Compare commits

..

2 commits

Author SHA1 Message Date
d0ed29e685
Optimize extract_info: no process=True for YouTube
For YT, processing separate videos greatly increases extract_info time,
but unnecessary when obtaining only track title.

For Yandex, processing is much faster, and we NEED it to get title.
2024-05-06 21:07:19 +04:00
1eb1e2c827
Working frontend!! No download progress yet, and no cool CSS 2024-05-06 21:01:53 +04:00
3 changed files with 62 additions and 3 deletions

View file

@ -36,6 +36,9 @@ create_ydl_fn = {
ydl_fn_keys = create_ydl_fn.keys() ydl_fn_keys = create_ydl_fn.keys()
# need process=True for track title in extract_info output
NP_YDLS = {'yandex'}
class Downloader: class Downloader:
@ -51,6 +54,7 @@ class Downloader:
} }
self.cur_ydl: YoutubeDL | None = None self.cur_ydl: YoutubeDL | None = None
self.cur_site = ''
self.progress_cb = progress_cb self.progress_cb = progress_cb
self.lyrics_cb = lyrics_cb self.lyrics_cb = lyrics_cb
@ -71,6 +75,7 @@ class Downloader:
ydl.params['cookiefile'] = str(cookies) ydl.params['cookiefile'] = str(cookies)
self.cur_ydl = ydl self.cur_ydl = ydl
self.cur_site = site
def get_cur_ydl(self) -> YoutubeDL: def get_cur_ydl(self) -> YoutubeDL:
@ -86,12 +91,13 @@ class Downloader:
Downloader._target_get_playlist_items, Downloader._target_get_playlist_items,
self.get_cur_ydl(), self.get_cur_ydl(),
url, url,
self.cur_site in NP_YDLS,
) )
@staticmethod @staticmethod
def _target_get_playlist_items(ydl: YoutubeDL, url: str) -> list[str]: def _target_get_playlist_items(ydl: YoutubeDL, url: str, process: bool) -> list[str]:
info = ydl.extract_info(url, download=False, process=True) info = ydl.extract_info(url, download=False, process=process)
if info is None: if info is None:
raise RuntimeError('ydl.extract_info returned None') raise RuntimeError('ydl.extract_info returned None')
return [ return [

View file

@ -24,7 +24,7 @@
</div> </div>
<div id="items-container"></div> <div id="items-container"></div>
<div> <div>
<button type="button">Download</button> <button type="button" id="dl-btn">Download</button>
</div> </div>
<div> <div>
<label>Progress: <span id="progress">not implemented</span></label> <label>Progress: <span id="progress">not implemented</span></label>

View file

@ -15,4 +15,57 @@ addEventListener('DOMContentLoaded', () => {
site.value = 'yandex' site.value = 'yandex'
} }
}) })
const socket = new WebSocket('ws://127.0.0.1:4009')
const itemsDiv = document.getElementById('items-container')
let items = []
document.getElementById('items-btn').addEventListener('click', () => {
socket.send(JSON.stringify({
action: 'list',
site: site.value,
url: urlField.value,
}))
})
document.getElementById('dl-btn').addEventListener('click', () => {
socket.send(JSON.stringify({
action: 'download',
site: site.value,
url: urlField.value,
items: items,
}))
items = []
})
socket.addEventListener('message', ev => {
const msg = JSON.parse(ev.data)
switch (msg.type) {
case 'items':
itemsDiv.textContent = '' // clear
const len = msg.data.length
for (let i = 1; i <= len; i++) {
const itemElem = document.createElement('label')
const itemCheckbox = document.createElement('input')
itemCheckbox.type = 'checkbox'
itemCheckbox.addEventListener('change', () => {
if (itemCheckbox.checked) {
items.push(i)
} else {
items.splice(items.indexOf(i), 1)
}
})
itemElem.append(itemCheckbox)
itemText = document.createTextNode(msg.data[i - 1])
itemElem.append(itemText)
itemsDiv.append(itemElem)
}
break
case 'dl_progress':
break
case 'dl_end':
break
}
})
}) })