from flask import request from tracker import db from . import ChartResource, charts from api import models class TikTokLatest(ChartResource): def post(self): limit = 20 offset = int(request.args.get("offset") or "0") username = self.user.name if request.args.get("sample"): return sample filters = charts.get_filters(request, publishedDaysAgo=2) interval = '{} days'.format(filters.get('publishedDaysAgo')) ids_list = self.Session.execute( """ select v.ytid, (max(s.like_count)*10 + max(s.comment_count)*100 + max(s.view_count))::float / (extract(epoch from max(s.as_of) - min(v.published)))::float as views_per_second from yt_videos v join yt_channel_videos cv on cv.video_ytid = v.ytid join users_yt_channels uch on uch.ytid = cv.channel_ytid and uch.username = :username join yt_video_statistics s on s.video_ytid = v.ytid where published > now() - INTERVAL :interval group by v.ytid order by 2 desc limit :limit offset :offset """, params=dict(username=username, limit=limit, offset=offset, interval=interval), ).fetchall() videos = list(models.youtube_videos([i[0] for i in ids_list])) next_api = "/api/charts/YouTubeNew?offset={}".format(offset + limit) if ids_list else None return { "nextApi": next_api, "results": [ { "video_ytid": r[0], "video": next((v["video"] for v in videos if v["ytid"] == r[0]), None), } for r in ids_list ], }