114
scripts/fix_special_dirs.py
Normal file
114
scripts/fix_special_dirs.py
Normal file
@@ -0,0 +1,114 @@
|
||||
#!/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()
|
||||
Reference in New Issue
Block a user