try: use bjoern wsgi

This commit is contained in:
cwilvx
2025-03-02 21:50:34 +03:00
parent 989f2dfb5f
commit a9d095d79f
8 changed files with 85 additions and 73 deletions
-4
View File
@@ -32,12 +32,10 @@ api = APIBlueprint("album", __name__, url_prefix="/album", abp_tags=[bp_tag])
class GetAlbumVersionsBody(BaseModel): class GetAlbumVersionsBody(BaseModel):
og_album_title: str = Field( og_album_title: str = Field(
description="The original album title (album.og_title)", description="The original album title (album.og_title)",
example=Defaults.API_ALBUMNAME,
) )
albumhash: str = Field( albumhash: str = Field(
description="The album hash of the album to exclude from the results.", description="The album hash of the album to exclude from the results.",
example=Defaults.API_ALBUMHASH,
) )
@@ -48,8 +46,6 @@ class GetMoreFromArtistsBody(AlbumLimitSchema):
base_title: str = Field( base_title: str = Field(
description="The base title of the album to exclude from the results.", description="The base title of the album to exclude from the results.",
example=Defaults.API_ALBUMNAME,
default=None,
) )
+4 -7
View File
@@ -15,10 +15,7 @@ api = APIBlueprint("lyrics", __name__, url_prefix="/lyrics", abp_tags=[bp_tag])
class SendLyricsBody(TrackHashSchema): class SendLyricsBody(TrackHashSchema):
filepath: str = Field( filepath: str = Field(description="The path to the file")
description="The path to the file",
example="/path/to/file.mp3",
)
@api.post("") @api.post("")
@@ -30,13 +27,13 @@ def send_lyrics(body: SendLyricsBody):
trackhash = body.trackhash trackhash = body.trackhash
is_synced = True is_synced = True
lyrics, copyright = get_lyrics(filepath) lyrics, copyright = get_lyrics(filepath, trackhash)
if not lyrics: if not lyrics:
lyrics, copyright = get_lyrics_from_duplicates(trackhash, filepath) lyrics, copyright = get_lyrics_from_duplicates(trackhash, filepath)
if not lyrics: if not lyrics:
lyrics, is_synced, copyright = get_lyrics_from_tags(filepath) lyrics, is_synced, copyright = get_lyrics_from_tags(trackhash) # type: ignore
if not lyrics: if not lyrics:
return {"error": "No lyrics found"} return {"error": "No lyrics found"}
@@ -57,6 +54,6 @@ def check_lyrics(body: SendLyricsBody):
if exists: if exists:
return {"exists": exists}, 200 return {"exists": exists}, 200
exists = get_lyrics_from_tags(filepath, just_check=True) exists = get_lyrics_from_tags(trackhash, just_check=True)
return {"exists": exists}, 200 return {"exists": exists}, 200
+3 -20
View File
@@ -39,9 +39,7 @@ class TransCodeStore:
class SendTrackFileQuery(BaseModel): class SendTrackFileQuery(BaseModel):
filepath: str = Field( filepath: str = Field(description="The filepath to play (if available)")
description="The filepath to play (if available)", default=None
)
quality: str = Field( quality: str = Field(
"original", "original",
description="The quality of the audio file. Options: original, 1411, 1024, 512, 320, 256, 128, 96", description="The quality of the audio file. Options: original, 1411, 1024, 512, 320, 256, 128, 96",
@@ -85,14 +83,6 @@ def send_track_file_legacy(path: TrackHashSchema, query: SendTrackFileQuery):
if track is not None: if track is not None:
audio_type = guess_mime_type(filepath) audio_type = guess_mime_type(filepath)
# return send_file(
# filepath,
# mimetype=audio_type,
# conditional=True,
# # environ=request.environ,
# as_attachment=True,
# max_age=None,
# )
return send_from_directory( return send_from_directory(
Path(filepath).parent, Path(filepath).parent,
Path(filepath).name, Path(filepath).name,
@@ -100,7 +90,6 @@ def send_track_file_legacy(path: TrackHashSchema, query: SendTrackFileQuery):
conditional=True, conditional=True,
as_attachment=True, as_attachment=True,
) )
# return ""
return msg, 404 return msg, 404
@@ -319,14 +308,8 @@ def get_start_range(range_header: str):
class GetAudioSilenceBody(BaseModel): class GetAudioSilenceBody(BaseModel):
ending_file: str = Field( ending_file: str = Field(description="The ending file's path")
description="The ending file's path", starting_file: str = Field(description="The beginning file's path")
example="/home/cwilvx/Music/Made in Kenya/Sol generation/Bensoul - Salama.mp3",
)
starting_file: str = Field(
description="The beginning file's path",
example="/home/cwilvx/Music/Tidal/Albums/Bensoul - Qwarantunes/Bensoul - Peddi.m4a",
)
@api.post("/silence") @api.post("/silence")
+53 -29
View File
@@ -1,5 +1,5 @@
from pathlib import Path from pathlib import Path
from tinytag import TinyTag from typing import Iterable
from app.store.tracks import TrackStore from app.store.tracks import TrackStore
@@ -28,7 +28,7 @@ def convert_to_milliseconds(time: str):
return int(milliseconds) return int(milliseconds)
def format_synced_lyrics(lines: list[str]): def format_synced_lyrics(lines: Iterable[str]):
""" """
Formats synced lyrics into a list of dicts Formats synced lyrics into a list of dicts
""" """
@@ -51,7 +51,7 @@ def format_synced_lyrics(lines: list[str]):
return lyrics return lyrics
def get_lyrics_from_lrc(filepath: str): def get_lyrics_from_lrc(filepath: str | Path):
with open(filepath, mode="r") as file: with open(filepath, mode="r") as file:
lines = (f.removesuffix("\n") for f in file.readlines()) lines = (f.removesuffix("\n") for f in file.readlines())
return format_synced_lyrics(lines) return format_synced_lyrics(lines)
@@ -79,7 +79,7 @@ def check_lyrics_file_rel_to_track(filepath: str):
return False return False
def get_lyrics(track_path: str): def get_lyrics(track_path: str, trackhash: str):
""" """
Gets the lyrics for a track Gets the lyrics for a track
""" """
@@ -87,9 +87,18 @@ def get_lyrics(track_path: str):
if lyrics_path: if lyrics_path:
lyrics = get_lyrics_from_lrc(lyrics_path) lyrics = get_lyrics_from_lrc(lyrics_path)
copyright = get_extras(track_path, ["copyright"]) copyright = ""
return lyrics, copyright[0] entry = TrackStore.trackhashmap.get(trackhash, None)
if entry:
for track in entry.tracks:
copyright = track.copyright
if copyright:
break
return lyrics, copyright
else: else:
return None, "" return None, ""
@@ -98,10 +107,14 @@ def get_lyrics_from_duplicates(trackhash: str, filepath: str):
""" """
Finds the lyrics from other duplicate tracks Finds the lyrics from other duplicate tracks
""" """
entry = TrackStore.trackhashmap.get(trackhash, None)
for track in TrackStore.tracks: if entry is None:
return None, ""
for track in entry.tracks:
if track.trackhash == trackhash and track.filepath != filepath: if track.trackhash == trackhash and track.filepath != filepath:
lyrics, copyright = get_lyrics(track.filepath) lyrics, copyright = get_lyrics(track.filepath, trackhash)
if lyrics: if lyrics:
return lyrics, copyright return lyrics, copyright
@@ -110,12 +123,20 @@ def get_lyrics_from_duplicates(trackhash: str, filepath: str):
def check_lyrics_file(filepath: str, trackhash: str): def check_lyrics_file(filepath: str, trackhash: str):
"""
Checks if the lyrics file exists for a track
"""
lyrics_exists = check_lyrics_file_rel_to_track(filepath) lyrics_exists = check_lyrics_file_rel_to_track(filepath)
if lyrics_exists: if lyrics_exists:
return True return True
for track in TrackStore.tracks: entry = TrackStore.trackhashmap.get(trackhash, None)
if entry is None:
return False
for track in entry.tracks:
if track.trackhash == trackhash and track.filepath != filepath: if track.trackhash == trackhash and track.filepath != filepath:
lyrics_exists = check_lyrics_file_rel_to_track(track.filepath) lyrics_exists = check_lyrics_file_rel_to_track(track.filepath)
@@ -139,32 +160,35 @@ def test_is_synced(lyrics: list[str]):
return False return False
def get_extras(filepath: str, keys: list[str]): def get_lyrics_from_tags(trackhash: str, just_check: bool = False):
"""
Get extra tags from an audio file.
"""
try:
tags = TinyTag.get(filepath)
except Exception:
return [""] * len(keys)
extras = tags.extra
return [extras.get(key, "").strip() for key in keys]
def get_lyrics_from_tags(filepath: str, just_check: bool = False):
""" """
Gets the lyrics from the tags of the track Gets the lyrics from the tags of the track
""" """
lyrics, copyright = get_extras(filepath, ["lyrics", "copyright"]) entry = TrackStore.trackhashmap.get(trackhash, None)
lyrics = lyrics.replace("engdesc", "")
exists = bool(lyrics.replace("\n", "").strip()) if entry is None:
return None, False, ""
lyrics: str | None = None
copyright: str | None = None
synced = False
for track in entry.tracks:
if lyrics and copyright:
break
if not lyrics:
lyrics = track.extra.get("lyrics", None)
if not copyright:
copyright = track.copyright
if just_check: if just_check:
return exists return lyrics is not None
if not exists: if lyrics:
lyrics = lyrics.replace("engdesc", "")
else:
return None, False, "" return None, False, ""
lines = lyrics.split("\n") lines = lyrics.split("\n")
+5 -5
View File
@@ -88,11 +88,11 @@ class Track:
self.explicit = int(explicit_tag[0]) == 1 self.explicit = int(explicit_tag[0]) == 1
self.image = self.albumhash + ".webp" + "?pathhash=" + self.pathhash self.image = self.albumhash + ".webp" + "?pathhash=" + self.pathhash
self.extra = { # self.extra = {
"disc_total": self.extra.get("disc_total", 0), # "disc_total": self.extra.get("disc_total", 0),
"track_total": self.extra.get("track_total", 0), # "track_total": self.extra.get("track_total", 0),
"samplerate": self.extra.get("samplerate", -1), # "samplerate": self.extra.get("samplerate", -1),
} # }
self.split_artists() self.split_artists()
self.map_with_config() self.map_with_config()
+11 -8
View File
@@ -6,6 +6,7 @@ import logging
import os import os
import psutil import psutil
import waitress import waitress
import bjoern
import mimetypes import mimetypes
import setproctitle import setproctitle
@@ -237,11 +238,13 @@ if __name__ == "__main__":
host = FLASKVARS.get_flask_host() host = FLASKVARS.get_flask_host()
port = FLASKVARS.get_flask_port() port = FLASKVARS.get_flask_port()
waitress.serve( # waitress.serve(
app, # app,
host=host, # host=host,
port=port, # port=port,
threads=100, # threads=100,
ipv6=True, # ipv6=True,
ipv4=True, # ipv4=True,
) # )
# app.run(host=host, port=port, debug=False)
bjoern.run(app, host, port)
+1
View File
@@ -33,6 +33,7 @@ dependencies = [
"pillow>=11.1.0", "pillow>=11.1.0",
"flask-openapi3==3.0.2", "flask-openapi3==3.0.2",
"rapidfuzz==3.11.0", "rapidfuzz==3.11.0",
"bjoern>=3.2.2",
] ]
[dependency-groups] [dependency-groups]
Generated
+8
View File
@@ -29,6 +29,12 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 },
] ]
[[package]]
name = "bjoern"
version = "3.2.2"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/d5/a0/fba55eb58a502dabc0915137ff44eaacaba58a60196fd94dc8cd4e9fe67d/bjoern-3.2.2.tar.gz", hash = "sha256:16e5a02a9a17a7f5f8bea0d7c58650e78ab80ead6fe3e390037573d4355baf31", size = 45716 }
[[package]] [[package]]
name = "blinker" name = "blinker"
version = "1.9.0" version = "1.9.0"
@@ -1206,6 +1212,7 @@ name = "swingmusic"
version = "2.0.0" version = "2.0.0"
source = { virtual = "." } source = { virtual = "." }
dependencies = [ dependencies = [
{ name = "bjoern" },
{ name = "colorgram-py" }, { name = "colorgram-py" },
{ name = "ffmpeg-python" }, { name = "ffmpeg-python" },
{ name = "flask" }, { name = "flask" },
@@ -1241,6 +1248,7 @@ dev = [
[package.metadata] [package.metadata]
requires-dist = [ requires-dist = [
{ name = "bjoern", specifier = ">=3.2.2" },
{ name = "colorgram-py", specifier = ">=1.2.0" }, { name = "colorgram-py", specifier = ">=1.2.0" },
{ name = "ffmpeg-python", specifier = ">=0.2.0" }, { name = "ffmpeg-python", specifier = ">=0.2.0" },
{ name = "flask", specifier = ">=3.1.0" }, { name = "flask", specifier = ">=3.1.0" },