{"id":32368917,"url":"https://github.com/gcottom/echo-daemon","last_synced_at":"2026-04-08T16:02:05.223Z","repository":{"id":316183285,"uuid":"1055276909","full_name":"gcottom/echo-daemon","owner":"gcottom","description":"echo-daemon is a self-hosted, dockerized pipeline and chrome extension combo that passively captures YouTube Music requests, downloads audio, enriches it with metadata from Spotify and YouTube, classifies genre via machine learning, and outputs enriched MP3s","archived":false,"fork":false,"pushed_at":"2025-10-22T04:55:04.000Z","size":39022,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-10-24T19:42:00.334Z","etag":null,"topics":["automation","cgo","chrome-extension","docker","docker-compose","docker-container","ffmpeg","golang","machine-learning","metadata","metadata-enrichment","onxx-cpu","passive-downloader","pipeline","self-hosted","spotify-api","youtube-api","youtube-downloader","youtube-music"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gcottom.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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-12T03:20:49.000Z","updated_at":"2025-10-22T04:55:08.000Z","dependencies_parsed_at":"2025-10-17T00:39:53.500Z","dependency_job_id":"7e20bbdd-a734-4973-a8a8-d029121f8cd4","html_url":"https://github.com/gcottom/echo-daemon","commit_stats":null,"previous_names":["gcottom/echo-daemon"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/gcottom/echo-daemon","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gcottom%2Fecho-daemon","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gcottom%2Fecho-daemon/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gcottom%2Fecho-daemon/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gcottom%2Fecho-daemon/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gcottom","download_url":"https://codeload.github.com/gcottom/echo-daemon/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gcottom%2Fecho-daemon/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31562697,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-08T14:31:17.711Z","status":"ssl_error","status_checked_at":"2026-04-08T14:31:17.202Z","response_time":54,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5: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":["automation","cgo","chrome-extension","docker","docker-compose","docker-container","ffmpeg","golang","machine-learning","metadata","metadata-enrichment","onxx-cpu","passive-downloader","pipeline","self-hosted","spotify-api","youtube-api","youtube-downloader","youtube-music"],"created_at":"2025-10-24T19:36:08.143Z","updated_at":"2026-04-08T16:02:05.205Z","avatar_url":"https://github.com/gcottom.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"✨ Echo Daemon  \n\nA new take on the YouTube Music downloader — intelligent, resilient, and built for research.  \n\nEcho Daemon rethinks the classic YouTube downloader.  \nInstead of depending on brittle signature-patching logic, it intercepts YouTube Music network requests directly in Chrome, giving it long-term reliability and minimal maintenance.  \n\n⚠️ Disclaimer: This project is a proof of concept, intended for educational and research purposes only.  \nYou are responsible for complying with all applicable terms of service and copyright laws.  \n\n\n🚀 Features  \n\t•\tHigh-Quality Audio Capture from YouTube Music  \n\t•\tParses YouTube UMP (Unified Media Player) format responses to extract clean .webm audio  \n\t•\tConverts WEBM → MP3 automatically via FFmpeg  \n\t•\tMetadata Enrichment: Queries the YouTube API and Spotify API to fetch artist, title, album, and artwork  \n\t•\tGenre Classification: Uses ONXX Runtime models to infer track genre  \n\t•\tAutomatic Tagging: Embeds metadata into the final MP3 and saves it to disk  \n\t•\tPassive or On-Demand Modes: Works both while streaming or through manual track requests  \n\n\n🧩 Architecture Overview  \nChrome Extension  -\u003e  Echo Daemon Backend  -\u003e  FFmpeg  -\u003e  YouTube API For Base/Fallback Metadata  -\u003e  Spotify API For Complete Metadata  -\u003e  ONXX Genre Identifier -\u003e ID3 Tagger  -\u003e  Enriched MP3 Audio\n\n\n⚙️ Setup \u0026 Usage  \n\t1.\tClone the repo  \n  ```git clone https://github.com/gcottom/echo-daemon.git```  \n  ```cd echo-daemon```  \n  2.\tRetrieve Spotify API credentials (clientID, clientSecret) and add them to settings.yaml.  \n  3.\tInstall Node.js (if not already installed).  \n  4.\tBuild the Chrome extension:  \n  ```cd chrome```  \n  ```npm install webpack```  \n  ```npm run build```  \n  5.\tLoad the extension in Chrome → Extensions \u003e Developer Mode \u003e Load Unpacked → select chrome/dist/.  \n  6.\tInstall and launch Docker.  \n  7.\tUpdate paths in settings.yaml for your environment.  \n  8.\tRun the backend:  \n  ```./start.sh```  \n  Wait for the message:  \n  ```echo-daemon ready!```  \n  9.\tStream from YouTube Music — tracks you play are saved to data/ and then moved to local_music_dir.  \n  10.   To download a track or playlist on demand, start the echo-daemon server in a docker container, find the video ID in the URL, and make a GET request to the backend:  \n    ```http://localhost:50999/download/VIDEO_ID_HERE``` or ```http://localhost:50999/download/PLAYLIST_ID_HERE``` \nYou can do this in any browser or using curl or Postman. \n\n📄 Environment Variables (settings.yaml)  \n  •\tsave_dir: Directory that the Docker container can write save files to (has to be local to the container)  \n  •\ttemp_dir: Directory that in progress downloads are written to (has to be local to the container)  \n  •\tmusic_dir: Linked Directory that allows the container to write to the directory specified in local_music_dir (do not change this)  \n  •\tlocal_music_dir: Directory that you want completed downloads to go to (absolute path)  \n  •\tlocal_music_root: The root of your music library (this is used to prevent duplicates appearing in your library, absolute path)  \n  •\tlocal_data_dir: The absolute path of the data directory in the root of this project  \n  •\tspotify_client_id: Your Spotify Client ID, retrieved from Spotify Developer Portal  \n  •\tspotify_client_secret: Your Spotify Client Secret, retrieved from the Spotify Developer Portal  \n\n  \n🧠 Notes  \n  •\tKeeps consistent performance without frequent patches.  \n  •\tAll request interception is local; no third-party proxies involved.  \n  •\tFully containerized for portability.  \n\n🪪 License  \nMIT License - see LICENSE for details.   \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgcottom%2Fecho-daemon","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgcottom%2Fecho-daemon","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgcottom%2Fecho-daemon/lists"}