Files
gh-christianlouis-quizzical…/musicround/routes/deezer_routes.py
T
Christian Krakau-Louis 03b982e7c2 Initial clean commit
2025-05-13 08:59:02 +00:00

223 lines
11 KiB
Python

from flask import Blueprint, render_template, redirect, url_for, request, current_app, flash, session, jsonify
from musicround.models import Song, db
import deezer
import musicbrainzngs
import requests
import openai
import os
import json
from musicround.helpers.metadata import get_song_metadata_by_isrc
from musicround.helpers.import_helper import ImportHelper
deezer_bp = Blueprint('deezer', __name__)
@deezer_bp.route('/deezer-search', methods=['GET'])
def deezer_search():
"""Display Deezer search form"""
return render_template('service_search.html',
service_name='Deezer',
search_results_url=url_for('deezer.deezer_search_results'),
browse_playlists_url=url_for('deezer.browse_deezer_playlists'),
track_import_url=url_for('deezer.import_deezer_track_result'),
album_import_url=url_for('deezer.import_deezer_album_result'),
playlist_import_url=url_for('deezer.import_deezer_playlist_result'),
url_placeholder='https://www.deezer.com/...')
@deezer_bp.route('/deezer-search-results', methods=['POST'])
def deezer_search_results():
"""Search for tracks, albums, and playlists on Deezer"""
search_term = request.form['search_term']
deezer_client = current_app.config['deezer']
try:
tracks = deezer_client.search_tracks(search_term)
albums = deezer_client.search_albums(search_term)
playlists = deezer_client.search_playlists(search_term)
# Format tracks for the template
formatted_tracks = []
for track in tracks:
if track:
formatted_tracks.append({
'id': track.get('id'),
'name': track.get('title'),
'artist': track.get('artist', {}).get('name', 'Unknown Artist') if track.get('artist') else 'Unknown Artist',
'album': track.get('album', {}).get('title', '') if track.get('album') else '',
'image_url': track.get('album', {}).get('cover_medium') if track.get('album') else None,
'preview_url': track.get('preview')
})
# Format albums for the template
formatted_albums = []
for album in albums:
if album:
formatted_albums.append({
'id': album.get('id'),
'name': album.get('title'),
'artist': album.get('artist', {}).get('name', 'Unknown Artist') if album.get('artist') else 'Unknown Artist',
'image_url': album.get('cover_medium'),
'track_count': album.get('nb_tracks')
})
# Format playlists for the template
formatted_playlists = []
for playlist in playlists:
if playlist:
formatted_playlists.append({
'id': playlist.get('id'),
'name': playlist.get('title'),
'owner': playlist.get('user', {}).get('name', 'Unknown') if playlist.get('user') else 'Unknown',
'image_url': playlist.get('picture_medium'),
'track_count': playlist.get('nb_tracks')
})
# Use the standardized template for search results
return render_template('service_search_results.html',
service_name='Deezer',
search_term=search_term,
tracks=formatted_tracks,
albums=formatted_albums,
playlists=formatted_playlists,
tracks_label='Tracks',
search_url=url_for('deezer.deezer_search'),
has_preview=True,
track_import_url=url_for('deezer.import_deezer_track_result'),
track_id_field='track_id',
album_import_url=url_for('deezer.import_deezer_album_result'),
album_id_field='album_id',
playlist_import_url=url_for('deezer.import_deezer_playlist_result'),
playlist_id_field='playlist_id')
except Exception as e:
current_app.logger.error(f"Deezer search error: {e}")
flash("Error searching Deezer. Please try again.", "danger")
return redirect(url_for('deezer.deezer_search'))
@deezer_bp.route('/import-deezer-track', methods=['GET'])
def import_deezer_track():
"""Display form to import a single track from Deezer"""
return render_template('service_import.html',
service_name='Deezer',
item_type='Track',
url_example_prefix='https://www.deezer.com/track/',
url_example_id='12345678',
id_field='track_id',
form_action=url_for('deezer.import_deezer_track_result'),
back_url=url_for('deezer.deezer_search'))
@deezer_bp.route('/import-deezer-track-result', methods=['POST'])
def import_deezer_track_result():
"""Process the import of a single track from Deezer using the unified ImportHelper"""
track_id = request.form['track_id']
# Use the unified ImportHelper to handle track import
result = ImportHelper.import_item('deezer', 'track', track_id)
if result['imported_count'] > 0:
flash(f'Successfully imported {result["imported_count"]} song from Deezer!', 'success')
elif result['skipped_count'] > 0:
flash('Song was already in the database.', 'info')
else:
flash(f'Error importing song: {", ".join(result["errors"])}', 'danger')
return redirect(url_for('core.view_songs'))
# Legacy function kept for backward compatibility
def import_deezer_track_result_helper(track_id):
"""Helper function to import a single track from Deezer"""
result = ImportHelper.import_item('deezer', 'track', track_id)
return result['imported_count'] > 0
@deezer_bp.route('/import-deezer-playlist', methods=['GET', 'POST'])
def import_deezer_playlist():
"""Display form to import all tracks from a Deezer playlist"""
if request.method == 'POST':
playlist_id = request.form.get('playlist_id')
if playlist_id:
# Use the unified ImportHelper to handle playlist import
result = ImportHelper.import_item('deezer', 'playlist', playlist_id)
if result['imported_count'] > 0:
flash(f'Successfully imported {result["imported_count"]} songs from Deezer playlist!', 'success')
elif result['skipped_count'] > 0 and result['error_count'] == 0:
flash(f'All {result["skipped_count"]} songs were already in the database.', 'info')
elif result['error_count'] > 0:
flash(f'Encountered {result["error_count"]} errors during import.', 'warning')
else:
flash(f'Error importing playlist: {", ".join(result["errors"])}', 'danger')
return redirect(url_for('core.view_songs'))
else:
flash("Playlist ID is required.", 'error')
return render_template('service_import.html',
service_name='Deezer',
item_type='Playlist',
url_example_prefix='https://www.deezer.com/playlist/',
url_example_id='9876543',
id_field='playlist_id',
form_action=url_for('deezer.import_deezer_playlist_result'),
back_url=url_for('deezer.deezer_search'))
@deezer_bp.route('/import-deezer-playlist-result', methods=['POST'])
def import_deezer_playlist_result():
"""Process the import of all tracks from a Deezer playlist using the unified ImportHelper"""
playlist_id = request.form['playlist_id']
# Use the unified ImportHelper to handle playlist import
result = ImportHelper.import_item('deezer', 'playlist', playlist_id)
if result['imported_count'] > 0:
flash(f'Successfully imported {result["imported_count"]} songs from Deezer playlist!', 'success')
elif result['skipped_count'] > 0 and result['error_count'] == 0:
flash(f'All {result["skipped_count"]} songs were already in the database.', 'info')
elif result['error_count'] > 0:
flash(f'Encountered {result["error_count"]} errors during import.', 'warning')
else:
flash(f'Error importing playlist: {", ".join(result["errors"])}', 'danger')
return redirect(url_for('core.view_songs'))
@deezer_bp.route('/import-deezer-album', methods=['GET'])
def import_deezer_album():
"""Display form to import all tracks from a Deezer album"""
return render_template('service_import.html',
service_name='Deezer',
item_type='Album',
url_example_prefix='https://www.deezer.com/album/',
url_example_id='1234567',
id_field='album_id',
form_action=url_for('deezer.import_deezer_album_result'),
back_url=url_for('deezer.deezer_search'))
@deezer_bp.route('/import-deezer-album-result', methods=['POST'])
def import_deezer_album_result():
"""Process the import of all tracks from a Deezer album using the unified ImportHelper"""
album_id = request.form['album_id']
# Use the unified ImportHelper to handle album import
result = ImportHelper.import_item('deezer', 'album', album_id)
if result['imported_count'] > 0:
flash(f'Successfully imported {result["imported_count"]} songs from Deezer album!', 'success')
elif result['skipped_count'] > 0 and result['error_count'] == 0:
flash(f'All {result["skipped_count"]} songs were already in the database.', 'info')
elif result['error_count'] > 0:
flash(f'Encountered {result["error_count"]} errors during import.', 'warning')
else:
flash(f'Error importing album: {", ".join(result["errors"])}', 'danger')
return redirect(url_for('core.view_songs'))
@deezer_bp.route('/browse-deezer-playlists')
def browse_deezer_playlists():
"""Browse popular playlists on Deezer"""
deezer_client = current_app.config['deezer']
try:
playlists = deezer_client.get_popular_playlists()
return render_template('browse_deezer_playlists.html', playlists=playlists)
except Exception as e:
current_app.logger.error(f"Error browsing Deezer playlists: {e}")
flash("Error loading Deezer playlists. Please try again.", "danger")
return render_template('browse_deezer_playlists.html', playlists=[])