Saltar a contenido

Solución al problema de pérdida de información de tiempo al exportar desde Google Fotos

Después de exportar desde Google Fotos utilizando Google Takeout, muchos archivos de fotos tienen su información de tiempo guardada en archivos .json. ¿Cómo podemos importar esta información y asociarla a las fotos correspondientes?

Para resolver este problema, vamos a crear un archivo Python llamado update-data.py:

from win32file import CreateFile, SetFileTime, GetFileTime, CloseHandle
from win32file  import GENERIC_READ, GENERIC_WRITE, OPEN_EXISTING
from pywintypes import Time
import os,json,time

# Obtener todos los archivos con una extensión específica
def get_all_file(ext_name):
    file_list = []
    datanames = os.listdir()
    for dataname in datanames:
        if os.path.splitext(dataname)[1] == ext_name:  # Archivos con extensión .json en el directorio
            file_list.append(dataname)
    return file_list

# Leer el archivo json
def load_json(json_file_name):
    f = open(json_file_name,'r',encoding = 'UTF-8')
    text = f.read()
    dic = json.loads(text)
    return dic

def modifyFileTime(filePath, createTime, modifyTime, accessTime, offset):
    """
    Función para modificar las propiedades de tiempo de cualquier archivo. Formato de tiempo: YYYY-MM-DD HH:MM:SS, por ejemplo: 2019-02-02 00:01:02
    :param filePath: Ruta del archivo
    :param createTime: Tiempo de creación
    :param modifyTime: Tiempo de modificación
    :param accessTime: Tiempo de acceso
    :param offset: Desplazamiento de tiempo en segundos, formato tuple, en el mismo orden que los parámetros de tiempo
    """
    try:
        format = "%Y-%m-%d %H:%M:%S"  # Formato de tiempo
        cTime_t = timeOffsetAndStruct(createTime, format, offset[0])
        mTime_t = timeOffsetAndStruct(modifyTime, format, offset[1])
        aTime_t = timeOffsetAndStruct(accessTime, format, offset[2])

        fh = CreateFile(filePath, GENERIC_READ | GENERIC_WRITE, 0, None, OPEN_EXISTING, 0, 0)
        createTimes, accessTimes, modifyTimes = GetFileTime(fh)

        createTimes = Time(time.mktime(cTime_t))
        accessTimes = Time(time.mktime(aTime_t))
        modifyTimes = Time(time.mktime(mTime_t))
        SetFileTime(fh, createTimes, accessTimes, modifyTimes)
        CloseHandle(fh)
        return 0
    except:
        return 1
def timeOffsetAndStruct(times, format, offset):
    return time.localtime(time.mktime(time.strptime(times, format)) + offset)

# Date conversion, converting Google's date to a numerical value
def time_format(data_string):
    print(data_string)
    year = data_string.split('年')[0]
    month = data_string.split('年')[1].split('月')[0]
    day = data_string.split('年')[1].split('月')[1].split('日')[0]
    add_flag = data_string.split('年')[1].split('月')[1].split('日')[1].find('下午')
    hour = data_string.split('年')[1].split('月')[1].split('日')[1].split('午')[1].split(':')[0]
    minute = data_string.split('年')[1].split('月')[1].split('日')[1].split('午')[1].split(':')[1]
    second = data_string.split('年')[1].split('月')[1].split('日')[1].split('午')[1].split(':')[2]
    if add_flag > 0:
        hour = str(int(hour)+12)
    return year + '-' + month + '-' +day +' ' + hour + ':'+ minute + ':' + second


if __name__ == '__main__':
    file_name_json = get_all_file('.json')                      # Get a list of all file names in the current directory

    for fnj in file_name_json:
        dic = load_json(fnj)                                        # Extract dictionary information
        st = dic['creationTime']['formatted']                       # Get the file date
        output_format = time_format(st)                             # Convert the date format

        file_name = fnj[0:-5]                                       # Get the corresponding photo name of the file
        print(file_name)
        offset = (0, 1, 2)
        # Modify the file date
        modifyFileTime(file_name, output_format, output_format, output_format,offset)

Este script se utiliza para modificar la fecha de creación de los archivos según el archivo JSON y luego importarla a las fotos con el mismo nombre.

Simplemente coloca este script en el directorio de cada álbum y ejecútalo. Después de la ejecución, la información de tiempo de las fotos se restaurará.

Referencias y agradecimientos

Dirección original del artículo: https://wiki-power.com/ Este artículo está protegido por la licencia CC BY-NC-SA 4.0. Si desea reproducirlo, por favor indique la fuente.

Este post está traducido usando ChatGPT, por favor feedback si hay alguna omisión.