PythonでSpotifyAPIの情報から音楽をダウンロードする

PythonでSpotifyAPIの情報から音楽をダウンロードします.

ただし,前回の記事 (opens new window)でDBを作成済みであることを前提にしています.

全国630店舗以上!もみほぐし・足つぼ・ハンドリフレ・クイックヘッドのリラクゼーション店【りらくる】

# Spotify APIの導入

Spotify APIの導入は下記のサイトを参考にしてください.

前回の記事 (opens new window)

# 楽曲情報の抽出

楽曲情報の抽出は下記のサイトを参考にしてください.

前回の記事 (opens new window)

# ライブラリのインストール

下記のコードでライブラリをインストールします.

!pip install spotdl

# 特定年代の情報を抽出

下記のコードで特定年代の情報を抽出します.

import sqlite3

# dbの読み込み(sample.dbは自動で作成される)
con = sqlite3.connect('spotify_music.db')
# カーソルの設定
# https://www.postgresql.jp/document/9.2/html/plpgsql-cursors.html
cur = con.cursor()

year = 2020
# info_table(楽曲の情報)の情報抽出
cur.execute(f'''SELECT * FROM info_table WHERE release_date BETWEEN '{year}-01-01' AND '{year}-12-31';''')
data = cur.fetchall()
print(len(data))

# テーブル変更を保存
con.commit()

# dbとカーソルを閉じる
cur.close()
con.close()

# データフレームに格納
df = pd.DataFrame(data, columns = ['track_id', 'name', 'album', 'artist', 'release_date', 'country', 'length', 'popularity'])
# お気に入り降順にソート
df.sort_values('popularity', ascending=False, inplace=True)
# DFの表示
display(df.head(10))

# SpotifyのDBにダウンロード状況を保存

下記のコードでSpotifyのDBにダウンロード状況を保存します.

情報は下記の通りです.

  • track_id:SpotifyのID
  • name:楽曲名
  • release_date:発売日
  • country:楽曲の国
  • popularity:人気度(再生回数+お気に入り数の総合得点)
  • rannk:年代別ランキング
  • youtube_id:youtuneのID
import sqlite3

# dbの読み込み(sample.dbは自動で作成される)
con = sqlite3.connect('spotify_music.db')
# カーソルの設定
# https://www.postgresql.jp/document/9.2/html/plpgsql-cursors.html
cur = con.cursor()

# テーブル1:info_table(楽曲の情報)の作成
# テーブル名  データ型 unique : 重複禁止のカラム作成
cur.execute('''CREATE TABLE download_table
               (track_id text unique, 
               name text,
               release_date date,
               country text,
               popularity int,
               rannk int,
               youtube_id text)
               ''')

# テーブル変更を保存
con.commit()

# dbとカーソルを閉じる
cur.close()
con.close()

# ダウンロードの実行工程

ダウンロードの実行工程は下記の通りです.

  1. DBの読み込み
  2. 1970~2021年隔年で指定
  3. 特定年代の音楽人気ランキングを出力
  4. spotdlでダウンロード
  5. YouTubeのIDの出力
  6. mp3の移動
  7. DBに格納する情報を整理
  8. download_tableに格納

# 工程3_特定年代の音楽人気ランキングを出力

下記のコードでDBから情報を抽出を実行します.

import sqlite3
import pandas as pd

# 特定年代の音楽人気ランキング
def year_music_ranking(year):
    # dbの読み込み(sample.dbは自動で作成される)
    con = sqlite3.connect('spotify_music.db')
    # カーソルの設定
    # https://www.postgresql.jp/document/9.2/html/plpgsql-cursors.html
    cur = con.cursor()

    # テーブル1:info_table(楽曲の情報)の格納
    # テーブル情報の抽出
    # to_date('2019-09-03', 'yyyy-mm-dd') AND to_date('2019-09-04', 'yyyy-mm-dd')
    cur.execute(f'''SELECT * FROM info_table WHERE release_date BETWEEN '{year}-01-01' AND '{year}-12-31';''')
    data = cur.fetchall()
    #print(len(data))

    # データフレームに格納
    df = pd.DataFrame(data, columns = ['track_id', 'name', 'album', 'artist', 'release_date', 'country', 'length', 'popularity'])
    # お気に入り降順にソート
    df.sort_values('popularity', ascending=False, inplace=True)
    #  indexの初期化
    df.reset_index(drop=True, inplace=True)

    # テーブル変更を保存
    con.commit()

    # dbとカーソルを閉じる
    cur.close()
    con.close()
    
    return df

