62 lines
1.4 KiB
Python
62 lines
1.4 KiB
Python
from pathlib import Path
|
|
from .file import File, Track, Art, MiscFile
|
|
from abc import ABC, abstractmethod
|
|
from log import Log, LogCat
|
|
|
|
|
|
class Directory(ABC):
|
|
def __init__(self, path: Path, log: Log, logcat: str):
|
|
self.path = path
|
|
self.log = LogCat(log.queue, logcat)
|
|
|
|
self.contents = self.populate(log)
|
|
|
|
def __iter__(self):
|
|
return self.contents.__iter__()
|
|
|
|
def __getitem__(self, name):
|
|
for e in self:
|
|
if e.name == name:
|
|
return e
|
|
raise KeyError
|
|
|
|
def prune(self, name):
|
|
for e in self:
|
|
if e.name == name:
|
|
self.contents.remove(e)
|
|
return
|
|
raise KeyError
|
|
|
|
def __str__(self):
|
|
return self.name
|
|
|
|
@property
|
|
def all_files(self) -> list:
|
|
files = list()
|
|
for c in self:
|
|
# todo: handle unexpected files
|
|
files += c.all_files
|
|
return files
|
|
|
|
@property
|
|
def name(self):
|
|
return self.path.name
|
|
|
|
def by_name(self):
|
|
return [e.name for e in self.contents]
|
|
|
|
@abstractmethod
|
|
def populate(self, log: Log) -> list:
|
|
raise NotImplementedError
|
|
|
|
@staticmethod
|
|
def create_file(file: Path) -> File:
|
|
suffix = file.suffix
|
|
|
|
if suffix in ['.flac']:
|
|
return Track(file)
|
|
elif suffix in ['.jpg', '.jpeg', '.png']:
|
|
return Art(file)
|
|
else:
|
|
return MiscFile(file)
|