Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 16 additions & 16 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -237,40 +237,40 @@ jobs:

case "$message" in
feat:*|feat\(*|feature:*)
FEATURES="${FEATURES}- feat: ${LINK}\n"
FEATURES="${FEATURES}- feat: ${LINK}"
;;
fix:*|fix\(*)
FIXES="${FIXES}- fix: ${LINK}\n"
FIXES="${FIXES}- fix: ${LINK}"
;;
docs:*|docs\(*)
DOCS="${DOCS}- docs: ${LINK}\n"
DOCS="${DOCS}- docs: ${LINK}"
;;
chore:*|chore\(*|ci:*|ci\(*|build:*|build\(*)
CHORES="${CHORES}- chore: ${LINK}\n"
CHORES="${CHORES}- chore: ${LINK}"
;;
*BREAKING*|*breaking*|*!:*)
BREAKING="${BREAKING}- breaking change: [${message}](${REPO_URL}/commit/${short_hash})\n"
BREAKING="${BREAKING}- breaking change: [${message}](${REPO_URL}/commit/${short_hash})"
;;
*)
OTHERS="${OTHERS}- ${LINK}\n"
OTHERS="${OTHERS}- ${LINK}"
;;
esac
done <<< "$HASHES"

NOTES="## Release $CURRENT_TAG\n\n"
NOTES="## Release $CURRENT_TAG"
if [ -n "$PREV_TAG" ]; then
NOTES="${NOTES}Changes since \`${PREV_TAG}\`:\n\n"
NOTES="${NOTES}Changes since \`${PREV_TAG}\`:"
fi
NOTES="${NOTES}Release commit: [\`${{ github.event.workflow_run.head_sha || github.sha }}\`](${REPO_URL}/commit/${{ github.event.workflow_run.head_sha || github.sha }}).\n\n"
NOTES="${NOTES}Release commit: [\`${{ github.event.workflow_run.head_sha || github.sha }}\`](${REPO_URL}/commit/${{ github.event.workflow_run.head_sha || github.sha }})."

[ -n "$BREAKING" ] && NOTES="${NOTES}### ⚠️ Breaking Changes\n$(printf %s "$BREAKING")\n"
[ -n "$FEATURES" ] && NOTES="${NOTES}### ✨ Features\n$(printf %s "$FEATURES")\n"
[ -n "$FIXES" ] && NOTES="${NOTES}### 🐛 Bug Fixes\n$(printf %s "$FIXES")\n"
[ -n "$DOCS" ] && NOTES="${NOTES}### 📚 Documentation\n$(printf %s "$DOCS")\n"
[ -n "$CHORES" ] && NOTES="${NOTES}### 🔧 Maintenance\n$(printf %s "$CHORES")\n"
[ -n "$OTHERS" ] && NOTES="${NOTES}### 📦 Other Changes\n$(printf %s "$OTHERS")\n"
[ -n "$BREAKING" ] && NOTES="${NOTES}### ⚠️ Breaking Changes$(printf %s "$BREAKING")"
[ -n "$FEATURES" ] && NOTES="${NOTES}### ✨ Features$(printf %s "$FEATURES")"
[ -n "$FIXES" ] && NOTES="${NOTES}### 🐛 Bug Fixes$(printf %s "$FIXES")"
[ -n "$DOCS" ] && NOTES="${NOTES}### 📚 Documentation$(printf %s "$DOCS")"
[ -n "$CHORES" ] && NOTES="${NOTES}### 🔧 Maintenance$(printf %s "$CHORES")"
[ -n "$OTHERS" ] && NOTES="${NOTES}### 📦 Other Changes$(printf %s "$OTHERS")"

