{"id":30895595,"url":"https://github.com/samestrin/media-library-tools","last_synced_at":"2025-09-08T22:08:28.948Z","repository":{"id":311846398,"uuid":"1045298012","full_name":"samestrin/media-library-tools","owner":"samestrin","description":"A comprehensive collection of self-contained Python CLI tools for managing and organizing media libraries across Plex, SABnzbd, and other media applications. Each tool is designed as a standalone script requiring no external dependencies, focusing on safety, automation, and consistent user experience.","archived":false,"fork":false,"pushed_at":"2025-08-27T00:35:51.000Z","size":241,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-08-27T09:19:19.752Z","etag":null,"topics":["automation","bittorrent","media","media-management","media-management-cli","plex","python","sabnzbd","self-contained"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/samestrin.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":"ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-08-27T00:27:39.000Z","updated_at":"2025-08-27T00:37:34.000Z","dependencies_parsed_at":"2025-08-27T09:29:57.169Z","dependency_job_id":null,"html_url":"https://github.com/samestrin/media-library-tools","commit_stats":null,"previous_names":["samestrin/media-library-tools"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/samestrin/media-library-tools","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/samestrin%2Fmedia-library-tools","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/samestrin%2Fmedia-library-tools/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/samestrin%2Fmedia-library-tools/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/samestrin%2Fmedia-library-tools/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/samestrin","download_url":"https://codeload.github.com/samestrin/media-library-tools/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/samestrin%2Fmedia-library-tools/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":274231527,"owners_count":25245659,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-08T02:00:09.813Z","response_time":121,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["automation","bittorrent","media","media-management","media-management-cli","plex","python","sabnzbd","self-contained"],"created_at":"2025-09-08T22:08:24.259Z","updated_at":"2025-09-08T22:08:28.938Z","avatar_url":"https://github.com/samestrin.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"```plain\n┏┳┓┏━╸╺┳┓╻┏━┓╻  ╻┏┓ ┏━┓┏━┓┏━┓╻ ╻╺┳╸┏━┓┏━┓╻  ┏━┓         \n┃┃┃┣╸  ┃┃┃┣━┫┃  ┃┣┻┓┣┳┛┣━┫┣┳┛┗┳┛ ┃ ┃ ┃┃ ┃┃  ┗━┓        \n╹ ╹┗━╸╺┻┛╹╹ ╹┗━╸╹┗━┛╹┗╸╹ ╹╹┗╸ ╹  ╹ ┗━┛┗━┛┗━╸┗━┛                              \n```                                             \n# Media Library Tools\n[![Star on GitHub](https://img.shields.io/github/stars/samestrin/media-library-tools?style=social)](https://github.com/samestrin/media-library-tools/stargazers) [![Fork on GitHub](https://img.shields.io/github/forks/samestrin/media-library-tools?style=social)](https://github.com/samestrin/media-library-tools/network/members) [![Watch on GitHub](https://img.shields.io/github/watchers/samestrin/media-library-tools?style=social)](https://github.com/samestrin/media-library-tools/watchers)\n![Version 1.2.0-beta](https://img.shields.io/badge/Version-1.2.0--beta-orange) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Built with Python](https://img.shields.io/badge/Built%20with-Python-green)](https://python.org/)\n\nA comprehensive collection of self-contained Python CLI tools for managing and organizing media libraries across Plex, SABnzbd, and other media applications. Each tool is designed as a standalone script requiring no external dependencies, focusing on safety, automation, and consistent user experience.\n\n## Overview\n\nThis project provides a unified suite of tools that help you maintain clean, well-organized media libraries. Each tool follows consistent design principles with standardized CLI interfaces, comprehensive safety features, and detailed logging capabilities. All tools are self-contained Python scripts that you can download and run immediately without any installation or setup.\n\n## Features\n\n- **Self-contained design**: Each tool is a standalone Python script using only standard library modules\n- **Zero dependencies**: No external libraries required - download, `chmod +x`, and run immediately\n- **Safety first**: All tools include dry-run modes and comprehensive validation before making changes\n- **Consistent interface**: Standardized CLI arguments and output formatting across all tools\n- **Comprehensive logging**: Detailed verbose and debug modes for troubleshooting and monitoring\n- **Cross-platform compatibility**: Python-based tools that work across different operating systems\n- **Automation-friendly**: Built-in support for cron jobs with non-interactive modes\n- **Well-documented**: Extensive documentation and practical usage examples for every tool\n\n## CLI Standardization (v1.2.0)\n\nAll tools now follow a completely standardized command-line interface with consistent behavior across the entire suite:\n\n### Standard Arguments (Available on All Tools)\n- `--dry-run` - **Default behavior**: Preview changes without making modifications\n- `--execute` - Override dry-run mode to actually perform operations  \n- `--no-banner` - Suppress banner display\n- `--verbose` - Show detailed operation information\n- `--debug` - Show comprehensive debug output (includes verbose)\n- `-y` / `--yes` - Skip confirmation prompts for automation\n- `--force` - Bypass lock files and force execution\n- `--version` - Display tool version information\n\n### Consistent Mode Indicators\nEvery tool clearly displays its current mode:\n- **DRY-RUN MODE**: No changes will be made (default)\n- **EXECUTE MODE**: Changes will be made to files/directories\n\n### Global Configuration Support\nTools respect environment variables for default behavior:\n- `AUTO_EXECUTE=true` - Default to execute mode instead of dry-run\n- `AUTO_CONFIRM=true` - Skip confirmation prompts automatically\n- `QUIET_MODE=true` - Suppress banner display by default\n\n### Cron-Friendly Operation\nAll tools include comprehensive automation support with:\n- Non-interactive environment detection\n- Proper exit codes for monitoring\n- Detailed logging for unattended operation\n- Example cron configurations in help text\n\n## Project Structure\n\n```\nmedia-library-tools/\n├── plex/                                     # Plex media organization tools\n│   ├── docs/                                 # Documentation for Plex tools\n│   │   ├── plex_correct_dirs.md              # Directory name sanitization documentation\n│   │   ├── plex_make_all_seasons.md          # Batch season processing documentation\n│   │   ├── plex_make_dirs.md                 # Directory structure creation documentation\n│   │   ├── plex_make_seasons.md              # TV show season organization documentation\n│   │   ├── plex_make_years.md                # Year-based organization documentation\n│   │   ├── plex_move_movie_extras.md         # Movie extras organization documentation\n│   │   ├── plex_movie_subdir_renamer.md      # Movie subdirectory renaming documentation\n│   │   └── plex_update_tv_years.md           # TV show year updater documentation\n│   ├── plex_correct_dirs                     # Directory name sanitization tool\n│   ├── plex_make_all_seasons                 # Batch season processing tool\n│   ├── plex_make_dirs                        # Directory structure creation tool\n│   ├── plex_make_seasons                     # TV show season organization tool\n│   ├── plex_make_years                       # Year-based organization tool\n│   ├── plex_move_movie_extras                # Movie extras organization tool\n│   ├── plex_movie_subdir_renamer             # Movie subdirectory renaming tool\n│   ├── plex_update_tv_years                  # TV show year updater tool\n│   └── README.md                             # Plex tools overview\n├── plex-api/                                 # Plex server management tools\n│   ├── docs/                                 # Documentation for Plex API tools\n│   │   └── plex_server_episode_refresh.md    # Episode refresh tool documentation\n│   ├── plex_server_episode_refresh           # Episode thumbnail regeneration tool\n│   └── README.md                             # Plex API tools overview\n├── README.md                                 # Project overview and main documentation\n└── SABnzbd/                                  # SABnzbd cleanup and management tools\n    ├── docs/                                 # Documentation for SABnzbd tools\n    │   └── sabnzbd_cleanup.md                # SABnzbd cleanup documentation\n    ├── README.md                             # SABnzbd tools overview\n    └── sabnzbd_cleanup                       # SABnzbd directory cleanup tool\n```\n\n## Available Tools\n\n### SABnzbd Tools\n\n#### `sabnzbd_cleanup` - Self-Contained Python\nIntelligent cleanup tool for SABnzbd download directories.\n\n**Self-Contained Features:**\n- **Zero dependencies**: Uses only Python standard library\n- **Single file**: Complete functionality in one script\n- **Portable**: Download and run anywhere with Python\n- Detects SABnzbd-specific directory patterns\n- Avoids BitTorrent directories to prevent data loss\n- Calculates disk space savings before cleanup\n- Interactive confirmation with detailed file listings (or `-y` for automation)\n- Comprehensive logging and safety checks\n- Cron-friendly with automatic non-interactive detection\n\n**Quick Start:**\n```bash\n# Download and run immediately\nwget [raw-url]/sabnzbd_cleanup \u0026\u0026 chmod +x sabnzbd_cleanup\n\n# Scan for SABnzbd directories (safe mode)\n./sabnzbd_cleanup /path/to/downloads\n\n# Actually delete identified directories\n./sabnzbd_cleanup /path/to/downloads --delete\n\n# Non-interactive mode for cron jobs\n./sabnzbd_cleanup /path/to/downloads --delete -y\n```\n\n### Plex Tools\n\n#### Media Organization Suite\nComprehensive tools for organizing media libraries according to Plex naming conventions.\n\n**All Tools Complete:**\n- `plex_correct_dirs` - Directory name sanitization and cleanup\n- `plex_make_all_seasons` - Batch season processing for TV shows\n- `plex_make_dirs` - Directory structure creation\n- `plex_make_seasons` - TV show season organization\n- `plex_make_years` - Year-based movie organization\n- `plex_move_movie_extras` - Movie extras management and relocation\n- `plex_movie_subdir_renamer` - Movie subdirectory renaming\n- `plex_update_tv_years` - Update TV show year metadata\n\n**Key Capabilities:**\n- Directory name sanitization and cleanup\n- TV show season organization and batch processing\n- Movie extras management and Plex-compliant naming\n- Year-based movie organization\n- Comprehensive safety features and dry-run modes\n\n**Self-Contained Design Benefits:**\n- **Zero dependencies**: Uses only Python standard library\n- **Portable execution**: Download and run anywhere with Python\n- **Standardized interface**: Consistent CLI arguments with `-y` flag for automation\n- **Enhanced safety**: Comprehensive dry-run modes and confirmation prompts\n- **Better reliability**: Improved error handling and recovery mechanisms\n- **Progress tracking**: Visual indicators for large operations\n- **Automation-ready**: Cron-friendly with automatic non-interactive detection\n\n## Quick Start Guide\n\n### Installation\n\n### Individual tool download (Recommended)\n```bash\n# Download any single tool and run immediately\nwget https://raw.githubusercontent.com/samestrin/media-library-tools/main/SABnzbd/sabnzbd_cleanup\nchmod +x sabnzbd_cleanup\n./sabnzbd_cleanup --help\n\n# All tools support standard arguments:\n# --verbose, --debug, --dry-run, --force, --version, -y/--yes\n```\n\n### Full repository\n```bash\n# Clone entire repository\ngit clone https://github.com/samestrin/media-library-tools.git\ncd media-library-tools\nchmod +x SABnzbd/sabnzbd_cleanup plex/plex_* plex-api/plex_*\n```\n\n### No dependencies required\n- **Zero installation**: All tools use Python standard library only\n- **No pip install**: No external packages needed\n- **Portable**: Works on any system with Python 3.6+\n\n## Usage\n\n### Common workflows\n\n#### Clean up downloads\n```bash\n# Clean up SABnzbd leftovers (preview mode)\n./SABnzbd/sabnzbd_cleanup /path/to/downloads --verbose\n\n# Clean up SABnzbd leftovers (execute)\n./SABnzbd/sabnzbd_cleanup /path/to/downloads --delete -y\n\n# Organize Plex media (preview mode)\n./plex/plex_correct_dirs /path/to/media\n\n# Organize Plex media (execute)\n./plex/plex_correct_dirs /path/to/media -y\n```\n\n#### Organize TV shows\n```bash\n# Create season directories (preview mode)\n./plex/plex_make_seasons /path/to/tv/show --dry-run\n\n# Create season directories (execute)\n./plex/plex_make_seasons /path/to/tv/show -y\n```\n\n#### Process movie extras\n```bash\n# Move and rename movie extras from subdirectories (preview mode)\n./plex/plex_move_movie_extras \"Movie (2023).mkv\" \"Featurettes\" --dry-run\n\n# Move and rename movie extras from subdirectories (execute)\n./plex/plex_move_movie_extras \"Movie (2023).mkv\" \"Featurettes\" -y\n\n# Rename movie extras within subdirectories (preview mode)\n./plex/plex_movie_subdir_renamer \"/Movies/Movie (2023)/Extras\" --dry-run\n\n# Rename movie extras within subdirectories (execute)\n./plex/plex_movie_subdir_renamer \"/Movies/Movie (2023)/Extras\" --execute -y\n```\n\n## Automation support\n\nAll tools support automation-friendly operation with built-in non-interactive detection.\n\n### Automatic non-interactive detection\nTools automatically detect non-interactive environments:\n- Cron jobs\n- CI/CD pipelines\n- SSH sessions without TTY\n- Scripts with redirected input\n\n### Manual non-interactive mode\nUse the `-y` or `--yes` flag to skip confirmation prompts:\n\n```bash\n# SABnzbd cleanup in cron\n./sabnzbd_cleanup /downloads --delete -y\n\n# Plex organization in automation\n./plex/plex_make_seasons /media/tv -y\n./plex/plex_make_years /media/movies -y\n```\n\n### Cron examples\n```bash\n# Daily SABnzbd cleanup at 3 AM\n0 3 * * * /path/to/sabnzbd_cleanup /downloads --delete -y \u003e\u003e /var/log/sabnzbd_cleanup.log 2\u003e\u00261\n\n# Weekly Plex organization on Sundays at 2 AM\n0 2 * * 0 /path/to/plex_make_all_seasons /media/tv -y \u003e\u003e /var/log/plex_organize.log 2\u003e\u00261\n\n# Monthly year-based organization\n0 1 1 * * /path/to/plex_make_years /media/movies -y \u003e\u003e /var/log/plex_years.log 2\u003e\u00261\n```\n\n### Safety in automation\n- File locking prevents concurrent executions\n- Comprehensive logging for troubleshooting\n- Graceful handling of permission errors\n- Exit codes for monitoring systems\n\n## Global Configuration\n\nAll tools support global configuration via environment variables and `.env` files, allowing you to set default behavior without specifying command-line flags every time.\n\n### Environment Variables\n\n#### `AUTO_EXECUTE`\nSets the default execution mode for tools that support `--execute`/`--dry-run` flags.\n\n**Supported values**: `true`, `1`, `yes`, `on` (case-insensitive) enable execution mode; any other value keeps dry-run as default.\n\n#### `AUTO_CONFIRM`\nSets the default confirmation behavior, equivalent to the `-y`/`--yes` flag.\n\n**Supported values**: `true`, `1`, `yes`, `on` (case-insensitive) skip confirmation prompts; any other value keeps interactive confirmations.\n\n### Configuration Hierarchy\n\nConfiguration is applied in the following order (highest to lowest precedence):\n1. **CLI arguments**: Explicit command-line flags (e.g., `--execute`, `-y`)\n2. **Environment variables**: `AUTO_EXECUTE`, `AUTO_CONFIRM`\n3. **Local .env**: File in current working directory\n4. **Global .env**: File in `~/.media-library-tools/.env`\n\n### Setup Global Configuration\n\n#### Method 1: Environment Variables\n```bash\n# Set globally for current session\nexport AUTO_EXECUTE=true\nexport AUTO_CONFIRM=true\n\n# Add to shell profile for persistence\necho 'export AUTO_EXECUTE=true' \u003e\u003e ~/.bashrc\necho 'export AUTO_CONFIRM=true' \u003e\u003e ~/.bashrc\n```\n\n#### Method 2: Global Configuration File\n```bash\n# Create global config directory\nmkdir -p ~/.media-library-tools\n\n# Create global configuration file\ncat \u003e ~/.media-library-tools/.env \u003c\u003c EOF\n# Global configuration for media library tools\nAUTO_EXECUTE=true\nAUTO_CONFIRM=true\nEOF\n```\n\n#### Method 3: Project-Specific Configuration\n```bash\n# Create local .env in your media directory\ncd /path/to/your/media\ncat \u003e .env \u003c\u003c EOF\n# Project-specific configuration\nAUTO_EXECUTE=false\nAUTO_CONFIRM=true\nEOF\n```\n\n### Usage Examples with Global Config\n\n#### Traditional Usage (Still Supported)\n```bash\n# Explicit flags (always works)\n./plex/plex_correct_dirs /media --execute -y\n./SABnzbd/sabnzbd_cleanup /downloads --delete -y\n```\n\n#### With Global Configuration\n```bash\n# After setting AUTO_EXECUTE=true, AUTO_CONFIRM=true\n./plex/plex_correct_dirs /media              # Runs in execute mode with no prompts\n./SABnzbd/sabnzbd_cleanup /downloads --delete  # Deletes with no prompts\n\n# CLI flags still override global config\n./plex/plex_correct_dirs /media --dry-run    # Forces dry-run despite AUTO_EXECUTE=true\n./SABnzbd/sabnzbd_cleanup /downloads --delete  # Will prompt despite AUTO_CONFIRM=true\n```\n\n#### Automation-Friendly Workflows\n```bash\n# Set up once for interactive workflows\necho \"AUTO_EXECUTE=true\" \u003e ~/.media-library-tools/.env\n\n# Now scripts run in execute mode by default\n./plex/plex_make_seasons /media/tv/ShowName\n./plex/plex_move_movie_extras \"Movie (2023).mkv\" \"Extras\"\n\n# Override when you want to preview\n./plex/plex_make_years /media/movies --dry-run\n```\n\n## Safety features\n\n### Built-in protections\n- **Dry-run modes**: Preview operations before execution\n- **Interactive confirmations**: User approval for destructive operations (or `-y` for automation)\n- **Lock files**: Prevent multiple instances of the same tool\n- **Path validation**: Ensure target directories exist and are accessible\n- **BitTorrent detection**: Avoid interfering with active torrents\n- **Non-interactive detection**: Automatic cron-friendly behavior\n\n### Best practices\n- Always test with `--dry-run` first\n- Backup important media before bulk operations\n- Use `--verbose` mode to understand what tools are doing\n- Start with small test directories before processing entire libraries\n\n## Technical details\n\n### Python requirements\n- **Python version**: 3.6 or higher\n- **Dependencies**: Standard library only\n- **Platform**: Cross-platform (Linux, macOS, Windows)\n\n### Design principles\n1. **Self-contained design**: Each tool is a complete, standalone script\n2. **Zero dependencies**: Use only Python standard library modules\n3. **Maintain functionality**: Preserve all existing features\n4. **Improve safety**: Add better validation and error handling\n5. **Standardize interface**: Consistent CLI arguments and output\n6. **Add features**: Progress indicators, better logging, built-in help\n7. **Portable execution**: Download, `chmod +x`, and run immediately\n\n### Debugging\n```bash\n# Enable debug mode for detailed logging\n./tool_name --debug --verbose\n\n# Use dry-run to see what would happen\n./tool_name --dry-run --verbose\n```\n\n## Documentation\n\n### Tool-specific documentation\n- **SABnzbd**: See `SABnzbd/README.md` and `SABnzbd/docs/sabnzbd_cleanup.md`\n- **Plex**: See `plex/README.md` for detailed tool descriptions\n- **Plex API**: See `plex-api/README.md` for server management tools\n\n### Safe operation workflow\n1. **Always start with dry-run**: `--dry-run` flag available on most tools\n2. **Use verbose mode**: `--verbose` for detailed operation logs\n3. **Check results**: Review what will be changed before proceeding\n4. **Backup important data**: Especially before bulk operations\n\n## Project status\n\n| Component | Status | Language | Features |\n|-----------|--------|----------|----------|\n| SABnzbd Tools | ✅ Complete | Python | Full feature set with automation support |\n| Plex Media Tools | ✅ Complete | Python | Comprehensive organization suite |\n| Plex API Tools | ✅ Complete | Python | Server management capabilities |\n| Project Documentation | ✅ Complete | Markdown | Comprehensive and specification-compliant |\n| Test Coverage | ✅ Complete | Python | Comprehensive fixture-based testing |\n\n### Configuration Management\n\nThis project follows a **self-contained, dependency-free** approach to configuration:\n\n- **Command-line arguments**: Primary configuration method for all tools\n- **Environment variables**: Used only for sensitive credentials (API keys, tokens)\n- **No configuration files**: Maintains portability and zero-dependency principle\n- **Embedded defaults**: All configuration options built into each script\n\n**Sensitive Data Handling:**\n```bash\n# Use .env file for API credentials only (not tracked in git)\nexport PLEX_TOKEN=\"your-token-here\"\nexport PLEX_URL=\"http://your-server:32400\"\n\n# All other configuration via command-line arguments\n./plex_server_episode_refresh --library \"TV Shows\" --verbose\n```\n\n### Future enhancements\n- **Batch processing**: Process multiple directories efficiently\n- **Self-testing**: Built-in `--test` modes for validation\n- **Enhanced portability**: Even better cross-platform compatibility\n- **Extended automation**: More cron-friendly features and scheduling options\n\n## Support\n\n### Getting help\n- Check tool-specific README files in each directory\n- Use `--help` flag on any tool for usage information\n- Review the documentation in the `docs/` subdirectories\n\n### Reporting issues\nWhen reporting issues, please include:\n- Tool name and version (`./tool_name --version`)\n- Operating system and Python version\n- Complete command line used\n- Error messages or unexpected behavior\n- Sample directory structure (if relevant)\n- Output from `--debug --verbose` mode\n\n## License\n\nMIT License - see [LICENSE](LICENSE) file for details.\n\n## Share\n\n[![Twitter](https://img.shields.io/badge/X-Tweet-blue)](https://twitter.com/intent/tweet?text=Check%20out%20this%20awesome%20project!\u0026url=https://github.com/samestrin/media-library-tools) [![Facebook](https://img.shields.io/badge/Facebook-Share-blue)](https://www.facebook.com/sharer/sharer.php?u=https://github.com/samestrin/media-library-tools) [![LinkedIn](https://img.shields.io/badge/LinkedIn-Share-blue)](https://www.linkedin.com/sharing/share-offsite/?url=https://github.com/samestrin/media-library-tools)\n\n---\n\n**Note**: This project prioritizes **safety and data integrity**. All tools are designed to be conservative and require explicit user confirmation for destructive operations. _Always **backup** your media libraries before running bulk operations._\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsamestrin%2Fmedia-library-tools","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsamestrin%2Fmedia-library-tools","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsamestrin%2Fmedia-library-tools/lists"}