Watch at EaseHistorias. Respuestas. Perspectiva.

Tecnología · GUÍA PRÁCTICA

Copia las valoraciones de JPEG a RAW en carpetas separadas de darktable

Conserva tus carpetas RAW organizadas por fecha y sus subcarpetas Jpgs. Utiliza un plan que puedas revisar para transferir las valoraciones explícitas por estrellas a los archivos XMP auxiliares existentes de darktable y después cargar los cambios en la biblioteca.

Diagrama conceptual de una carpeta de fecha: el RAW y su XMP existente están en la carpeta principal; el JPEG correspondiente y su XMP nativo opcional están en Jpgs. Elige una fuente de valoración, empareja por el mismo nombre base únicamente dentro de esa carpeta inmediatamente superior y transfiere Rating conservando los demás metadatos y las ediciones del archivo auxiliar del RAW.
Ilustración conceptual original con nombres de archivo ficticios y un ejemplo de cuatro estrellas. Elige expresamente el origen deseado: la valoración incrustada en el JPEG o la de su archivo auxiliar nativo. Empareja cada JPEG con su RAW en la carpeta inmediatamente superior. El programa exige un archivo XMP auxiliar existente del RAW y solo modifica su campo XMP Rating; no copia el historial de edición del JPEG al RAW. Watch at Ease

Valorar los JPEG puede facilitar la organización de un archivo fotográfico grande. El trabajo adicional llega cuando los RAW correspondientes están una carpeta más arriba: ya has elegido las fotos, pero los archivos que quieres revelar todavía necesitan esas valoraciones. No debería ser necesario reorganizar años de carpetas para trasladarlas.

Esta guía incluye el programa auxiliar completo para esa estructura. Empareja los archivos dentro de cada carpeta de fecha, actualiza un campo de valoración concreto en un archivo XMP auxiliar (sidecar) existente del RAW y guarda el archivo auxiliar original. Una lectura posterior en darktable completa el proceso. Empieza por una carpeta de fecha pequeña para revisar cada pareja y confirmar el resultado antes de recorrer el resto del archivo.

1. Mantén cada pareja dentro de su carpeta de fecha

La estructura admitida sitúa el RAW directamente en una carpeta de fecha y su JPEG directamente en la subcarpeta Jpgs de esa misma carpeta. Por ejemplo, Photos/2024/2024-05/Jpgs/DSC01234.JPG se empareja con Photos/2024/2024-05/DSC01234.ARW. El archivo que recibirá la valoración es Photos/2024/2024-05/DSC01234.ARW.xmp.

El nombre base compartido es DSC01234, escrito exactamente igual y con las mismas mayúsculas y minúsculas. Otro DSC01234.ARW en la carpeta de un mes distinto es un candidato diferente y nunca se utiliza para suplir una pareja que falte. El programa recorre el árbol de fotos que selecciones, pero cada emparejamiento se mantiene dentro de esta relación entre carpeta principal y subcarpeta. No determina si dos archivos corresponden a la misma toma; debes confirmar que tus nombres y tu estructura de carpetas identifican fotos que van juntas.

ARW y Jpgs son los valores predeterminados. Puedes indicar otra extensión RAW con --raw-ext y otro nombre exacto de subcarpeta con --jpeg-subdir. Se bloquean para su revisión los casos con varios JPEG que comparten nombre base, varios formatos RAW coincidentes, ambigüedades entre mayúsculas y minúsculas o posibles archivos auxiliares numerados de versiones de edición. Las carpetas anidadas dentro de Jpgs quedan fuera de esta regla.

El archivo XMP auxiliar de destino ya debe contener metadatos de darktable. El programa no creará un sustituto vacío si falta el historial de edición ni supondrá que debe usar un archivo como DSC01234.xmp al estilo de Lightroom. darktable puede leer otras convenciones de archivos auxiliares durante la importación, pero su archivo auxiliar nativo conserva la extensión de la imagen de entrada. Utiliza el archivo nativo real para esta transferencia.

