diff --git a/routes/content/bulk_add.py b/routes/content/bulk_add.py index 2110fa3..61ea837 100644 --- a/routes/content/bulk_add.py +++ b/routes/content/bulk_add.py @@ -1,10 +1,20 @@ import re from typing import List -from fastapi import APIRouter +from fastapi import APIRouter, Request, Depends, Request, Depends from pydantic import BaseModel import logging -# Assuming these imports are available for queue management and Spotify info +# Import authentication dependencies +from routes.auth.middleware import require_auth_from_state, User + +# Import queue management and Spotify info +from routes.utils.get_info import get_spotify_info +from routes.utils.celery_queue_manager import download_queue_manager + +# Import authentication dependencies +from routes.auth.middleware import require_auth_from_state, User + +# Import queue management and Spotify info from routes.utils.get_info import ( get_client, get_track, @@ -12,7 +22,7 @@ from routes.utils.get_info import ( get_playlist, get_artist, ) -from routes.utils.celery_tasks import download_track, download_album, download_playlist +from routes.utils.celery_queue_manager import download_queue_manager router = APIRouter() logger = logging.getLogger(__name__) @@ -23,7 +33,7 @@ class BulkAddLinksRequest(BaseModel): @router.post("/bulk-add-spotify-links") -async def bulk_add_spotify_links(request: BulkAddLinksRequest): +async def bulk_add_spotify_links(request: BulkAddLinksRequest, req: Request, current_user: User = Depends(require_auth_from_state)): added_count = 0 failed_links = [] total_links = len(request.links) @@ -34,7 +44,7 @@ async def bulk_add_spotify_links(request: BulkAddLinksRequest): # but still handle potential errors during info retrieval or unsupported types # Extract type and ID from the link directly using regex match = re.match( - r"https://open\.spotify\.com(?:/intl-[a-z]{2})?/(track|album|playlist|artist)/([a-zA-Z0-9]+)(?:\?.*)?", + r"https://open\.spotify\.com(?:/[a-z]{2})?/(track|album|playlist|artist)/([a-zA-Z0-9]+)(?:\?.*)?", link, ) if not match: @@ -46,6 +56,8 @@ async def bulk_add_spotify_links(request: BulkAddLinksRequest): spotify_type = match.group(1) spotify_id = match.group(2) + logger.debug(f"Extracted from link: spotify_type={spotify_type}, spotify_id={spotify_id}") + logger.debug(f"Extracted from link: spotify_type={spotify_type}, spotify_id={spotify_id}") try: # Get basic info to confirm existence and get name/artist @@ -80,46 +92,29 @@ async def bulk_add_spotify_links(request: BulkAddLinksRequest): # Construct URL for the download task spotify_url = f"https://open.spotify.com/{spotify_type}/{spotify_id}" - # Add to Celery queue based on type - if spotify_type == "track": - download_track.delay( - url=spotify_url, - spotify_id=spotify_id, - type=spotify_type, - name=item_name, - artist=artist_name, - download_type="track", - ) - elif spotify_type == "album": - download_album.delay( - url=spotify_url, - spotify_id=spotify_id, - type=spotify_type, - name=item_name, - artist=artist_name, - download_type="album", - ) - elif spotify_type == "playlist": - download_playlist.delay( - url=spotify_url, - spotify_id=spotify_id, - type=spotify_type, - name=item_name, - artist=artist_name, - download_type="playlist", - ) + # Prepare task data for the queue manager + task_data = { + "download_type": spotify_type, + "url": spotify_url, + "name": item_name, + "artist": artist_name, + "spotify_id": spotify_id, + "type": spotify_type, + "username": current_user.username, + "orig_request": dict(req.query_params), + } + + # Add to download queue using the queue manager + task_id = download_queue_manager.add_task(task_data) + + if task_id: + added_count += 1 + logger.debug(f"Added {added_count}/{total_links} {spotify_type} '{item_name}' ({spotify_id}) to queue with task_id: {task_id}.") else: - logger.warning( - f"Unsupported Spotify type for download: {spotify_type} for link: {link}" - ) + logger.warning(f"Failed to add {spotify_type} '{item_name}' ({spotify_id}) to queue.") failed_links.append(link) continue - added_count += 1 - logger.debug( - f"Added {added_count + 1}/{total_links} {spotify_type} '{item_name}' ({spotify_id}) to queue." - ) - except Exception as e: logger.error(f"Error processing Spotify link {link}: {e}", exc_info=True) failed_links.append(link)