Shows destinations

This commit is contained in:
2026-09-07 17:26:07 -06:00
parent fad252a099
commit 66144e92d4
2 changed files with 64 additions and 8 deletions
+29 -7
View File
@@ -15,7 +15,7 @@ import mutagen
from mutagen.easyid3 import EasyID3 from mutagen.easyid3 import EasyID3
from mutagen.mp3 import MP3 from mutagen.mp3 import MP3
from mutagen.id3 import ID3, APIC from mutagen.id3 import ID3, APIC
from flask import Flask, render_template, request, jsonify from flask import Flask, render_template, request, jsonify, send_file
MUSIC_FOLDER = "Music" MUSIC_FOLDER = "Music"
@@ -33,6 +33,7 @@ class ReleaseInfo:
class ReleaseStatus: class ReleaseStatus:
info: ReleaseInfo | None info: ReleaseInfo | None
status: str status: str
destinations: set[str]
class RipError(Exception): class RipError(Exception):
@@ -178,7 +179,9 @@ def find_tmp_path() -> str:
return f"{project_root_path}/tmp" return f"{project_root_path}/tmp"
def sort_into_music(path: str, info: ReleaseInfo) -> None: def sort_into_music(path: str, info: ReleaseInfo) -> set[str]:
destinations: set[str] = set()
try: try:
for file_name in os.listdir(path): for file_name in os.listdir(path):
if file_name == "cover.jpg": if file_name == "cover.jpg":
@@ -218,11 +221,15 @@ def sort_into_music(path: str, info: ReleaseInfo) -> None:
source_file_path_cover = os.path.join(path, "cover.jpg") source_file_path_cover = os.path.join(path, "cover.jpg")
shutil.copy(source_file_path_cover, release_path) shutil.copy(source_file_path_cover, release_path)
destinations.add(release_path)
except Exception: except Exception:
raise RipError("Filesystem error") raise RipError("Filesystem error")
return destinations
def rip_worker(rip_queue: list[str], status_callback: Callable[[ReleaseInfo | str, bool],]):
def rip_worker(rip_queue: list[str], status_callback: Callable[[ReleaseInfo | str | set[str], bool],]):
tmp_path = find_tmp_path() tmp_path = find_tmp_path()
while True: while True:
@@ -259,7 +266,8 @@ def rip_worker(rip_queue: list[str], status_callback: Callable[[ReleaseInfo | st
raise RipError("No content was downloaded") raise RipError("No content was downloaded")
status_callback("Sorting content", False) status_callback("Sorting content", False)
sort_into_music(tmp_path, info) destinations = sort_into_music(tmp_path, info)
status_callback(destinations, False)
except RipError as e: except RipError as e:
status_callback(e.msg, True) status_callback(e.msg, True)
@@ -278,10 +286,12 @@ if __name__ == "__main__":
current_release_info: ReleaseInfo | None = None current_release_info: ReleaseInfo | None = None
current_release_status_message: str = "" current_release_status_message: str = ""
current_release_destinations: set[str] = set()
def get_current_release_status(x: ReleaseInfo | str, finished: bool): def get_current_release_status(x: ReleaseInfo | str | set[str], finished: bool):
global current_release_info global current_release_info
global current_release_status_message global current_release_status_message
global current_release_destinations
global finished_queue global finished_queue
if type(x) is ReleaseInfo: if type(x) is ReleaseInfo:
@@ -290,13 +300,19 @@ if __name__ == "__main__":
elif type(x) is str: elif type(x) is str:
current_release_status_message = x current_release_status_message = x
elif type(x) is set:
current_release_destinations = x.copy()
if finished: if finished:
if current_release_info is None: if current_release_info is None:
current_release_info = ReleaseInfo("Unknown", "Unknown", "url", False, False) current_release_info = ReleaseInfo("Unknown", "Unknown", "url", False, False)
finished_queue.append(ReleaseStatus(current_release_info, current_release_status_message)) finished_queue.append(
ReleaseStatus(current_release_info, current_release_status_message, current_release_destinations.copy())
)
current_release_info = None current_release_info = None
current_release_status_message = "Waiting" current_release_status_message = "Waiting"
current_release_destinations = set()
if len(finished_queue) > 30: if len(finished_queue) > 30:
finished_queue.pop(0) finished_queue.pop(0)
@@ -325,7 +341,13 @@ if __name__ == "__main__":
continue continue
data["finishedQueue"].append( data["finishedQueue"].append(
{"artist": q.info.artist, "title": q.info.title, "status": q.status, "art_url": q.info.art_url} {
"artist": q.info.artist,
"title": q.info.title,
"status": q.status,
"art_url": q.info.art_url,
"destinations": list(q.destinations),
}
) )
if current_release_info is not None: if current_release_info is not None:
+35 -1
View File
@@ -79,6 +79,40 @@
`; `;
} }
function createFinishCard(artist, title, status, art, destinations) {
let dstList = ""
for (destination of destinations) {
dstList += `<li>${destination}</li>`;
}
let extraClasses = ""
if (status !== "Finished sucessfully") {
extraClasses = "border-danger"
}
return `
<div class="card mb-3 ${extraClasses}" style="max-width: 540px;">
<div class="row g-0">
<div class="col-md-4">
<img src="${art}" class="img-fluid rounded-start">
</div>
<div class="col-md-8">
<div class="card-body">
<h5 class="card-title">${title}</h5>
<p class="card-text">${artist}</p>
<ol>
${dstList}
</ol>
<p class="card-text"><small class="text-body-secondary">${status}</small></p>
</div>
</div>
</div>
</div>
`;
}
const ripFormInput = document.getElementById("urlInput"); const ripFormInput = document.getElementById("urlInput");
document document
@@ -124,7 +158,7 @@
finishTableBody.innerHTML = ""; finishTableBody.innerHTML = "";
for (const q of statusJson.finishedQueue) { for (const q of statusJson.finishedQueue) {
finishTableBody.innerHTML += createCard(q.artist, q.title, q.status, q.art_url); finishTableBody.innerHTML += createFinishCard(q.artist, q.title, q.status, q.art_url, q.destinations);
} }
} }