Compare commits
No commits in common. "54449690273128bb450a37239c2ebb8faf48c5b7" and "8720ea07fd66a99569a146f7d490d77051c22cbf" have entirely different histories.
5444969027
...
8720ea07fd
5 changed files with 20 additions and 80 deletions
|
@ -13,18 +13,7 @@ type SocketT = websockets.WebSocketServerProtocol
|
||||||
|
|
||||||
async def handler(socket: SocketT) -> None:
|
async def handler(socket: SocketT) -> None:
|
||||||
|
|
||||||
async def ydl_log_handler(level: response.YdlLogLevel, msg: str) -> None:
|
ydls = ydl_pool.Downloader(None, None) # type: ignore # TODO
|
||||||
try:
|
|
||||||
await socket.send(response.ydl_log(level, msg))
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
|
|
||||||
ydls = ydl_pool.Downloader(
|
|
||||||
ydl_pool.YdlLogger(
|
|
||||||
ydl_log_handler,
|
|
||||||
asyncio.get_event_loop(),
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
async for message in socket:
|
async for message in socket:
|
||||||
|
|
||||||
|
@ -45,7 +34,9 @@ async def handler(socket: SocketT) -> None:
|
||||||
data['url'],
|
data['url'],
|
||||||
data.get('items'),
|
data.get('items'),
|
||||||
)
|
)
|
||||||
await socket.send(response.ydl_end(ret))
|
await socket.send(response.dl_end(ret))
|
||||||
|
|
||||||
|
# TODO: cancellation
|
||||||
|
|
||||||
case _:
|
case _:
|
||||||
raise ValueError('invalid "action" field value')
|
raise ValueError('invalid "action" field value')
|
||||||
|
|
|
@ -1,7 +1,5 @@
|
||||||
import json
|
import json
|
||||||
import logging
|
import traceback
|
||||||
from typing import Literal
|
|
||||||
|
|
||||||
|
|
||||||
def playlist(items: list[str]) -> str:
|
def playlist(items: list[str]) -> str:
|
||||||
return json.dumps({
|
return json.dumps({
|
||||||
|
@ -9,25 +7,20 @@ def playlist(items: list[str]) -> str:
|
||||||
"data": items,
|
"data": items,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
def dl_progress(msg: str) -> str:
|
||||||
type YdlLogLevel = Literal['debug'] | Literal['warning'] | Literal['error']
|
|
||||||
|
|
||||||
def ydl_log(level: YdlLogLevel, msg: str) -> str:
|
|
||||||
return json.dumps({
|
return json.dumps({
|
||||||
"type": "ydl_log",
|
"type": "dl_progress",
|
||||||
"level": level,
|
|
||||||
"data": msg,
|
"data": msg,
|
||||||
})
|
})
|
||||||
|
|
||||||
def ydl_end(ret: int) -> str:
|
def dl_end(ret: int) -> str:
|
||||||
return json.dumps({
|
return json.dumps({
|
||||||
"type": "ydl_end",
|
"type": "dl_end",
|
||||||
"data": ret,
|
"data": ret,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
def error(ex: Exception) -> str:
|
def error(ex: Exception) -> str:
|
||||||
logging.getLogger('musicdlp').exception(ex)
|
traceback.print_tb(ex.__traceback__)
|
||||||
return json.dumps({
|
return json.dumps({
|
||||||
"type": "error",
|
"type": "error",
|
||||||
"data": {
|
"data": {
|
||||||
|
|
|
@ -1,12 +1,10 @@
|
||||||
import asyncio
|
import asyncio
|
||||||
import logging
|
|
||||||
from typing import Callable, Awaitable, Iterable
|
from typing import Callable, Awaitable, Iterable
|
||||||
|
|
||||||
from yt_dlp import YoutubeDL
|
from yt_dlp import YoutubeDL
|
||||||
from yt_dlp.postprocessor import FFmpegExtractAudioPP
|
from yt_dlp.postprocessor import FFmpegExtractAudioPP
|
||||||
|
|
||||||
import config
|
import config
|
||||||
import response
|
|
||||||
import id3pp
|
import id3pp
|
||||||
|
|
||||||
|
|
||||||
|
@ -42,33 +40,12 @@ ydl_fn_keys = create_ydl_fn.keys()
|
||||||
NP_YDLS = {'yandex'}
|
NP_YDLS = {'yandex'}
|
||||||
|
|
||||||
|
|
||||||
class YdlLogger:
|
class Downloader:
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
log_cb: Callable[[response.YdlLogLevel, str], Awaitable],
|
progress_cb: Callable[[str], Awaitable],
|
||||||
loop: asyncio.AbstractEventLoop) -> None:
|
lyrics_cb: Callable[[list[str]], Awaitable]) -> None:
|
||||||
self.log_cb = log_cb
|
|
||||||
self.loop = loop
|
|
||||||
self.mdlp_logger = logging.getLogger('musicdlp')
|
|
||||||
|
|
||||||
def debug(self, msg: str) -> None:
|
|
||||||
asyncio.run_coroutine_threadsafe(self.log_cb('debug', msg), self.loop)
|
|
||||||
|
|
||||||
def info(self, _: str) -> None: # afaik not used in yt-dlp
|
|
||||||
pass
|
|
||||||
|
|
||||||
def warning(self, msg: str) -> None:
|
|
||||||
asyncio.run_coroutine_threadsafe(self.log_cb('warning', msg), self.loop)
|
|
||||||
|
|
||||||
def error(self, msg: str) -> None:
|
|
||||||
self.mdlp_logger.error(msg)
|
|
||||||
asyncio.run_coroutine_threadsafe(self.log_cb('error', msg), self.loop)
|
|
||||||
|
|
||||||
|
|
||||||
class Downloader:
|
|
||||||
|
|
||||||
def __init__(self, logger: YdlLogger | None = None) -> None:
|
|
||||||
|
|
||||||
self.ydls: dict[str, YoutubeDL | None] = {
|
self.ydls: dict[str, YoutubeDL | None] = {
|
||||||
'youtube': None,
|
'youtube': None,
|
||||||
|
@ -79,9 +56,8 @@ class Downloader:
|
||||||
self.cur_ydl: YoutubeDL | None = None
|
self.cur_ydl: YoutubeDL | None = None
|
||||||
self.cur_site = ''
|
self.cur_site = ''
|
||||||
|
|
||||||
self.id3pp_obj = id3pp.ID3TagsPP()
|
self.progress_cb = progress_cb
|
||||||
|
self.lyrics_cb = lyrics_cb
|
||||||
self.logger = logger
|
|
||||||
|
|
||||||
def choose_ydl(self, site: str) -> None:
|
def choose_ydl(self, site: str) -> None:
|
||||||
|
|
||||||
|
@ -91,11 +67,8 @@ class Downloader:
|
||||||
if ydl is None:
|
if ydl is None:
|
||||||
ydl = create_ydl_fn[site]()
|
ydl = create_ydl_fn[site]()
|
||||||
|
|
||||||
if self.logger is not None:
|
|
||||||
ydl.params['logger'] = self.logger
|
|
||||||
|
|
||||||
ydl.params['outtmpl']['default'] = cfg.tmpl
|
ydl.params['outtmpl']['default'] = cfg.tmpl
|
||||||
ydl.add_post_processor(self.id3pp_obj, when='post_process')
|
ydl.add_post_processor(id3pp.ID3TagsPP(), when='post_process')
|
||||||
|
|
||||||
cookies = cfg.cookies_dir / (site + '.txt')
|
cookies = cfg.cookies_dir / (site + '.txt')
|
||||||
if cookies.exists():
|
if cookies.exists():
|
||||||
|
|
|
@ -27,7 +27,7 @@
|
||||||
<button type="button" id="dl-btn">Download</button>
|
<button type="button" id="dl-btn">Download</button>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<pre><code id="log"></code></pre>
|
<label>Progress: <span id="progress">not implemented</span></label>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -21,15 +21,12 @@ addEventListener('DOMContentLoaded', () => {
|
||||||
const itemsDiv = document.getElementById('items-container')
|
const itemsDiv = document.getElementById('items-container')
|
||||||
let items = []
|
let items = []
|
||||||
|
|
||||||
const logField = document.getElementById('log')
|
|
||||||
|
|
||||||
document.getElementById('items-btn').addEventListener('click', () => {
|
document.getElementById('items-btn').addEventListener('click', () => {
|
||||||
socket.send(JSON.stringify({
|
socket.send(JSON.stringify({
|
||||||
action: 'list',
|
action: 'list',
|
||||||
site: site.value,
|
site: site.value,
|
||||||
url: urlField.value,
|
url: urlField.value,
|
||||||
}))
|
}))
|
||||||
logField.textContent = '' // clear
|
|
||||||
})
|
})
|
||||||
|
|
||||||
document.getElementById('dl-btn').addEventListener('click', () => {
|
document.getElementById('dl-btn').addEventListener('click', () => {
|
||||||
|
@ -40,14 +37,13 @@ addEventListener('DOMContentLoaded', () => {
|
||||||
items: items,
|
items: items,
|
||||||
}))
|
}))
|
||||||
items = []
|
items = []
|
||||||
logField.textContent = ''
|
|
||||||
})
|
})
|
||||||
|
|
||||||
socket.addEventListener('message', ev => {
|
socket.addEventListener('message', ev => {
|
||||||
const msg = JSON.parse(ev.data)
|
const msg = JSON.parse(ev.data)
|
||||||
switch (msg.type) {
|
switch (msg.type) {
|
||||||
case 'items':
|
case 'items':
|
||||||
itemsDiv.textContent = ''
|
itemsDiv.textContent = '' // clear
|
||||||
const len = msg.data.length
|
const len = msg.data.length
|
||||||
for (let i = 1; i <= len; i++) {
|
for (let i = 1; i <= len; i++) {
|
||||||
const itemElem = document.createElement('label')
|
const itemElem = document.createElement('label')
|
||||||
|
@ -66,22 +62,9 @@ addEventListener('DOMContentLoaded', () => {
|
||||||
itemsDiv.append(itemElem)
|
itemsDiv.append(itemElem)
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
case 'ydl_log':
|
case 'dl_progress':
|
||||||
const lineElem = document.createElement('span')
|
|
||||||
switch (msg.level) {
|
|
||||||
case 'warning':
|
|
||||||
lineElem.className = 'log-warning'
|
|
||||||
break
|
break
|
||||||
case 'error':
|
case 'dl_end':
|
||||||
lineElem.className = 'log-error'
|
|
||||||
break
|
|
||||||
default: // add no classes if `debug` or some unknown level
|
|
||||||
break
|
|
||||||
}
|
|
||||||
lineElem.innerText = msg.data + '\n'
|
|
||||||
logField.append(lineElem)
|
|
||||||
break
|
|
||||||
case 'ydl_end':
|
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
Loading…
Add table
Reference in a new issue