3 votos

¿Cómo desduplicar los archivos de iMovie en "Original Media"?

Con cada proyecto, iMovie importa vídeos, imágenes y audio en un iMovie Library.imovielibrary . Quiero mis originales en una carpeta separada, junto con otros originales que no importé en iMovie y otros para los que uso otras herramientas como ffmpeg Pero quiero mantener la capacidad de editar y exportar proyectos. Por el momento tengo vídeos en dos lugares y la biblioteca de iMovie es un hinchado 300 GB en una unidad de 1 TB.

¿Cómo puedo evitar la duplicación de vídeos u otros archivos en una biblioteca de iMovie y ahorrar espacio en el disco?

2voto

mmorin Puntos 128

Esta página sugiere sustituir los archivos de vídeo por enlaces al original, lo que ahorra espacio. Tiene este gist en ruby y codifiqué este gist en Python que también se encuentra a continuación. La biblioteca de iMovie pasó de 300 GB a 5 GB porque me salté dos proyectos en los que aún estaba trabajando.

Como la versión de rubí:

  • pasa por una biblioteca de iMovie 10 y reemplaza los archivos en Original Media para los que puede encontrar una correspondencia con los enlaces
  • requiere importar a la biblioteca, salir de iMovie y luego ejecutar el script.

A diferencia de la versión de rubí:

  • utiliza enlaces simbólicos a los medios originales en lugar de enlaces duros (he confirmado que funciona igual de bien)
  • puede definir los tipos de archivos a sustituir (película, audio, imagen)
  • puede adaptar la variable global PROJECTS_TO_SKIP para evitar la sustitución de soportes en algunos proyectos en los que puede estar trabajando.
  • puedes saltarte los proyectos en los que aún estás trabajando
  • asume que tu biblioteca de iMovie y la carpeta de originales están organizadas por el mismo nombre de evento, porque en mi caso tenía múltiples DSC001.MOV y utilizo el nombre del evento para distinguirlos
  • 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()

2voto

Ben Burns Puntos 123

En primer lugar, un descargo de responsabilidad: Como se puede ver en Respuesta de miguelmorin En la actualidad, algunas personas han creado varios scripts para reemplazar las imágenes y vídeos duplicados en la biblioteca de iMovies con enlaces duros o simbólicos. Antes de ir más lejos, yo evitaría los enlaces duros. Los enlaces simbólicos parecen funcionar bien con iMovie, y los enlaces duros pueden tener efectos secundarios extraños, por ejemplo, Time Machine puede hacer una copia de seguridad de ellos como archivos separados.

En mi caso, he utilizado rdfinden que es una utilidad existente para limpiar archivos duplicados y no es específica de iMovie o incluso de MacOS.

  1. Instalar rdfind

    brew install rdfind
  2. Haga un simulacro

    Por ejemplo

    rdfind -dryrun true -minsize 1048576 -makesymlinks true ~/Pictures/ ~/Movies/
    • -minsize se utiliza para evitar tocar cualquier archivo que no sea de imagen o vídeo. Ajústelo según sea necesario.
    • Sustituir ~/Pictures/ con la(s) ubicación(es) de los archivos de imagen/vídeo originales. Puede enumerar tantos directorios como desee, pero ~/Movies/ debe ser el último porque rdfind espera que las ubicaciones de los archivos originales se listen primero.

    Actualización: YMMV pero parece que iMovie 10 pone todas las imágenes y vídeos originales en Original Media directorios bajo ~/Movies/iMovie Librarie.imovielibrary. Esto recorrerá sólo esos directorios y ejecutará rdfind en ellos, en cuyo caso -minsize no debería ser necesario (como en el caso anterior, sustituir ~/Pictures/ según sea necesario):

    find ~/Movies/ -type d -name "Original Media" -exec rdfind -dryrun true -makesymlinks true ~/Pictures/ {} \;
  3. Crear los enlaces simbólicos

    Una vez que esté satisfecho con la salida del comando de la ejecución en seco, elimine -dryrun true para sustituir los archivos duplicados por enlaces simbólicos, por ejemplo

    rdfind -minsize 1048576 -makesymlinks true ~/Pictures/ ~/Movies/

    O:

    find ~/Movies/ -type d -name "Original Media" -exec rdfind -makesymlinks true ~/Pictures/ {} \;

Pros:

  • Opción de ejecución en seco para mostrar lo que va a hacer primero
  • Comprobará realmente los archivos para ver si son los mismos en lugar de limitarse a comparar los nombres de los archivos
  • Encontrará duplicados incluso si los nombres de los archivos son diferentes

Contras:

  • No hay manera de restringirlo a sólo los archivos de imagen y vídeo (se ha trabajado alrededor de lo anterior, ya sea mediante el uso de -minsize o ejecutando sólo rdfind en el Original Media directorios)

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X