2. Elige la fuente autoritativa de la valoración del JPEG

Antes de preparar nada en darktable, decide dónde está actualmente la valoración que quieres conservar. Hay tres situaciones habituales, y la preparación es distinta aunque el programa solo ofrezca dos modos de origen explícitos.

Si la valoración está incrustada en el JPEG original, utiliza --rating-source jpeg. Conserva esos JPEG sin cambios. No los importes ni generes archivos XMP auxiliares para los JPEG solo para preparar el origen de esta guía. El programa lee el campo explícito XMP-xmp:Rating; no supone que una valoración mostrada por cualquier otra aplicación esté incrustada en ese campo.

Si la valoración que quieres está actualmente en la base de datos de darktable para el JPEG, selecciona los JPEG correspondientes en lighttable (la mesa de luz) y utiliza history stack > write sidecar files para escribir los archivos auxiliares del historial de edición. Esto guarda la información actual en un archivo auxiliar nativo como Jpgs/DSC01234.JPG.xmp. Después de cerrar darktable, elige --rating-source sidecar.

Si un archivo XMP auxiliar del JPEG ya contiene las valoraciones deseadas, conserva ese archivo como fuente autoritativa. No lo sobrescribas desde una base de datos de darktable más antigua solo por seguir el párrafo anterior. El modo sidecar exige el nombre completo y exacto del JPEG seguido de .xmp, en la misma carpeta; no busca un archivo auxiliar con un nombre más corto que solo comparta el nombre base.

Cuando están disponibles, el plan muestra tanto la valoración incrustada como la del archivo auxiliar. Si no coinciden, una advertencia muestra la diferencia y prevalece el modo de origen que hayas elegido expresamente. Ninguna comparación de fechas de modificación decide por ti. Si falta la valoración en el origen seleccionado, se omite esa pareja aunque el otro origen sí tenga una. Elige el modo correcto y crea un plan nuevo en lugar de tratar la ausencia de información como un cero.

3. Prepara los archivos XMP auxiliares actuales de los RAW y cierra darktable

Comprueba que cada archivo XMP auxiliar de destino representa el estado de edición actual que quieres conservar para el RAW. Si esas ediciones están en la base de datos de darktable, selecciona el lote previsto en lighttable y utiliza history stack > write sidecar files para escribir sus archivos auxiliares. Hazlo antes de volver a importar un archivo auxiliar más antiguo. Si el archivo XMP auxiliar del RAW ya contiene las ediciones más recientes que quieres conservar, mantenlo para crear el plan en lugar de sobrescribirlo desde una base de datos más antigua; después de aplicar los cambios, carga el XMP en la base de datos.

Para los RAW que realmente no estén en la biblioteca, utiliza import > add to library para añadirlos desde su ubicación actual y comprueba después que se hayan escrito sus archivos auxiliares nativos. Prepara únicamente los metadatos JPEG que requiera la rama de origen elegida. Antes de la transferencia, guarda una copia de seguridad de los datos importantes de la biblioteca y de los archivos auxiliares; las copias que crea después el programa cubren los archivos auxiliares de los RAW que modifica.

Antes de salir, abre preferences > storage > XMP sidecar files, las preferencias de almacenamiento de archivos XMP auxiliares, y activa look for updated XMP files on startup para buscar XMP actualizados al iniciar. Para este procedimiento, configura create XMP files en on import (al importar), en lugar de never (nunca). La política after edit (después de editar) no garantiza que todos los RAW sin procesar ya tengan un archivo auxiliar.

Cierra darktable y mantenlo cerrado durante la creación del plan, su revisión y la aplicación. Pausa también las demás aplicaciones que puedan reescribir estos archivos. Así se mantiene estable el estado preparado: una vez que una imagen está en darktable, su base de datos puede tener prioridad y sobrescribir un cambio externo en el XMP.

