si los nombres de los eventos son diferentes, por ejemplo, si crea dos eventos titulados "película" y luego iMovie renombra el segundo a "película 1", puede adaptar la variable global SHOW_NAME_CORRESPONDENCE
para asignar el nombre del evento de iMovie al nombre de la carpeta con el contenido original.
import doctest
import glob
import os
import pathlib
import shutil
import sys
FILE_SUFFIXES_LOWERCASE = [".mp4", ".mts", ".mov", ".jpg", ".jpeg", ".png"]
PROJECTS_TO_SKIP = [] # e.g., ["project 1", "project 2"]
SHOW_NAME_CORRESPONDENCE = {} # e.g. {"movie": "movie 1"}
def skip(f):
"""Returns a boolean for whether to skip a file depending on suffix.
skip("abc.mp4")
False
skip("ABC.JPEG")
False
skip("abc.plist")
True
skip("00114.MTS")
False
"""
suffix = pathlib.Path(f).suffix.lower()
return suffix not in FILE_SUFFIXES_LOWERCASE
def get_show_and_name(f):
"""
show, name = get_show_and_name("/Volumes/video/iMovie Library.imovielibrary/my great show/Original Media/00117.mts")
"my great show" == show
True
"00117.mts" == name
True
show, name = get_show_and_name("/Volumes/video/path/to/originals/my great show/00117.mts")
"my great show" == show
True
"00117.mts" == name
True
"""
path = pathlib.Path(f)
name = path.name.lower()
dirname = str(path.parents[0])
imovie = "iMovie Library.imovielibrary" in dirname
parent_dir = str(path.parents[2 if imovie else 1])
show = dirname.replace(parent_dir, "")
if imovie:
assert show.endswith("/Original Media"), f
show = show.replace("/Original Media", "")
assert show.startswith("/")
show = show[1:].lower()
if show in SHOW_NAME_CORRESPONDENCE:
show = SHOW_NAME_CORRESPONDENCE[show]
return show, name
def build_originals_dict(originals):
"""Go through the original directory to build a dictionary of filenames to paths."""
originals_dic = dict()
for f in glob.glob(os.path.join(originals, "**", "*.*"), recursive=True):
if skip(f):
continue
show, name = get_show_and_name(f)
originals_dic[(show, name)] = f
return originals_dic
def replace_files_with_symlinks(library, originals):
"""Go through the iMovie library and find the replacements."""
originals_dic = build_originals_dict(originals)
# List files recursively
for f in glob.glob(os.path.join(library, "**", "*.*"), recursive=True):
if skip(f) or os.path.islink(f):
continue
show, name = get_show_and_name(f)
if (show, name) in originals_dic:
target = originals_dic[(show, name)]
print("Replacing %s with %s" % (f, target))
os.unlink(f)
os.symlink(target, f)
else:
print("No original found for %s" % f)
def main():
args = sys.argv
assert 3 == len(args), "You need to pass 3 arguments"
library = args[1]
originals = args[2]
replace_files_with_symlinks(library = library, originals = originals)
if "main" == name:
r = doctest.testmod()
assert 0 == r.failed, "Problem: doc-tests do not pass!"
main()