115 lines
3.8 KiB
Python
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()
|