swingmusic/server/app/lib/folderslib.py
geoffrey45 d98cc0547e Save complete tracks and albums to the db for faster startup
- refactor function locations
- add logger
- check for new tracks instead of re-processing all files
2022-04-21 10:16:45 +03:00

81 lines
2.0 KiB
Python

import time
from typing import List, Set
from app import api
from app import helpers
from app import models
from progress.bar import Bar
def get_valid_folders() -> None:
for track in api.TRACKS:
api.VALID_FOLDERS.add(track.folder)
def get_folder_track_count(foldername: str) -> int:
"""
Returns the number of files associated with a folder.
"""
track_list = [track for track in api.TRACKS if foldername in track.folder]
return len(track_list)
def create_folder(foldername: str) -> models.Folder:
"""Create a single Folder object"""
folder = {
"name": foldername.split("/")[-1],
"path": foldername,
"trackcount": get_folder_track_count(foldername),
}
return models.Folder(folder)
def create_all_folders() -> Set[models.Folder]:
folders: List[models.Folder] = []
_bar = Bar("Creating folders", max=len(api.VALID_FOLDERS))
for foldername in api.VALID_FOLDERS:
folder = create_folder(foldername)
folders.append(folder)
_bar.next()
_bar.finish()
return folders
def get_subdirs(foldername: str) -> List[models.Folder]:
"""
Finds and Creates models.Folder objects for each sub-directory string in the foldername passed.
"""
subdirs = set()
for folder in api.VALID_FOLDERS:
if foldername in folder:
str0 = folder.replace(foldername, "")
try:
str1 = str0.split("/")[1]
except IndexError:
str1 = None
if str1 is not None:
subdirs.add(foldername + "/" + str1)
return [create_folder(dir) for dir in subdirs]
@helpers.background
def run_scandir():
"""
Initiates the creation of all folder objects for each folder with a track in it.
Runs in a background thread after every 5 minutes.
It calls the
"""
get_valid_folders()
folders_ = create_all_folders()
"""Create all the folder objects before clearing api.FOLDERS"""
api.FOLDERS = folders_