|
"""Shazam Playlist to Youtube Playlist""" |
|
|
|
from pathlib import Path |
|
import random |
|
from typing import Optional |
|
import logging |
|
import pandas as pd |
|
from pytube import Search, YouTube |
|
from flask import Flask, request, send_from_directory |
|
from sklearn.utils import shuffle as sklearn_shuffle |
|
|
|
|
|
pytube_logger = logging.getLogger('pytube') |
|
pytube_logger.setLevel(logging.ERROR) |
|
|
|
app = Flask(__name__) |
|
|
|
@app.route('/') |
|
def index(): |
|
"""Route handler for the home page""" |
|
try: |
|
return send_from_directory('.', 'index.html') |
|
except Exception as e: |
|
return str(e) |
|
|
|
@app.route('/video_id', methods=['POST']) |
|
def video_id() -> str: |
|
"""Route handler for retrieving the YouTube video ID""" |
|
try: |
|
title: str = request.json.get('title') |
|
artist: str = request.json.get('artist') |
|
youtube: YouTube = get_youtube_song(title, artist) |
|
return youtube.video_id |
|
except Exception as e: |
|
return str(e) |
|
|
|
@app.route('/parse_csv', methods=['POST']) |
|
def parse_csv(): |
|
"""Route handler for parsing the uploaded CSV file""" |
|
try: |
|
file = request.files['file'] |
|
|
|
return parse_csv_util(pd.read_csv(file, header=1)) |
|
except Exception as e: |
|
return str(e) |
|
|
|
@app.route('/parse_csv_test', methods=['GET']) |
|
def parse_csv_test(): |
|
"""Route handler for parsing the test CSV file""" |
|
try: |
|
|
|
csv_path = Path(__file__).parent / 'shazamlibrary.test.csv' |
|
return parse_csv_util(pd.read_csv(csv_path, header=1), True) |
|
except Exception as e: |
|
return str(e) |
|
|
|
def get_youtube_song(title: str, artist: str) -> Optional[YouTube]: |
|
"""Searches for a YouTube video based on the given title and artist""" |
|
search_result = Search(f'{title} by {artist}') |
|
return search_result.results[0] if search_result.results else None |
|
|
|
def parse_csv_util(df: pd.DataFrame, shuffle = False): |
|
try: |
|
df = df.drop_duplicates(subset=['TrackKey'])[['Title', 'Artist']] |
|
if shuffle: |
|
for random_state in random.sample(range(444, 44444), 3): |
|
df = sklearn_shuffle(df, random_state=random_state).reset_index(drop=True) |
|
return df.to_json(orient="records") |
|
except Exception as e: |
|
return str(e) |