mirror of
https://github.com/tcsenpai/swingmusic.git
synced 2025-06-06 19:25:34 +00:00
fix db insert duplicate unique fields error
+ save album date as timestamp in db + Rewrite artist image downloader with multiprocessing.Pool
This commit is contained in:
parent
4d310c39c3
commit
88be80b25d
@ -115,7 +115,9 @@ def get_artist_albums():
|
||||
albums = [
|
||||
{
|
||||
"artisthash": a,
|
||||
"albums": AlbumStore.get_albums_by_albumartist(a, limit, exclude=base_title),
|
||||
"albums": AlbumStore.get_albums_by_albumartist(
|
||||
a, limit, exclude=base_title
|
||||
),
|
||||
}
|
||||
for a in albumartists
|
||||
]
|
||||
@ -136,18 +138,17 @@ def get_album_versions():
|
||||
if data is None:
|
||||
return {"msg": "No albumartist provided"}
|
||||
|
||||
og_album_title: str = data['og_album_title']
|
||||
base_title: str = data['base_title']
|
||||
artisthash: str = data['artisthash']
|
||||
og_album_title: str = data["og_album_title"]
|
||||
base_title: str = data["base_title"]
|
||||
artisthash: str = data["artisthash"]
|
||||
|
||||
albums = AlbumStore.get_albums_by_artisthash(artisthash)
|
||||
|
||||
albums = [
|
||||
a for a in albums
|
||||
if
|
||||
create_hash(a.base_title) == create_hash(base_title) and create_hash(og_album_title) != create_hash(a.og_title)
|
||||
a
|
||||
for a in albums
|
||||
if create_hash(a.base_title) == create_hash(base_title)
|
||||
and create_hash(og_album_title) != create_hash(a.og_title)
|
||||
]
|
||||
|
||||
return {
|
||||
"data": albums
|
||||
}
|
||||
return {"data": albums}
|
||||
|
@ -21,7 +21,7 @@ class SQLiteTrackMethods:
|
||||
"""
|
||||
Inserts a single track into the database.
|
||||
"""
|
||||
sql = """INSERT INTO tracks(
|
||||
sql = """INSERT OR REPLACE INTO tracks(
|
||||
album,
|
||||
albumartist,
|
||||
albumhash,
|
||||
|
@ -1,19 +1,19 @@
|
||||
from concurrent.futures import ThreadPoolExecutor
|
||||
from pathlib import Path
|
||||
from io import BytesIO
|
||||
|
||||
from PIL import Image, UnidentifiedImageError
|
||||
import requests
|
||||
import urllib
|
||||
from concurrent.futures import ProcessPoolExecutor as Pool
|
||||
from io import BytesIO
|
||||
from multiprocessing import Pool, cpu_count
|
||||
from pathlib import Path
|
||||
|
||||
import requests
|
||||
from PIL import Image, UnidentifiedImageError
|
||||
from requests.exceptions import ConnectionError as ReqConnError
|
||||
from requests.exceptions import ReadTimeout
|
||||
from tqdm import tqdm
|
||||
from requests.exceptions import ConnectionError as ReqConnError, ReadTimeout
|
||||
|
||||
from app import settings
|
||||
from app.models import Artist, Track, Album
|
||||
from app.utils.hashing import create_hash
|
||||
|
||||
from app.models import Album, Artist, Track
|
||||
from app.store import artists as artist_store
|
||||
from app.utils.hashing import create_hash
|
||||
|
||||
|
||||
def get_artist_image_link(artist: str):
|
||||
@ -74,15 +74,17 @@ class DownloadImage:
|
||||
|
||||
class CheckArtistImages:
|
||||
def __init__(self):
|
||||
with ThreadPoolExecutor() as pool:
|
||||
list(
|
||||
with Pool(cpu_count()) as pool:
|
||||
res = list(
|
||||
tqdm(
|
||||
pool.map(self.download_image, artist_store.ArtistStore.artists),
|
||||
pool.imap_unordered(self.download_image, artist_store.ArtistStore.artists),
|
||||
total=len(artist_store.ArtistStore.artists),
|
||||
desc="Downloading missing artist images",
|
||||
)
|
||||
)
|
||||
|
||||
list(res)
|
||||
|
||||
@staticmethod
|
||||
def download_image(artist: Artist):
|
||||
"""
|
||||
@ -90,7 +92,9 @@ class CheckArtistImages:
|
||||
|
||||
:param artist: The artist name
|
||||
"""
|
||||
img_path = Path(settings.Paths.get_artist_img_sm_path()) / f"{artist.artisthash}.webp"
|
||||
img_path = (
|
||||
Path(settings.Paths.get_artist_img_sm_path()) / f"{artist.artisthash}.webp"
|
||||
)
|
||||
|
||||
if img_path.exists():
|
||||
return
|
||||
@ -155,9 +159,7 @@ def get_albumartists(albums: list[Album]) -> set[str]:
|
||||
return artists
|
||||
|
||||
|
||||
def get_all_artists(
|
||||
tracks: list[Track], albums: list[Album]
|
||||
) -> list[Artist]:
|
||||
def get_all_artists(tracks: list[Track], albums: list[Album]) -> list[Artist]:
|
||||
artists_from_tracks = get_artists_from_tracks(tracks=tracks)
|
||||
artist_from_albums = get_albumartists(albums=albums)
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
import datetime
|
||||
import os
|
||||
from io import BytesIO
|
||||
import pendulum
|
||||
|
||||
from PIL import Image, UnidentifiedImageError
|
||||
from tinytag import TinyTag
|
||||
@ -64,11 +65,12 @@ def extract_thumb(filepath: str, webp_path: str) -> bool:
|
||||
return False
|
||||
|
||||
|
||||
def extract_date(date_str: str | None, timestamp: float) -> int:
|
||||
def extract_date(date_str: str | None) -> int | None:
|
||||
try:
|
||||
return int(date_str.split("-")[0])
|
||||
date = pendulum.parse(date_str, strict=False)
|
||||
return int(date.timestamp())
|
||||
except Exception as e:
|
||||
return datetime.datetime.fromtimestamp(timestamp).year
|
||||
return None
|
||||
|
||||
|
||||
def get_tags(filepath: str):
|
||||
@ -141,7 +143,7 @@ def get_tags(filepath: str):
|
||||
tags.image = f"{tags.albumhash}.webp"
|
||||
tags.folder = win_replace_slash(os.path.dirname(filepath))
|
||||
|
||||
tags.date = extract_date(tags.year, last_mod)
|
||||
tags.date = extract_date(tags.year) or int(last_mod)
|
||||
tags.filepath = win_replace_slash(filepath)
|
||||
tags.filetype = filetype
|
||||
tags.last_mod = last_mod
|
||||
|
@ -131,7 +131,6 @@ def add_track(filepath: str) -> None:
|
||||
"""
|
||||
# remove the track if it already exists
|
||||
TrackStore.remove_track_by_filepath(filepath)
|
||||
db.remove_tracks_by_filepaths(filepath)
|
||||
|
||||
# add the track to the database and store.
|
||||
tags = get_tags(filepath)
|
||||
|
Loading…
x
Reference in New Issue
Block a user