3.6.0: grabaciones siempre por día y por fuente, grabadoras en su carpeta, y «Organizar carpetas»
Las grabaciones van siempre a su día de rodaje y dentro a una carpeta por fuente; el DJI Mic, la Tascam y las Zoom se reconocen por su nombre y van a DJI_MIC, TASCAM y ZOOM en vez de caer juntas en AUDIO. El plan repasa lo ya ordenado sin carpeta de día o con la grabadora en AUDIO. «Mapa» pasa a «Organizar carpetas»: el árbol salía en fila por una regla CSS del ejemplo de tipo de trabajo; ahora va en vertical a toda la altura y a la derecha, fijos, «Qué va en esta carpeta» y «¿Dónde va a parar este archivo?». Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Este commit está contenido en:
@@ -42,7 +42,7 @@ import actualizador
|
||||
asistente.O = sys.modules[__name__]
|
||||
actualizador.O = sys.modules[__name__]
|
||||
|
||||
VERSION = "3.5.0"
|
||||
VERSION = "3.6.0"
|
||||
|
||||
BASE = os.path.dirname(os.path.abspath(sys.executable if getattr(sys, "frozen", False) else __file__))
|
||||
# Empaquetado: el programa corre con el motor que viaja en su propia carpeta. OrganizadorLabstream.exe es
|
||||
@@ -1055,9 +1055,11 @@ class Plan:
|
||||
return dias
|
||||
|
||||
def dia_de(self, fecha, anio, mes):
|
||||
"""El nombre de la carpeta del día, o "" si en ese mes solo se grabó un día: entonces sobra."""
|
||||
if len(self.dias_mes.get((anio, mes), ())) < 2:
|
||||
return ""
|
||||
"""El nombre de la carpeta del día de rodaje («13- Jueves»).
|
||||
|
||||
Hasta la 3.5.0 se omitía cuando ese mes solo tenía un día de rodaje. Munka, 14-oct-2026: las
|
||||
grabaciones van «siempre según la cámara, organizado por fecha y por carpetas», así que la carpeta
|
||||
del día va siempre, y dentro una por fuente (URSA_BRAW, SONY, DJI_MIC, TASCAM…)."""
|
||||
return R.nombre_dia(fecha)
|
||||
|
||||
# ---- helpers ----
|
||||
@@ -1595,7 +1597,7 @@ class Plan:
|
||||
continue
|
||||
mot = motivo + (" · repartido por fuente" if anio and mes else " · mes por la fecha de cada archivo" + (" (fecha de modificación)" if fconf == "baja" else ""))
|
||||
if dia:
|
||||
mot += " · y por día, que ese mes hubo varios rodajes"
|
||||
mot += " · y por día de rodaje"
|
||||
self.agregar(e.path, self.abs_(destino), "GRABACION", "mover archivos", mot + aviso_fecha, fconf,
|
||||
archivos=archivos)
|
||||
|
||||
@@ -1691,24 +1693,51 @@ class Plan:
|
||||
break
|
||||
else:
|
||||
resto = segs[len(pat):]
|
||||
if resto and _RX_DIA.match(resto[0]):
|
||||
tenia_dia = bool(resto and _RX_DIA.match(resto[0]))
|
||||
if tenia_dia:
|
||||
resto = resto[1:] # la carpeta del día se vuelve a calcular en destino
|
||||
por_mes[(R.detectar_anio(segs[ia]), R.detectar_mes(segs[im])[0])].append((f, resto))
|
||||
por_mes[(R.detectar_anio(segs[ia]), R.detectar_mes(segs[im])[0])].append((f, resto, tenia_dia))
|
||||
grupos = defaultdict(list)
|
||||
grupos_dia = defaultdict(list) # ya en su mes, pero sin carpeta de día o con la grabadora en «AUDIO»
|
||||
for (anio_c, mes_c), fs in por_mes.items():
|
||||
fuera = [(f, resto) for f, resto in fs if _discrepa_mes(f["fecha"], f["fecha_origen"], anio_c, mes_c)]
|
||||
if not fuera:
|
||||
continue
|
||||
# lo que solo tiene fecha de modificación pero es del mismo día que lo que se va (la Sony que
|
||||
# rodó junto a la URSA) se va con ello: si no, el rodaje quedaría partido entre dos meses
|
||||
dias = {f["fecha"] for f, _ in fuera}
|
||||
fuera += [(f, resto) for f, resto in fs
|
||||
if f["fecha_origen"] == "mtime" and f["fecha"] in dias and _fecha_de_camara(f)]
|
||||
fuera = [(f, resto) for f, resto, _ in fs if _discrepa_mes(f["fecha"], f["fecha_origen"], anio_c, mes_c)]
|
||||
if fuera:
|
||||
# lo que solo tiene fecha de modificación pero es del mismo día que lo que se va (la Sony que
|
||||
# rodó junto a la URSA) se va con ello: si no, el rodaje quedaría partido entre dos meses
|
||||
dias = {f["fecha"] for f, _ in fuera}
|
||||
fuera += [(f, resto) for f, resto, _ in fs
|
||||
if f["fecha_origen"] == "mtime" and f["fecha"] in dias and _fecha_de_camara(f)]
|
||||
for f, resto in fuera:
|
||||
ay, am = int(f["fecha"][:4]), int(f["fecha"][5:7])
|
||||
destino = destino_plantilla(self.tipo, "GRABACION", anio=ay, mes=am,
|
||||
dia=self.dia_de(f["fecha"], ay, am), sub=os.sep.join(resto))
|
||||
grupos[(f["dir"], destino, anio_c, mes_c, ay, am)].append((f["ruta"], f["bytes"], f["fecha_origen"] == "nombre"))
|
||||
# Lo que sí está en su mes: desde la 3.6.0 las grabaciones van siempre dentro de su día de
|
||||
# rodaje y cada grabadora en su carpeta (DJI_MIC, TASCAM, ZOOM), así que lo ordenado con
|
||||
# versiones anteriores (sin carpeta de día, o con la grabadora en «AUDIO») se vuelve a mirar.
|
||||
# Solo lo que tiene fecha de fiar (en el nombre, o un original de cámara, cuya fecha de
|
||||
# modificación es la del rodaje): lo demás se queda donde está.
|
||||
idos = {f["ruta"] for f, _ in fuera}
|
||||
for f, resto, tenia_dia in fs:
|
||||
if f["ruta"] in idos or (f["fecha_origen"] == "mtime" and not _fecha_de_camara(f)):
|
||||
continue
|
||||
nuevo = list(resto)
|
||||
fu = R.FUENTE_CARPETA.get(f["fuente"])
|
||||
if fu and fu != "AUDIO" and f["rol"] == "audio_grabado":
|
||||
for i in range(len(nuevo)):
|
||||
if R.norm(nuevo[i]) == "audio":
|
||||
nuevo[i] = fu
|
||||
if tenia_dia and nuevo == resto:
|
||||
continue
|
||||
destino = destino_plantilla(self.tipo, "GRABACION", anio=anio_c, mes=mes_c,
|
||||
dia=self.dia_de(f["fecha"], anio_c, mes_c), sub=os.sep.join(nuevo))
|
||||
if self.abs_(destino).lower() == os.path.normpath(f["dir"]).lower():
|
||||
continue
|
||||
grupos_dia[(f["dir"], destino, not tenia_dia, nuevo != resto)].append((f["ruta"], f["bytes"]))
|
||||
for (origen, destino, sin_dia, grabadora), archivos in grupos_dia.items():
|
||||
partes = (["sin la carpeta del día de rodaje"] if sin_dia else []) + (["la grabadora va en su propia carpeta, no en «AUDIO»"] if grabadora else [])
|
||||
self.agregar(origen, self.abs_(destino), "GRABACION", "mover archivos",
|
||||
"ya en su mes, pero " + " y ".join(partes), "media", archivos=archivos)
|
||||
n = b = 0
|
||||
for (origen, destino, anio_c, mes_c, ay, am), archivos in grupos.items():
|
||||
n += len(archivos)
|
||||
@@ -4606,7 +4635,7 @@ def _plural(n, uno, varios):
|
||||
EJEMPLO_VAR = {
|
||||
"anio": ("2026", "el año del material"),
|
||||
"mes": ("09- Septiembre", "el mes del material"),
|
||||
"dia": ("15- Viernes", "el día en que se grabó, y solo si ese mes hubo más de un rodaje"),
|
||||
"dia": ("15- Viernes", "el día en que se grabó"),
|
||||
"nombre": ("Nombre de la pieza", "el nombre de la pieza o de la carpeta"),
|
||||
"fuente": ("URSA_BRAW", "la cámara de la que salió"),
|
||||
"app": ("Premiere", "el programa que abre el proyecto"),
|
||||
@@ -4747,15 +4776,15 @@ def donde_iria(nombre, tipo="contenido"):
|
||||
fecha, origen = R.fecha_de_nombre(nombre, time.time())
|
||||
kw = {"anio": int(fecha[:4]), "mes": int(fecha[5:7])}
|
||||
if cub == "GRABACION":
|
||||
kw["sub"] = R.FUENTE_CARPETA.get(firma, "OTROS")
|
||||
kw["sub"] = R.FUENTE_CARPETA.get(firma, "AUDIO" if rol == "audio_grabado" else "OTROS")
|
||||
if cub == "CELULAR" and tipo == "contenido":
|
||||
cub, kw["sub"] = "GRABACION", "CELULAR"
|
||||
if cub in ("GRABACION", "CELULAR"):
|
||||
kw["dia"] = R.nombre_dia(fecha)
|
||||
if cub == "PROYECTOS":
|
||||
kw["app"] = R.app_proyecto(ext) or ("Diseño" if rol == "diseno" else "Edicion")
|
||||
destino = "_Revisar" if cub == "REVISAR" else destino_plantilla(tipo, cub, **kw)
|
||||
# el día solo se sabe con la carpeta del cliente delante (depende de cuántos rodajes tuvo ese mes),
|
||||
# así que aquí se dice cuál sería, no que vaya a estar
|
||||
dia = R.nombre_dia(fecha) if cub in ("GRABACION", "CELULAR") else ""
|
||||
dia = kw.get("dia", "")
|
||||
return {"nombre": nombre, "dia": dia, "rol": rol, "que": R.ROL_QUE.get(rol, rol), "cubeta": cub,
|
||||
"titulo": R.CUBETAS.get(cub, cub), "color": R.COLOR_CUBETA.get(cub, R.COLOR_CUBETA[""]),
|
||||
"destino": destino, "crudo": [x for x in (PLANTILLAS.get(tipo, {}).get(cub, "") or "").split("/") if x],
|
||||
|
||||
Referencia en una nueva incidencia
Block a user