{"id":47728286,"url":"https://github.com/morino23/embedcast","last_synced_at":"2026-04-15T00:02:22.886Z","repository":{"id":348374310,"uuid":"1197697651","full_name":"MoriNo23/embedCast","owner":"MoriNo23","description":"Android TV app for video casting and playback with WebSocket remote control","archived":false,"fork":false,"pushed_at":"2026-03-31T22:37:47.000Z","size":656,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-01T00:30:13.529Z","etag":null,"topics":["android","android-tv","casting","kotlin","leanback","media","video-player","websocket"],"latest_commit_sha":null,"homepage":null,"language":"Kotlin","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/MoriNo23.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","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":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-03-31T19:59:52.000Z","updated_at":"2026-03-31T22:30:19.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/MoriNo23/embedCast","commit_stats":null,"previous_names":["morino23/embedcast"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/MoriNo23/embedCast","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MoriNo23%2FembedCast","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MoriNo23%2FembedCast/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MoriNo23%2FembedCast/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MoriNo23%2FembedCast/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MoriNo23","download_url":"https://codeload.github.com/MoriNo23/embedCast/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MoriNo23%2FembedCast/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31316124,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-02T12:59:32.332Z","status":"ssl_error","status_checked_at":"2026-04-02T12:54:48.875Z","response_time":89,"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":["android","android-tv","casting","kotlin","leanback","media","video-player","websocket"],"created_at":"2026-04-02T21:02:25.931Z","updated_at":"2026-04-15T00:02:22.880Z","avatar_url":"https://github.com/MoriNo23.png","language":"Kotlin","readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/logo.png\" alt=\"EmbedCast Logo\" width=\"200\"\u003e\n\u003c/p\u003e\n\n# 🎬 EmbedCast\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![Android API](https://img.shields.io/badge/API-24%2B-brightgreen.svg)](https://android-arsenal.com/api?level=24)\n[![Kotlin](https://img.shields.io/badge/Kotlin-1.9.0-blue.svg)](https://kotlinlang.org)\n[![Go](https://img.shields.io/badge/Go-1.21-blue.svg)](https://golang.org)\n[![WebSocket](https://img.shields.io/badge/Protocol-WebSocket-orange.svg)](https://developer.mozilla.org/en-US/docs/Web/API/WebSocket)\n[![GitHub Stars](https://img.shields.io/github/stars/MoriNo23/embedCast)](https://github.com/MoriNo23/embedCast/stargazers)\n[![GitHub Issues](https://img.shields.io/github/issues/MoriNo23/embedCast)](https://github.com/MoriNo23/embedCast/issues)\n[![Build Status](https://img.shields.io/github/actions/workflow/status/MoriNo23/embedCast/build-android.yml)](https://github.com/MoriNo23/embedCast/actions)\n[![Last Commit](https://img.shields.io/github/last-commit/MoriNo23/embedCast/main)](https://github.com/MoriNo23/embedCast/commits)\n\n\u003e **EmbedCast** is an Android TV application for video casting and playback. Cast videos from a Linux host to your Android TV device with full remote control via WebSocket.\n\n## 🎥 Demo\n\n\u003e TODO: Add a demo GIF or screenshot of the application\n\n## 🚀 Quick Start\n\n### Download \u0026 Install\n\n| Platform | Download | Instructions |\n|----------|----------|--------------|\n| Android TV | [Latest Release](https://github.com/MoriNo23/embedCast/releases/latest) | Download APK → Install on TV |\n| Linux App | [Latest Release](https://github.com/MoriNo23/embedCast/releases/latest) | Run AppImage or binary |\n\n## ✨ Features\n\n- 🎥 **Video Casting** - Cast videos from Linux host to Android TV\n- 🎮 **Remote Control** - Full playback control via WebSocket\n- ⏯️ **Playback Controls** - Play, pause, seek, stop, quality selection\n- 📺 **Android TV Optimized** - Built with Leanback for TV experience\n- 🔄 **Auto-Reconnect** - Automatic WebSocket reconnection on disconnect\n- 💾 **Resume Playback** - Save and restore video positions\n- 🎨 **Animated Splash** - Custom animated splash screen with logo\n- 📡 **Real-time Status** - Live video status synchronization\n\n## 📋 Table of Contents\n\n- [Features](#-features)\n- [Architecture](#-architecture)\n- [Tech Stack](#-tech-stack)\n- [Project Structure](#-project-structure)\n- [Getting Started](#-getting-started)\n  - [Prerequisites](#prerequisites)\n  - [Installation](#installation)\n- [Usage](#-usage)\n- [API Reference](#-api-reference)\n- [Contributing](#-contributing)\n- [Changelog](#-changelog)\n- [Roadmap](#-roadmap)\n- [License](#-license)\n\n## 🏗️ Architecture\n\n```\n┌─────────────────┐     WebSocket (8080)     ┌─────────────────┐\n│                 │◄────────────────────────►│                 │\n│   Linux Host    │                          │   Android TV    │\n│   (CLI/Web GUI) │     JSON Protocol        │   (EmbedCast)   │\n│                 │                          │                 │\n└─────────────────┘                          └─────────────────┘\n```\n\n### Communication Protocol\n\n| Action   | Description              | Parameters           |\n| -------- | ------------------------ | -------------------- |\n| `load`   | Load video URL           | `url: string`       |\n| `play`   | Play/Pause toggle        | -                    |\n| `pause`  | Pause video              | -                    |\n| `stop`   | Stop and reset           | -                    |\n| `seek`   | Seek to position         | `seconds: int`       |\n| `quality`| Change video quality     | `value: string`      |\n| `reload` | Force reload (new token) | -                    |\n\n## 🛠️ Tech Stack\n\n### Android TV App\n| Component | Technology |\n|-----------|------------|\n| Language | Kotlin |\n| Min SDK | 24 (Android 7.0) |\n| Target SDK | 34 (Android 14) |\n| UI Framework | Android TV Leanback |\n| Video Player | JWPlayer (WebView) |\n| Networking | Java-WebSocket 1.5.4 |\n| Media | AndroidX Media 1.7.0 |\n\n### Linux Host\n| Component | Technology |\n|-----------|------------|\n| Host App | Go 1.21 (systray) |\n| Update Server | Python 3 |\n\n## 📁 Project Structure\n\n```\nembedCast/\n├── embedCast-tv/                 # Android TV Application\n│   ├── app/\n│   │   ├── build.gradle.kts\n│   │   └── src/main/\n│   │       ├── java/com/tvremote/control/\n│   │       │   ├── MainActivity.kt\n│   │       │   ├── SplashActivity.kt\n│   │       │   ├── VideoPlayerManager.kt\n│   │       │   ├── WebSocketManager.kt\n│   │       │   └── PreferencesManager.kt\n│   │       ├── res/\n│   │       └── AndroidManifest.xml\n│   └── gradle/\n├── embedCast-host/               # Linux Host Controller\n│   ├── go-app/                   # Go application (system tray)\n│   └── userscripts/              # Browser userscripts\n├── experimental/                 # Work in Progress\n├── docs/                         # Documentation\n├── assets/                       # Static assets\n├── AGENTS.md                     # AI Assistant Guide\n├── LICENSE                       # MIT License\n└── README.md\n```\n\n## 🚀 Getting Started\n\n### Prerequisites\n\n| Tool | Version | Purpose |\n|------|---------|---------|\n| Android Studio | Hedgehog (2024.1)+ | Android development |\n| JDK | 17+ | Java compilation |\n| Android SDK | API 34 | Android platform |\n| Go | 1.21+ | Host tools |\n| Python | 3.10+ | Update server |\n\n### Installation\n\n```bash\n# 1. Clone the repository\ngit clone https://github.com/MoriNo23/embedCast.git\ncd embedCast\n\n# 2. Android TV\ncd embedCast-tv\necho \"sdk.dir=/path/to/your/Android/Sdk\" \u003e local.properties\n./gradlew assembleDebug\n\n# 3. Install on device\n./gradlew installDebug\n\n# 4. Host tools (optional)\ncd ../embedCast-host/go-app\ngo build -o embedcast-host .\n```\n\n## 📖 Usage\n\n### WebSocket Server\n\nThe Android TV app automatically starts a WebSocket server on port 8080 when launched.\n\n```kotlin\n// Server starts automatically in MainActivity\nwebSocketManager.startServer { json -\u003e \n    handleCommand(json) \n}\n```\n\n### Sending Commands\n\n```bash\n# Go app (web interface)\n# Open browser at http://localhost:3000 (or next available port)\n\n# Python example\nimport websocket\nws = websocket.WebSocket()\nws.connect(\"ws://TV_IP:8080\")\nws.send('{\"action\": \"play\"}')\n```\n\n## 📡 API Reference\n\n### WebSocket Messages\n\n**Request:**\n```json\n{\n  \"action\": \"load|play|pause|stop|seek|quality|reload\",\n  \"url\": \"https://...\",\n  \"seconds\": 10,\n  \"value\": \"1\"\n}\n```\n\n**Response:**\n```json\n{\n  \"type\": \"status\",\n  \"currentTime\": 120.5,\n  \"duration\": 3600.0,\n  \"paused\": false\n}\n```\n\n## 🤝 Contributing\n\nContributions are welcome! Please read our [Code of Conduct](CODE_OF_CONDUCT.md) first.\n\n### Guidelines\n\n1. Fork the repository\n2. Create your feature branch (`git checkout -b feature/AmazingFeature`)\n3. Commit your changes with clear messages\n4. Push to the branch\n5. Open a Pull Request\n\n### Development Standards\n\n- Follow [Kotlin Coding Conventions](https://kotlinlang.org/docs/coding-conventions.html)\n- Keep `MainActivity.kt` under 500 lines\n- Use `PackageInfoCompat` for version checks\n- Test WebSocket compatibility after changes\n\n## 📝 Changelog\n\nAll notable changes are documented in [CHANGELOG.md](CHANGELOG.md).\n\n### v1.0.0 (Initial Release)\n- Android TV application for video casting\n- WebSocket-based remote control\n- Linux CLI and Web GUI tools\n- Resume playback functionality\n- Auto-reconnect feature\n\n## 🗺️ Roadmap\n\n- [ ] Adaptive icons for Android 8.0+\n- [x] CI/CD pipeline with GitHub Actions\n- [ ] Multi-device casting support\n- [ ] Video playlist management\n- [ ] Subtitle support\n- [ ] Chromecast compatibility\n- [ ] iOS companion app\n\n## 📄 License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n## 🔒 Security Policy\n\nIf you discover a security vulnerability, please report it via:\n\n1. **GitHub Issues** (for non-critical issues)\n2. **Email** (for critical vulnerabilities) - contact via GitHub profile\n\n## 📜 Code of Conduct\n\nPlease read our [Code of Conduct](CODE_OF_CONDUCT.md) before contributing.\n\n---\n\n⭐ **Star this repo if you find it useful!**\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmorino23%2Fembedcast","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmorino23%2Fembedcast","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmorino23%2Fembedcast/lists"}