From 665468a1a64c9ac656e51dbbf06abe186655ec4b Mon Sep 17 00:00:00 2001 From: scoobybejesus Date: Sun, 5 Feb 2023 18:33:57 +0000 Subject: [PATCH] So many changes in one commit. --- .gitignore | 3 ++ favicon.ico | Bin 0 -> 12014 bytes ircradio.pid | 1 + ircradio/routes.py | 30 ++++++++++++- ircradio/site.webmanifest | 19 ++++++++ ircradio/static/search.js | 79 ++++++++++++++++++++++++++++++++++ ircradio/templates/base.html | 36 ++++++++++++++++ ircradio/templates/index.html | 63 +++++++++++++++++++++------ ircradio/youtube.py | 4 +- requirements.txt | 3 +- 10 files changed, 221 insertions(+), 17 deletions(-) create mode 100644 favicon.ico create mode 100644 ircradio.pid create mode 100644 ircradio/site.webmanifest create mode 100644 ircradio/static/search.js diff --git a/.gitignore b/.gitignore index 74ebd4d..e868eaf 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,9 @@ data/music/*.webp data/music/*.ogg* __pycache__ settings.py +data/* +!data/agents.txt +venv/ ircradio/static/favicons/ ircradio/favicon.ico ircradio/site.manifest diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c0be3a9e2aceba1dbfff5da49407215da7e8d7be GIT binary patch literal 12014 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 glIY!ET1)@D`cvvhq+QyfE0OwJuz% { + try { + const res = await fetch(url); + console.log("Status code 200 or similar: " + res.ok); + const data = await res.json(); + return data; + } catch(err) { + console.error(err) + } + }; + + LoadData().then(newSongsJson => { + newSongsJson.forEach( (new_song) => { + let already_have = false; + songs.forEach( (_v, key) => { + if (new_song.id == key) { already_have = true; return; }; + }) + if (!already_have) { songs.set(new_song.utube_id, new_song) } + }) + }).then( () => { returned = true } ); + + }; + + function renderTable () { + + if (returned) { + + $("#table tr").remove(); + + var filtered = new Map( + [...songs] + .filter(([k, v]) => + ( v.title.toLowerCase().includes( input_so_far.toLowerCase() ) ) || + ( v.added_by.toLowerCase().includes( input_so_far.toLowerCase() ) ) ) + ); + + filtered.forEach( (song) => { + let added = song.added_by; + let added_link = '' + added + ''; + let title = song.title; + let id = song.utube_id; + let id_link = '' + id + ''; + $('#table tbody').append(''+id_link+''+added_link+''+title+'') + }) + + } else { + setTimeout(renderTable, 30); // try again in 30 milliseconds + } + }; + + renderTable(); + +}); diff --git a/ircradio/templates/base.html b/ircradio/templates/base.html index a4b8b90..4dd653e 100644 --- a/ircradio/templates/base.html +++ b/ircradio/templates/base.html @@ -29,7 +29,43 @@ IRC!Radio ala Scoob! + + + + + + + + + + + + + + + + + diff --git a/ircradio/templates/index.html b/ircradio/templates/index.html index 7b90635..561c96a 100644 --- a/ircradio/templates/index.html +++ b/ircradio/templates/index.html @@ -4,17 +4,28 @@
-
+
-

+

IRC!Radio ala Scoob!

-

+

Thanks, dsc_! -
+

Enjoy the music :)

+
+ +

+ +

Now playing:

+
+ +
Previous:
+
Nothing here yet
+
+

Command list:

@@ -35,29 +46,52 @@
+
-
-

Library - (by user) +
+ +

View User Library +

-
-
+ +
-
-
-
+

+
+ +
+
+

Quick Search + (general) +

+
+ +
+
+
+ + + + + +
+
+
+ +
+

IRC

{{ settings.irc_host }}:{{ settings.irc_port }}
 {{ settings.irc_channels | join(" ") }}
@@ -65,4 +99,7 @@
     
+ + + {% endblock %} diff --git a/ircradio/youtube.py b/ircradio/youtube.py index 77f4b6a..60b9d04 100644 --- a/ircradio/youtube.py +++ b/ircradio/youtube.py @@ -36,7 +36,9 @@ class YouTube: try: proc = await asyncio.create_subprocess_exec( - *["youtube-dl", + *[ + #"/home/radio/ircradio/venv/bin/youtube-dl", + "youtube-dl", "--add-metadata", "--write-all-thumbnails", "--write-info-json", diff --git a/requirements.txt b/requirements.txt index 1b39095..b58bb7e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,7 +4,6 @@ aiofiles aiohttp bottom tinytag -peewee python-dateutil mutagen -peewee \ No newline at end of file +peewee