223 lines
11 KiB
Python
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=[]) |