Affiche automatiquement les paroles de la chanson en cours de lecture sur iTunes en Python (version améliorée)

introduction

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.

Points d'amélioration

Prend en charge le saut de chansons

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

Affichage plus rapide

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])

Contrôle des applications

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

    # ~~~~~~~~

Défilement automatique

É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.

Amélioration de la précision de la recherche de paroles

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

Code entier

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

Affiche automatiquement les paroles de la chanson en cours de lecture sur iTunes en Python (version améliorée)
Affiche automatiquement les paroles de la chanson en cours de lecture sur iTunes en Python
Utilisons la version Python du module API Confluence.
Ne pas être conscient du contenu des données en python
Utilisons les données ouvertes de "Mamebus" en Python
Mettez la dernière version de Python dans Linux (Debian) du Chromebook
Comment est le progrès? Continuons le boom ?? en Python
Mesurez la couverture de test du code python poussé sur GitHub.
[Python] Réduisons le nombre d'éléments dans le résultat dans le fonctionnement de l'ensemble
Comment mettre à jour la version Python de Cloud Shell dans GCP
Obtenez le nombre de lecteurs d'articles sur Mendeley en Python
pyenv-changer la version python de virtualenv
Affichage de la forme d'onde audio en Python
Modifions automatiquement la palette de couleurs d'iTerm2 en fonction de l'heure de la journée
[Android] Afficher des images sur le Web dans la fenêtre info de Google Map
Afficher le statut de l'infection COVID 19 au Japon avec Splunk (version GitHub)
J'ai essayé d'obtenir automatiquement le RSS de la chanson la plus populaire de l'iTunes Store
Vérifiez le comportement du destroyer en Python
Django ~ Affichons-le sur le navigateur ~
Afficher une liste d'alphabets en Python 3
À propos de l'environnement virtuel de Python version 3.7
Afficher Python 3 dans le navigateur avec MAMP
Le résultat de l'installation de python sur Anaconda
[Python] Essayez pydash de la version Python de lodash
Empêcher le double lancement en Python (version améliorée)
Afficher le graphique de tensorBoard sur Jupyter
Principes de base pour exécuter NoxPlayer en Python
À la recherche du FizzBuzz le plus rapide en Python
Je souhaite utiliser Python dans l'environnement de pyenv + pipenv sous Windows 10
J'ai installé Pygame avec Python 3.5.1 dans l'environnement de pyenv sur OS X
J'ai comparé la vitesse des expressions régulières en Ruby, Python et Perl (version 2013)
Jouons avec Python Receive et enregistrez / affichez le texte du formulaire de saisie
En Python, changez le comportement de la méthode en fonction de la façon dont elle est appelée
Définir la limite supérieure du nombre de répétitions de fonctions récursives en Python
Sortie du nombre de cœurs de processeur en Python
Essai du parseur d'emacs-org orgparse pour python
[Python] Trier la liste de pathlib.Path dans l'ordre naturel
Analysons le journal de validation git en Python!
Récupérer l'appelant d'une fonction en Python
Faites correspondre la distribution de chaque groupe en Python
Afficher le résultat du traitement de la géométrie en Python
Copiez la liste en Python
Utilisez la dernière version de PyCharm sur Ubuntu
Écrire une note sur la version python de python virtualenv
Découvrez la fraction de la valeur saisie en python
Essayez Progate Free Edition [Python I]
Trouvez la solution de l'équation d'ordre n avec python
L'histoire de la lecture des données HSPICE en Python
[Note] À propos du rôle du trait de soulignement "_" en Python
Résolution d'équations de mouvement en Python (odeint)
Sortie sous la forme d'un tableau python
Au moment de la mise à jour de python avec ubuntu
Je veux afficher la progression en Python!
[Exemple d'amélioration de Python] Apprentissage des bases de Python sur un site gratuit en 2 semaines
[Apprentissage automatique] "Détection d'anomalies et détection de changement" Dessinons la figure du chapitre 1 en Python.