Tecnología · GUÍA PRÁCTICA
Convierte la lista guardada de Shotcut a CSV sin agrupar clips repetidos
Conserva subclips repetidos, nombres guardados y recortes originales en una tabla sin conexión; no la confundas con un inventario de la línea de tiempo ni una lista de borrado.

Una lista de nombres de archivo únicos puede perder lo que necesitas de la lista de reproducción de Shotcut: dos entradas con recortes distintos pueden usar el mismo archivo. El informe debe conservar cada entrada, su posición y el nombre guardado, en lugar de agruparlas como un único recurso.
Shotcut ya exporta vídeos de las carpetas de la lista, y sus opciones actuales de nombres por lotes admiten nombres de origen. Esta guía añade un informe CSV sin conexión y con alcance limitado de tu lista principal guardada. Lee una copia MLT compatible sin cambiar el proyecto ni abrir medios; no exporta vídeos ni identifica archivos que puedas borrar.
Guarda el proyecto y distingue las listas
Guarda y cierra el proyecto actual y conserva una copia MLT aparte llamada project.mlt para el informe. La receta espera tu propio XML sencillo UTF-8, exactamente una playlist main_bin de nivel superior, o su nombre antiguo main bin, y entradas directas que remitan a producer o chain de nivel superior. Espacios de nombres, entradas anidadas o compuestas, elementos blank y XML con declaraciones quedan fuera y detienen el proceso antes de crear salida.
La lista principal guardada contiene todas sus entradas. No se lee la carpeta seleccionada, el filtro de búsqueda ni el orden de la interfaz en ejecución. El código actual usa shotcut:bins para el texto guardado de carpeta y shotcut:caption para el nombre visible; propiedades ausentes dejan celdas vacías. No recrea nombres automáticos derivados del archivo, pertenencia a carpetas inteligentes ni alternativas de visualización de la interfaz.
Si quieres vídeos, usa la exportación nativa Current Playlist Bin o Each Playlist Bin Item. Para una lista de recursos únicos, el MLT Analyzer existente ya ofrece una descarga. Son resultados distintos: este informe mantiene el orden guardado y las repeticiones. No repara proyectos trasladados ni cambia rutas.
Ejecuta la conversión CSV dentro de su alcance
En una terminal Linux Bash con Python 3, entra en la carpeta de tu copia project.mlt. Copia el comando siguiente como una sola línea, conservando comillas rectas y barras inversas. Elige un nombre nuevo de salida: rechaza playlist.csv si ya existe. Ejecutamos este comando exacto en Linux Bash; no lo probamos en Windows ni macOS.
El analizador XML resuelve cada referencia de la lista principal a un producer o chain y lee solo sus propiedades seleccionadas directas. El resource de un filtro no se trata silenciosamente como recurso del clip. ID de nivel superior duplicados, referencias ausentes, propiedades seleccionadas repetidas y estructuras de entrada incompatibles detienen la creación del CSV.
python3 -c 'exec('"'"'import csv, sys, xml.etree.ElementTree as E\nfrom pathlib import Path\nsrc, dst = map(Path, sys.argv[1:])\nraw = src.read_bytes()\ntext = raw.decode("utf-8-sig")\nif "<!DOCTYPE" in text.upper() or "<!ENTITY" in text.upper():\n raise ValueError("Own plain XML only; declarations unsupported")\nroot = E.fromstring(text)\nif root.tag != "mlt":\n raise ValueError("Expected unnamespaced mlt root")\nbins = [x for x in root if x.tag == "playlist" and x.get("id") in ("main_bin", "main bin")]\nif len(bins) != 1:\n raise ValueError("Need exactly one saved main playlist")\nobjects = {}\nfor x in root:\n if x.get("id"):\n if x.get("id") in objects:\n raise ValueError("Duplicate top-level ID")\n objects[x.get("id")] = x\nkeys = ["shotcut:caption", "shotcut:bins", "mlt_service", "resource", "shotcut:resource", "warp_resource", "shotcut:comment"]\nrows = []\nfor entry in bins[0]:\n if entry.tag == "property":\n continue\n if entry.tag != "entry" or len(entry):\n raise ValueError("Only direct referenced entries supported")\n pid = entry.get("producer", "")\n obj = objects.get(pid)\n if obj is None or obj.tag not in ("producer", "chain"):\n raise ValueError("Missing or composite producer reference")\n values = {}\n for prop in obj.findall("property"):\n name = prop.get("name")\n if name in keys:\n if name in values or len(prop):\n raise ValueError("Duplicate or nested selected property")\n values[name] = prop.get("value", prop.text or "")\n rows.append([str(len(rows)+1), pid, values.get(keys[0], ""), values.get(keys[1], ""), entry.get("in", ""), entry.get("out", "")] + [values.get(k, "") for k in keys[2:]])\nheader = ["ordinal", "producer_id", "caption", "bin_raw", "in_raw", "out_raw", "service", "resource_raw", "proxy_original_raw", "warp_resource_raw", "comment"]\nwith dst.open("x", encoding="utf-8-sig", newline="") as f:\n w = csv.writer(f)\n w.writerow(header)\n w.writerows(rows)\nwith dst.open(encoding="utf-8-sig", newline="") as f:\n if list(csv.reader(f)) != [header] + rows:\n raise ValueError("Readback mismatch; discard partial CSV")\nprint(str(len(rows)) + " saved playlist entries checked; not a timeline or deletion list")\n'"'"')' "project.mlt" "playlist.csv"
Interpreta las once columnas como texto
Las columnas son ordinal, producer_id, caption, bin_raw, in_raw, out_raw, service, resource_raw, proxy_original_raw, warp_resource_raw y comment. Ordinal empieza en 1 según el orden guardado. Nombre, carpeta y comentario son propiedades guardadas, no datos deducidos del nombre del archivo. Una celda vacía significa que la receta no registró un valor; no certifica un clip sin usar ni roto.
In_raw y out_raw conservan las cadenas de atributos analizadas, incluidos ceros iniciales; los límites ausentes quedan vacíos. No calcula duración, resuelve límites implícitos ni valida el intervalo de reproducción. No restes esas cadenas como segundos: los valores MLT dependen de su representación y del contexto del proyecto. El análisis decodifica los escapes XML; la tabla conserva valores analizados, no la escritura XML byte por byte.
Los tres campos de recursos quedan separados. Resource_raw recoge resource, proxy_original_raw recoge shotcut:resource y warp_resource_raw recoge warp_resource. Un recurso timewarp puede llevar un prefijo de velocidad, y las propiedades relacionadas con proxies pueden diferir. No expande rutas, las convierte en absolutas, comprueba su existencia ni elige el original correcto. Tampoco recorre dependencias de proyectos anidados, filtros, máscaras, LUT ni secuencias de imágenes.
Comprueba las filas antes de usar el informe
El comando relee el CSV y compara cabecera y cada campo con las filas analizadas antes de anunciar éxito. Compara el número de entradas con la lista principal guardada y revisa dos apariciones del mismo origen con recortes distintos y un nombre personalizado conocido. Guarda el MLT original y el CSV maestro; filtra o añade notas de entrega solo en una copia de trabajo. Para créditos verifica autor y licencia aparte: nombres de archivo y títulos no los proporcionan.
En LibreOffice Calc importa UTF-8 con separador coma y comillas dobles rectas como delimitador de texto. Pon las once columnas como Texto; desactiva Combinar delimitadores, Recortar espacios y Evaluar fórmulas. Activa Editar configuración de filtros si se oculta el diálogo. Evitas que la copia de revisión interprete una cadena temporal como fecha o un comentario guardado como fórmula. No ejecutamos la interfaz de Calc.
Ejecutamos 21 casos sintéticos con este comando exacto: seis válidos cubrieron orden repetido, Unicode y escapes XML, campos de velocidad/proxy sin modificar, ID antiguos, límites ausentes, carpetas vacías y separación de recursos de filtros y línea de tiempo; quince inválidos se detuvieron antes de crear salida. Se rechazaron seis intentos adicionales de sobrescribir salidas válidas, sin cambiar los bytes de entrada ni de salida existente. No probamos proyectos reales de Shotcut, reproducción, GUI ni ejecuciones en Windows o macOS. Si falla la escritura o relectura, descarta el CSV parcial y usa un nombre nuevo; nunca emplees este informe como permiso para borrar medios.
