{"id":22120186,"url":"https://github.com/maxpleaner/mediaorganizer","last_synced_at":"2025-07-12T02:35:22.171Z","repository":{"id":223253848,"uuid":"759721885","full_name":"MaxPleaner/MediaOrganizer","owner":"MaxPleaner","description":null,"archived":false,"fork":false,"pushed_at":"2024-03-08T08:01:27.000Z","size":50,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-24T06:33:21.644Z","etag":null,"topics":["data-hoarding","image-classification","image-organization","metadata-editor","training-data"],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/MaxPleaner.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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}},"created_at":"2024-02-19T08:01:32.000Z","updated_at":"2024-02-20T07:29:39.000Z","dependencies_parsed_at":null,"dependency_job_id":"31d25963-a269-4ccb-b983-319a39cc11da","html_url":"https://github.com/MaxPleaner/MediaOrganizer","commit_stats":null,"previous_names":["maxpleaner/mediaorganizer"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/MaxPleaner/MediaOrganizer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MaxPleaner%2FMediaOrganizer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MaxPleaner%2FMediaOrganizer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MaxPleaner%2FMediaOrganizer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MaxPleaner%2FMediaOrganizer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MaxPleaner","download_url":"https://codeload.github.com/MaxPleaner/MediaOrganizer/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MaxPleaner%2FMediaOrganizer/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":264926040,"owners_count":23684266,"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":["data-hoarding","image-classification","image-organization","metadata-editor","training-data"],"created_at":"2024-12-01T14:21:23.039Z","updated_at":"2025-07-12T02:35:22.133Z","avatar_url":"https://github.com/MaxPleaner.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Media Organizer\n\n## Screenshots\n\n### Main Menu\n\u003cimg src='https://github.com/MaxPleaner/MediaOrganizer/assets/5035719/5b136bb4-beb4-4960-a54d-d1072c602089' width='800px'/\u003e\n\n### Tag / Collection / Item view\n\u003cimg src='https://github.com/MaxPleaner/MediaOrganizer/assets/5035719/fd7bba6b-4038-442a-bb89-af3a4f71b038' width='800px' /\u003e\n\n---\n\n## Overview\n\nThis is a web-based interface for organizing large amounts of media\n(mainly intended images, though potentially applicable to other things).\n\nMake no mistake, this is _no_ adobe lightroom. There are no photo manipulation tools here.\nRather, this is solely focused on organization via _tags_ (Exif metatadata keywords) and _collections_ (e.g. folders).\n\nAnd specifically, it's built for those people (like myself) who do a _lot_\nof image organizing and need to do it very efficiently. \n\n## How it works\n\nThis is a web server built in Sinatra, which is a framework for the Ruby language.\nIt's similar to Rails, but with _way_ less boilerplate.\nIt's sort of like Ruby's version of Express.js.\n\nAnyway, the web server has a sqlite3 database which stores references to \"Items\" (e.g. images or other kinds of media).\nThe expectation is that the files are accessible by the web server for metadata reading/writing.\nSo, a self-hosting setup is perfect here. It's not currently set up for using remote storage sources, but it could be\naccomplished with a bit of tweaking.\n\nYou bulk-import your content, and then use the web interface to set tags and collections.\nTags are intended to mirror the files' Exif metadata. For performance reasons this syncing doesn't actually happen\nautomatically, but the server does keep track of which items are \"dirty\" (e.g. which ones need syncing)\nand there's a button which will write all the sqlite tag changes into the Exif data.\n\nCollections are are a concept that only exists in the sqlite database; there is no support for actually moving\nfiles around the drive right now.\n\n## How to use it\n\n1. Clone\n2. install a recent version of Ruby (at the time of writing, that means some 3.x variant)\n3. Install system deps: `exiftool`, `imagemagick`\n3. Install ruby deps: `bundle install`\n4. create the database: `bundle exec rake db:create`\n5. create the tables: `bundle exec rake db:migrate`\n6. Import your files: First run `irb -r './server.rb'` to open a REPL. Then run `Scripts.import_files(\"/path/to/folder\")`. This will take a while if you have a lot of media, but it will show you progress as it goes.\n8. run the server (this will use port 9292): `rackup --host 0.0.0.0`\n\n## Notes:\n\n- There are keyboard shortcuts for navigating through items. Use `[` and `]` for previous and next, respectively.\n- Tags and collections will be auto-deleted if they have no associated items.\n- The import script will attempt to calculate the persistent hash (\"phash\") for each item. This can theoretically be used to detect duplicate images,\n  though the app doesn't actually have any UI for this yet. If you don't care about this or encounter difficulties, pass the `calc_phash: false` option to the `Scripts.import_files` call.\n- Both exif and metadata extraction are skipped for files greater than 50 MB.\n- This was developed as a single-user application, e.g. for myself to organize my own image collection (self-hosting the application on a private network). As such, there is no authentication built in.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaxpleaner%2Fmediaorganizer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmaxpleaner%2Fmediaorganizer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmaxpleaner%2Fmediaorganizer/lists"}