Flujo conceptual de cuatro pasos: conserva la fuente de valoración elegida, comprueba que el XMP del RAW contenga las ediciones actuales que quieres mantener y cierra los editores de fotos; revisa la elección del origen y cada pareja prevista; guarda una copia del XMP original y cambia Rating; carga el XMP modificado en darktable y comprueba las estrellas y las ediciones. El cero es una valoración explícita de cero estrellas, menos uno significa rechazado y la ausencia de valoración hace que se omita la pareja. Las valoraciones RAW existentes distintas con estrellas o rechazo se protegen de forma predeterminada.
Ilustración conceptual original. Conserva la fuente de valoración elegida, asegúrate de que el XMP del RAW contenga las ediciones actuales que quieres mantener y cierra los editores antes de revisar y aplicar el plan. Escribe un archivo auxiliar desde darktable solo cuando su base de datos contenga el estado de origen deseado. Por último, vuelve a cargar el XMP modificado del RAW en darktable y comprueba las valoraciones y las ediciones. La ausencia de valoración, el cero y el rechazo son distintos; los conflictos requieren un plan nuevo creado expresamente. Watch at Ease

4. Prepara Python, RDFLib y ExifTool

Necesitas Python 3.10 o posterior, RDFLib 7.6.0 y un ejecutable de ExifTool. Trabaja en una carpeta nueva con permisos de escritura para el programa auxiliar y los manifiestos. Los ejemplos utilizan python3; en Windows, usa py -3 de forma coherente si ese es tu comando de Python.

Instala RDFLib en el mismo entorno de Python que ejecutará el programa auxiliar. Un entorno virtual es una forma práctica de mantenerlo separado de otros proyectos. Si utilizas uno, sustituye python3 por el ejecutable de Python de ese entorno en todos los comandos que siguen.

python3 -m pip install rdflib==7.6.0

python3 -c "import sys,rdflib; print(sys.version); print(rdflib.__version__)"

Obtén ExifTool de su distribución oficial y sigue sus instrucciones de instalación. En Windows, cambia el nombre de exiftool(-k).exe a exiftool.exe para utilizarlo desde la línea de comandos y conserva a su lado la carpeta exiftool_files incluida. Si utilizas la distribución portátil en Perl en macOS o Linux, conserva el directorio lib junto al script exiftool y asegúrate de tener Perl disponible.

Si ExifTool está en PATH, el programa auxiliar puede encontrarlo como exiftool. De lo contrario, indica la ruta de su ejecutable con --exiftool. En Windows puede ser --exiftool "C:/Tools/ExifTool/exiftool.exe"; en macOS o Linux, utiliza la ruta real de tu ejecutable. Este argumento es una ruta de archivo, no un comando de shell como "perl exiftool".

Utiliza el mismo ejecutable y la misma versión al crear el plan y al aplicarlo. Si actualizas ExifTool o lo cambias de ubicación entre ambos pasos, crea un plan nuevo para que coincida con el entorno de ejecución registrado.

5. Guarda e inspecciona el programa auxiliar completo

El siguiente párrafo contiene el programa auxiliar completo en un paquete compacto de una sola línea. Copia el párrafo entero en un archivo de texto sin formato llamado unpack_rating_helper.py dentro de tu carpeta de trabajo. Mantenlo como una sola línea lógica; el ajuste visual de línea del editor no supone ningún problema. No añadas comillas, delimitadores de bloques Markdown ni texto del artículo.

El desempaquetador funciona sin conexión. Descomprime el código fuente incluido, comprueba su SHA-256 y crea un archivo nuevo sync_jpeg_ratings.py mediante creación exclusiva para que puedas inspeccionarlo. No ejecuta el programa auxiliar ni descarga nada. Si ya existe un archivo con ese nombre, se niega a sobrescribirlo.

import base64,zlib,hashlib,sys; from pathlib import Path; data=zlib.decompress(base64.b64decode('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')); f=Path("sync_jpeg_ratings.py").open("xb") if hashlib.sha256(data).hexdigest()=='ba1136a7f667973bf1fef54682971bf964f4518825c99d45955ed871fdb88158' else sys.exit("SHA-256 mismatch; no helper file written"); f.write(data); f.close(); print("Created sync_jpeg_ratings.py for inspection; it has not been run.")

