{"id":27736740,"url":"https://github.com/joshpaulie/nanoencoder","last_synced_at":"2025-07-03T09:06:44.616Z","repository":{"id":287580006,"uuid":"960104119","full_name":"JoshPaulie/NanoEncoder","owner":"JoshPaulie","description":"A simple FFmpeg-powered batch re-encoder for h.265 (HEVC)","archived":false,"fork":false,"pushed_at":"2025-05-15T12:06:33.000Z","size":358,"stargazers_count":13,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-05-15T13:24:11.982Z","etag":null,"topics":["batch-processing","ffmpeg","ffmpeg-wrapper","hevc-encoder","python"],"latest_commit_sha":null,"homepage":"http://www.bexli.dev/NanoEncoder/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/JoshPaulie.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-04-03T21:37:47.000Z","updated_at":"2025-05-15T12:06:37.000Z","dependencies_parsed_at":"2025-05-15T13:32:32.310Z","dependency_job_id":null,"html_url":"https://github.com/JoshPaulie/NanoEncoder","commit_stats":null,"previous_names":["joshpaulie/nanoencoder"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/JoshPaulie/NanoEncoder","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JoshPaulie%2FNanoEncoder","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JoshPaulie%2FNanoEncoder/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JoshPaulie%2FNanoEncoder/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JoshPaulie%2FNanoEncoder/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/JoshPaulie","download_url":"https://codeload.github.com/JoshPaulie/NanoEncoder/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JoshPaulie%2FNanoEncoder/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":263296443,"owners_count":23444489,"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","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":["batch-processing","ffmpeg","ffmpeg-wrapper","hevc-encoder","python"],"created_at":"2025-04-28T14:30:00.451Z","updated_at":"2025-07-03T09:06:44.604Z","avatar_url":"https://github.com/JoshPaulie.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"imgs/Banner.png\" width=\"600\"\u003e\n\u003c/p\u003e\n\n# NanoEncoder\nA lightweight ffmpeg wrapper to reduce your video collection size (while preserving quality)\n\n\u003e [!warning]\n\u003e  Project in \"Beta\", feedback on small sample sizes welcome. Refrain from running on large portions of your media until full first release (on PyPI) 😄\n\n**NanoEncoder** is for local media nerds who want to save storage space without sacrificing video quality. It provides:\n\n- Smart batch processing of video directories into HEVC (h.265)\n- Detailed reporting of space savings\n- Safe cleanup of original files (only when you're ready)\n\n## Installation\n### Requirements\n- Python 3.13+ (if not installing via `uv`)\n- [FFmpeg](https://www.ffmpeg.org/download.html) (including `ffprobe`) 7.1+ installed system-wide\n\n### uv (Recommended)\n\u003e [!note]\n\u003e uv allows you to install Python apps without even having Python itself installed.\n\u003e\n\u003e Check it out [here](https://docs.astral.sh/uv/getting-started/installation/). This is the preferred method for my friends wanting to use the NanoEncoder\n\n```bash\n# PyPI package coming soon™\nuv tool install git+https://github.com/JoshPaulie/NanoEncoder.git\n```\n\nCheck out the [installation](https://bexli.dev/NanoEncoder/installation) page for more details.\n\n## Usage\n```bash\nnen optimize '/media/series/The Office (US)' # Re-encode a directory with HEVC (h.265)\nnen health '/media/series/The Office (US)'  # Compare the original and optimized video files via SSIM\nnen purge '/media/series/The Office (US)'  # Safely remove original files (sends to trash)\nnen untag '/media/series/The Office (US)' # Remove the \"tags\" left behind by NanoEncoder\n\nnen optimize --crf 23 '/media/series/Berserk (1997)' # Re-encode at specified CRF (Default is 28)\n```\n\n## Features\n- **Greatly reduce file sizes** for videos by re-encoding with h.265/HEVC\n- **Crossplatform**, tested on Windows, Linux, and MacOS\n- Perfectly handles **multiple subtitle and audio tracks**[^1] (GREAT for anime)\n- **CPU Multithreading** by default\n- **Smart batch processing** skips already processed videos and recovers incomplete files\n- **Dynamic bit allocation** with [CRF](docs/about-crf.md)\n- **High fault tolerance**! If you have a power outage while encoding, you can simply run the script against the same directory, and it will pick up at the video where it left off[^2]\n\n### Safety Measures\n- No silent deletions: `purge` requires explicit user confirmation, and sends originals to system recycling bin\n- Crash detection: Handles partially optimized files\n- Comprehensive logging: All operations are recorded in `~/NanoEncoder.log`, and FFmpeg logs are recorded in `~/NanoEncoder_ffmpeg.log`\n\n## Contributing\n1. File an issue (optional)\n2. Clone repo\n3. Make venv `uv venv`\n4. Install editable locally `uv pip install -e .`\n5. Make branch \n6. PR\n\n### Requirements\n- [uv](https://github.com/astral-sh/uv) \n- [ruff](https://github.com/astral-sh/ruff) (110 line length)\n\n---\n\n[^1]: By literally not touching them at all and copying them as-is. 😎\n[^2]: Well, near where it left off. It will delete the partially-encoded file (denoted by .optimizing still being in the name), and re-encode the original.\n[^3]: Use `NanoEncoder.py optimize -h` for more details\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjoshpaulie%2Fnanoencoder","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjoshpaulie%2Fnanoencoder","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjoshpaulie%2Fnanoencoder/lists"}