import html
from hashlib import sha1
from peewee import fn
from aiofiles.tempfile import NamedTemporaryFile
from db import db
from db import Video, User, Like, Tag, VideoTag
from tools import parse_tags, parse_offset
from tools import probe_video, create_preview
from tools import save_content
class VideoError(Exception): pass
async def find_video_by_id(video_id):
try:
video_id = int(video_id)
video_id = abs(video_id)
except ValueError:
raise VideoError('illegal video_id')
try:
return await db.get(Video
.select(Video, User)
.join(User)
.switch(Video)
.where(
(Video.id == video_id) &
(~Video.is_hidden)
))
except Video.DoesNotExist:
raise VideoError('video is unavailable or doesn\'t exist')
async def get_tags(video_id):
video = await find_video_by_id(video_id)
tags = await db.execute(Tag
.select()
.join(VideoTag)
.join(Video)
.where(Video.id == video.id))
return [tag.tag for tag in tags]
async def get_likes(video_id):
video = await find_video_by_id(video_id)
return await db.count(Like
.select(Like, Video)
.join(Video)
.switch(Like)
.where(Like.video.id == video.id))
async def get_random_video():
return await db.get(Video
.select(Video, User)
.join(User)
.switch(Video)
.order_by(fn.Random())
.limit(1))
async def serialize_video(video):
return {
'id': video.id,
'upload_ts': int(video.upload_date.timestamp()),
'thumbnail': video.thumbnail,
'uploader_id': video.uploader.id,
'likes_count': await get_likes(video.id),
'tags_list': await get_tags(video.id)
}