# 工程5_YouTubeのIDを抽出

下記のコードでyoutubeのIDの抽出します.

# youtubeのIDの出力
def output_youtubeID():
    # テキストを入力
    f = open('hoge.txt', 'r')
    # ターミナルの出力をリスト化
    terminallist = f.readlines()
    # youtubeのIDを出力
    for terminal in terminallist:
        if 'https://www.youtube.com/watch?v=' in terminal:
            youtubeID = terminal.split('https://www.youtube.com/watch?v=')[-1]
            return youtubeID
    return 0

# 工程6_mp3ファイルの移動

下記のコードでダウンロードしたmp3ファイルを特定のディレクトリに移動させます.

import os 
from glob import glob
import subprocess

# mp3の移動
def move_mp3(year, rankn):
    # 保存ディレクトリの作成
    dl_dir = f"./mp3/{year}"
    os.makedirs(dl_dir, exist_ok=True)

    # mp3パス
    mp3_file1 = glob("./*.mp3")[0]

    import subprocess
    # ファイルの移動
    subprocess.run(["mv", mp3_file1, f"{dl_dir}/{str(rankn + 1).zfill(4)}_{os.path.basename(mp3_file1)}"])

# ダウンロードの実行

下記のコードでダウンロードを実行します.

ダウンロードの工程は下記の通りです.

  1. DBの読み込み
  2. 1970~2021年隔年で指定
  3. 特定年代の音楽人気ランキングを出力
  4. spotdlでダウンロード
  5. youtubeのIDの出力
  6. mp3ファイルの移動
  7. DBに格納する情報を整理
  8. download_tableに格納
import sqlite3

# 工程1_DBの読み込み
con = sqlite3.connect('spotify_music.db')
# カーソルの設定
# https://www.postgresql.jp/document/9.2/html/plpgsql-cursors.html
cur = con.cursor()

# 工程2_1970~2021年隔年で指定
for year_rank in range(1970, 2022):
    # 工程3_特定年代の音楽人気ランキングを出力
    rank_df = year_music_ranking(year_rank)

    for rank_num in range(200):
        try:
            # 工程4_spotdlでダウンロード
            proc = subprocess.run(f"spotdl https://open.spotify.com/track/{rank_df['track_id'][rank_num]} > hoge.txt", shell=True)

            # 工程5_youtubeのIDの出力
            yid = output_youtubeID()

            # 工程6_mp3ファイルの移動
            move_mp3(year_rank, rank_num)

            # 工程7_DBに格納する情報を整理
            rank_info = [rank_df['track_id'][rank_num], 
                          rank_df['name'][rank_num], 
                          rank_df['release_date'][rank_num], 
                          rank_df['country'][rank_num], 
                          rank_df['popularity'][rank_num],
                          rank_num + 1,
                          yid]

            # 工程8_download_tableに格納
            cur.execute(f"INSERT INTO download_table VALUES ({rank_info});".replace('[', '').replace(']', ''))
            # テーブル変更を保存
            con.commit()

        except:
            print(f"ERROR track_")
    
# dbとカーソルを閉じる
cur.close()
con.close()

# まとめ

ここまでで,PythonでSpotifyAPIの情報から音楽をダウンロードしました.

# 参考サイト

PythonでSpotify APIを使ってみる ~全ての音楽愛好家のためのSpotify API ep 1~ (opens new window)

PythonでSpotify API [情報の文字列検索] (opens new window)

Spotify 検索 (opens new window)

Spotify API Search for Item (opens new window)

ISO 3166-1 alpha-2 wiki (opens new window)

Spotify Web APIから分析用データセットをつくる (opens new window)

Billboard×Spotifyで「〇〇年代を代表する曲」を決めよう! (opens new window)

Spotify.Tracks (opens new window)

Pythonで2次元配列の重複行を一発で削除する (opens new window)

全国630店舗以上!もみほぐし・足つぼ・ハンドリフレ・クイックヘッドのリラクゼーション店【りらくる】

BigQueryでwhile文を使用する

BigQueryでwhile文を使用する

BigQueryでwhile文を使用します.

架空の行動履歴データでChordDiagram(弦グラフ)を作成する(後半)

架空の行動履歴データでChordDiagram(弦グラフ)を作成する(後半)

前回作成した架空の行動履歴データでChordDiagram(弦グラフ)を作成します.