MP3 organisé automatiquement téléchargé depuis Google Play Music en utilisant Python

Début

La nouvelle que Google Play Music prendra fin à la fin du mois de décembre a été annoncée. Les chansons achetées ou téléchargées peuvent être transférées sur la musique YouTube telles quelles, mais je ne sais pas quand le service prendra fin, j'ai donc décidé de les sauvegarder dans l'environnement local au cas où. Quand j'ai téléchargé les chansons, toutes les données ont été téléchargées dans le même dossier à la fois, j'ai donc décidé d'utiliser Python pour diviser les dossiers par "nom d'artiste" et "nom d'album". Même un amateur de programmation comme moi semble être capable de faire ce genre de chose.

Télécharger

Les chansons ont été téléchargées selon la page suivante. https://support.google.com/googleplaymusic/answer/1250232?hl=ja

Hiérarchie des dossiers

La hiérarchie des dossiers est définie comme suit.

Root ├ Artiste A │ └ Nom de l'album │ └ Song_1.mp3 │ └ Music_2.mp3 ├ Artiste B ├ Artiste C

Reportez-vous ici pour savoir comment remplir le diagramme de configuration de répertoire. https://qiita.com/paty-fakename/items/c82ed27b4070feeceff6

Obtenir des informations sur les balises mp3

Utilisez ʻEasyID3` pour obtenir les informations de balise incluses dans le mp3, telles que le nom de la chanson, le nom de l'artiste et le nom de l'album. J'ai fait référence à ce site. https://note.nkmk.me/python-mutagen-mp3-id3/

Code complété

Soudain, le code terminé est le suivant.

from mutagen.easyid3 import EasyID3
import os
import shutil
import re

def replace(string):
    return(re.sub(r'[\\/:*?"<>|]+', '-', string))

def arrange_data(mp3_path):
    tags = EasyID3(mp3_path)
    try:
        artistname = (tags['albumartist'])
    except KeyError:
        artistname = (tags['artist'])
    albumname = (tags['album'])
    artistname = replace(artistname[0]).strip()
    albumname = replace(albumname[0]).strip()
    title = os.path.basename(mp3_path)
    artist_dir = os.path.join(globalpath, artistname)
    album_dir = os.path.join(artist_dir, albumname)
    new_mp3_path = os.path.join(album_dir, title)
    if not artistname in artist_list:
        if not os.path.isdir(artist_dir):
            os.makedirs(artist_dir)
            artist_list.append(artistname)
    if not albumname in album_list:
        album_list.append(albumname)
        if not os.path.isdir(album_dir):
            os.makedirs(album_dir)
            album_list.append(albumname)
    try:
        shutil.copyfile(mp3_path, new_mp3_path)
        print(title + " is done.")
    except shutil.SameFileError:
        print(title + " is already exists.")


def data_check(file_list, path):
    for i in file_list:
        if os.path.isdir(os.path.join(path, i)):
            new_path = os.path.join(path, i)
            new_file_list = os.listdir(new_path)
            data_check(new_file_list, new_path)
        else:
            arrange_data(os.path.join(path, i))


globalpath = r"Dossier contenant des chansons"
file_list = os.listdir(globalpath)
album_list = []
artist_list = []

data_check(file_list, globalpath)

Le point qui a été pris

KeyError: se produit

Il y a des caractères non valides \ /: *?" <> | Ne peut pas être utilisé comme nom de fichier sous Windows, mais il y avait plusieurs noms d'artiste et noms d'album contenant des caractères non valides. Ceci estre.sub J'ai utilisépour remplacer les caractères invalides par _.

Il y a un espace dans le chemin du répertoire

Si l'un des noms d'artiste ou d'album contient un espace à la fin, le nom du dossier réel et le chemin du dossier ne correspondent pas, ce qui entraîne une erreur de lecture. Ceci a été résolu en utilisant .strip ().

problème d'exploit

Pour les chansons dont le nom d'artiste est quelque chose comme "feat. 〇〇" et il est difficile de trier par nom d'artiste, j'ai utilisé le nom d'artiste de l'album. Les chansons avec un nom d'artiste d'album auront la priorité, et les chansons sans nom d'artiste d'album utiliseront le nom d'artiste.

en conclusion

J'ai pu organiser les données en toute sécurité. Ce serait pratique si vous pouviez utiliser Python même un peu. Il semble que certaines chansons ne fonctionnent pas correctement, mais je suis content car j'ai pu traiter toutes les données locales.

Merci beaucoup!

Recommended Posts

MP3 organisé automatiquement téléchargé depuis Google Play Music en utilisant Python
Aplatir à l'aide du rendement Python de
Écouter de la musique à partir d'un haut-parleur USB à l'aide du package ROS (gx_sound_player)
Jouez avec l'API de données YouTube v3 à l'aide du client Python de l'API Google
Les débutants en Python utilisent l'API non officielle de Google Play Music pour jouer de la musique
Utilisation de Rstan de Python avec PypeR
[Python3] Google translate google translation sans utiliser l'API
Remarques sur l'utilisation de MeCab depuis Python
Utiliser de force Google Translate à partir de python
Utiliser Cloud Storage depuis Python3 (Introduction)
Exécutez Ansible à partir de Python à l'aide de l'API
Précautions lors de l'utilisation de phantomjs de python
Accéder aux feuilles de calcul à partir de Python à l'aide d'OAuth 2.0
Utiliser l'API Google Analytics de Python
Essayez d'utiliser Amazon DynamoDB à partir de Python
Comment gérer l'erreur OAuth2 lors de l'utilisation des API Google à partir de Python
Créez un outil qui secoue automatiquement furigana avec html en utilisant Mecab de Python3
De Python à l'utilisation de MeCab (et CaboCha)
Lire un fichier audio à partir de Python avec interruption
Comment mettre à jour Google Sheets à partir de Python
[Débutant] Scrapage Web Python facile à comprendre à l'aide de Google Colaboratory
Essayez d'utiliser Python avec Google Cloud Functions
Utiliser l'API Google Cloud Vision de Python
J'ai essayé d'utiliser l'API UnityCloudBuild de Python
Créer une feuille de calcul Google à l'aide de l'API Python / Google Data
Enregistrez automatiquement les images de vos personnages préférés à partir de la recherche d'images Google avec Python
J'ai essayé d'utiliser Google Translate à partir de Python et c'était trop facile