Files
kontor/scripts/check_kontor.py
T
2025-04-01 08:12:53 +02:00

136 lines
5.4 KiB
Python

"""
Checks the database kontor
"""
from enum import Enum, auto
import mariadb
from pathlib import Path
from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter
from setup import get_database_cursors, get_logger
parser = ArgumentParser(formatter_class=ArgumentDefaultsHelpFormatter)
parser.add_argument('--verbose', '-v', action='count', default=0)
parser.add_argument('--dir', '-d', default='/media/tpeetz/Media')
parser.add_argument('--dry-run', '-m', action='store_true')
parser.add_argument('--reset-cloud-link', '-r', action='store_true')
args = parser.parse_args()
class StatusType(Enum):
UNKNOWN = auto()
FILE_NAME = auto()
FILE_ID = auto()
DUPLICATE = auto()
CLOUD_LINK = auto()
CLOUD_LINK_ID = auto()
def get_status_of_file(found_file, cursor):
status = StatusType.UNKNOWN
file_id = ''
try:
cursor.execute(f'SELECT id, cloud_link FROM media_file WHERE file_name="{found_file.name}"')
rows = cursor.fetchall()
if len(rows) == 1:
status = StatusType.FILE_NAME
file_id = rows[0][0]
except mariadb.Error as error:
logger.debug(f'select failed with {error}')
try:
cursor.execute(f'SELECT id FROM media_file WHERE id="{found_file.stem}"')
rows = cursor.fetchall()
if len(rows) == 1:
status = StatusType.FILE_ID
file_id = rows[0][0]
if len(rows) > 1:
status = StatusType.DUPLICATE
for row in rows:
logger.info(f"found {row[0]} with {found_file}")
except mariadb.Error as error:
logger.debug(f'select failed with {error}')
try:
cursor.execute(f'SELECT id FROM media_file WHERE cloud_link LIKE "%{found_file.stem}%"')
rows = cursor.fetchall()
if len(rows) == 1:
file_id = rows[0][0]
if rows[0][0] == found_file.stem:
status = StatusType.CLOUD_LINK_ID
else:
status = StatusType.CLOUD_LINK
except mariadb.Error as error:
logger.debug(f'select failed with {error}')
return status, file_id
def rename_files_to_id(media_dir, conn, dry_run):
media_path = Path(media_dir)
cursor = conn.cursor()
for file in media_path.iterdir():
logger.debug('found file: {}'.format(file.name))
(status, file_id) = get_status_of_file(file, cursor)
new_file_path = file.with_name(f"{file_id}{file.suffix}")
match status:
case StatusType.FILE_NAME:
logger.info(f'status of {file.name} is file_name')
rename_file(file, new_file_path, dry_run)
update_cloud_link(file_id, new_file_path, conn, dry_run)
case StatusType.FILE_ID:
logger.info(f'status of {file.name} is file_id')
update_cloud_link(file_id, new_file_path, conn, dry_run)
case StatusType.CLOUD_LINK:
logger.info(f'status of {file.name} is cloud_link')
rename_file(file, new_file_path, dry_run)
update_cloud_link(file_id, new_file_path, conn, dry_run)
case StatusType.CLOUD_LINK_ID:
logger.debug(f'status of {file.name} is cloud_link_id')
update_cloud_link(file_id, new_file_path, conn, dry_run)
case StatusType.DUPLICATE:
logger.info(f'status of {file.name} is duplicate')
case StatusType.UNKNOWN:
logger.info(f'status of {file.name} is unknown')
case _:
logger.info(f'status of {file.name} is not defined')
def rename_file(current_file, new_file_path, dry_run):
if dry_run:
logger.info('rename file {} to {}'.format(current_file.name, new_file_path.name))
else:
current_file.rename(Path(new_file_path))
def update_cloud_link(file_id, file_path, conn, dry_run):
cursor = conn.cursor()
logger.debug(f'update entry {file_id} with {file_path.absolute()}')
if dry_run:
logger.info(f'UPDATE media_file: cloud_link={file_path.absolute()}')
else:
cursor.execute('UPDATE media_file SET cloud_link="{}" WHERE id="{}"'.format(file_path.absolute(), file_id))
conn.commit()
def reset_cloud_link(conn, dry_run):
cursor = conn.cursor()
if dry_run:
logger.info('UPDATE media_file SET cloud_link=""')
else:
cursor.execute('UPDATE media_file SET cloud_link="" WHERE id is NOT NULL')
conn.commit()
if __name__ == '__main__':
logger = get_logger(args.verbose)
logger.info("kontor.check_kontor started")
_, mariadb_conn = get_database_cursors(logger)
mariadb_cursor = mariadb_conn.cursor()
if args.reset_cloud_link:
reset_cloud_link(mariadb_conn, args.dry_run)
link_list = []
data_dir = args.dir
logger.info("kontor.check_kontor.rename_files_to_id")
rename_files_to_id(data_dir, mariadb_conn, args.dry_run)
#logger.info("kontor.check_kontor.update_cloud_link_with_found_files")
#update_cloud_link_with_found_files(data_dir, mariadb_conn, args.dry_run)
#logger.info("kontor.check_kontor.get_ids_from_column_cloud_link")
#get_ids_from_column_cloud_link(link_list, mariadb_cursor)
#logger.info('found {} ids in column cloud_link'.format(len(link_list)))
#logger.info("kontor.check_kontor.checking_ids_from_cloud_link")
#checking_ids_from_cloud_link(link_list, mariadb_cursor)
mariadb_conn.close()
logger.info("kontor.check_kontor finished")