aboutsummaryrefslogtreecommitdiff
path: root/app/main.py
blob: 9d5fb2e48b79cf6d92f353bdedb630926ad818de (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#!/usr/bin/env python3

import os
from aiohttp import web
import asyncio
import socketio
import time
import logging
import json

from ytdl import DownloadQueueNotifier, DownloadQueue

log = logging.getLogger('main')

class Config:
    _DEFAULTS = {
        'DOWNLOAD_DIR': '.',
    }

    def __init__(self):
        for k, v in self._DEFAULTS.items():
            setattr(self, k, os.environ[k] if k in os.environ else v)

config = Config()

class ObjectSerializer(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, object):
            return obj.__dict__
        else:
            return json.JSONEncoder.default(self, obj)

serializer = ObjectSerializer()
app = web.Application()
sio = socketio.AsyncServer()
sio.attach(app)
routes = web.RouteTableDef()

class Notifier(DownloadQueueNotifier):
    async def added(self, dl):
        await sio.emit('added', serializer.encode(dl))

    async def updated(self, dl):
        await sio.emit('updated', serializer.encode(dl))

    async def deleted(self, id):
        await sio.emit('deleted', serializer.encode(id))

dqueue = DownloadQueue(config, Notifier())

@routes.post('/add')
async def add(request):
    post = await request.json()
    url = post.get('url')
    if not url:
        raise web.HTTPBadRequest()
    status = await dqueue.add(url)
    return web.Response(text=serializer.encode(status))

@routes.post('/delete')
async def delete(request):
    post = await request.json()
    ids = post.get('ids')
    if not ids:
        raise web.HTTPBadRequest()
    status = await dqueue.delete(ids)
    return web.Response(text=serializer.encode(status))

@routes.get('/queue')
def queue(request):
    ret = dqueue.get()
    return web.Response(text=serializer.encode(ret))

@sio.event
async def connect(sid, environ):
    ret = dqueue.get()
    #ret = [["XeNTV0kyHaU", {"id": "XeNTV0kyHaU", "title": "2020 Mercedes ACTROS \u2013 Digital Side Mirrors, Electronic Stability, Auto Braking, Side Guard Safety", "url": "XeNTV0kyHaU", "status": None, "percentage": 0}], ["76wlIusQe9U", {"id": "76wlIusQe9U", "title": "Toyota HIACE 2020 \u2013 Toyota Wagon /  Toyota HIACE 2019 and 2020", "url": "76wlIusQe9U", "status": None, "percentage": 0}], ["n_d5LPwflMM", {"id": "n_d5LPwflMM", "title": "2020 Toyota GRANVIA \u2013 Toyota 8 Seater LUXURY VAN / ALL-NEW Toyota GRANVIA 2020", "url": "n_d5LPwflMM", "status": None, "percentage": 0}], ["Dv4ZFhCpF1M", {"id": "Dv4ZFhCpF1M", "title": "Toyota SIENNA 2019 vs Honda ODYSSEY 2019", "url": "Dv4ZFhCpF1M", "status": None, "percentage": 0}], ["GjHJFb3Mgqw", {"id": "GjHJFb3Mgqw", "title": "How It's Made (Buses) \u2013 How Buses are made? SETRA BUS Production", "url": "GjHJFb3Mgqw", "status": None, "percentage": 0}]]
    await sio.emit('queue', serializer.encode(ret), to=sid)

@routes.get('/')
def index(request):
    return web.FileResponse('ui/dist/metube/index.html')

routes.static('/favicon/', 'favicon')
routes.static('/', 'ui/dist/metube')

app.add_routes(routes)


if __name__ == '__main__':
    logging.basicConfig(level=logging.DEBUG)
    web.run_app(app, port=8081)
bgstack15