initial commit
This commit is contained in:
72
backend/app/routes/music.py
Normal file
72
backend/app/routes/music.py
Normal file
@@ -0,0 +1,72 @@
|
||||
from fastapi import APIRouter, Depends, UploadFile, File, Form, HTTPException
|
||||
from fastapi.responses import FileResponse
|
||||
from sqlalchemy.orm import Session
|
||||
from typing import List
|
||||
from pydantic import BaseModel
|
||||
import shutil
|
||||
import os
|
||||
from app.database import get_db
|
||||
from app.models.models import Song, User
|
||||
from app.auth import get_current_user
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
class SongResponse(BaseModel):
|
||||
id: int
|
||||
title: str
|
||||
artist: str
|
||||
file_path: str
|
||||
cover_path: str | None
|
||||
duration: int
|
||||
owner_id: int
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
|
||||
@router.post("/upload")
|
||||
async def upload_song(
|
||||
title: str = Form(...),
|
||||
artist: str = Form(...),
|
||||
duration: int = Form(...),
|
||||
file: UploadFile = File(...),
|
||||
cover: UploadFile = File(None),
|
||||
current_user: User = Depends(get_current_user),
|
||||
db: Session = Depends(get_db)
|
||||
):
|
||||
file_path = f"uploads/music/{current_user.id}_{file.filename}"
|
||||
with open(file_path, "wb") as buffer:
|
||||
shutil.copyfileobj(file.file, buffer)
|
||||
|
||||
cover_path = None
|
||||
if cover:
|
||||
cover_path = f"uploads/covers/{current_user.id}_{cover.filename}"
|
||||
with open(cover_path, "wb") as buffer:
|
||||
shutil.copyfileobj(cover.file, buffer)
|
||||
|
||||
song = Song(
|
||||
title=title,
|
||||
artist=artist,
|
||||
file_path=file_path,
|
||||
cover_path=cover_path,
|
||||
duration=duration,
|
||||
owner_id=current_user.id
|
||||
)
|
||||
db.add(song)
|
||||
db.commit()
|
||||
db.refresh(song)
|
||||
return song
|
||||
|
||||
@router.get("/songs", response_model=List[SongResponse])
|
||||
def get_songs(db: Session = Depends(get_db)):
|
||||
return db.query(Song).all()
|
||||
|
||||
@router.get("/my-songs", response_model=List[SongResponse])
|
||||
def get_my_songs(current_user: User = Depends(get_current_user), db: Session = Depends(get_db)):
|
||||
return db.query(Song).filter(Song.owner_id == current_user.id).all()
|
||||
|
||||
@router.get("/download/{song_id}")
|
||||
def download_song(song_id: int, db: Session = Depends(get_db)):
|
||||
song = db.query(Song).filter(Song.id == song_id).first()
|
||||
if not song:
|
||||
raise HTTPException(status_code=404, detail="Song not found")
|
||||
return FileResponse(song.file_path, filename=f"{song.title}.mp3")
|
||||
Reference in New Issue
Block a user