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)
  }