{"id":13597675,"url":"https://github.com/MDeLuise/ytsms","last_synced_at":"2025-04-10T05:33:07.359Z","repository":{"id":152996871,"uuid":"616378152","full_name":"MDeLuise/ytsms","owner":"MDeLuise","description":"📺 Self-hosted, open source YouTube subscription management system","archived":true,"fork":false,"pushed_at":"2024-04-02T06:23:45.000Z","size":4489,"stargazers_count":9,"open_issues_count":0,"forks_count":2,"subscribers_count":3,"default_branch":"main","last_synced_at":"2024-11-06T22:40:17.020Z","etag":null,"topics":["docker","docker-compose","java","javascript","privacy","reactjs","self-hosted","spring-boot","springboot","typescript","youtube"],"latest_commit_sha":null,"homepage":"","language":"Java","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/MDeLuise.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}},"created_at":"2023-03-20T09:18:43.000Z","updated_at":"2024-10-17T14:18:39.000Z","dependencies_parsed_at":"2024-01-14T04:42:12.280Z","dependency_job_id":"0c21e89e-f6a1-45f2-a1a0-468741340b6c","html_url":"https://github.com/MDeLuise/ytsms","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MDeLuise%2Fytsms","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MDeLuise%2Fytsms/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MDeLuise%2Fytsms/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MDeLuise%2Fytsms/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MDeLuise","download_url":"https://codeload.github.com/MDeLuise/ytsms/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248163317,"owners_count":21057910,"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":["docker","docker-compose","java","javascript","privacy","reactjs","self-hosted","spring-boot","springboot","typescript","youtube"],"created_at":"2024-08-01T17:00:38.881Z","updated_at":"2025-04-10T05:33:03.172Z","avatar_url":"https://github.com/MDeLuise.png","language":"Java","funding_links":[],"categories":["Java"],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg width=\"200px\" src=\"images/ytsms-logo.png\" title=\"YTSMS\"\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://img.shields.io/github/checks-status/MDeLuise/ytsms/main?style=for-the-badge\u0026label=build\u0026color=%23DC143C\" /\u003e\n\u003cimg src=\"https://img.shields.io/github/v/release/MDeLuise/ytsms?style=for-the-badge\u0026color=%23DC143C\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\u003ci\u003e\u003cb\u003e[Still under \"initial\" development, some features may be unstable or change in the future, although database schemas should be stable. A first release version is planned to be packed soon].\u003c/b\u003e\u003c/i\u003e\u003c/p\u003e\n\u003cp align=\"center\"\u003eYTSMS is a \u003cb\u003eself-hosted youtube subscription management service.\u003c/b\u003e\u003cbr\u003eUseful to keep track of new uploaded video of the followed channels, even without having a Google account.\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\u003ca href=\"https://github.com/MDeLuise/ytsms/#why\"\u003eWhy?\u003c/a\u003e • \u003ca href=\"https://github.com/MDeLuise/ytsms/#features-highlight\"\u003eFeatures highlights\u003c/a\u003e • \u003ca href=\"https://github.com/MDeLuise/ytsms/#getting-started\"\u003eQuickstart\u003c/a\u003e • \u003ca href=\"https://github.com/MDeLuise/ytsms/#configuration\"\u003eConfiguration\u003c/a\u003e • \u003ca href=\"https://github.com/MDeLuise/ytsms/#faq\"\u003eFAQ\u003c/a\u003e • \u003ca href=\"https://github.com/MDeLuise/ytsms/#contribute\"\u003eContribute\u003c/a\u003e\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"/images/screenshot-desktop.png\" width=\"45%\" /\u003e\n  \u003cimg src=\"/images/screenshot-mobile.png\" width=\"45%\" /\u003e \n\u003c/p\u003e\n\n## Why?\nI've always enjoyed spending some time viewing YouTube videos. The problem is that YouTube keeps track of a lot of data about you.\n\nYtsms takes care of this problem allowing you to get updated about new videos from followed channels without having a Google account or having it but using the official API (that is still better then using directly the subscription system of the Google account, since you can view the video logged out).\n\n## Features highlight\n* Add channels to followed list\n* Get notified about every new video published by the followed channels\n* Filter videos by channel\n* Chose between YouTube backend or an [Invidious](https://invidious.io/) instance\n* Dark/Light mode\n* 🔜 Create playlists of videos\n\n### Quickstart \nInstalling ytsms is pretty straight forward, in order to do so follow these steps:\n1. Create a folder where you want to place all ytsms related files.\n1. Inside that folder, create the following files:\n    * Create a directory `mkdir certificates`\n    * Give the permission of the directory `chmod 777 ./certificates`\n    * `docker-compose.yml`:\n    ```yaml\n    version: \"3\"\n    name: ytsms\n    services:\n      backend:\n        image: msdeluise/ytsms-backend:latest\n        env_file: backend.env\n        depends_on:\n          - db\n        restart: unless-stopped\n        volumes:\n          - \"certs:/certificates\"\n        ports:\n          - \"8080:8080\"\n\n      db:\n        image: mysql:8.0\n        restart: always\n        env_file: backend.env\n        volumes:\n          - \"./db:/var/lib/mysql\"\n\n      frontend:\n        image: msdeluise/ytsms-frontend:latest\n        env_file: frontend.env\n        links:\n          - backend\n        ports:\n          - \"3000:3000\"\n        volumes:\n          - \"certs:/certificates\"\n    volumes:\n      certs:\n        driver: local\n        driver_opts:\n          type: none\n          o: bind\n          device: ./certificates\n    ```\n    * `backend.env`:\n    ```properties\n    #\n    # DB\n    #\n    MYSQL_HOST=db\n    MYSQL_PORT=3306\n    MYSQL_USERNAME=root\n    MYSQL_PSW=root\n    MYSQL_ROOT_PASSWORD=root\n    MYSQL_DATABASE=bootdb\n    \n    #\n    # JWT\n    #\n    JWT_SECRET=putTheSecretHere\n    JWT_EXP=1\n    \n    #\n    # Server config\n    #\n    USERS_LIMIT=-1 # \u003c= 0 means no limit\n    YOUTUBE_KEY=\n    VIDEO_REFRESH=0 0 * * * *\n\n    #\n    # SSL\n    #\n    SSL_ENABLED=false\n    CERTIFICATE_PATH=/certificates/\n    ```\n    * `frontend.env`:\n    ```properties\n    PORT=3000\n    API_URL=http://localhost:8080/api\n    WAIT_TIMEOUT=10000\n    BROWSER=none\n    SSL_ENABLED=false\n    CERTIFICATE_PATH=/certificates/\n    ```\n1. Run the docker compose file (`docker compose -f docker-compose.yml up -d`), then the service will be available at `localhost:3000`, while the REST API will be available at `localhost:8080/api` (`localhost:8080/api/swagger-ui/index.html` for the documentation of them).\n\nRun the docker compose file (`docker compose -f \u003cfile\u003e up -d`), then the service will be available at `localhost:8080`, while the REST API will be available at `localhost:8080/api` (`localhost:8080/api/swagger-ui/index.html` for the documentation of them).\n\n\u003cdetails\u003e\n\n  \u003csummary\u003eRun on a remote host (e.g. from mobile)\u003c/summary\u003e\n\n  Please notice that running the `docker-compose` file from another machine change the way to connect to the server. For example, if you run the `docker-compose` on the machine with the local IP `192.168.1.100` then you have to change the backend url in the `API_URL` variable to `192.168.1.100:8080/api`. In this case, the frontend of the system will be available at `192.168.1.100:8080`, and the backend will be available at `192.168.1.100:8080/api`.\n\u003c/details\u003e\n\n\n### Fetching mode\nThe service offers two video retrieval options:\n* `scraping`: videos are retrieved without the need of a YouTube API key, although there are [some restrictions](#FAQ)\n* `official YouTube api`: video are retrieved using a YouTube API key, which means [more metadata can be fetched but less anonymization is provided](#FAQ) \n\nIn order to choose between one of the retrieval option, the `YOUTUBE_KEY` property in the [configuration file](#Configuration) must be filled or left empty. \n\n## FAQ\n* How can I get the `channel id` of a youtube channel?\n  \n  You can do it in two ways:\n  * go to the channel homepage and run in the javascript console `ytInitialData.metadata.channelMetadataRenderer.externalId`\n  * go to the channel homepage, view the page source and search for the value `browse_id`\n\n* What distinguishes `official youtube api` and `scraping` modes?\n  \n  The `official youtube api` mode offers the following advantages:\n  * retrieve the video duration\n  * retrieve the channels image thumbnails\n  * retrieve more old video\n  \n  The `scraping` mode offers the following advantages:\n  * no need to use any YouTube API key\n  * no [quota restrictions](https://developers.google.com/youtube/v3/getting-started#quota)\n  * increased anonymization\n\n* How can I create a YouTube API key?\n\n  You can create a key following the [official guide](https://developers.google.com/youtube/v3/getting-started).\n\n* Why sometime the `Channel Name` method for adding a subscription does not works?\n\n  This is a pretty known problem ([1](https://stackoverflow.com/questions/71062188/youtube-listchannels-with-usernameforusername-is-not-working), [2](https://stackoverflow.com/questions/35051882/youtube-api-v3-channels-list-method-doesnt-work-for-some-channels-names), [3](https://stackoverflow.com/questions/39378768/youtube-api-3-channels-by-username-and-id-inconsistant), [4](https://stackoverflow.com/questions/64299967/how-to-find-the-forusername-parameter-for-a-specific-channel)). It's caused by the inconsistence of some YouTube channel's `custom URL` and `username` parameters.\n\n## Contribute\nFeel free to contribute and help improve the repo.\n\n### Bug Report, Feature Request and Question\nYou can submit any of this in the [issues](https://github.com/MDeLuise/ytsms/issues/new/choose) section of the repository. Chose the right template and then fill the required info.\n\n### Bug fix\nIf you fix a bug, please follow the [contribution-guideline](https://github.com/MDeLuise/ytsms# contribution-guideline) in order to merge the fix in the repository.\n\n### Feature development\nLet's discuss first possible solutions for the development before start working on that, please open a [feature request issue](https://github.com/MDeLuise/ytsms/issues/new?assignees=\u0026labels=\u0026projects=\u0026template=fr.yml).\n\n### Contribution guideline\nTo fix a bug or create a feature, follow these steps:\n1. Fork the repo\n1. Create a new branch (`git checkout -b awesome-feature`)\n1. Make changes or add new changes.\n1. Commit your changes (`git add -A; git commit -m 'Awesome new feature'`)\n1. Push to the branch (`git push origin awesome-feature`)\n1. Create a Pull Request\n\n#### Conventions\n* Commits should follow the [semantic commit](https://www.conventionalcommits.org/en/v1.0.0/) specification, although not mandatory.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FMDeLuise%2Fytsms","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FMDeLuise%2Fytsms","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FMDeLuise%2Fytsms/lists"}