diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 80acb83..775e2ec 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -211,7 +211,7 @@ Documentation improvements are always welcome! This includes: ## License -By contributing to CinePro Core, you agree that your contributions will be licensed under the MIT License. +By contributing to CinePro Core, you agree that your contributions will be licensed under the PolyForm Noncommercial 1.0 License. --- diff --git a/.github/SECURITY.md b/.github/SECURITY.md index c7c5b1e..b0a2048 100644 --- a/.github/SECURITY.md +++ b/.github/SECURITY.md @@ -196,7 +196,7 @@ If you're unsure whether something is a security issue or where to report it: ## Legal -CinePro Core is provided "as is" without warranty. See the [MIT License](../LICENSE) for details. +CinePro Core is provided "as is" without warranty. See the [PolyForm Noncommercial 1.0 License](../LICENSE) for details. --- diff --git a/LICENSE b/LICENSE index ab08c54..9dd35e8 100644 --- a/LICENSE +++ b/LICENSE @@ -1,21 +1,131 @@ -MIT License - -Copyright (c) 2026 CinePro Contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +# PolyForm Noncommercial License 1.0.0 + + + +## Acceptance + +In order to get any license under these terms, you must agree +to them as both strict obligations and conditions to all +your licenses. + +## Copyright License + +The licensor grants you a copyright license for the +software to do everything you might do with the software +that would otherwise infringe the licensor's copyright +in it for any permitted purpose. However, you may +only distribute the software according to [Distribution +License](#distribution-license) and make changes or new works +based on the software according to [Changes and New Works +License](#changes-and-new-works-license). + +## Distribution License + +The licensor grants you an additional copyright license +to distribute copies of the software. Your license +to distribute covers distributing the software with +changes and new works permitted by [Changes and New Works +License](#changes-and-new-works-license). + +## Notices + +You must ensure that anyone who gets a copy of any part of +the software from you also gets a copy of these terms or the +URL for them above, as well as copies of any plain-text lines +beginning with `Required Notice:` that the licensor provided +with the software. For example: + +> Required Notice: Copyright CinePro Foundation (https://github.com/cinepro-org) + +## Changes and New Works License + +The licensor grants you an additional copyright license to +make changes and new works based on the software for any +permitted purpose. + +## Patent License + +The licensor grants you a patent license for the software that +covers patent claims the licensor can license, or becomes able +to license, that you would infringe by using the software. + +## Noncommercial Purposes + +Any noncommercial purpose is a permitted purpose. + +## Personal Uses + +Personal use for research, experiment, and testing for +the benefit of public knowledge, personal study, private +entertainment, hobby projects, amateur pursuits, or religious +observance, without any anticipated commercial application, +is use for a permitted purpose. + +## Noncommercial Organizations + +Use by any charitable organization, educational institution, +public research organization, public safety or health +organization, environmental protection organization, +or government institution is use for a permitted purpose +regardless of the source of funding or obligations resulting +from the funding. + +## Fair Use + +You may have "fair use" rights for the software under the +law. These terms do not limit them. + +## No Other Rights + +These terms do not allow you to sublicense or transfer any of +your licenses to anyone else, or prevent the licensor from +granting licenses to anyone else. These terms do not imply +any other licenses. + +## Patent Defense + +If you make any written claim that the software infringes or +contributes to infringement of any patent, your patent license +for the software granted under these terms ends immediately. If +your company makes such a claim, your patent license ends +immediately for work on behalf of your company. + +## Violations + +The first time you are notified in writing that you have +violated any of these terms, or done anything with the software +not covered by your licenses, your licenses can nonetheless +continue if you come into full compliance with these terms, +and take practical steps to correct past violations, within +32 days of receiving notice. Otherwise, all your licenses +end immediately. + +## No Liability + +***As far as the law allows, the software comes as is, without +any warranty or condition, and the licensor will not be liable +to you for any damages arising out of these terms or the use +or nature of the software, under any kind of legal claim.*** + +## Definitions + +The **licensor** is the individual or entity offering these +terms, and the **software** is the software the licensor makes +available under these terms. + +**You** refers to the individual or entity agreeing to these +terms. + +**Your company** is any legal entity, sole proprietorship, +or other kind of organization that you work for, plus all +organizations that have control over, are under the control of, +or are under common control with that organization. **Control** +means ownership of substantially all the assets of an entity, +or the power to direct its management and policies by vote, +contract, or otherwise. Control can be direct or indirect. + +**Your licenses** are all the licenses granted to you for the +software under these terms. + +**Use** means anything you do with the software requiring one +of your licenses. diff --git a/README.md b/README.md index 7a61078..1c20476 100644 --- a/README.md +++ b/README.md @@ -2,220 +2,57 @@ # CinePro Core 🎬 -## _🌟 Star this repository to support us! 🌟_ + -**OMSS-compliant streaming backend powering the CinePro ecosystem.**
Built with [@omss/framework](https://www.npmjs.com/package/@omss/framework) for extensible, type-safe media scraping and streaming. +**OMSS-compliant streaming backend powering the CinePro ecosystem.** +Built with [@omss/framework](https://www.npmjs.com/package/@omss/framework) for extensible, type-safe media scraping. - - ---- - -## Overview - -CinePro Core is the foundational backend service of CinePro that uses the Open Media Streaming Standard (OMSS) for movies and TV shows. This repository serves as the central scraping and streaming engine, designed to work seamlessly with the [CinePro ecosystem](https://github.com/orgs/cinepro-org/repositories?type=source). - -Built on the [OMSS template](https://github.com/omss-spec/template), this backend implements a modular provider system that enables easy integration of multiple streaming sources (that means providers) while maintaining type safety and production-ready standards. +[![Stars](https://img.shields.io/github/stars/cinepro-org/core?style=flat-square&color=gold)](https://github.com/cinepro-org/core/stargazers) +[![GitHub License](https://img.shields.io/badge/License-PolyForm_Noncommercial_License_1.0.0-orange?style=flat-square) +](LICENSE) ---- - -## ✨ Features - -- 🎯 **OMSS-Compliant** – Follows the Open Media Streaming Standard specification -- πŸ”Œ **Modular Providers** – Drop-in provider system with auto-discovery -- πŸ›‘οΈ **Type-Safe** – Full TypeScript implementation with strict types -- ⚑ **Production-Ready** – Redis caching, Docker support, error handling -- 🎬 **Multi-Source** – Support for movies and TV shows from multiple providers -- πŸ”„ **Hot Reload** – Development mode with automatic restarts -- πŸ“¦ **CineHome Integration** – Compatible with CineHome download automation and any other CinePro ecosystem products +**[πŸ“– Documentation](https://cinepro.mintlify.app)** Β· **[πŸ’¬ Discussions](https://github.com/orgs/cinepro-org/discussions)** Β· **[πŸ› Issues](https://github.com/cinepro-org/core/issues)** -✨Please star this repository if you find it useful! It helps us gain visibility and continue improving the project!✨ + --- -## πŸš€ Quick Start +CinePro Core is the central scraping and streaming engine of the CinePro ecosystem. It exposes an [OMSS-compliant](https://github.com/omss-spec/omss-spec) HTTP API for resolving movie and TV show stream sources from multiple providers, with Redis caching and full Docker support. **Get up to 30+ unique sources for a single movie/tv show!** -### Prerequisites +> [!CAUTION] +> CinePro Core is designed for **personal and home use only.** +> Users are responsible for ensuring compliance with applicable laws and the terms of service of streaming sources. -- Node.js 20+ -- TMDB API Key ([get one here](https://www.themoviedb.org/settings/api)) +## Quick Start -### Installation +**Prerequisites:** Node.js 20+, a [TMDB API key](https://www.themoviedb.org/settings/api) ```bash -# Clone the repository -git clone https://github.com/cinepro-org/core.git -cd core - -# Install dependencies +git clone https://github.com/cinepro-org/core.git && cd core npm install - -# Configure environment -cp .env.example .env -# Edit .env and add your TMDB_API_KEY -``` - -### Development - -```bash -# Start dev server with hot reload -npm run dev - -# Server runs at http://localhost:3000 -``` - -### Production - -> [!Caution] -> **CinePro Core is designed for personal and home use only.** ->
Users are responsible for ensuring compliance with applicable laws and terms of service for streaming sources. - -```bash -# Modify .env to match your environment (maybe redis) -cp .env.example .env - -# Build and start -npm run build -npm start +cp .env.example .env # add your TMDB_API_KEY +npm run dev # http://localhost:3000 ``` -### Docker Deployment +For Docker, production setup, and full configuration options β†’ **[Quickstart](https://cinepro.mintlify.app/quickstart)** -#### With Docker Compose (includes Redis) +## Features -```bash -# Create .env file with your TMDB_API_KEY -cp .env.example .env -# Edit .env and add your TMDB_API_KEY - -# Start services -docker-compose up -d - -# Server runs at http://localhost:3000 or whatever you set in .env -``` - -#### Standalone Docker - -```bash -# Build image -docker build -t cinepro-core:latest . - -# Run with memory cache -docker run -p 3000:3000 \ - -e TMDB_API_KEY=your_tmdb_api_key_here \ - -e CACHE_TYPE=memory \ - cinepro-core:latest -``` +- 🎯 **OMSS-Compliant** – follows the Open Media Streaming Standard +- πŸ”Œ **Modular Providers** – drop-in provider system with auto-discovery +- πŸ›‘οΈ **Type-Safe** – full TypeScript with strict mode +- ⚑ **Production-Ready** – Redis caching, Docker, error handling +- 🎬 **Multi-Source** – movies and TV shows from multiple providers +- πŸ“¦ **CineHome Integration** – works with CineHome download automation -#### Custom Configuration +## Documentation -```bash -# Custom port and Redis -docker run -p 8080:8080 \ - -e PORT=8080 \ - -e TMDB_API_KEY=your_key \ - -e CACHE_TYPE=redis \ - -e REDIS_HOST=your-redis-host \ - cinepro-core:latest -``` +Full docs, API reference, configuration guide, and provider development at **[the CinePro Docs](https://cinepro.mintlify.app)**. ---- +## Contributing -## πŸ“ Project Structure - -``` -core/ -β”œβ”€β”€ src/ -β”‚ β”œβ”€β”€ server.ts # Main server entrypoint -β”‚ β”œβ”€β”€ providers/ # Streaming source providers -β”‚ β”‚ └── example.ts # Reference implementation -β”œβ”€β”€ .env.example # Environment configuration template -β”œβ”€β”€ package.json # Dependencies and scripts -└── tsconfig.json # TypeScript configuration -``` - ---- - -## βš™οΈ Configuration - -### Environment Variables - -Create a `.env` file based on `.env.example`: - -```env -# Required -TMDB_API_KEY=your_tmdb_api_key_here - -# Server Configuration -PORT=3000 -HOST=localhost -NODE_ENV=development -PUBLIC_URL=http://localhost:3000 - -# Redis (Production) -REDIS_HOST=localhost -REDIS_PORT=6379 -REDIS_PASSWORD= -``` - -### TMDB API Key - -CinePro Core requires a TMDB API key for metadata enrichment: - -1. Create a TMDB account at [themoviedb.org](https://www.themoviedb.org/) -2. Navigate to Settings β†’ API -3. Request an API key (choose "Developer" option) -4. Add the key to your `.env` file - ---- - -## πŸ› οΈ Development - -### Scripts - -```bash -npm run dev # Development server with hot reload -npm run build # Build for production -npm start # Start production server. Requires build first -npm run format # Format code with Prettier -``` - -### Code Standards - -- TypeScript strict mode enabled -- Prettier for code formatting -- Comprehensive error handling -- Provider interface compliance - ---- - -## πŸ“š Documentation - -- **OMSS Specification**: [github.com/omss-spec/omss-spec](https://github.com/omss-spec/omss-spec) -- **Framework Docs**: [@omss/framework on npm](https://www.npmjs.com/package/@omss/framework) -- **CinePro Docs**: [cinepro.mintlify.app](https://cinepro.mintlify.app) - ---- - -## 🀝 Contributing - -CinePro is actively maintained and open to contributors. We welcome: [github](https://github.com/cinepro-org) - -- New provider implementations -- Bug fixes and improvements -- Documentation enhancements -- Performance optimizations - -### How to Contribute - -1. Fork the repository -2. Create a feature branch (`git checkout -b feature/amazing-provider`) -3. Commit your changes (`git commit -m 'Add amazing provider'`) -4. Push to the branch (`git push origin feature/amazing-provider`) -5. Open a Pull Request - -See [CONTRIBUTING.md](https://github.com/omss-spec/omss-spec/blob/main/CONTRIBUTING.md) for detailed guidelines. - ---- +PRs are welcome β€” especially new providers, bug fixes, and docs improvements. +See the Documentation and the [OMSS contributing guide](https://github.com/omss-spec/omss-spec/blob/main/CONTRIBUTING.md) for details. ## Star History @@ -227,32 +64,9 @@ See [CONTRIBUTING.md](https://github.com/omss-spec/omss-spec/blob/main/CONTRIBUT ---- - -## πŸ”’ Legal Notice - -CinePro Core is designed for **personal and home use only**. Users are responsible for ensuring compliance with applicable laws and terms of service for streaming sources. This software does not host, store, or distribute any copyrighted content. [github](https://github.com/cinepro-org) - ---- - -## πŸ“„ License - -MIT Β© CinePro Organization +## License ---- - -## 🌟 Acknowledgments - -- Built with [OMSS Framework](https://github.com/omss-spec) -- Metadata powered by [The Movie Database (TMDB)](https://www.themoviedb.org/) -- Template from [omss-spec/template](https://github.com/omss-spec/template) - ---- - -
- -**[Documentation](https://cinepro.mintlify.app)** - **[Discussions](https://github.com/orgs/cinepro-org/discussions/)** - **[Report Issue](https://github.com/cinepro-org/core/issues)** - -⭐ **Star this repo** if you find it useful! - -
+PolyForm Noncommercial License 1.0.0 Β© CinePro Organization β€” see [LICENSE](LICENSE) for details. +This software does not host, store, or distribute any copyrighted content. +ANY DMCA Complaints should be opened at the hosting provider and not directed at us. +[Read more here](https://cinepro.mintlify.app/core/general-information/license) diff --git a/package-lock.json b/package-lock.json index a1e72be..bb35d17 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1958,9 +1958,9 @@ } }, "node_modules/undici": { - "version": "7.22.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.22.0.tgz", - "integrity": "sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.2.tgz", + "integrity": "sha512-P9J1HWYV/ajFr8uCqk5QixwiRKmB1wOamgS0e+o2Z4A44Ej2+thFVRLG/eA7qprx88XXhnV5Bl8LHXTURpzB3Q==", "license": "MIT", "engines": { "node": ">=20.18.1" diff --git a/src/providers/02moviedownloader/02moviedownloader.ts b/src/providers/02moviedownloader/02moviedownloader.ts index 3b4c5cd..81b6726 100644 --- a/src/providers/02moviedownloader/02moviedownloader.ts +++ b/src/providers/02moviedownloader/02moviedownloader.ts @@ -8,11 +8,7 @@ import type { SubtitleFormat } from '@omss/framework'; import axios from 'axios'; -import { - MovieDownloaderDecryptResponse, - MovieDownloaderResponse -} from './02moviedownloader.types.js'; -import { decryptData } from './decrypt.js'; +import { MovieDownloaderResponse, Token } from './02moviedownloader.types.js'; export class MovieDownloader extends BaseProvider { readonly id = '02moviedownloader'; @@ -46,36 +42,59 @@ export class MovieDownloader extends BaseProvider { return this.getSources(media); } + async getToken(media: ProviderMediaObject): Promise { + const req = await fetch(this.BASE_URL + '/api/verify-robot', { + headers: { + accept: '*/*', + 'cache-control': 'no-cache' + }, + referrer: + this.BASE_URL + + '/api/download' + + (media.type === 'movie' + ? '/movie/' + media.tmdbId + : '/tv/' + media.tmdbId + media.s + media.e), + body: null, + method: 'POST' + }); + const resp = (await req.json()) as Token; + if (resp.success && resp.token) { + return resp.token; + } else { + throw 'no token found...'; + } + } + /** - * Main scraping logic - Parallel servers + decryption + * Main scraping logic */ - // Complete the getSources method and add decryptData private async getSources( media: ProviderMediaObject ): Promise { try { const pageUrl = this.buildPageUrl(media); - const encryptedResponse: MovieDownloaderResponse = - await this.fetchPage(pageUrl, media); - if (!encryptedResponse || !encryptedResponse.data) { - return this.emptyResult('Failed to fetch page', media); - } + const token = await this.getToken(media); - // Decrypt data - const decryptedData = await decryptData(encryptedResponse.data); + const response: MovieDownloaderResponse = await this.fetchPage( + pageUrl, + token, + media + ); // Map to ProviderResult - return this.mapToProviderResult(decryptedData, media); + return this.mapToProviderResult(response); } catch (error) { - return this.emptyResult('Failed to process sources', media); + return this.emptyResult( + error instanceof Error + ? error.message + : 'Failed to process sources', + media + ); } } - private mapToProviderResult( - data: MovieDownloaderDecryptResponse, - media: ProviderMediaObject - ): ProviderResult { + private mapToProviderResult(data: MovieDownloaderResponse): ProviderResult { const sources: Source[] = []; // Map download sources @@ -200,11 +219,15 @@ export class MovieDownloader extends BaseProvider { private async fetchPage( url: string, + token: string, media: ProviderMediaObject ): Promise { try { const response = await fetch(url, { - headers: { accept: 'application/json' } + headers: { + accept: 'application/json', + 'x-session-token': token + } }); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); diff --git a/src/providers/02moviedownloader/02moviedownloader.types.ts b/src/providers/02moviedownloader/02moviedownloader.types.ts index 8b52f0b..34c5523 100644 --- a/src/providers/02moviedownloader/02moviedownloader.types.ts +++ b/src/providers/02moviedownloader/02moviedownloader.types.ts @@ -1,10 +1,5 @@ -export interface MovieDownloaderResponse { - data: string; - encrypted: boolean; -} - // MovieDownloaderResponse.ts -export interface MovieDownloaderDecryptResponse { +export interface MovieDownloaderResponse { success: boolean; tmdbId: string; originalId: string; @@ -61,3 +56,9 @@ export interface MovieDownloaderDecryptResponse { filename?: string; }>; } + +export interface Token { + success: boolean; + token: string; + expiresIn: number; +} diff --git a/src/providers/02moviedownloader/decrypt.ts b/src/providers/02moviedownloader/decrypt.ts deleted file mode 100644 index 6296ddc..0000000 --- a/src/providers/02moviedownloader/decrypt.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { enc } from 'crypto-js'; -import { - MovieDownloaderDecryptResponse, - MovieDownloaderResponse -} from './02moviedownloader.types.js'; - -export async function decryptData( - encryptedData: MovieDownloaderResponse['data'] -): Promise { - const ENCRYPTION_KEY_HASH = - '22857ca8d826ed837bafaeafccd75afaa776befdafa495df3e2017f575e4e37a'; - - if (!encryptedData) { - throw new Error('No data to decrypt'); - } - - try { - const parts = encryptedData.split(':'); - if (parts.length !== 2) { - throw new Error('Invalid encrypted data format'); - } - - const iv = Uint8Array.from(atob(parts[0]), (c) => c.charCodeAt(0)); - const encrypted = Uint8Array.from(atob(parts[1]), (c) => - c.charCodeAt(0) - ); - - // Import the key - const keyData = new Uint8Array( - ENCRYPTION_KEY_HASH.match(/.{1,2}/g)?.map((byte) => - parseInt(byte, 16) - ) || [] - ); - - const key = await crypto.subtle.importKey( - 'raw', - keyData, - { name: 'AES-CBC' }, - false, - ['decrypt'] - ); - - // Decrypt - const decrypted = await crypto.subtle.decrypt( - { name: 'AES-CBC', iv: iv }, - key, - encrypted - ); - - // Convert to string and parse JSON - const text = new TextDecoder().decode(decrypted); - return JSON.parse(text); - } catch (error) { - console.error('Decryption error:', error); - throw new Error('Failed to decrypt data'); - } -} diff --git a/src/providers/vidzee/decrypt.ts b/src/providers/vidzee/decrypt.ts index 252d837..d8b16d5 100644 --- a/src/providers/vidzee/decrypt.ts +++ b/src/providers/vidzee/decrypt.ts @@ -1,26 +1,31 @@ import type { StreamUrl } from './vidzee.types.js'; +const KEY = 'YWxvb2tlcGFyYXRoZXdpdGhsYXNzaQ=='; + export default async function decrypt(urls: StreamUrl[]): Promise { const results: string[] = []; try { for (const streamurl of urls) { - const decoded = Buffer.from( - streamurl.link.toString(), - 'base64' - ).toString(); + // atob(e) + const decoded = Buffer.from(streamurl.link, 'base64').toString( + 'utf8' + ); const [ivBase64, cipherBase64] = decoded.split(':'); + if (!ivBase64 || !cipherBase64) continue; - if (!ivBase64 || !cipherBase64) { - continue; - } + // Base64.parse(a) + const iv = Buffer.from(ivBase64, 'base64'); - const iv = await base64ToArrayBuffer(ivBase64); - const keyBytes = await base64ToArrayBuffer( - 'aWZ5b3VzY3JhcGV5b3VhcmVnYXkAAAAAAAAAAAAAAAA=' - ); - const ciphertext = await base64ToArrayBuffer(cipherBase64); + // ciphertext + const ciphertext = Buffer.from(cipherBase64, 'base64'); + + // key.padEnd(32, "\0") + const paddedKey = Buffer.from(KEY, 'base64') + .toString() + .padEnd(32, '\0'); + const keyBytes = new TextEncoder().encode(paddedKey); const cryptoKey = await crypto.subtle.importKey( 'raw', @@ -30,20 +35,18 @@ export default async function decrypt(urls: StreamUrl[]): Promise { ['decrypt'] ); - const plaintextBuffer = await crypto.subtle.decrypt( + const decryptedBuffer = await crypto.subtle.decrypt( { name: 'AES-CBC', - iv: iv as ArrayBuffer // Explicit cast + iv }, cryptoKey, ciphertext ); - const decrypted = new TextDecoder().decode(plaintextBuffer); + const decrypted = new TextDecoder().decode(decryptedBuffer).trim(); - if (decrypted && decrypted.trim()) { - results.push(decrypted.trim()); - } + if (decrypted) results.push(decrypted); } return results; @@ -51,17 +54,3 @@ export default async function decrypt(urls: StreamUrl[]): Promise { throw new Error('Vidzee Decrypt failed: ' + (error as Error).message); } } - -/** - * Convert base64 to ArrayBuffer (Web Crypto compatible) - */ -async function base64ToArrayBuffer(b64: string): Promise { - const binaryString = atob(b64); - const bytes = new Uint8Array(binaryString.length); - - for (let i = 0; i < binaryString.length; i++) { - bytes[i] = binaryString.charCodeAt(i); - } - - return bytes.buffer; -} diff --git a/src/streamPatterns.ts b/src/streamPatterns.ts index 9d16fb1..e097918 100644 --- a/src/streamPatterns.ts +++ b/src/streamPatterns.ts @@ -3,5 +3,6 @@ export const streamPatterns: RegExp[] = [ /pixeldrain|pixeldra\.in/, - /hub.raj.lat/ + /hub.raj.lat/, + /hub.oreao-cdn.buzz/ ]; diff --git a/src/thirdPartyProxies.ts b/src/thirdPartyProxies.ts index 75c0a5b..590d218 100644 --- a/src/thirdPartyProxies.ts +++ b/src/thirdPartyProxies.ts @@ -60,6 +60,7 @@ export const knownThirdPartyProxies: Record = { // These are checked AFTER origin-specific patterns '*': [ + /^https:\/\/[^/]+\.workers\.dev\/((?:https?:\/\/|https?%3A%2F%2F).+)$/, // another workers.dev/https[url encoded] capturer /^https:\/\/[^/]+\.workers\.dev\/((?:https?:\/\/)?[^/]+\/file2\/.+)$/, // any workers.dev/[domain]/file2/[content] capturer /^https:\/\/.+?\.workers\.dev\/((?:https?:\/\/).+)$/, // any [subdomain].workers.dev/[https://..... link] capturer /\/proxy\/(.+)$/, // Generic /proxy/encoded