Une fonction majeure a été ajoutée au "Affichons automatiquement les paroles de la chanson en cours de lecture sur iTunes en Python" créé précédemment.
Une fois la page des paroles d'une chanson ouverte, cette page était affichée jusqu'à la fin de cette chanson, mais si vous passez à la chanson suivante, les paroles afficheront également la chanson suivante.
Changer avant
while True:
    start = time.time()  # delete
    # ~~~~~~~~
    time.sleep(music_time - (time.time() - start))  # delete
Après le changement
prev_track_name = ""  # add
while True:
    #Lecture du nom de la chanson, du nom de l'album, du nom de l'artiste, de la durée de la chanson
    name = music.current_track.name.get()
    artist = music.current_track.artist.get()
    album = music.current_track.album.get()
    music_time = music.current_track.time.get()  # m:s str
    # add-start
    if name == prev_track_name:
        time.sleep(1)
        continue
    prev_track_name = name
    # add-end
    # ~~~~~~~~
    time.sleep(1)  # add
J'ai défini un délai d'attente car il a fallu beaucoup de temps pour afficher la page des paroles.
Après le changement
driver = webdriver.Chrome(executable_path="chromedriver")
driver.get("https://www.google.com/")  #Onglet initial
driver.set_page_load_timeout(5)  #Temps d'attente de lecture maximal (5 secondes dans ce cas)# add
Les paroles elles-mêmes peuvent être lues en 5 secondes, mais les autres images prendront beaucoup de temps et le temps de chargement de la page sera long, il sera donc interrompu de force après 5 secondes. À propos, "Faire défiler jusqu'à la position des paroles" a également été modifié pour rechercher la position des paroles et faire défiler jusqu'à cette position.
Changer avant
while True:
    # ~~~~~~~~
    try:
        # ~~~~~~~~
        #Ouvrir dans un nouvel onglet
        driver.execute_script("window.open()")
        driver.switch_to.window(driver.window_handles[1])
        driver.get("https://www.uta-net.com/" + name_url)
        driver.execute_script("window.scrollTo(0, 380);")  #Faites défiler jusqu'à la position des paroles
        #Fermer l'onglet précédent
        driver.switch_to.window(driver.window_handles[0])
        driver.close()
        driver.switch_to.window(driver.window_handles[0])
Après le changement
while True:
    # ~~~~~~~~
    try:
        # ~~~~~~~~
        #Ouvrir dans un nouvel onglet
        driver.execute_script("window.open()")
        driver.switch_to.window(driver.window_handles[1])
        # add-start
        try:
            driver.get("https://www.uta-net.com/" + name_url)
        except:
            pass
        #Faites défiler jusqu'à la position des paroles
        driver.execute_script("arguments[0].scrollIntoView();", driver.find_element_by_id("view_kashi"))
        # add-end
        #Fermer l'onglet précédent
        driver.switch_to.window(driver.window_handles[0])
        driver.close()
        driver.switch_to.window(driver.window_handles[0])
