{"id":50554253,"url":"https://github.com/tranquangvu/9film","last_synced_at":"2026-06-04T05:31:00.183Z","repository":{"id":361313655,"uuid":"1253998248","full_name":"tranquangvu/9film","owner":"tranquangvu","description":null,"archived":false,"fork":false,"pushed_at":"2026-05-30T03:59:12.000Z","size":206,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-30T05:06:29.689Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","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/tranquangvu.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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-30T03:00:15.000Z","updated_at":"2026-05-30T03:59:16.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/tranquangvu/9film","commit_stats":null,"previous_names":["tranquangvu/9film"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/tranquangvu/9film","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tranquangvu%2F9film","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tranquangvu%2F9film/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tranquangvu%2F9film/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tranquangvu%2F9film/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tranquangvu","download_url":"https://codeload.github.com/tranquangvu/9film/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tranquangvu%2F9film/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33891723,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-04T02:00:06.755Z","response_time":64,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":[],"created_at":"2026-06-04T05:30:59.570Z","updated_at":"2026-06-04T05:31:00.177Z","avatar_url":"https://github.com/tranquangvu.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# NiceFilm\n\nA streaming app built with React on the frontend and Go on the backend. Streams real video from any IMDb title ID, with HLS proxying, subtitle support via OpenSubtitles, and episode selection for TV series.\n\n## Stack\n\n**Frontend** — React 19, TypeScript 6, Vite 8, Tailwind CSS 4, Framer Motion, Video.js  \n**Backend** — Go 1.23, Gin, Zap, godotenv\n\n## Project Structure\n\n```\nnicefilm/\n├── backend/                   Go Gin API\n│   ├── cmd/server/main.go\n│   ├── internal/\n│   │   ├── config/            env loading\n│   │   ├── handler/           HTTP handlers\n│   │   ├── logger/            zap setup\n│   │   ├── router/            route registration + middleware\n│   │   └── service/           IMDb, stream proxy, HLS proxy, subtitles\n│   ├── .env.example\n│   └── Makefile\n├── web/                       React frontend\n│   ├── src/\n│   │   ├── components/\n│   │   │   ├── ui/            base primitives (Button, Tag, Select, …)\n│   │   │   └── system/        feature components (layout, movie, player)\n│   │   ├── hooks/             use-player-session\n│   │   ├── pages/             route-level components\n│   │   └── utils/             IMDb, stream, subtitle, HLS utilities\n│   └── vite.config.ts         proxies /api and /proxy → backend:8080\n├── docs/\n└── README.md\n```\n\n## API Endpoints\n\n| Method | Path | Description |\n|--------|------|-------------|\n| GET | `/api/title/:imdb` | Fetch IMDb title metadata via GraphQL |\n| GET | `/api/subtitle/search` | Search subtitles via OpenSubtitles |\n| GET | `/api/subtitle/download` | Download subtitle as WebVTT |\n| GET | `/api/stream` | Proxy stream URLs from CDN |\n| GET | `/proxy/hls` | HLS segment/manifest proxy with URL rewriting |\n\n## Getting Started\n\n### Backend\n\n```bash\ncd backend\ncp .env.example .env\nmake dev          # http://localhost:8080\n```\n\nSubtitle support requires an [OpenSubtitles API key](https://www.opensubtitles.com/en/consumers). Fill in `.env`:\n\n```env\nOPENSUBTITLES_API_KEY=your_key\nOPENSUBTITLES_USERNAME=your_username\nOPENSUBTITLES_PASSWORD=your_password\n```\n\n### Frontend\n\n```bash\ncd web\npnpm install\npnpm dev          # http://localhost:5173\n```\n\n## Usage\n\nNavigate to `/watch/:imdb` to stream any title. For example:\n\n- `http://localhost:5173/watch/tt0903747` — Breaking Bad\n- `http://localhost:5173/watch/tt0468569` — The Dark Knight\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftranquangvu%2F9film","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftranquangvu%2F9film","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftranquangvu%2F9film/lists"}