File size: 4,176 Bytes
ff7a5f2
cdd2ff8
 
a108d08
7d46648
ff7a5f2
a108d08
ff7a5f2
7d46648
 
 
 
ff7a5f2
cdd2ff8
a108d08
 
 
 
cdd2ff8
 
 
 
b642c37
cdd2ff8
ff7a5f2
 
 
 
 
cdd2ff8
ff7a5f2
 
 
cdd2ff8
 
ff7a5f2
cdd2ff8
 
7d46648
cdd2ff8
 
a108d08
cdd2ff8
 
 
 
 
 
 
 
 
7d46648
 
 
 
 
 
cdd2ff8
7d46648
cdd2ff8
 
7d46648
cdd2ff8
 
 
 
a108d08
 
 
b642c37
 
 
 
 
 
 
 
 
 
 
 
 
 
a108d08
 
b642c37
7d46648
a108d08
ff7a5f2
7d46648
ff7a5f2
 
cdd2ff8
ff7a5f2
 
 
cdd2ff8
 
ff7a5f2
7d46648
ff7a5f2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
from fastapi import FastAPI, HTTPException
from deezspot.deezloader import DeeLogin
import requests
import os
import logging
from typing import Optional
from fastapi.staticfiles import StaticFiles

# Set up logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

app = FastAPI(title="Deezer API")

# Mount a static files directory to serve downloaded files
os.makedirs("downloads", exist_ok=True)
app.mount("/downloads", StaticFiles(directory="downloads"), name="downloads")

# Deezer API base URL
DEEZER_API_URL = "https://api.deezer.com"

# Deezer ARL token (required for deezspot downloads)
ARL_TOKEN = "9850d663715d56830e6cdb4d28d19491d8c9d9a8ee31c160a0f5e06116b6d8035fb01c5323ec9690e49a32c0580c0a84e484366df2d6a8ac5786d30a95dc660771fbb372735cb2b39d4081bf30284f08319c0f73f6ad34d3d6bcb4449226877c"  # Replace with your ARL token
dl = DeeLogin(arl=ARL_TOKEN)

@app.get("/")
def read_root():
    return {"message": "Deezer API Endpoints - Use /track/{track_id}"}

# Fetch track metadata from Deezer API
@app.get("/track/{track_id}")
def get_track(track_id: str):
    try:
        response = requests.get(f"{DEEZER_API_URL}/track/{track_id}")
        if response.status_code != 200:
            raise HTTPException(status_code=404, detail="Track not found")
        return response.json()
    except Exception as e:
        logger.error(f"Error fetching track metadata: {e}")
        raise HTTPException(status_code=500, detail=str(e))

# Download a track and return a download URL
@app.post("/download/track/{track_id}")
def download_track(track_id: str, quality: str = "MP3_320"):
    try:
        # Fetch track link from Deezer API
        track_info = requests.get(f"{DEEZER_API_URL}/track/{track_id}").json()
        track_link = track_info.get("link")
        if not track_link:
            raise HTTPException(status_code=404, detail="Track link not found")

        # Sanitize filename
        track_title = track_info.get("title", "track")
        artist_name = track_info.get("artist", {}).get("name", "unknown")
        filename = f"{artist_name} - {track_title}.mp3".replace("/", "_")  # Sanitize filename
        filepath = os.path.join("downloads", filename)

        # Download the track using deezspot
        logger.info(f"Downloading track: {filename}")
        dl.download_trackdee(
            link_track=track_link,
            output_dir="downloads",
            quality_download=quality,
            recursive_quality=False,
            recursive_download=False
        )

        # Check if the file exists
        if not os.path.exists(filepath):
            # If the file is not found, search for files in the downloads directory
            logger.warning(f"File not found at expected path: {filepath}")
            logger.warning("Searching for downloaded files in the downloads directory...")
            downloaded_files = os.listdir("downloads")
            logger.warning(f"Files in downloads directory: {downloaded_files}")

            # Try to find the file with a similar name
            for file in downloaded_files:
                if track_title.lower() in file.lower() and artist_name.lower() in file.lower():
                    filepath = os.path.join("downloads", file)
                    logger.info(f"Found matching file: {filepath}")
                    break
            else:
                raise HTTPException(status_code=500, detail="File download failed")

        # Return the download URL
        download_url = f"/downloads/{os.path.basename(filepath)}"
        logger.info(f"Download successful: {download_url}")
        return {"download_url": download_url}
    except Exception as e:
        logger.error(f"Error downloading track: {e}")
        raise HTTPException(status_code=500, detail=str(e))

# Search tracks using Deezer API
@app.get("/search")
def search_tracks(query: str, limit: Optional[int] = 10):
    try:
        response = requests.get(f"{DEEZER_API_URL}/search", params={"q": query, "limit": limit})
        return response.json()
    except Exception as e:
        logger.error(f"Error searching tracks: {e}")
        raise HTTPException(status_code=500, detail=str(e))