from asyncio.log import logger from api import api_errors from api.api_errors import BadRequestError from api.resources import AdminResource, AuthenticatedResource from tracker import db from datetime import datetime from flask import request from tracker.spidering.spider import ScArtistInfoSource from tracker.utils import a_datetime from tracker.soundcloud import ensure_tracks_from_scids from tracker import soundcloud def _build_results(users_json_list): existing_scids = set( [ r[0] for r in db.Session.execute( "select scid from sc_users where scid = any (:scids)", params=dict(scids=[u["id"] for u in users_json_list]), ).fetchall() ] ) return [dict(u, exists=(u["id"] in existing_scids)) for u in users_json_list] class SoundCloudTrackAdmin(AuthenticatedResource): def post(self): scids = [int(i) for i in (request.json.get("scids") or []) if i] ensure_tracks_from_scids(scids) return {"count": len(scids)} class SoundcloudAdmin(AuthenticatedResource): def get(self): query: str = request.args.get("q") if not query or len(query) < 3: raise BadRequestError("Provide something to search for on soundcloud") if "soundcloud.com" not in query: raise BadRequestError("Not a resolvable url") try: info = soundcloud.resolve_generic(query) return {"info", info.obj} except Exception as e: logger.exception(f"Failed to resolve {query}") raise api_errors.NotFoundError(f"No info found for: {query}") def put(self): data = request.json if not data: raise BadRequestError("Empty body") if "id" not in data: raise BadRequestError('Requires {"id":}') u = soundcloud.get_user(data["id"]) if not u: raise api_errors.NotFoundError(f"No artist for id {u['id']}") sc_user: db.ScUser = ScArtistInfoSource().upsert(u, include_track_search=True) return {"scid": sc_user.scid, "name": sc_user.name}