python3 unpack_rating_helper.py

Abre el archivo sync_jpeg_ratings.py resultante en tu editor de texto antes de utilizarlo. El archivo reconstruido tiene 34,478 bytes y su SHA-256 es ba1136a7f667973bf1fef54682971bf964f4518825c99d45955ed871fdb88158. Si el hash no coincide, no se escribe ningún programa auxiliar; vuelve a copiar el párrafo original en lugar de eliminar la comprobación.

El programa, cuyo código puedes leer, solo cambia XMP-xmp:Rating en una copia temporal de un archivo XMP auxiliar existente del RAW. Utiliza RDFLib para comparar todos los demás metadatos RDF, por lo que acepta representaciones XML equivalentes, pero no cambios en los datos de edición. No escribe píxeles de imagen, no accede a la base de datos de darktable ni copia el bloque XMP completo del JPEG.

6. Crea un plan y revisa cada pareja propuesta

Empieza por una carpeta de fecha pequeña o por el árbol de un año seleccionado. Sustituye las rutas de las fotos y de ExifTool de este comando por las tuyas. La operación predeterminada escribe un manifiesto JSON nuevo y deja todas las fotos y los archivos auxiliares sin cambios.

python3 sync_jpeg_ratings.py "/path/to/Photos/2024" --rating-source sidecar --manifest "ratings-plan.json" --exiftool "/path/to/exiftool"

Para usar las valoraciones incrustadas en los JPEG, sustituye sidecar por jpeg. Si es necesario, añade --jpeg-subdir "Jpgs" o --raw-ext ARW con los valores adecuados. En Windows, un comando completo equivalente puede ser el siguiente:

py -3 sync_jpeg_ratings.py "D:/Photos/2024" --rating-source sidecar --manifest "ratings-plan.json" --exiftool "C:/Tools/ExifTool/exiftool.exe"

Abre ratings-plan.json. Empieza por counts y después revisa los campos jpeg, raw, raw_sidecar, rating_source, target_rating y new_rating de cada fila ready. Confirma las rutas, el cambio previsto del valor anterior al nuevo y todas las advertencias sobre diferencias entre la valoración incrustada y la del archivo auxiliar. Que la simulación termine correctamente no significa que todas las imágenes estén listas.

Los pares ready están listos para aplicar el cambio. Los pares unchanged ya tienen el valor deseado. Los pares skipped no tienen una valoración explícita en el origen seleccionado. Los pares blocked requieren atención: sus motivos explican si falta un archivo auxiliar, la valoración es desconocida, hay conflictos entre nombres de archivo, posibles versiones de edición u otra condición no admitida. Corrige el problema de origen y crea un manifiesto nuevo.

El plan registra la identidad de los archivos, sus fechas de modificación, los hashes de los archivos completos y los nombres de archivo cercanos que sean relevantes. Calcular los hashes de RAW grandes lleva tiempo aunque nunca se editen sus píxeles. Selecciona un árbol manejable. Un plan vacío puede indicar que la carpeta seleccionada no contiene subcarpetas Jpgs que cumplan las condiciones; no demuestra que el archivo fotográfico carezca de JPEG valorados.

7. Decide cómo tratar las cero estrellas, el rechazo y las valoraciones existentes

Los valores de origen aceptados son números enteros de -1 a 5. El cero es una valoración real de cero estrellas y -1 es un rechazo real. Un campo ausente no equivale a ninguno de esos valores. El programa conserva la valoración del RAW cuando falta en el origen seleccionado y bloquea las valoraciones que no puede leer, las fraccionarias, las que están fuera de rango y las ambiguas.

