From b353b313ee2c7eaa070d1f9cf7dc29ca893983b3 Mon Sep 17 00:00:00 2001 From: Julian Mutter Date: Thu, 18 Aug 2022 15:38:07 +0200 Subject: [PATCH] Add script for transferring ripped dvds to transcoder --- ripper/rip_dvd.py | 2 + ripper/transfer_ripped.py | 126 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 128 insertions(+) create mode 100755 ripper/transfer_ripped.py diff --git a/ripper/rip_dvd.py b/ripper/rip_dvd.py index 1ce3d0a..4019dec 100755 --- a/ripper/rip_dvd.py +++ b/ripper/rip_dvd.py @@ -89,6 +89,8 @@ def chdir_to_script_dir(): def mkdirs(): os.makedirs(TMP_DIR, exist_ok=True) os.makedirs(RIPPED_DIR, exist_ok=True) + os.makedirs(os.path.join(RIPPED_DIR, "movie"), exist_ok=True) + os.makedirs(os.path.join(RIPPED_DIR, "series"), exist_ok=True) def write_to_logfile(args, tag): diff --git a/ripper/transfer_ripped.py b/ripper/transfer_ripped.py new file mode 100755 index 0000000..3441160 --- /dev/null +++ b/ripper/transfer_ripped.py @@ -0,0 +1,126 @@ +#!/usr/bin/env python3 + +import os +import subprocess + +DESTINATION_FOLDER = "transcode/raw" # pi@192.168.xxx:/home/pi/transcode/raw +RIPPED_DIR = "ripped" + + +def main(): + chdir_to_script_dir() + + for dvd_type in ("movie", "series"): + for dvd in list_ripped_dvds(dvd_type): + print(f"Transferring {dvd_type}: {dvd}") + success = transfer_ripped_dvd_to_transcoder(dvd, dvd_type) + print() + if not success: + print("Transfer failed!") + exit(1) + + print("Success") + + +def chdir_to_script_dir(): + os.chdir(os.path.dirname(__file__)) + + +def list_ripped_dvds(dvd_type): + path = os.path.join(RIPPED_DIR, dvd_type) + try: + dvd_titles = os.listdir(path) + dvd_titles = filter(lambda title: not title.endswith(".lock"), dvd_titles) + return map(lambda dvd_title: os.path.join(path, dvd_title), dvd_titles) + except FileNotFoundError: + print( + f"Directory {path} not found. Running the ripper script will generate it." + ) + exit(1) + + +def transfer_ripped_dvd_to_transcoder(ripped_dvd, dvd_type) -> bool: + """Returns: success of command""" + + dvd_title = os.path.basename(ripped_dvd) + + local_folder = os.path.dirname(ripped_dvd) + remote_folder = os.path.join(DESTINATION_FOLDER, dvd_type) + + lock_file_name = dvd_title + ".lock" + lock_file_local = os.path.join(local_folder, lock_file_name) + lock_file_remote = os.path.join(remote_folder, lock_file_name) + + try: + create_local_lock_file(lock_file_local) + transfer_lock_file(lock_file_local, lock_file_remote) + + transfer_ripped_dvd(ripped_dvd, remote_folder) + remove_empty_dirs_lefover_from_rsync(local_folder) + + delete_local_lock_file(lock_file_local) + remove_remote_lock_file(lock_file_name, local_folder, remote_folder) + + except subprocess.CalledProcessError: + return False + + return True + + +def create_local_lock_file(path): + create_empty_file(path) + + +def create_empty_file(path): + with open(path, "w") as _: + pass + + +def delete_local_lock_file(path): + os.remove(path) + + +def transfer_lock_file(lock_file_local, lock_file_remote): + subprocess.run(["rsync", "-e ssh", lock_file_local, lock_file_remote], check=True) + + +def transfer_ripped_dvd(ripped_dvd, destination_folder): + subprocess.run( + [ + "rsync", + "-az", + "-e ssh", + "--remove-source-files", + ripped_dvd, + destination_folder, + ], + check=True, + ) + + +def remove_empty_dirs_lefover_from_rsync(folder): + """Rsyncs --remove-source-files does not delete directories, so call this method to fix this""" + subprocess.run( + ["find", folder, "-depth", "-type", "d", "-empty", "-delete"], + check=True, + ) + + +def remove_remote_lock_file(lock_file_name, folder, destination_folder): + subprocess.run( + [ + "rsync", + "-r", + "-e ssh", + "--delete", + f"--include={lock_file_name}", + "--exclude=*", + folder + "/", + destination_folder + "/", + ], + check=True, + ) + + +if __name__ == "__main__": + main()