KaruMediaServer/api/karumedia/controllers.py

113 lines
3.3 KiB
Python

import os
import re
import json
from . import tasks
from falcon import HTTPInternalServerError, HTTP_201
from bson.objectid import ObjectId
from .tools import TODOException
from .models import *
from pprint import pprint
from urllib.parse import quote
movie_name_and_year = re.compile("(.*)\((.*)\)")
class BaseMovieResource():
def __init__(self, path):
self.path = path
def build_movie_object(media):
mobj = {
"title":media.title,
"title_english":media.title,
"title_long": f"{media.title} ({media.year})",
"year":media.year,
"imdb_code": media.imdb_id,
"rating": media.rating,
"summary": media.plot_outline,
"synopsis": media.plot_outline,
"mpa_rating": media.mpa_rating,
"genres": media.genres,
"yt_trailer_code": media.yt_trailer_code,
"state": "ok",
"id": media.id
}
try:
mobj["runtime"] = media.runtime // 100
except:
pass
if media.plots:
mobj["description_full"] = media.plots[0]
relevant_tasks = list(Task.objects(imdb_id=media.imdb_id, state__ne="done"))
if relevant_tasks:
pprint(relevant_tasks)
mobj["state"] = "tasks_running"
mobj["relevant_tasks"] = [task.id for task in relevant_tasks]
mobj["streams"] = {}
stream_urls = list(MediaFile.objects(media=media))
if stream_urls:
mobj["streams"] = {media_file.resolution: media_file.url for media_file in stream_urls if media_file.mimetype.startswith("video")}
mobj["small_cover_image"] = f"https://media.arti.ee/Filmid/{quote(mobj['title_long'])}/cover.jpg"
mobj["medium_cover_image"] = mobj["small_cover_image"]
mobj["large_cover_image"] = mobj["medium_cover_image"]
return mobj
class MoviesCollection(BaseMovieResource):
def on_get(self, req, resp):
movies = []
for media in Media.objects:
movies.append(build_movie_object(media))
jobj = {"data":{
"limit":len(movies),
"count":len(movies),
"movies":movies,
"page_number":1
},
"status": "ok",
"status_message": "query was successful"
}
resp.json = jobj
class MoviesResource(BaseMovieResource):
def on_get(self, req, resp, movie):
try:
media = Media.objects.get(id=movie)
except ValidationError:
media = Media.objects.get(imdb_id=movie)
resp.json = build_movie_object(media)
class MagnetResource():
def on_post(self, req, resp):
json = req.json
if not 'info_hash' in json:
raise ValueError("info_hash missing from request")
task = TaskMetainfoDl(info_hash=json['info_hash'])
task.imdb_code = json.get('imdb_code')
task.save()
tasks.metainfo_dl(str(task.id))
resp.json = {"task_id":task.id}
class TaskCollection():
def on_get(self, req, resp):
tasks = list()
for task in Task.objects:
tasks.append(task.to_mongo())
resp.json = tasks
class TaskResource():
def on_get(self, req, resp, task_id):
task = Task.objects.get(id=task_id)
resp.json = task.to_mongo()
def on_delete(self, req, resp, task_id):
Task.objects(id=task_id).delete()