Browse Source

catch errors from ffcuesplitter and handle by falling back to file processor, test for output folder for albums existing and skip if DST_OVERWRITE is not set, small optimizations as well

master
Constantin Fürst 2 years ago
parent
commit
3bffe595e5
  1. 60
      libconv.py

60
libconv.py

@ -28,44 +28,55 @@ DEDUCE_METADATA: bool = config.get("libconv", "deduce_metadata") == "true"
FFMPEG_LOCATION: str = config.get("ffmpeg", "location") FFMPEG_LOCATION: str = config.get("ffmpeg", "location")
FFMPEG_OPTS: str = config.get("ffmpeg", "options") FFMPEG_OPTS: str = config.get("ffmpeg", "options")
if DST_OVERWRITE:
FFMPEG_OPTS += " -y"
logging.basicConfig(level=logging.INFO) logging.basicConfig(level=logging.INFO)
# ----------------------------------------------------------------- # # ----------------------------------------------------------------- #
# file and folder operations # file and folder operations
def copy(src: str, dst: str): def copy(src: str, dst: str):
if (DRY_RUN):
logging.info(f"copy {src} to {dst}")
else:
logging.debug(f"copy {src} to {dst}")
if not DRY_RUN:
shutil.copyfile(src, dst, follow_symlinks=True) shutil.copyfile(src, dst, follow_symlinks=True)
def mkdir(path: str): def mkdir(path: str):
if (DRY_RUN):
logging.info(f"mkdir -r {path}")
else:
logging.debug(f"mkdir -r {path}")
if not DRY_RUN:
os.makedirs(path, exist_ok=True) os.makedirs(path, exist_ok=True)
def execute(command: str): def execute(command: str):
if (DRY_RUN):
logging.info(f"execute: {command}")
else:
subprocess.run(command)
logging.debug(f"execute: {command}")
if not DRY_RUN:
os.system(command)
# ----------------------------------------------------------------- # # ----------------------------------------------------------------- #
# cue sheet processing # cue sheet processing
def cue_sheet_processor(path: str): def cue_sheet_processor(path: str):
dst_folder = prepare_destination(path)
dst_folder, preexisting = prepare_destination(path)
if preexisting and not DST_OVERWRITE:
logging.info(f"Album {path} already exists in output location and overwrite is disabled - skipping")
return
sheet = get_files_with_ext(path, [CUE_SHEET_EXTENSION]) sheet = get_files_with_ext(path, [CUE_SHEET_EXTENSION])
args
if (len(sheet) != 1): if (len(sheet) != 1):
logging.error(f"Expected exactly one but {path} contains {len(sheet)} cue sheets")
logging.error(f"Expected exactly one but {path} contains {len(sheet)} cue sheets - trying file processor")
file_processor(path)
return return
data = FFCueSplitter(sheet[0], dry=DRY_RUN, outputdir=dst_folder, suffix=DST_FILE_EXT, overwrite=DST_OVERWRITE, ffmpeg_cmd=FFMPEG_LOCATION, ffmpeg_add_params=FFMPEG_OPTS)
data.open_cuefile()
args = data.ffmpeg_arguments()["arguments"]
dst_folder = prepare_destination(path)
try:
data = FFCueSplitter(sheet[0], dry=DRY_RUN, outputdir=dst_folder, suffix=DST_FILE_EXT, overwrite=DST_OVERWRITE, ffmpeg_cmd=FFMPEG_LOCATION, ffmpeg_add_params=FFMPEG_OPTS)
data.open_cuefile()
args = data.ffmpeg_arguments()["arguments"]
except:
logging.error(f"Error during parsing of cuesheet {path} - trying file processor")
file_processor(path)
return
for arg in args: for arg in args:
arg_end = arg.find("-y") arg_end = arg.find("-y")
@ -114,7 +125,12 @@ def metadata_from_file(filename: str) -> str:
return f"-metadata TITLE=\"{title}\" -metadata TRACK=\"{number}\"" return f"-metadata TITLE=\"{title}\" -metadata TRACK=\"{number}\""
def file_processor(path: str): def file_processor(path: str):
dst_folder = prepare_destination(path)
dst_folder, preexisting = prepare_destination(path)
if preexisting and not DST_OVERWRITE:
logging.info(f"Album {path} already exists in output location and overwrite is disabled - skipping")
return
files = get_files_with_ext(path, SRC_FILE_EXTS) files = get_files_with_ext(path, SRC_FILE_EXTS)
album_metadata = metadata_from_folder(path) album_metadata = metadata_from_folder(path)
@ -153,11 +169,13 @@ def get_files_with_ext(path: str, extensions: List[str]) -> List[str]:
break break
return ret_files return ret_files
def prepare_destination(path: str) -> str:
def prepare_destination(path: str) -> Tuple[str,bool]:
images = get_files_with_ext(path, SRC_ICON_EXTS) images = get_files_with_ext(path, SRC_ICON_EXTS)
sub_path = path.replace(SRC_FOLDER, "") sub_path = path.replace(SRC_FOLDER, "")
new_path = DST_FOLDER + sub_path new_path = DST_FOLDER + sub_path
existing: bool = os.path.exists(new_path)
mkdir(new_path) mkdir(new_path)
for img in images: for img in images:
@ -165,7 +183,7 @@ def prepare_destination(path: str) -> str:
new_img_path = new_path + img_name new_img_path = new_path + img_name
copy(img, new_img_path) copy(img, new_img_path)
return new_path
return (new_path,existing)
def get_filename(file: str, path: str) -> str: def get_filename(file: str, path: str) -> str:
fname = file.replace(path, "") fname = file.replace(path, "")
@ -194,6 +212,10 @@ def process_folder(path: str):
if __name__ == "__main__": if __name__ == "__main__":
logging.info(f"Using settings from {CONFIG_FILE}") logging.info(f"Using settings from {CONFIG_FILE}")
if DRY_RUN: if DRY_RUN:
logging.info("Executing as DRY RUN") logging.info("Executing as DRY RUN")
if DST_OVERWRITE:
logging.info("Overwrite of existing files active")
process_folder(SRC_FOLDER) process_folder(SRC_FOLDER)
Loading…
Cancel
Save