Files
media-downloader/scripts/fix_special_dirs.py
Todd 0d7b2b1aab Initial commit
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-29 22:42:55 -04:00

115 lines
3.8 KiB
Python

#!/usr/bin/env python3
"""
Rename special directories (manual_*, PPV, import_*) to use date format.
For multiple posts on same date, use suffixes: YYYY-MM-DD, YYYY-MM-DD_2, etc.
"""
import os
import sys
from pathlib import Path
from collections import defaultdict
sys.path.insert(0, '/opt/media-downloader')
from modules.unified_database import UnifiedDatabase
def main():
import argparse
parser = argparse.ArgumentParser(description='Fix special directory names')
parser.add_argument('--dry-run', action='store_true', help='Show changes without making them')
args = parser.parse_args()
db = UnifiedDatabase()
base_path = Path('/opt/immich/paid/fansly/puffinasmr')
stats = {'renamed': 0, 'db_updated': 0, 'errors': 0}
# Find all special directories grouped by date
date_dirs = defaultdict(list)
for date_dir in base_path.iterdir():
if not date_dir.is_dir():
continue
date_str = date_dir.name
for post_dir in date_dir.iterdir():
if not post_dir.is_dir():
continue
name = post_dir.name
# Check if it's a special directory (not a numeric post_id)
if name.startswith('manual_') or name.startswith('import_') or name == 'PPV':
date_dirs[date_str].append(post_dir)
# Process each date
for date_str, dirs in sorted(date_dirs.items()):
# Check if a date-named directory already exists
existing_date_dir = base_path / date_str / date_str
suffix = 1
if existing_date_dir.exists():
# Find next available suffix
while (base_path / date_str / f"{date_str}_{suffix + 1}").exists():
suffix += 1
suffix += 1
for old_dir in sorted(dirs, key=lambda d: d.name):
# Determine new name
if suffix == 1:
new_name = date_str
else:
new_name = f"{date_str}_{suffix}"
new_dir = old_dir.parent / new_name
# Skip if target exists
if new_dir.exists():
print(f" SKIP (exists): {old_dir} -> {new_dir}")
suffix += 1
continue
print(f" {old_dir.name} -> {new_name}")
if not args.dry_run:
try:
old_dir.rename(new_dir)
stats['renamed'] += 1
# Update database paths
with db.get_connection(for_write=True) as conn:
cursor = conn.cursor()
cursor.execute("""
UPDATE paid_content_attachments
SET local_path = REPLACE(local_path, ?, ?)
WHERE local_path LIKE ?
""", (str(old_dir), str(new_dir), f"%{old_dir}%"))
stats['db_updated'] += cursor.rowcount
# Also update posts table if post_id matches the old dir name
old_name = old_dir.name
if old_name.startswith('manual_'):
cursor.execute("""
UPDATE paid_content_posts
SET post_id = ?
WHERE post_id = ?
""", (new_name, old_name))
conn.commit()
except Exception as e:
print(f" ERROR: {e}")
stats['errors'] += 1
suffix += 1
print("\n" + "=" * 50)
print("SUMMARY")
print("=" * 50)
print(f"Directories renamed: {stats['renamed']}")
print(f"DB records updated: {stats['db_updated']}")
print(f"Errors: {stats['errors']}")
if args.dry_run:
print("\n(Dry run - no changes made)")
if __name__ == '__main__':
main()