mirror of
https://github.com/Dvorinka/swingmusic-extended.git
synced 2026-06-04 20:43:04 +00:00
move the populate function to separate file
This commit is contained in:
+11
-129
@@ -1,25 +1,18 @@
|
||||
"""
|
||||
This module contains functions for the server
|
||||
"""
|
||||
import datetime
|
||||
import os
|
||||
import time
|
||||
from dataclasses import asdict
|
||||
from io import BytesIO
|
||||
|
||||
import requests
|
||||
from app import api
|
||||
from app import helpers
|
||||
from app import instances
|
||||
from app import models
|
||||
from app import settings
|
||||
from app.lib import albumslib
|
||||
from app.lib import folderslib
|
||||
from app.lib import watchdoge
|
||||
from app.lib.taglib import get_tags
|
||||
from app.logger import Log
|
||||
from PIL import Image
|
||||
from progress.bar import Bar
|
||||
from app.lib.populate import Populate
|
||||
|
||||
|
||||
@helpers.background
|
||||
@@ -27,6 +20,7 @@ def reindex_tracks():
|
||||
"""
|
||||
Checks for new songs every 5 minutes.
|
||||
"""
|
||||
is_underway = False
|
||||
|
||||
while True:
|
||||
populate()
|
||||
@@ -44,129 +38,11 @@ def start_watchdog():
|
||||
|
||||
|
||||
def populate():
|
||||
"""
|
||||
Populate the database with all songs in the music directory
|
||||
|
||||
checks if the song is in the database, if not, it adds it
|
||||
also checks if the album art exists in the image path, if not tries to
|
||||
extract it.
|
||||
"""
|
||||
start = time.time()
|
||||
db_tracks = instances.tracks_instance.get_all_tracks()
|
||||
tagged_tracks = []
|
||||
albums = []
|
||||
folders = set()
|
||||
|
||||
files = helpers.run_fast_scandir(settings.HOME_DIR, [".flac", ".mp3"], full=True)[1]
|
||||
|
||||
_bar = Bar("Checking files", max=len(files))
|
||||
for track in db_tracks:
|
||||
if track["filepath"] in files:
|
||||
files.remove(track["filepath"])
|
||||
_bar.next()
|
||||
|
||||
_bar.finish()
|
||||
|
||||
Log(f"Found {len(files)} untagged files")
|
||||
|
||||
_bar = Bar("Tagging files", max=len(files))
|
||||
for file in files:
|
||||
tags = get_tags(file)
|
||||
foldername = os.path.dirname(file)
|
||||
folders.add(foldername)
|
||||
|
||||
if tags is not None:
|
||||
tagged_tracks.append(tags)
|
||||
api.DB_TRACKS.append(tags)
|
||||
|
||||
_bar.next()
|
||||
_bar.finish()
|
||||
|
||||
Log(f"Tagged {len(tagged_tracks)} tracks")
|
||||
|
||||
pre_albums = []
|
||||
|
||||
for t in tagged_tracks:
|
||||
a = {
|
||||
"title": t["album"],
|
||||
"artist": t["albumartist"],
|
||||
}
|
||||
|
||||
if a not in pre_albums:
|
||||
pre_albums.append(a)
|
||||
|
||||
exist_count = 0
|
||||
_bar = Bar("Creating albums", max=len(pre_albums))
|
||||
for aa in pre_albums:
|
||||
albumindex = albumslib.find_album(aa["title"], aa["artist"])
|
||||
|
||||
if albumindex is None:
|
||||
track = [
|
||||
track
|
||||
for track in tagged_tracks
|
||||
if track["album"] == aa["title"]
|
||||
and track["albumartist"] == aa["artist"]
|
||||
][0]
|
||||
|
||||
album = albumslib.create_album(track)
|
||||
api.ALBUMS.append(album)
|
||||
albums.append(album)
|
||||
|
||||
instances.album_instance.insert_album(asdict(album))
|
||||
|
||||
else:
|
||||
exist_count += 1
|
||||
|
||||
_bar.next()
|
||||
|
||||
_bar.finish()
|
||||
|
||||
Log(f"{exist_count} of {len(albums)} were already in the database")
|
||||
|
||||
_bar = Bar("Creating tracks", max=len(tagged_tracks))
|
||||
for track in tagged_tracks:
|
||||
try:
|
||||
album_index = albumslib.find_album(track["album"], track["albumartist"])
|
||||
album = api.ALBUMS[album_index]
|
||||
|
||||
track["image"] = album.image
|
||||
upsert_id = instances.tracks_instance.insert_song(track)
|
||||
|
||||
track["_id"] = {"$oid": str(upsert_id)}
|
||||
api.TRACKS.append(models.Track(track))
|
||||
except TypeError:
|
||||
# Bug: some albums are not found although they exist in `api.ALBUMS`. It has something to do with the bisection method used or sorting. Not sure yet.
|
||||
pass
|
||||
|
||||
_bar.next()
|
||||
|
||||
_bar.finish()
|
||||
|
||||
Log(f"Added {len(tagged_tracks)} new tracks and {len(albums)} new albums")
|
||||
|
||||
_bar = Bar("Creating folders", max=len(folders))
|
||||
for folder in folders:
|
||||
if folder not in api.VALID_FOLDERS:
|
||||
api.VALID_FOLDERS.add(folder)
|
||||
fff = folderslib.create_folder(folder)
|
||||
api.FOLDERS.append(fff)
|
||||
|
||||
_bar.next()
|
||||
|
||||
_bar.finish()
|
||||
|
||||
Log(f"Created {len(api.FOLDERS)} folders")
|
||||
|
||||
end = time.time()
|
||||
|
||||
print(
|
||||
str(datetime.timedelta(seconds=round(end - start)))
|
||||
+ " elapsed for "
|
||||
+ str(len(files))
|
||||
+ " files"
|
||||
)
|
||||
pop = Populate()
|
||||
pop.run()
|
||||
|
||||
|
||||
@helpers.background
|
||||
def fetch_image_path(artist: str) -> str or None:
|
||||
"""
|
||||
Returns a direct link to an artist image.
|
||||
@@ -185,6 +61,7 @@ def fetch_image_path(artist: str) -> str or None:
|
||||
return None
|
||||
|
||||
|
||||
@helpers.background
|
||||
def fetch_artist_images():
|
||||
"""Downloads the artists images"""
|
||||
|
||||
@@ -238,3 +115,8 @@ def fetch_album_bio(title: str, albumartist: str):
|
||||
bio = None
|
||||
|
||||
return bio
|
||||
|
||||
|
||||
# TODO
|
||||
# - Move the populate function to a new file and probably into a new class
|
||||
# - Start movement from functional programming to OOP to OOP
|
||||
|
||||
Reference in New Issue
Block a user