diff --git a/app/api/folder.py b/app/api/folder.py index 78ed7fd..f251124 100644 --- a/app/api/folder.py +++ b/app/api/folder.py @@ -8,10 +8,8 @@ from pathlib import Path from flask import Blueprint, request from app import settings -from app.lib.folderslib import GetFilesAndDirs +from app.lib.folderslib import GetFilesAndDirs, create_folder from app.db.sqlite.settings import SettingsSQLMethods as db -from app.models.folder import Folder -from app.utils.hashing import create_folder_hash from app.utils.wintools import win_replace_slash, is_windows api = Blueprint("folder", __name__, url_prefix="/") @@ -44,14 +42,7 @@ def get_folder_tree(): return { "folders": [ - Folder( - name=f.name if f.name != "" else str(f).replace("\\", "/"), - path=win_replace_slash(str(f)), - has_tracks=True, - is_sym=f.is_symlink(), - path_hash=create_folder_hash(*f.parts[1:]), - ) - for f in folders + create_folder(str(f)) for f in folders ], "tracks": [], } diff --git a/app/api/settings.py b/app/api/settings.py index d82ce52..5fb51a8 100644 --- a/app/api/settings.py +++ b/app/api/settings.py @@ -8,7 +8,7 @@ from app.db.sqlite.settings import SettingsSQLMethods as sdb from app.utils.generators import get_random_str from app.utils.threading import background -from app.store.store import FolderStore +from app.store.folder import FolderStore from app.store.albums import AlbumStore from app.store.tracks import TrackStore from app.store.artists import ArtistStore diff --git a/app/lib/folderslib.py b/app/lib/folderslib.py index e229f33..d1a5a22 100644 --- a/app/lib/folderslib.py +++ b/app/lib/folderslib.py @@ -1,15 +1,44 @@ import os -from concurrent.futures import ThreadPoolExecutor +from pathlib import Path +from app.logger import log from app.models import Folder, Track from app.settings import SUPPORTED_FILES -from app.logger import log from app.utils.wintools import win_replace_slash -from app.store.store import FolderStore from app.store.tracks import TrackStore +def create_folder(path: str, count=0) -> Folder: + """ + Creates a folder object from a path. + """ + folder = Path(path) + + return Folder( + name=folder.name, + path=win_replace_slash(str(folder)), + is_sym=folder.is_symlink(), + count=count + ) + + +def get_folders(paths: list[str]): + """ + Filters out folders that don't have any tracks and + returns a list of folder objects. + """ + count_dict = {path: 0 for path in paths} + + for track in TrackStore.tracks: + for path in paths: + if track.filepath.startswith(path): + count_dict[path] += 1 + + folders = [{"path": path, "count": count_dict[path]} for path in paths] + return [create_folder(f['path'], f['count']) for f in folders if f['count'] > 0] + + class GetFilesAndDirs: """ Get files and folders from a directory. @@ -51,17 +80,6 @@ class GetFilesAndDirs: files = [f["path"] for f in files_] tracks = TrackStore.get_tracks_by_filepaths(files) + folders = get_folders(dirs) - # TODO: Remove this threadpool and modify the get_folder store - # method to accept a list of paths. - with ThreadPoolExecutor() as pool: - iterable = pool.map(FolderStore.get_folder, dirs) - folders = [i for i in iterable if i is not None] - - folders = filter(lambda f: f.has_tracks, folders) - - # folders_with_count_dict = Store.get_folders_count(dirs) - # pprint(folders_with_count_dict) - # TODO: Map folder count to folder object - - return tracks, folders # type: ignore + return tracks, folders diff --git a/app/lib/populate.py b/app/lib/populate.py index 5e9bfef..26d2d33 100644 --- a/app/lib/populate.py +++ b/app/lib/populate.py @@ -12,7 +12,7 @@ from app.logger import log from app.models import Album, Artist, Track from app.utils.filesystem import run_fast_scandir -from app.store.store import FolderStore +from app.store.folder import FolderStore from app.store.albums import AlbumStore from app.store.tracks import TrackStore from app.store.artists import ArtistStore diff --git a/app/lib/watchdogg.py b/app/lib/watchdogg.py index f31e976..a15efa3 100644 --- a/app/lib/watchdogg.py +++ b/app/lib/watchdogg.py @@ -17,7 +17,7 @@ from app.db.sqlite.tracks import SQLiteManager from app.db.sqlite.tracks import SQLiteTrackMethods as db from app.db.sqlite.settings import SettingsSQLMethods as sdb -from app.store.store import FolderStore +from app.store.folder import FolderStore from app.store.tracks import TrackStore from app.store.albums import AlbumStore from app.store.artists import ArtistStore diff --git a/app/models/folder.py b/app/models/folder.py index 7e73da3..920542b 100644 --- a/app/models/folder.py +++ b/app/models/folder.py @@ -5,6 +5,5 @@ from dataclasses import dataclass class Folder: name: str path: str - has_tracks: bool is_sym: bool = False - path_hash: str = "" + count: int = 0 diff --git a/app/setup/__init__.py b/app/setup/__init__.py index 21cdacd..4ed8044 100644 --- a/app/setup/__init__.py +++ b/app/setup/__init__.py @@ -1,7 +1,7 @@ """ Prepares the server for use. """ -from app.store.store import FolderStore +from app.store.folder import FolderStore from app.setup.files import create_config_dir from app.setup.sqlite import setup_sqlite, run_migrations diff --git a/app/store/store.py b/app/store/folder.py similarity index 72% rename from app/store/store.py rename to app/store/folder.py index 0a9d64c..6a105ee 100644 --- a/app/store/store.py +++ b/app/store/folder.py @@ -2,13 +2,13 @@ In memory store. """ from pathlib import Path - from tqdm import tqdm from app.models import Folder from app.utils.bisection import UseBisection from app.utils.hashing import create_folder_hash -from app.utils.wintools import win_replace_slash + +from app.lib import folderslib from .tracks import TrackStore @@ -44,21 +44,6 @@ class FolderStore: path_hash = create_folder_hash(*Path(path).parts[1:]) return path_hash in folder_hashes - @staticmethod - def create_folder(path: str) -> Folder: - """ - Creates a folder object from a path. - """ - folder = Path(path) - - return Folder( - name=folder.name, - path=win_replace_slash(str(folder)), - is_sym=folder.is_symlink(), - has_tracks=True, - path_hash=create_folder_hash(*folder.parts[1:]), - ) - @classmethod def add_folder(cls, path: str): """ @@ -68,7 +53,7 @@ class FolderStore: if cls.check_has_tracks(path): return - folder = cls.create_folder(path) + folder = folderslib.create_folder(path) cls.folders.append(folder) @classmethod @@ -109,7 +94,7 @@ class FolderStore: pass for path in tqdm(valid_folders, desc="Processing folders"): - folder = cls.create_folder(str(path)) + folder = folderslib.create_folder(str(path)) cls.folders.append(folder) @@ -130,21 +115,8 @@ class FolderStore: if not has_tracks: return None - folder = cls.create_folder(path) + folder = folderslib.create_folder(path) cls.folders.append(folder) return folder - @classmethod - def get_folders_count(cls, paths: list[str]) -> list[dict[str, int]]: - count_dict = {path: 0 for path in paths} - - for track in TrackStore.tracks: - for path in paths: - if track.filepath.startswith(path): - count_dict[path] += 1 - - result = [{"path": path, "count": count_dict[path]} for path in paths] - - # TODO: Modify this method to return Folder objects with - # track count mapped. Keep an eye on function complexity. - return result +# TODO: Remove this file. it's no longer needed.