De forma predeterminada, un origen válido puede rellenar una valoración de destino ausente o igual a cero. Si los valores coinciden, no se modifica nada. Se protege cualquier valoración existente de 1–5 o -1 que difiera de la del origen, incluso cuando el origen la dejaría en cero. La valoración inicial de importación documentada de darktable es 1 de forma predeterminada, por lo que incluso los RAW recién importados pueden activar esta protección.

Cuando la transferencia prevista realmente deba sustituir esos valores existentes, revisa las parejas afectadas y crea un plan independiente con --replace-rated. Esta opción se aplica a los conflictos aptos de todo ese plan nuevo; utiliza un árbol lo bastante pequeño en lugar de tratarla como una casilla que selecciona una sola fila.

python3 sync_jpeg_ratings.py "/path/to/Photos/2024" --rating-source sidecar --replace-rated --manifest "ratings-replace-plan.json" --exiftool "/path/to/exiftool"

Revisa ese manifiesto nuevo antes de aplicarlo. No edites a mano los valores ni los estados del JSON para forzar una operación. La suma de comprobación protege el plan revisado frente a cambios accidentales, y la aplicación del plan también comprueba el emparejamiento, el origen, la política de conflictos y los archivos actuales. La opción de sustitución no convierte una valoración inválida ni una pareja de archivos ambigua en casos aceptables.

8. Aplica el plan revisado y conserva su registro de resultados

Con darktable todavía cerrado, aplica exactamente el manifiesto que revisaste. Utiliza aquí ratings-replace-plan.json solo si ese es el plan nuevo de sustitución que aprobaste. Conserva la misma ruta de ExifTool que antes.

python3 sync_jpeg_ratings.py --apply "ratings-plan.json" --exiftool "/path/to/exiftool"

Antes de cada escritura, el programa vuelve a leer la valoración seleccionada y verifica los archivos previstos y el inventario del directorio. Guarda el archivo XMP auxiliar original del RAW en una carpeta única rating-sync-backup-<plan-id> junto al manifiesto y mantiene la ruta relativa del destino dentro de sidecars. receipt.json registra cada destino, su copia de seguridad, las valoraciones anterior y nueva y los hashes.

ExifTool cambia el único campo de valoración especificado con su espacio de nombres en un archivo auxiliar preparado temporalmente. Después, el programa comprueba la valoración y todos los datos RDF ajenos a ella, vuelve a verificar el estado de entrada y sustituye ese destino. Verifica el archivo auxiliar ya escrito y confirma que el RAW, el JPEG y cualquier archivo auxiliar del JPEG registrado siguen coincidiendo con sus huellas. El formato XML o el identificador del kit de herramientas pueden variar; la copia de seguridad conserva los bytes originales.

Un archivo cambiado, una lista de nombres de archivo relevantes modificada o un manifiesto alterado detienen una operación basada en un estado desactualizado. Si se produce un error a mitad del lote, las parejas ya completadas permanecen completadas y las posteriores quedan sin intentar. Revisa result_counts y unattempted_ready_pairs en el registro de resultados. Se trata de una secuencia de confirmaciones individuales, no de un lote que se aplique entero o no se aplique en absoluto.

Presta atención a committed_verification_failed y commit_state_requires_inspection. Estos estados indican que debes comprobar el archivo actual frente a los hashes registrados; un error posterior a la sustitución no significa que nada haya cambiado. Si una interrupción deja como última entrada guardada una entrada prepared, también debes inspeccionarla. Conserva juntos el manifiesto, el registro de resultados y las copias de seguridad.

El directorio de copia de seguridad único impide ejecutar a ciegas el mismo plan dos veces. Después de resolver la causa de un lote detenido, crea un plan nuevo para el trabajo restante. No borres el directorio de copia anterior para eludir esa protección. Incluso un registro de resultados completado sigue indicando que darktable_reload está pendiente.

9. Carga los archivos XMP auxiliares en darktable y verifica el resultado

