from flask import Blueprint, jsonify from flask_apispec import doc, marshal_with, use_kwargs from http import HTTPStatus from src.constants.include import HHTrackInclude, NMFTrackInclude from src.legacy.apollo_api.util import hothits from src.legacy.core.pagination import paginate from src.legacy.core.util import multikeysort from src.legacy.redis_db import keys from src.legacy.spotify.vendor import SpotifyNewMusicFriday from src.schemas.tracks import playlists as serializers blueprint = Blueprint("tracks_playlists", __name__) @blueprint.route("/tracks/playlists/hot-hits/", methods=["GET"]) @doc("Hot Hits playlists by track.") @use_kwargs(serializers.TracksPlaylistsHH.Request, location="query") @marshal_with( serializers.TracksPlaylistsHH.Response, code=HTTPStatus.OK, description="Hot Hits track playlists.", apply=False ) @marshal_with(None, code=HTTPStatus.UNAUTHORIZED, description="Authentication failed.") @paginate( cache_key_template=keys.TRACKS_PLAYLISTS_HH, cache_ttl=keys.TRACKS_PLAYLISTS_HH_TTL, full_data=True, response_kwargs=True, ) def get_track_playlists_hot_hits(**data): isrc, region, include, order_by = data["isrc"], data["region"], data["include"], data["order_by"] items, region_list, region_data, average_position, top_10_total = hothits.get_hot_hits_single_track_in_playlists( isrc, region_code=region, include_inactive_markets=(HHTrackInclude.INACTIVE_MARKETS.value in include), with_name=False, ) items = multikeysort(items, order_by) extra = { "positions_avg": average_position, "positions_top_total": top_10_total, "total": region_data.get("total", 0), } if HHTrackInclude.REGIONS.value in include: extra["regions"] = region_list return items, extra @blueprint.route("/tracks/playlists/hot-hits/bulk/", methods=["GET"]) @doc("Tracks entries to hot hits playlists.") @use_kwargs(serializers.TracksPlaylistsHHBulk.Request, location="query") @marshal_with(serializers.TracksPlaylistsHHBulk.Response, code=HTTPStatus.OK, description="Tracks hot hits.") @marshal_with(None, code=HTTPStatus.UNAUTHORIZED, description="Authentication failed.") def get_tracks_playlists_hot_hits_bulk(**data): result = hothits.get_hot_hits_multiple_tracks_in_playlists(with_name=False, **data) return jsonify(serializers.TracksPlaylistsHHBulk.Response().dump(result)) @blueprint.route("/tracks/playlists/nmf/", methods=["GET"]) @doc("Track in New music friday playlists.") @use_kwargs(serializers.TracksPlaylistsNMF.Request, location="query") @marshal_with( serializers.TracksPlaylistsNMF.Response, code=HTTPStatus.OK, description="NMF track playlists.", apply=False ) @marshal_with(None, code=HTTPStatus.UNAUTHORIZED, description="Authentication failed") @paginate( cache_key_template=keys.TRACKS_PLAYLISTS_NMF, cache_ttl=keys.TRACKS_PLAYLISTS_NMF_TTL, full_data=True, response_kwargs=True, ) def get_tracks_playlists_nmf(**data): vendor = SpotifyNewMusicFriday() isrc, region, include, order_by = data["isrc"], data["region"], data["include"], data["order_by"] available_dates = vendor.get_available_dates() latest_date = max(available_dates) items, region_list, region_data, average_position, top_10_total = vendor.get_track_playlists( isrc=isrc, nmf_date=latest_date, include_inactive_markets=(NMFTrackInclude.INACTIVE_MARKETS.value in include), region_code=region, with_name=False, ) items = multikeysort(items, order_by) extra = { "positions_avg": average_position, "positions_top_total": top_10_total, "total": region_data.get("total", 0), } if NMFTrackInclude.TOP_PLAYLIST_IMAGE_URL.value in include: extra["top_playlist_image_url"] = items[0]["image_url"] if items else None if NMFTrackInclude.REGIONS.value in include: extra["regions"] = region_list return items, extra