{"id":31618044,"url":"https://github.com/cruechan/omniview","last_synced_at":"2026-04-10T13:31:46.984Z","repository":{"id":317551434,"uuid":"1067908746","full_name":"CrueChan/OmniView","owner":"CrueChan","description":"Free online video search and streaming platform with Docker support","archived":false,"fork":false,"pushed_at":"2025-10-01T15:17:56.000Z","size":864,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-10-01T17:22:22.192Z","etag":null,"topics":["docker","docker-compose","express","hls-player","nodejs","self-hosted","video-search","video-streaming"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/CrueChan.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","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-10-01T15:05:15.000Z","updated_at":"2025-10-01T15:16:47.000Z","dependencies_parsed_at":"2025-10-01T17:23:08.123Z","dependency_job_id":"0dbab17b-4c77-4ffd-88f8-efea3ce651df","html_url":"https://github.com/CrueChan/OmniView","commit_stats":null,"previous_names":["cruechan/omniview"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/CrueChan/OmniView","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CrueChan%2FOmniView","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CrueChan%2FOmniView/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CrueChan%2FOmniView/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CrueChan%2FOmniView/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/CrueChan","download_url":"https://codeload.github.com/CrueChan/OmniView/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CrueChan%2FOmniView/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278621844,"owners_count":26017253,"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","status":"online","status_checked_at":"2025-10-06T02:00:05.630Z","response_time":65,"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":["docker","docker-compose","express","hls-player","nodejs","self-hosted","video-search","video-streaming"],"created_at":"2025-10-06T13:45:12.779Z","updated_at":"2025-10-06T13:45:15.327Z","avatar_url":"https://github.com/CrueChan.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# OmniView - Free Online Video Search and Streaming Platform\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"image/logo.png\" alt=\"OmniView Logo\" width=\"128\"\u003e\n\n  [![GitHub stars](https://img.shields.io/github/stars/CrueChan/OmniView?style=social)](https://github.com/CrueChan/OmniView/stargazers)\n  [![GitHub forks](https://img.shields.io/github/forks/CrueChan/OmniView?style=social)](https://github.com/CrueChan/OmniView/network)\n  [![GitHub issues](https://img.shields.io/github/issues/CrueChan/OmniView)](https://github.com/CrueChan/OmniView/issues)\n  [![GitHub license](https://img.shields.io/github/license/CrueChan/OmniView)](https://github.com/CrueChan/OmniView/blob/main/LICENSE)\n  [![Docker Pulls](https://img.shields.io/docker/pulls/YOUR_DOCKERHUB/omniview)](https://hub.docker.com/r/YOUR_DOCKERHUB/omniview)\n\n  \u003cp\u003e\u003cstrong\u003eStream Freely, Enjoy Fully\u003c/strong\u003e\u003c/p\u003e\n\u003c/div\u003e\n\n## 📺 Project Introduction\n\nOmniView is a lightweight, free online video search and streaming platform that provides content search and playback services from multiple video sources. No registration required, ready to use out of the box, supports access from various devices. The project combines frontend technology and backend proxy functionality, and can be deployed on various website hosting services that support server-side functions. \n\nThis project is based on [LibreSpark/LibreTV](https://github.com/LibreSpark/LibreTV) **Original Project Portal**: [libretv.is-an.org](https://libretv.is-an.org), and that project is based on a refactored and enhanced version of [bestK/tv](https://github.com/bestK/tv).\n\n## 🚀 Quick Deploy\n\nChoose any of the following platforms and click the one-click deploy button to quickly create your own OmniView instance:\n\n[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2FCrueChan%2FOmniView)  \n[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/CrueChan/OmniView)  \n[![Deploy to Render](https://render.com/images/deploy-to-render-button.svg)](https://render.com/deploy?repo=https://github.com/CrueChan/OmniView)\n[![Deploy with EdgeOne Pages](https://cdnstatic.tencentcs.com/edgeone/pages/deploy.svg)](https://edgeone.ai/pages/new?repository-url=https://github.com/CrueChan/OmniView)\n\n## ⚠️ Security and Privacy Notice\n\n### 🔒 Strongly Recommend Setting Password Protection\n\nFor your security and to avoid potential legal risks, we **strongly recommend** setting password protection when deploying:\n\n- **Avoid Public Access**: Instances without password protection can be accessed by anyone and may be maliciously exploited\n- **Prevent Copyright Risks**: Public video search services may face complaints and reports from copyright holders\n- **Protect Personal Privacy**: Setting a password can limit access scope and protect your usage records\n\n### 📝 Deployment Recommendations\n\n1. **Set Environment Variable `PASSWORD`**: Set a strong password for your instance\n2. **Personal Use Only**: Do not publicly share or distribute your instance link\n3. **Comply with Local Laws**: Ensure your usage complies with local laws and regulations\n\n### 🚨 Important Disclaimer\n\n- This project is for learning and personal use only\n- Do not use the deployed instance for commercial purposes or public services\n- Users are solely responsible for any legal issues arising from public sharing\n- Project developers are not liable for any legal responsibilities arising from user behavior\n\n## ⚠️ Do Not Use Pull Bot for Auto-Sync\n\nPull Bot will repeatedly trigger invalid PRs and spam, seriously disrupting project maintenance. The author may directly block all repository owners who use Pull Bot for automatic sync requests.\n\n**Recommended Approach:**\n\nIt is recommended to enable the built-in GitHub Actions auto-sync feature in your forked repository (see `.github/workflows/sync.yml`).\n\nIf you need to manually sync updates from the main repository, you can also use GitHub's official [Sync fork](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/syncing-a-fork) feature.\n\n### GitHub Actions Workflows\n\nThis project includes three automated workflows:\n\n#### 1. **Upstream Sync** (`.github/workflows/sync.yml`)\n- **Schedule**: Runs daily at 12 PM UTC+8 (4 AM UTC)\n- **Purpose**: Automatically syncs your fork with the upstream repository\n- **Trigger**: Scheduled (cron) or manual dispatch\n- **Note**: Only works on forked repositories\n\nTo enable automatic sync in your fork:\n1. Go to your fork's \"Actions\" tab\n2. Enable GitHub Actions if not already enabled\n3. The sync workflow will run automatically daily\n\n#### 2. **Version Bump** (`.github/workflows/version.yml`)\n- **Trigger**: On push to main branch or manual dispatch\n- **Purpose**: Automatically updates version number based on timestamp\n- **Actions**: \n  - Updates `VERSION.txt` with current timestamp\n  - Commits changes\n  - Cleans up old workflow runs (keeps last 2)\n- **Note**: Only runs on the main repository (`CrueChan/OmniView`)\n\n#### 3. **Docker Image Build** (`.github/workflows/docker-build.yml`)\n- **Trigger**: After successful version bump or manual dispatch\n- **Purpose**: Builds and publishes Docker images to Docker Hub\n- **Platforms**: \n  - `linux/amd64` (x86_64)\n  - `linux/arm64/v8` (ARM 64-bit)\n  - `linux/arm/v7` (ARM 32-bit)\n- **Tags**: \n  - `latest` (always points to newest version)\n  - Version-specific tag (e.g., `202401151200`)\n- **Note**: Requires Docker Hub credentials in repository secrets\n\n**For Fork Maintainers**: If you want to build your own Docker images, you need to:\n1. Create a Docker Hub account\n2. Add repository secrets:\n   - `DOCKER_USERNAME`: Your Docker Hub username\n   - `DOCKER_PASSWORD`: Your Docker Hub password or access token\n3. Modify the workflow file to use your Docker Hub repository\n\n## 📋 Detailed Deployment Guide\n\n### Docker Deployment (Recommended)\n\nDocker provides the easiest and most consistent deployment method across different platforms.\n\n#### Quick Start with Docker\n\n```bash\ndocker run -d \\\n  --name omniview \\\n  --restart unless-stopped \\\n  -p 8899:8080 \\\n  -e PASSWORD=your_secure_password \\\n  -e ADMINPASSWORD=your_admin_password \\\n  CrueChan/omniview:latest\n```\n\nThen visit `http://localhost:8899` to access your instance.\n\n#### Docker Compose (Recommended for Production)\n\n**Step 1: Create project directory**\n\n```bash\nmkdir omniview \u0026\u0026 cd omniview\n```\n\n**Step 2: Create `docker-compose.yml` file**\n\n```yaml\nservices:\n  omniview:\n    image: CrueChan/omniview:latest\n    container_name: omniview\n    \n    ports:\n      - \"8899:8080\"  # Host port:Container port\n    \n    environment:\n      # Basic Configuration\n      - PORT=8080\n      - NODE_ENV=production\n      - PASSWORD=${PASSWORD:-}\n      - ADMINPASSWORD=${ADMINPASSWORD:-}\n      - DEBUG=${DEBUG:-false}\n      \n      # CORS Configuration\n      - CORS_ORIGIN=${CORS_ORIGIN:-*}\n      \n      # Request Configuration\n      - REQUEST_TIMEOUT=${REQUEST_TIMEOUT:-5000}\n      - MAX_RETRIES=${MAX_RETRIES:-2}\n      - USER_AGENT=${USER_AGENT:-Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36}\n      \n      # Cache Configuration\n      - CACHE_MAX_AGE=${CACHE_MAX_AGE:-1d}\n      \n      # Security Configuration\n      - BLOCKED_HOSTS=${BLOCKED_HOSTS:-localhost,127.0.0.1,0.0.0.0,::1}\n      - BLOCKED_IP_PREFIXES=${BLOCKED_IP_PREFIXES:-192.168.,10.,172.}\n      - FILTERED_HEADERS=${FILTERED_HEADERS:-content-security-policy,cookie,set-cookie,x-frame-options,access-control-allow-origin}\n    \n    restart: unless-stopped\n    \n    healthcheck:\n      test: [\"CMD\", \"node\", \"-e\", \"require('http').get('http://localhost:8080', (res) =\u003e { process.exit(res.statusCode === 200 ? 0 : 1) }).on('error', () =\u003e process.exit(1))\"]\n      interval: 30s\n      timeout: 10s\n      retries: 3\n      start_period: 40s\n    \n    # Optional: Resource limits\n    deploy:\n      resources:\n        limits:\n          cpus: '1.0'\n          memory: 512M\n        reservations:\n          cpus: '0.25'\n          memory: 128M\n    \n    networks:\n      - omniview_network\n\nnetworks:\n  omniview_network:\n    driver: bridge\n```\n\n**Step 3: Create `.env` file**\n\n```bash\n# Copy the example environment file\ncp .env.example .env\n\n# Edit the .env file and set your passwords\nnano .env\n```\n\nExample `.env` configuration:\n\n```bash\n# REQUIRED: Set strong passwords\nPASSWORD=YourSecurePassword2024!\nADMINPASSWORD=YourAdminPassword2024!\n\n# Optional configurations\nPORT=8080\nCORS_ORIGIN=*\nDEBUG=false\nREQUEST_TIMEOUT=5000\nMAX_RETRIES=2\nCACHE_MAX_AGE=1d\n```\n\n**Step 4: Start the service**\n\n```bash\n# Start in detached mode\ndocker-compose up -d\n\n# View logs\ndocker-compose logs -f\n\n# Check status\ndocker-compose ps\n```\n\n**Step 5: Access your instance**\n\nOpen your browser and navigate to `http://localhost:8899`\n\n#### Building from Source\n\nIf you want to build the Docker image yourself:\n\n```bash\n# Clone the repository\ngit clone https://github.com/CrueChan/OmniView.git\ncd OmniView\n\n# Create and configure .env file\ncp .env.example .env\nnano .env  # Set your passwords\n\n# Build and start with Docker Compose\ndocker-compose up -d --build\n\n# Or build manually\ndocker build -t omniview:latest .\ndocker run -d \\\n  --name omniview \\\n  -p 8899:8080 \\\n  --env-file .env \\\n  omniview:latest\n```\n\n#### Docker Management Commands\n\n```bash\n# Start service\ndocker-compose up -d\n\n# Stop service\ndocker-compose down\n\n# Restart service\ndocker-compose restart\n\n# View logs (real-time)\ndocker-compose logs -f omniview\n\n# View logs (last 100 lines)\ndocker-compose logs --tail=100 omniview\n\n# Check container status\ndocker-compose ps\n\n# Execute command in container\ndocker-compose exec omniview sh\n\n# Update to latest version\ndocker-compose pull\ndocker-compose up -d\n\n# Clean up (including volumes)\ndocker-compose down -v\n```\n\n#### Reverse Proxy Configuration\n\nFor production deployment, it's recommended to use a reverse proxy (Nginx/Caddy) with SSL.\n\n**Nginx Configuration Example:**\n\n```nginx\nserver {\n    listen 443 ssl http2;\n    server_name video.yourdomain.com;\n\n    ssl_certificate /path/to/cert.pem;\n    ssl_certificate_key /path/to/key.pem;\n\n    location / {\n        proxy_pass http://localhost:8899;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header X-Forwarded-Proto $scheme;\n        \n        # Streaming optimization\n        proxy_buffering off;\n        proxy_request_buffering off;\n        proxy_http_version 1.1;\n    }\n}\n```\n\n**Caddy Configuration Example:**\n\n```caddy\nvideo.yourdomain.com {\n    reverse_proxy localhost:8899 {\n        flush_interval -1\n    }\n}\n```\n\n### Cloudflare Pages\n\n1. Fork or clone this repository to your GitHub account\n2. Log in to [Cloudflare Dashboard](https://dash.cloudflare.com/) and go to Pages service\n3. Click \"Create a project\" and connect your GitHub repository\n4. Use the following settings:\n   - Build command: Leave blank (no build required)\n   - Build output directory: Leave blank (defaults to root directory)\n5. **⚠️ Important: Add `PASSWORD` variable in \"Settings\" \u003e \"Environment Variables\"**\n6. **Optional: Add `ADMINPASSWORD` variable in \"Settings\" \u003e \"Environment Variables\"**\n7. Click \"Save and Deploy\"\n\n### Vercel\n\n1. Fork or clone this repository to your GitHub/GitLab account\n2. Log in to [Vercel](https://vercel.com/) and click \"New Project\"\n3. Import your repository using default settings\n4. **⚠️ Important: Add `PASSWORD` variable in \"Settings\" \u003e \"Environment Variables\"**\n5. **Optional: Add `ADMINPASSWORD` variable in \"Settings\" \u003e \"Environment Variables\"**\n6. Click \"Deploy\"\n\n### Render\n\n1. Fork or clone this repository to your GitHub account\n2. Log in to [Render](https://render.com/) and click \"New Web Service\"\n3. Select your repository, Render will automatically detect the `render.yaml` configuration file\n4. Keep default settings (no need to set environment variables, password protection is disabled by default)\n5. Click \"Create Web Service\" and wait for deployment to complete\n\n\u003e To enable password protection, manually add `PASSWORD` and/or `ADMINPASSWORD` in environment variables in the Render console.\n\n### Local Development Environment\n\nThe project includes backend proxy functionality and requires an environment that supports server-side functions:\n\n```bash\n# Clone the repository\ngit clone https://github.com/CrueChan/OmniView.git\ncd OmniView\n\n# Copy environment variables\ncp .env.example .env\n\n# Install dependencies\nnpm install\n\n# Start development server\nnpm run dev\n```\n\nVisit `http://localhost:8080` to use (port can be modified via PORT variable in .env file).\n\n\u003e ⚠️ Note: When using simple static servers (such as `python -m http.server` or `npx http-server`), video proxy functionality will not be available and videos cannot play properly. For full functionality testing, please use Node.js development server.\n\n## 🔧 Configuration Reference\n\n### Environment Variables\n\n| Variable | Default Value | Description |\n|----------|---------------|-------------|\n| **Basic Configuration** |\n| `PORT` | `8080` | Application listening port |\n| `PASSWORD` | Empty | User password ⚠️ **Must be set** |\n| `ADMINPASSWORD` | Empty | Admin password (for settings protection) |\n| `DEBUG` | `false` | Debug mode |\n| **CORS Configuration** |\n| `CORS_ORIGIN` | `*` | Allowed CORS origins (use specific domain in production) |\n| **Request Configuration** |\n| `REQUEST_TIMEOUT` | `5000` | Request timeout in milliseconds |\n| `MAX_RETRIES` | `2` | Maximum retry attempts |\n| `USER_AGENT` | Chrome UA | User-Agent header for requests |\n| **Cache Configuration** |\n| `CACHE_MAX_AGE` | `1d` | Cache max age (1 day) |\n| **Security Configuration** |\n| `BLOCKED_HOSTS` | Local addresses | Comma-separated list of blocked hostnames |\n| `BLOCKED_IP_PREFIXES` | Private IPs | Comma-separated list of blocked IP prefixes |\n| `FILTERED_HEADERS` | Sensitive headers | Comma-separated list of headers to filter |\n\n### Security Best Practices\n\n#### 1. Set Strong Passwords (Required)\n\n```bash\n# .env file\nPASSWORD=MyStr0ng@Pass2024!\nADMINPASSWORD=Adm1n$ecure2024!\n```\n\n#### 2. Restrict CORS in Production\n\n```bash\n# Allow only your domain\nCORS_ORIGIN=https://yourdomain.com\n\n# Allow multiple domains\nCORS_ORIGIN=https://domain1.com,https://domain2.com\n```\n\n#### 3. Use HTTPS with Reverse Proxy\n\nAlways deploy behind a reverse proxy (Nginx/Caddy) with SSL certificates in production.\n\n#### 4. Enable Firewall\n\n```bash\n# Example: UFW on Ubuntu\nsudo ufw allow 22/tcp\nsudo ufw allow 80/tcp\nsudo ufw allow 443/tcp\nsudo ufw enable\n```\n\n### Password Protection\n\nTo add password protection to your OmniView instance, set the following environment variables:\n\n**For Regular Users:**\n- Variable: `PASSWORD`\n- Value: Your desired password\n\n**For Admin Access (Settings):**\n- Variable: `ADMINPASSWORD`\n- Value: Your desired admin password\n\nPlatform-specific setup methods:\n\n- **Docker/Docker Compose**: Set in `.env` file or `-e` flags\n- **Cloudflare Pages**: Dashboard \u003e Project \u003e Settings \u003e Environment Variables\n- **Vercel**: Dashboard \u003e Project \u003e Settings \u003e Environment Variables\n- **Netlify**: Dashboard \u003e Project \u003e Site settings \u003e Build \u0026 deploy \u003e Environment\n- **Local Development**: Set in `.env` file\n\n### API Compatibility\n\nOmniView supports the standard Apple CMS V10 API format. When adding custom APIs, the following format must be followed:\n- Search endpoint: `https://example.com/api.php/provide/vod/?ac=videolist\u0026wd=keyword`\n- Detail endpoint: `https://example.com/api.php/provide/vod/?ac=detail\u0026ids=video_id`\n\n**Adding CMS Source**:\n1. Select \"Custom Interface\" in the settings panel\n2. Interface address: `https://example.com/api.php/provide/vod`\n\n## ⌨️ Keyboard Shortcuts\n\nThe player supports the following keyboard shortcuts:\n\n- **Space**: Play/Pause\n- **Left/Right Arrow**: Rewind/Fast Forward\n- **Up/Down Arrow**: Volume Up/Down\n- **M Key**: Mute/Unmute\n- **F Key**: Fullscreen/Exit Fullscreen\n- **Esc Key**: Exit Fullscreen\n\n## 🔄 Updating Your Instance\n\n### Docker\n\n```bash\n# Pull latest image\ndocker-compose pull\n\n# Restart with new image\ndocker-compose up -d\n\n# Or for standalone Docker\ndocker pull CrueChan/omniview:latest\ndocker stop omniview\ndocker rm omniview\n# Run with same configuration as before\n```\n\n**Using Specific Version**: You can use version-specific tags instead of `latest`:\n\n```bash\n# Example: Use version 202401151200\ndocker pull CrueChan/omniview:202401151200\n```\n\nCheck available versions on [Docker Hub](https://hub.docker.com/r/CrueChan/omniview/tags).\n\n### Serverless Platforms\n\nMost platforms (Vercel, Netlify, Cloudflare) support automatic deployment:\n\n1. Enable auto-deployment in your platform settings\n2. When the main repository updates, your fork will be notified\n3. Merge the changes or enable auto-sync using GitHub Actions (see workflow section above)\n\n### Building Custom Docker Images\n\nIf you want to build your own Docker images from source:\n\n```bash\n# Clone the repository\ngit clone https://github.com/YourUsername/OmniView.git\ncd OmniView\n\n# Build for current platform\ndocker build -t your-username/omniview:latest .\n\n# Build for multiple platforms (requires Docker Buildx)\ndocker buildx create --use\ndocker buildx build \\\n  --platform linux/amd64,linux/arm64,linux/arm/v7 \\\n  -t your-username/omniview:latest \\\n  --push .\n```\n\n**Note**: The project's GitHub Actions automatically builds multi-platform images on every version bump.\n\n## 🐛 Troubleshooting\n\n### Videos Not Playing\n\n1. Check if proxy is working: `docker-compose logs omniview | grep proxy`\n2. Verify CORS settings in `.env`\n3. Check browser console for errors\n4. Ensure the video source API is accessible\n\n### Cannot Access Instance\n\n1. Check container status: `docker-compose ps`\n2. Verify port binding: `netstat -tlnp | grep 8899`\n3. Check firewall settings\n4. Review logs: `docker-compose logs -f`\n\n### Performance Issues\n\n1. Increase resource limits in `docker-compose.yml`\n2. Adjust timeout settings in `.env`\n3. Enable caching by increasing `CACHE_MAX_AGE`\n4. Consider using a CDN for static assets\n\n## 🛠️ Tech Stack\n\n- **Frontend**:\n  - HTML5 + CSS3 + JavaScript (ES6+)\n  - Tailwind CSS for styling\n  - HLS.js for HLS stream processing\n  - DPlayer video player core\n  - localStorage for local storage\n  \n- **Backend**:\n  - Node.js (Express.js framework)\n  - Axios for HTTP requests\n  - CORS middleware\n  - Server-side HLS proxy and processing\n  \n- **Deployment \u0026 DevOps**:\n  - Docker for containerization\n  - Multi-platform support (amd64, arm64, armv7)\n  - GitHub Actions for CI/CD\n  - Automated version bumping\n  - Automated Docker image builds\n  \n- **Hosting Platforms**:\n  - Cloudflare Pages\n  - Vercel\n  - Netlify\n  - Render\n  - Self-hosted (Docker)\n\n## 🤝 Contributing\n\nContributions are welcome! Here's how you can help:\n\n1. **Fork the repository**\n2. **Create a feature branch**: `git checkout -b feature/amazing-feature`\n3. **Commit your changes**: `git commit -m 'Add some amazing feature'`\n4. **Push to the branch**: `git push origin feature/amazing-feature`\n5. **Open a Pull Request**\n\nPlease ensure your PR:\n- Follows the existing code style\n- Includes appropriate comments\n- Updates documentation if needed\n- Passes all checks (if any are configured)\n\n### Development Workflow\n\n```bash\n# Clone your fork\ngit clone https://github.com/YourUsername/OmniView.git\ncd OmniView\n\n# Install dependencies\nnpm install\n\n# Create .env file\ncp .env.example .env\n\n# Start development server\nnpm run dev\n\n# Make your changes and test thoroughly\n\n# Commit and push\ngit add .\ngit commit -m \"Your descriptive commit message\"\ngit push origin your-branch-name\n```\n\n## ⚖️ Disclaimer\n\nOmniView serves only as a video search tool and does not store, upload, or distribute any video content. All videos come from search results provided by third-party API interfaces. For any infringing content, please contact the respective content providers.\n\nThe developers of this project are not responsible for any consequences arising from the use of this project. When using this project, you must comply with local laws and regulations.\n\n---\n\n## 📞 Support\n\n- **GitHub Issues**: [Report bugs or request features](https://github.com/CrueChan/OmniView/issues)\n- **Documentation**: This README and inline code comments\n- **Original Project**: [LibreSpark/LibreTV](https://github.com/LibreSpark/LibreTV)\n\n---\n\n**Made with ❤️ by Crue Chan**\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcruechan%2Fomniview","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcruechan%2Fomniview","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcruechan%2Fomniview/lists"}