Inicia darktable. En el cuadro de diálogo de archivos auxiliares actualizados, selecciona las entradas RAW previstas y elige keep the XMP edit (conservar la edición del XMP), la acción que carga el contenido del XMP en la base de datos. No elijas keep the database edit (conservar la edición de la base de datos), que devuelve el estado antiguo de la base de datos al archivo auxiliar. Estas etiquetas de botones se comprobaron en el código fuente oficial actual; el texto puede variar según la versión y la traducción.

Si las entradas esperadas no aparecen, no des por hecho que la transferencia haya fallado ni que haya funcionado. La comprobación al inicio depende de la configuración y de las marcas de tiempo. Como alternativa, utiliza import > add to library en lighttable para añadir los archivos a la biblioteca: ve a la carpeta RAW original, desmarca select only new images (seleccionar solo imágenes nuevas) y selecciona expresamente los RAW existentes de este lote. La casilla controla la selección inicial; desmarcarla por sí solo no sustituye la selección de los archivos previstos. Completa la operación de añadirlos para volver a cargar sus datos XMP.

Utiliza los archivos en su ubicación actual. copy & import (copiar e importar) crea una ruta de importación distinta y no utiliza el archivo auxiliar existente de la misma manera. No hace falta quitar ni eliminar imágenes. refresh exif vuelve a leer la imagen de origen y puede sobrescribir las valoraciones; cargar el archivo auxiliar de un JPEG como historial de un RAW puede sustituir sus ediciones. Ninguna de esas operaciones es el paso de lectura posterior que requiere esta transferencia.

Comprueba las estrellas visibles del RAW, su estado de rechazo y sus ediciones originales. Comprueba también cualquier orden personalizado del que dependas. Las posiciones de ordenación personalizada no se guardan en XMP, por lo que conservar el archivo auxiliar no garantiza reconstruir todos los detalles exclusivos de la base de datos. Conserva la copia de seguridad de la base de datos cuando ese estado sea importante.

Para deshacer una transferencia confirmada antes de seguir editando, cierra darktable y localiza en el registro de resultados esa pareja exacta de raw_sidecar y backup. Verifica la copia de seguridad con backup_sha256 y el archivo auxiliar actual con new_sidecar_sha256. Este comando de solo lectura muestra el SHA-256 de un archivo; sustituye la ruta por cada ruta real, una a una:

python3 -c "import hashlib,sys; print(hashlib.sha256(open(sys.argv[1],'rb').read()).hexdigest())" "/full/path/to/sidecar.xmp"

Si el destino actual todavía coincide con la versión transferida que quedó registrada, copia esa única copia de seguridad original sobre ese archivo XMP auxiliar exacto del RAW con tu gestor de archivos; después carga el archivo auxiliar restaurado en darktable y verifícalo. Si el archivo actual ha cambiado desde la aplicación del plan, consérvalo por separado e inspecciona esas ediciones posteriores antes de restaurar nada. Deja intactos los destinos ajenos a esa restauración. Continúa con la siguiente carpeta de fecha solo después de confirmar las valoraciones y el estado de edición del lote actual.

Verificación: el programa auxiliar suministrado superó 27 casos completos de línea de comandos con Python 3.12, RDFLib 7.6.0 y ExifTool 13.59 de la distribución 13.59.3 del proveedor. Las pruebas utilizaron JPEG generados, XMP sintéticos con estructura de darktable e historial de edición y archivos testigo opacos usados como RAW. Comprobaron cambios controlados de valoración, bytes de imagen y metadatos ajenos a la valoración sin cambios, copias de seguridad, conflictos, entradas desactualizadas, finalización parcial y una restauración deliberada de un único destino. El desempaquetador también superó cuatro casos de reconstrucción; su comprobación de hash sigue activa con la optimización de Python y no sobrescribe un archivo de salida existente. Estos resultados no incluyen la lectura del XMP en la interfaz o la base de datos de darktable, la decodificación de RAW reales de cámara ni la ejecución en distintos sistemas operativos. Las indicaciones sobre la interfaz se cotejaron con el manual oficial 5.6 y el código fuente actual; verifica el resultado final en tu propia biblioteca.