C'est presque un bonus, mais j'ai rendu possible le contrôle de "playback" et "to the next song" même sur le terminal. Le premier est l'opération de base.
opération de base
music = appscript.app("Music")
#Régénération
music.play()
#pause
music.pause()
#Jouer pause
music.playpause()
#Vers la piste précédente
music.previous_track()
#Vers la piste suivante
music.next_track()
Utilisez ceci tel quel. De plus, avec ʻinput () `normal, il n'est pas possible d'attendre que l'entrée soit effectuée et d'effectuer un autre traitement, donc une entrée avec un délai d'attente a été utilisée.
Entrée avec timeout
from select import select
import sys
#Les arguments sont «read», «write», «exception» et «wait time» dans l'ordre, et cette fois seule la lecture est utilisée.
#Le temps d'attente est de 0.Spécifié comme 5 secondes
# 0.S'il n'y a pas d'entrée après 5 secondes, une liste vide est renvoyée
read, _, _ = select([sys.stdin], [], [], 0.5)
if read:
    command = sys.stdin.readline().strip()
else:
    command = ""
Je mettrai ce qui précède dans le code tel quel.
Après le changement
while True:
    #Accédez à l'application Musique
    music = appscript.app("Music")
    # add-start
    # ----Contrôle des applications----
    #Entrée avec timeout
    read, _, _ = select([sys.stdin], [], [], 0.5)
    if read:
        command = sys.stdin.readline().strip()
    else:
        command = ""
    if command == "b":  #Vers la piste précédente
        music.previous_track()
    elif command == "p":  #Jouer pause
        music.playpause()
    elif command == "n":  #Vers la piste suivante
        music.next_track()
    # add-end
    # ~~~~~~~~
Étant donné que toutes les paroles peuvent ne pas être affichées, les paroles défilent automatiquement.
Après le changement
while True:
    # ~~~~~~~~
    if name == prev_track_name:
        time.sleep(1)
        # add-start
        count += 1
        if count % 5 == 0:
            driver.execute_script(
                "window.scrollTo(window.pageXOffset, window.pageYOffset + " + str(kashi_length // music_time * 5) + ");"
            )
        # add-end
        continue
        # ~~~~~~~~
        #Ouvrir dans un nouvel onglet
        driver.execute_script("window.open()")
        driver.switch_to.window(driver.window_handles[1])
        try:
            driver.get("https://www.uta-net.com/" + name_url)
        except:
            pass
        #Faites défiler jusqu'à la position des paroles
        driver.execute_script("arguments[0].scrollIntoView();", driver.find_element_by_id("view_kashi"))
        # add-start
        #Longueur des paroles sur la page
        kashi_length = driver.find_element_by_id("view_mylink").location["y"] - \
                       driver.find_element_by_id("view_kashi").location["y"]
        # add-end
        #Fermer l'onglet précédent
        driver.switch_to.window(driver.window_handles[0])
        driver.close()
        driver.switch_to.window(driver.window_handles[0])
Obtenez la longueur de la partie des paroles dans la page, (Longueur des paroles / Longueur de la chanson) * 5 Faites défiler vers le bas toutes les 5 secondes pour faire défiler à un rythme raisonnable.
Commencez par convertir l'alphabet pleine largeur en demi-largeur. De plus, lors de la recherche, «correspondance exacte» a été remplacée par «contient».
Après le changement
while True:
    # ~~~~~~~~
    # ----Accéder au site des paroles----
    #Angle complet à demi-angle# add
    name = str(name).translate(str.maketrans({chr(0xFF01 + i): chr(0x21 + i) for i in range(94)}))
    name = parse.quote(name)  #Codage en pourcentage
    url = "https://www.uta-net.com/search/?Aselect=2&Keyword=" + name + "&Bselect=3&x=0&y=0"  # Bselect=Bsélectionner 4=À 3
De plus, la position du nom du chanteur peut changer en raison de l'influence de la marque de la couronne sur la page avec beaucoup d'accès, donc cela a été corrigé.
Après le changement
while True:
    # ~~~~~~~~
    try:
        # ~~~~~~~~
        name_url = ""
        flag = False
        for tag_tr in tr:
            a = tag_tr.find_all("a")
            for i, tag_a in enumerate(a):
                if i == 0:  #Titre de la chanson
                    name_url = tag_a.get("href")
                elif i == 1 or i == 2:  #Nom du chanteur#Ajoutez 2 là où il n'y en avait qu'un
                    if tag_a.string == artist:
                        flag = True
                        break
            if flag:
                break
import time
import sys
from select import select
import appscript
from urllib import request, parse
from bs4 import BeautifulSoup
from selenium import webdriver
driver = webdriver.Chrome(executable_path="chromedriver")
driver.get("https://www.google.com/")  #Onglet initial
driver.set_page_load_timeout(5)  #Il peut être plus court en fonction de la vitesse de la ligne
music_time = 0
prev_track_name = ""
count = 0
kashi_length = 0
while True:
    #Accédez à l'application Musique
    music = appscript.app("Music")
    # ----Contrôle des applications----
    #Entrée avec timeout
    read, _, _ = select([sys.stdin], [], [], 0.5)
    if read:
        command = sys.stdin.readline().strip()
    else:
        command = ""
    if command == "b":  #Vers la piste précédente
        music.previous_track()
    elif command == "p":  #Jouer pause
        music.playpause()
    elif command == "n":  #Vers la piste suivante
        music.next_track()
    # ----Obtenir le titre de la chanson----
    #Lecture du nom de la chanson, du nom de l'album, du nom de l'artiste, de la durée de la chanson
    name = music.current_track.name.get()
    artist = music.current_track.artist.get()
    album = music.current_track.album.get()
    music_time = music.current_track.time.get()  # m:s str
    # music_temps en secondes
    music_time = music_time.split(":")
    music_time = int(music_time[0]) * 60 + int(music_time[1])
    if name == prev_track_name:
        time.sleep(1)
        count += 1
        if count % 5 == 0:
            driver.execute_script(
                "window.scrollTo(window.pageXOffset, window.pageYOffset + " + str(kashi_length // music_time * 5) + ");"
            )
        continue
    prev_track_name = name
    print("{} / {} / {}".format(name, artist, album))
    # ----Accéder au site des paroles----
    #Angle complet à demi-angle
    name = str(name).translate(str.maketrans({chr(0xFF01 + i): chr(0x21 + i) for i in range(94)}))
    name = parse.quote(name)  #Codage en pourcentage
    url = "https://www.uta-net.com/search/?Aselect=2&Keyword=" + name + "&Bselect=3&x=0&y=0"
    try:
        html = request.urlopen(url)
        soup = BeautifulSoup(html, "html.parser")
        tr = soup.find_all("tr")
        name_url = ""
        flag = False
        for tag_tr in tr:
            a = tag_tr.find_all("a")
            for i, tag_a in enumerate(a):
                if i == 0:  #Titre de la chanson
                    name_url = tag_a.get("href")
                elif i == 1 or i == 2:  #Nom du chanteur
                    if tag_a.string == artist:
                        flag = True
                        break
            if flag:
                break
        #Ouvrir dans un nouvel onglet
        driver.execute_script("window.open()")
        driver.switch_to.window(driver.window_handles[1])
        try:
            driver.get("https://www.uta-net.com/" + name_url)
        except:
            pass
        #Faites défiler jusqu'à la position des paroles
        driver.execute_script("arguments[0].scrollIntoView();", driver.find_element_by_id("view_kashi"))
        kashi_length = driver.find_element_by_id("view_mylink").location["y"] - \
                       driver.find_element_by_id("view_kashi").location["y"]
        #Fermer l'onglet précédent
        driver.switch_to.window(driver.window_handles[0])
        driver.close()
        driver.switch_to.window(driver.window_handles[0])
    except:
        pass
    print("b:Avant| p:Jouer pause| n:Suivant")
    print()
    time.sleep(1)
Recommended Posts