swingmusic/server/app/api/playlist.py
2022-07-06 17:38:33 +03:00

143 lines
3.8 KiB
Python

"""
Contains all the playlist routes.
"""
from datetime import datetime
from app import api
from app import exceptions
from app import instances
from app import models
from app import serializer
from app.helpers import create_new_date
from app.helpers import Get
from app.helpers import UseBisection
from app.lib import playlistlib
from flask import Blueprint
from flask import request
playlist_bp = Blueprint("playlist", __name__, url_prefix="/")
PlaylistExists = exceptions.PlaylistExists
TrackExistsInPlaylist = exceptions.TrackExistsInPlaylist
@playlist_bp.route("/playlists", methods=["GET"])
def get_all_playlists():
"""Returns all the playlists."""
dbplaylists = instances.playlist_instance.get_all_playlists()
dbplaylists = [models.Playlist(p) for p in dbplaylists]
playlists = [
serializer.Playlist(p, construct_last_updated=False)
for p in dbplaylists
]
playlists.sort(
key=lambda p: datetime.strptime(p.lastUpdated, "%Y-%m-%d %H:%M:%S"),
reverse=True,
)
return {"data": playlists}
@playlist_bp.route("/playlist/new", methods=["POST"])
def create_playlist():
data = request.get_json()
data = {
"name": data["name"],
"description": "",
"pre_tracks": [],
"lastUpdated": create_new_date(),
"image": "",
"thumb": "",
}
dbp = instances.playlist_instance.get_playlist_by_name(data["name"])
if dbp is not None:
return {"message": "Playlist already exists."}, 409
upsert_id = instances.playlist_instance.insert_playlist(data)
p = instances.playlist_instance.get_playlist_by_id(upsert_id)
playlist = models.Playlist(p)
return {"playlist": playlist}, 201
@playlist_bp.route("/playlist/<playlist_id>/add", methods=["POST"])
def add_track_to_playlist(playlist_id: str):
data = request.get_json()
trackid = data["track"]
try:
playlistlib.add_track(playlist_id, trackid)
except TrackExistsInPlaylist:
return {"error": "Track already exists in playlist"}, 409
return {"msg": "I think It's done"}, 200
@playlist_bp.route("/playlist/<playlistid>")
def get_playlist(playlistid: str):
p = instances.playlist_instance.get_playlist_by_id(playlistid)
if p is None:
return {"info": {}, "tracks": []}
playlist = models.Playlist(p)
tracks = playlistlib.create_playlist_tracks(playlist.pretracks)
duration = sum([t.length for t in tracks])
playlist = serializer.Playlist(playlist)
playlist.duration = duration
return {"info": playlist, "tracks": tracks}
@playlist_bp.route("/playlist/<playlistid>/update", methods=["PUT"])
def update_playlist(playlistid: str):
image = None
if "image" in request.files:
image = request.files["image"]
data = request.form
playlist = {
"name": str(data.get("name")).strip(),
"description": str(data.get("description").strip()),
"lastUpdated": create_new_date(),
"image": None,
"thumb": None,
}
playlists = Get.get_all_playlists()
p = UseBisection(playlists, "playlistid", [playlistid])()
p: models.Playlist = p[0]
if playlist is not None:
if image:
image_, thumb_ = playlistlib.save_p_image(image, playlistid)
playlist["image"] = image_
playlist["thumb"] = thumb_
else:
playlist["image"] = p.image.split("/")[-1]
playlist["thumb"] = p.thumb.split("/")[-1]
p.update_playlist(playlist)
instances.playlist_instance.update_playlist(playlistid, playlist)
return {
"data": serializer.Playlist(p),
}
return {"msg": "Something shady happened"}, 500
# @playlist_bp.route("/playlist/<playlist_id>/info")
# def get_playlist_track(playlist_id: str):
# tracks = playlistlib.get_playlist_tracks(playlist_id)
# return {"data": tracks}