NOTES="${NOTES}## Quick start\n\nStart the latest version:\n\n\`\`\`bash\ndocker run --name cinepro-core-${{ needs.prepare.outputs.app_version }} -p 3000:3000 -e TMDB_API_KEY=your-tmdb-key ${{ env.REGISTRY }}/${{ env.IMAGE_NAME_LC }}:latest\n\`\`\`\n\n## For more details, check the [CinePro documentation](https://docs.cinepro.cc) and the [Version History](https://docs.cinepro.cc/core/versions)."
NOTES="${NOTES}## Quick startStart the latest version:\`\`\`bashdocker run --name cinepro-core-${{ needs.prepare.outputs.app_version }} -p 3000:3000 -e TMDB_API_KEY=your-tmdb-key ${{ env.REGISTRY }}/${{ env.IMAGE_NAME_LC }}:latest\`\`\`## For more details, check the [CinePro documentation](https://docs.cinepro.cc) and the [Version History](https://docs.cinepro.cc/core/versions)."

{
echo "notes<<EOF"
Expand Down
104 changes: 71 additions & 33 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,71 +1,102 @@
<a id="readme-top"></a>

<div align="center">

[![Contributors](https://img.shields.io/github/contributors/cinepro-org/core?style=for-the-badge&color=green)](#top-contributors)
[![Forks](https://img.shields.io/github/forks/cinepro-org/core?style=for-the-badge&color=blue)](https://github.com/cinepro-org/core/forks)
[![Stars](https://img.shields.io/github/stars/cinepro-org/core?style=for-the-badge&color=gold)](https://github.com/cinepro-org/core/stargazers)
[![GitHub License](https://img.shields.io/badge/license-PolyForm-orange?style=for-the-badge)
](LICENSE)

# CinePro Core 🎬

<img src="https://repository-images.githubusercontent.com/1138947882/af901757-a06b-442d-8976-c485fcafc230"></img>
### _Support CinePro’s development by starring this repository!_ ⭐

### _Support CinePro's Development by starring this repo!_ ⭐
<img src="https://repository-images.githubusercontent.com/1138947882/af901757-a06b-442d-8976-c485fcafc230"></img>

**OMSS-compliant streaming backend powering the CinePro ecosystem.**
#### 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.

[![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)

**[📖 Documentation](https://docs.cinepro.cc)** · **[💬 Discussions](https://github.com/orgs/cinepro-org/discussions)** · **[🐛 Issues](https://github.com/cinepro-org/core/issues)**

</div>

---

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. Now even with MCP support for your AI agents! (The first streaming server worldwide to offer this feature). **Get up to 50+ unique sources for a single movie/tv show!**
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.

<details><summary>Proof!</summary>
<p>
With failing providers still got 88 sources. If the other providers worked (which they would I not be connected to a VPN) we would have gotten more then 50 sources! Please note that this number changes very often as providers change their sites and try to block scrapers. CinePro Core is designed to be resilient to these changes with its modular provider system and regular updates, but the exact number of sources can vary over time.
It now also includes MCP support for AI agents — making it the first streaming server worldwide to offer this feature.

![proof](docs/images/img.png)

</p>
</details>
**Get access to 50+ unique sources for a single movie or TV show!**

> [!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.
> While we do not prevent public hosting, it is insecure by default.*
>
> Users are responsible for ensuring compliance with applicable laws and the terms of service of streaming providers.

<details><summary>*:</summary>

CinePro Core is a scraper. This means it automatically navigates through third-party streaming websites to retrieve direct streaming links while bypassing ads and scam redirects.

Because this process consumes computing resources, publicly exposed instances may be vulnerable to abuse or (D)DOS attacks, which can significantly increase hosting costs.

We strongly recommend running CinePro Core locally. More end-user documentation and setup guides will be released soon.

</details>

## Quick Start

**Prerequisites:** Node.js 20+, a [TMDB API key](https://www.themoviedb.org/settings/api)
**Prerequisites:** Node.js 20+ and a [TMDB API key](https://www.themoviedb.org/settings/api)

```bash
git clone https://github.com/cinepro-org/core.git && cd core
npm install
cp .env.example .env # add your TMDB_API_KEY
cp .env.example .env # add your TMDB_API_KEY and configure additional options if needed
npm run dev # http://localhost:3000
```
````

For Docker, production setup, and full configuration options → **[Quickstart](https://docs.cinepro.cc/quickstart)**
For Docker, production deployment, and advanced configuration options → **[Quickstart](https://docs.cinepro.cc/quickstart)**

<p align="right">(<a href="#readme-top">back to top</a>)</p>

## Features

- 🎯 **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
* 🎯 **OMSS-Compliant** – follows the Open Media Streaming Standard
* 🔌 **Modular Providers** – drop-in provider system with auto-discovery
* 🛡️ **Type-Safe** – built with strict TypeScript
* ⚡ **Production-Ready** – Redis caching, Docker support, and robust error handling
* 🎬 **Multi-Source Streaming** – resolves movies and TV shows from multiple providers
* 📺 **Stremio Compatibility** – enable a Stremio addon using the `STREMIO_ADDON` environment variable at `/stremio/manifest.json`
* 📦 **CineHome Integration** *(planned for late 2026)* – compatible with CineHome download automation

<p align="right">(<a href="#readme-top">back to top</a>)</p>

## Documentation

Full docs, API reference, configuration guide, and provider development at **[the CinePro Docs](https://docs.cinepro.cc)**.
Full documentation, API references, configuration guides, and provider development resources are available at **[CinePro Docs](https://docs.cinepro.cc)**.

<p align="right">(<a href="#readme-top">back to top</a>)</p>

## Contributing

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.
Pull requests are welcome — especially for new providers, bug fixes, and documentation improvements.

See the [Documentation](https://docs.cinepro.cc/core/general-information/development) and the [Contributing Guidelines](https://github.com/cinepro-org/core?tab=contributing-ov-file#contributing-to-cinepro-core) for more information.

### Top Contributors

<a href="https://github.com/cinepro-org/core/graphs/contributors">
<img src="https://contrib.rocks/image?repo=cinepro-org/core" alt="contrib.rocks image" />
</a>

*Join the project by contributing!*

## Star History
<p align="right">(<a href="#readme-top">back to top</a>)</p>

## Graphs

![Repobeats analytics image](https://repobeats.axiom.co/api/embed/94fe2818e3f3254c91180779917073d3dbb1ace1.svg "Repobeats analytics image")

<a href="https://www.star-history.com/#cinepro-org/core&type=date&legend=top-left">
<picture>
Expand All @@ -75,9 +106,16 @@ See the Documentation and the [OMSS contributing guide](https://github.com/omss-
</picture>
</a>

<p align="right">(<a href="#readme-top">back to top</a>)</p>

## License

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.
PolyForm Noncommercial License 1.0.0 © CinePro Organization — see [LICENSE](LICENSE) for details.

This software does not host, store, or distribute copyrighted content.

Any DMCA complaints should be directed to the hosting provider, not to us.

[Read more here](https://docs.cinepro.cc/core/general-information/license)

<p align="right">(<a href="#readme-top">back to top</a>)</p>
26 changes: 16 additions & 10 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

30 changes: 30 additions & 0 deletions src/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,36 @@ async function main() {
await registry.discoverProviders(path.join(__dirname, './providers/'));

await server.start();

const publicUrl =
process.env.PUBLIC_URL ??
`http://${process.env.HOST ?? 'localhost'}:${process.env.PORT ?? 3000}`;

const uiUrl = `https://ui.cinepro.cc/?omssurl=${encodeURIComponent(publicUrl)}`;

const title = '🚀 CinePro/ui is in public testing';
const contrib =
'🤝 We are looking for contributors to improve and develop!';
const repo = 'Contribute: https://github.com/cinepro-org/ui';
const tryIt = `🌐 Try it out: ${uiUrl}!`;

const lines = [title, '', repo, '', contrib, '', tryIt];

// compute box width based on longest line
const width = Math.max(...lines.map((l) => l.length)) + 2;

const borderTop = '╭' + '─'.repeat(width) + '╮';
const borderBottom = '╰' + '─'.repeat(width) + '╯';

const pad = (line: string) => '│ ' + line.padEnd(width - 2, ' ') + ' │';

console.log(`
================== CINEPRO BETA ANNOUNCEMENT ==================

${borderTop}
${lines.map(pad).join('\n')}
${borderBottom}
`);
}

main().catch(() => {
Expand Down
Loading