{"id":21160158,"url":"https://github.com/mason-larobina/classi-cine","last_synced_at":"2026-05-12T16:04:57.480Z","repository":{"id":204844161,"uuid":"712762106","full_name":"mason-larobina/classi-cine","owner":"mason-larobina","description":"Build smart playlists from your video collection","archived":false,"fork":false,"pushed_at":"2025-08-16T12:34:07.000Z","size":1182,"stargazers_count":6,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-04-16T23:13:00.456Z","etag":null,"topics":["bayesian-inference","http","naive-bayes-classifier","reqwest","rust","serde-json","vlc"],"latest_commit_sha":null,"homepage":"","language":"Rust","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/mason-larobina.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":"2023-11-01T06:15:10.000Z","updated_at":"2025-08-16T13:46:43.000Z","dependencies_parsed_at":null,"dependency_job_id":"7510172e-2c88-4401-9c97-ac5b466c713c","html_url":"https://github.com/mason-larobina/classi-cine","commit_stats":null,"previous_names":["mason-larobina/classi-cine"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/mason-larobina/classi-cine","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mason-larobina%2Fclassi-cine","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mason-larobina%2Fclassi-cine/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mason-larobina%2Fclassi-cine/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mason-larobina%2Fclassi-cine/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mason-larobina","download_url":"https://codeload.github.com/mason-larobina/classi-cine/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mason-larobina%2Fclassi-cine/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32946450,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-12T09:19:52.626Z","status":"ssl_error","status_checked_at":"2026-05-12T09:17:33.438Z","response_time":102,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["bayesian-inference","http","naive-bayes-classifier","reqwest","rust","serde-json","vlc"],"created_at":"2024-11-20T13:02:43.048Z","updated_at":"2026-05-12T16:04:57.475Z","avatar_url":"https://github.com/mason-larobina.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"![classi-cine](classi-cine.png)\n\n# Classi-Cine\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n[![Rust](https://github.com/mason-larobina/classi-cine/actions/workflows/rust.yml/badge.svg)](https://github.com/mason-larobina/classi-cine/actions/workflows/rust.yml)\n\n**Stop scrolling through thousands of videos.** Classi-Cine is like autocomplete for video selection - it predicts what you want to watch next based on your feedback, helping you rapidly build the perfect playlist for your current mood.\n\n## The Problem\n\nYou have a large video collection but finding what matches your current mood is tedious:\n\n- Manually browsing through hundreds or thousands of files\n- Remembering which episodes or clips you enjoyed\n- No quick way to find \"videos like this one\"\n- Building playlists by hand takes forever\n\n## The Solution\n\nClassi-Cine plays 20-questions with your video collection to rapidly zero in on what you want:\n\n1. **Point it at your video directories** - Let it discover your collection\n1. **It suggests videos, you accept/reject** - Like/dislike using VLC controls (stop = accept, pause = reject)\n1. **Watch recommendations improve in real-time** - Each decision teaches the AI what you're looking for\n1. **Build your perfect playlist faster** - Find content that matches your current mood in minutes, not hours\n\nPerfect for:\n\n- **Large media collections** (TV series, movies, documentaries, clips)\n- **Content creators** curating references or footage\n- **Anyone with 100+ videos** who wants smart discovery\n- **Building themed playlists** (action movies, comedy episodes, tutorial clips, etc.)\n\n## Quick Start\n\n```bash\n# Install\ncargo install classi-cine\n\n# Start building a playlist - the AI will suggest additions\nclassi-cine build my-playlist.m3u ~/Videos ~/Movies\n\n# The TUI shows AI predictions ranked by relevance\n# Press Enter to preview in VLC\n# Stop (s) to accept and add to playlist, pause (space) to reject\n# Watch suggestions get smarter with each decision!\n```\n\n## How It Works\n\nLike autocomplete for text, Classi-Cine learns patterns from your video collection and predicts what you want next:\n\n1. **Analyzes your entire collection** - Understands file names, folder structure, sizes, and ages\n1. **Uses machine learning** - Multiple AI classifiers work together to score every video\n1. **Learns from your feedback** - Each accept/reject teaches it more about your preferences\n1. **Predicts better matches** - Rankings improve in real-time as you build your playlist\n\n**Simple VLC Integration:**\n\n- Stop video (s key) = \"Yes, add this to my playlist\"\n- Pause video (space) = \"No, this doesn't fit\"\n- Standard M3U playlists work in any media player\n\n## Installation\n\nVLC is required for video playback.\n\nEnsure you have Rust and Cargo installed. If not, you can install them using rustup.\n\n### From Cargo\n\n```bash\n# Build from the cargo.io crate registry.\n$ cargo install classi-cine\n```\n\n### From Source\n\n```bash\n# Clone this repository\n$ git clone https://github.com/mason-larobina/classi-cine.git\n\n# Go into the repository\n$ cd classi-cine\n\n# Build and install it locally\n$ cargo install --path=.\n```\n\n## Usage\n\n```bash\nUsage: classi-cine [OPTIONS] \u003cCOMMAND\u003e\n\nCommands:\n  build          Build playlist through interactive classification\n  score          Score files using trained classifiers without interactive classification\n  list-positive  List classified files\n  list-negative  \n  move           Move playlist to a new location and rebase paths\n  help           Print this message or the help of the given subcommand(s)\n\nOptions:\n      --log-level \u003cLOG_LEVEL\u003e  [default: info]\n  -h, --help                   Print help\n```\n\n### Build Command\n\nBuild a playlist through interactive VLC classification:\n\n```bash\nclassi-cine build [OPTIONS] \u003cPLAYLIST\u003e [DIRS]...\n\nArguments:\n  \u003cPLAYLIST\u003e  M3U playlist file\n  [DIRS]...   Directories to scan for video files\n\nOptions:\n      --video-exts \u003cVIDEO_EXTS\u003e         Video file extensions to scan for [default: avi,flv,mov,f4v,flv,m2ts,m4v,mkv,mpg,webm,wmv,mp4]\n      --windows \u003cWINDOWS\u003e               [default: 5]\n      --file-size-bias \u003cFILE_SIZE_BIAS\u003e Bias scoring based on file sizes (log base, \u003e 1.0). Negative reverses bias\n      --file-size-offset \u003cFILE_SIZE_OFFSET\u003e Offset to add to file size before log scaling [default: 1048576]\n      --dir-size-bias \u003cDIR_SIZE_BIAS\u003e   Bias scoring based on directory sizes (log base, \u003e 1.0). Negative reverses bias\n      --dir-size-offset \u003cDIR_SIZE_OFFSET\u003e Offset to add to directory size before log scaling [default: 0]\n      --file-age-bias \u003cFILE_AGE_BIAS\u003e   Bias scoring based on file age (log base, \u003e 1.0). Negative reverses bias\n      --file-age-offset \u003cFILE_AGE_OFFSET\u003e Offset to add to file age in seconds before log scaling [default: 86400]\n      --fullscreen                      Fullscreen VLC playback\n      --vlc-timeout \u003cVLC_TIMEOUT\u003e       Timeout in seconds for VLC startup [default: 60]\n      --vlc-poll-interval \u003cVLC_POLL_INTERVAL\u003e Polling interval in milliseconds for VLC status checks [default: 100]\n      --batch \u003cBATCH\u003e                   Number of entries to classify in each batch iteration [default: 1]\n      --random-top-n \u003cRANDOM_TOP_N\u003e     Select next entry randomly from top-n scored entries\n  -h, --help                            Print help\n```\n\n### Score Command\n\nScore files using trained classifiers without interactive classification:\n\n```bash\nclassi-cine score [OPTIONS] \u003cPLAYLIST\u003e [DIRS]...\n\nArguments:\n  \u003cPLAYLIST\u003e  M3U playlist file\n  [DIRS]...   Directories to scan for video files\n\nOptions:\n      --video-exts \u003cVIDEO_EXTS\u003e         Video file extensions to scan for [default: avi,flv,mov,f4v,flv,m2ts,m4v,mkv,mpg,webm,wmv,mp4]\n      --windows \u003cWINDOWS\u003e               [default: 5]\n      --file-size-bias \u003cFILE_SIZE_BIAS\u003e Bias scoring based on file sizes (log base, \u003e 1.0). Negative reverses bias\n      --file-size-offset \u003cFILE_SIZE_OFFSET\u003e Offset to add to file size before log scaling [default: 1048576]\n      --dir-size-bias \u003cDIR_SIZE_BIAS\u003e   Bias scoring based on directory sizes (log base, \u003e 1.0). Negative reverses bias\n      --dir-size-offset \u003cDIR_SIZE_OFFSET\u003e Offset to add to directory size before log scaling [default: 0]\n      --file-age-bias \u003cFILE_AGE_BIAS\u003e   Bias scoring based on file age (log base, \u003e 1.0). Negative reverses bias\n      --file-age-offset \u003cFILE_AGE_OFFSET\u003e Offset to add to file age in seconds before log scaling [default: 86400]\n      --include-classified              Include already classified files in the score listing\n      --no-header                       Skip header output for machine-readable format\n      --include-size                    Include file size in bytes in output\n      --json                            Output results in JSON format\n      --reverse                         Reverse output order (lowest scores first)\n      --by-dir                          Group results by directory and aggregate scores\n      --absolute                        Display absolute paths instead of relative to current directory\n  -h, --help                            Print help\n```\n\n### List Commands\n\nList positively or negatively classified files:\n\n```bash\nclassi-cine list-positive [OPTIONS] \u003cPLAYLIST\u003e\nclassi-cine list-negative [OPTIONS] \u003cPLAYLIST\u003e\n\nArguments:\n  \u003cPLAYLIST\u003e  M3U playlist file\n\nOptions:\n      --absolute  Display absolute paths instead of relative to current directory\n  -h, --help      Print help\n```\n\n### Move Command\n\nMove playlist to a new location and rebase paths:\n\n```bash\nclassi-cine move \u003cORIGINAL\u003e \u003cNEW\u003e\n\nArguments:\n  \u003cORIGINAL\u003e  Original M3U playlist file\n  \u003cNEW\u003e       New M3U playlist file location\n\nOptions:\n  -h, --help  Print help\n```\n\n## Technical Details\n\nFor developers and ML enthusiasts, Classi-Cine uses several sophisticated techniques:\n\n**Multi-Classifier Architecture:**\n\n- **Naive Bayes Classifier**: Uses byte-pair encoding tokenization to learn patterns from file paths and folder names\n- **File Size Classifier**: Logarithmic scoring based on file sizes (configurable bias for larger/smaller files)\n- **Directory Size Classifier**: Scoring based on number of files in directories\n- **File Age Classifier**: Scoring based on file creation time\n- All classifiers use normalized scores that are combined for final ranking\n\n**Advanced Tokenization:**\n\n- Byte pair encoding learns frequent character sequences from your specific collection\n- Language and character set agnostic - works with any naming convention\n- Adaptive tokenization learns from your library's patterns\n- N-gram analysis for sequence pattern recognition\n\n**Performance Optimizations:**\n\n- Probabilistic filters and parallel processing for efficient tokenization\n- Sharded data structures for multi-core processing\n- Background VLC control with multi-threaded communication\n- Incremental M3U saves for long classification sessions\n\n**VLC Integration:**\n\n- Uses VLC's HTTP interface for status monitoring\n- Multi-threaded VLC control with background processing\n- Automatic process lifecycle management\n- Real-time classification feedback loop\n\n## Contributing\n\nWe're open to contributions! Enhancements, bug fixes, documentation improvements, and more are all welcome.\n\n## License\n\nThis project is licensed under the MIT License. See LICENSE for details.\n\n## Special Thanks\n\nMade with ❤️ and Rust.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmason-larobina%2Fclassi-cine","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmason-larobina%2Fclassi-cine","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmason-larobina%2Fclassi-cine/lists"}