{"id":16551205,"url":"https://github.com/michaelcurrin/netflix-assistant","last_synced_at":"2025-10-28T18:31:26.631Z","repository":{"id":93179333,"uuid":"184402825","full_name":"MichaelCurrin/netflix-assistant","owner":"MichaelCurrin","description":"Search and filter shows and movies on Netflix using the reelgood.com API","archived":false,"fork":false,"pushed_at":"2022-06-05T11:11:55.000Z","size":518,"stargazers_count":17,"open_issues_count":5,"forks_count":3,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-02-01T17:11:13.454Z","etag":null,"topics":["movies","netflix","netflix-assistant","reelgood","reelgood-api","static-site"],"latest_commit_sha":null,"homepage":"https://netflix-assistant.netlify.app","language":"JavaScript","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/MichaelCurrin.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}},"created_at":"2019-05-01T10:49:43.000Z","updated_at":"2024-08-13T11:15:17.000Z","dependencies_parsed_at":"2023-05-02T07:46:58.617Z","dependency_job_id":null,"html_url":"https://github.com/MichaelCurrin/netflix-assistant","commit_stats":null,"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MichaelCurrin%2Fnetflix-assistant","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MichaelCurrin%2Fnetflix-assistant/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MichaelCurrin%2Fnetflix-assistant/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MichaelCurrin%2Fnetflix-assistant/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MichaelCurrin","download_url":"https://codeload.github.com/MichaelCurrin/netflix-assistant/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":238700279,"owners_count":19515896,"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":["movies","netflix","netflix-assistant","reelgood","reelgood-api","static-site"],"created_at":"2024-10-11T19:36:37.515Z","updated_at":"2025-10-28T18:31:26.258Z","avatar_url":"https://github.com/MichaelCurrin.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Netflix Assistant 📺 👀 🌐\n\u003e Search and filter shows and movies on Netflix using the ReelGood API\n\n[![Netlify Status](https://api.netlify.com/api/v1/badges/e5dfdbec-c007-4323-a375-fc01798166e8/deploy-status)](https://app.netlify.com/sites/netflix-assistant/deploys \"Netlify app deploy status\")\n[![GitHub tag](https://img.shields.io/github/tag/MichaelCurrin/netflix-assistant)](https://github.com/MichaelCurrin/netflix-assistant/releases/?include_prereleases\u0026sort=semver \"Latest tag\")\n[![License](https://img.shields.io/badge/License-MIT-blue)](#license)\n\nMade with:\n\n- [Netflify Functions](https://michaelcurrin.github.io/dev-resources/resources/ci-cd/netlify/functions.html)\n- ReelGood API (because the Netlify API is not accessible)\n- [mustache.js](https://github.com/janl/mustache.js) NPM package\n\n\n## Error\n\nThis app is currently broken - ReelGood migrated to using V3 API on their site and the V2 API no longer works. If you want to figure out how the new API endpoints can be used and contribute a PR, please do.\n\nSee issue [#5](https://github.com/MichaelCurrin/netflix-assistant/issues/5).\n\n\n## Limitations\n\nSo far this project just represents a _single_ page of API results as text and images, using templating.\n\nThere is **no** fancy reporting or filtering.\n\nAlso I might rebuild this in Vue, instead of Mustache.\n\n\n## Preview\n\n\u003cdiv align=\"center\"\u003e\n    \u003ca href=\"https://netflix-assistant.netlify.app\"\u003e\n        \u003cimg src=\"/sample.png\" alt=\"sample screenshot\" width=\"350\" /\u003e\n    \u003c/a\u003e\n\u003c/div\u003e\n\n\n## Web app\n\n\u003cdiv align=\"center\"\u003e\n\n[![Site](https://img.shields.io/badge/View_site-Netflix_Assistant-2ea44f?style=for-the-badge)](https://netflix-assistant.netlify.app/)\n\n\u003c/div\u003e\n\n\n## Purpose\n\n[ReelGood](https://reelgood.com) is a service which provides listing of TV shows and movies across many online services, including [Netflix](https://netflix.com/).\n\nReelGood has a great GUI on their website which is easy to navigate for searching and filtering. They also use an API as part of this. I wanted to build my own show guide reports and recommendations list, so I pull data from their API with client-side JS and render it on a website.\n\n\n## Usage\n\nView the site:\n\n- [netflix-assistant.netlify.app](https://netflix-assistant.netlify.app/)\n\nIf you are new to Netlify / Lambda Functions, see my [Cookbook](https://michaelcurrin.github.io/code-cookbook/recipes/ci-cd/netlify/functions/).\n\nTest the JSON API endpoint directly:\n\n- Netflix shows\n    - This is queried by the website frontend. This Function fetches data from the ReelGood API and returns it. Caching is set up to reduce resource usage. The query done is limited by could be expanded to be more flexible like taking params and doing paging internally.\n    - Endpoint: [/.netlify/functions/shows](https://netflix-assistant.netlify.app/.netlify/functions/shows)\n    - Script: [functions/shows.js](/functions/shows.js)\n\n\n## Installation\n\n### Clone\n\nClone the repo:\n\n```sh\n$ git clone git@github.com:MichaelCurrin/netflix-assistant.git\n$ cd netflix-assistant\n```\n\nThere are no build or install steps!\n\nContinue below.\n\n\n## Infrastructure\n\u003e Using Serverless to API requests\n\nThis app cannot do browser requests directly ReelGood API (locally this is okay but on the deployed site you get an error). The API change dso there are CORS errors.\n\nSo this app redesigned to use Netlify's free _Functions_ feature (built on AWS Lambda).\n\nA Function is defined using a short JS script and this is hosted on Netlify. When a request is done to this Function's endpoint, a request is done to the ReelGood API and the result is returned as a cached JSON response.\n\nThis is much simpler than saying building a Python or Node API, as that needs a lot more code and cannot be hosted on Netlify.\n\n### Using Function endpoint locally\n\nThe downside is that the Function only works in the cloud and not on a local server.\n\nThere are some ways around this:\n\n- Setup Python/Node server locally and access it on localhost. You can setup a server using a short script with `http` library maybe and just add an extra line to call the JS script on a certain endpoint - this means you only need one server and one port.\n- Use Netlify CLI (maybe something like [netlify](https://www.npmjs.com/package/netlify) on NPM).\n- Get the the HTML/JS code to run on localhost, but still reference the Netlify app's Function endpoint using a customized URL.\n\n\n## Usage\n\nNote the local usage is limited - see the the section above.\n\n### Server\n\nStart a web server in the root directory.\n\nSee approaches in this [gist](https://gist.github.com/MichaelCurrin/1a6116a4e0918c8468dc7e1a701a5f95) or use an approach below.\n\n- Use VS Code's Live Server extension (with auto reloading).\n- Start a Python web server (no auto-reloading).\n    ```sh\n    $ python3 -m http.server\n    ```\n\nOpen in the browser. e.g.\n\n- https://localhost:8000\n\n\n### Scraper\n\nThere is a basic shell script in this project which uses Bash and cURL to get data from the ReelGood API.\n\nRather than using an on-demand Function as covered above, this approach is to scrape data from the API and store it as JSON data, which could be left in the deployed app or committed to version control if you care about that. Then the frontend can use that data - which will be much faster because all the paging is already handled. At the cost of slightly stale data and querying a large static JSON file. Some clean-up could be done so that the JSON file only contains fields of interest.\n\nThis script gets the first two pages of shows from the API, where the IMDB and ReelGood scores are above 50%. More advanced handling with Python or similar is recommended if you want to page smartly - i.e. substitute in a higher `skip` value, until there are no more pages.\n\n- [scrape/get_shows.sh](/scrape/get_shows.sh)\n\nRun as:\n\n```sh\n$ cd scrape\n$ ./get_shows.sh\n```\n\nThen view the JSON files created in the `out` subdirectory\n\n\n\n## Deploy\n\u003e Remote setup\n\nThis repo can be deployed on Netlify for free - as a static website plus Netlify Functions for the serverless backend calls to the external API.\n\nThe CORS header must be set for API requests and this is not possible to be set on Github Pages. Also, this uses Function on Netlify, which GitHub Pages does not support.\n\n\n## Source of data\n\nOn ReelGood's website there is a view of TV shows and movies available to stream on Netflix.\n\n- https://reelgood.com/source/netflix\n\nThe page supports filter parameters, ordering options and display format options.\n\nThe show data is retrieved from the ReelGood API.\n\n- https://api.reelgood.com/v2/\n\nThis is done upon initial page load, when you apply filtering/sorting and also when you click _Load More_ at the bottom of the page.\n\nThe API is free to use and on their FAQ page they provide details for requesting API access. I found that without having to e-mail them that the API is easy to access. I have not found documentation for it yet, so I compare GUI choice I make with the API requests which are made and infer how the fields on the API requests work and what the response fields mean.\n\n\n## Development\n\n### Future development\n\n- Look at avoiding a mix of `$.getJSON` (frontend) and `axios` (Function) to simplify the project.\n- Do something more interactive (searchable) and useful (page more data and present it better) with the Netflix data.\n\n### Lambda\n\nTo avoid CORS errors, this project uses a Function aka Lambda on Netlify to request data on the server side and then make the data available on the same domain as the browser request.\n\nSee [Netlify Function](https://www.netlify.com/products/functions/).\n\nSee also [blog post](https://dev.to/abusedmedia/using-netlify-functions-to-fetch-external-files-1a4b).\n\nA local setup could use a Netlify library or just a fallback to using the original URL (which doesn't give CORS errors on localhost fortunately even though it does on Netlify) based on an flag like `ENV=dev` or local/remote.\n\n\n## License\n\nReleased under [MIT](/LICENSE) by [@MichaelCurrin](https://github.com/MichaelCurrin).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmichaelcurrin%2Fnetflix-assistant","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmichaelcurrin%2Fnetflix-assistant","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmichaelcurrin%2Fnetflix-assistant/lists"}