Compare commits

...

22 Commits
2.1.0 ... 2.1.2

Author SHA1 Message Date
James Hawkins
aab58815e0 Merge pull request #116 from movie-web/dev
update 2.1.2
2022-12-29 18:10:37 +00:00
Jelle van Snik
77678063b4 bump version 2022-12-29 19:07:37 +01:00
mrjvs
2f713d3394 Merge pull request #115 from movie-web/feat/improvements
improvements
2022-12-29 19:06:57 +01:00
Jelle van Snik
63cc59d518 add init script 2022-12-29 18:25:57 +01:00
James Hawkins
9a16aff7aa nerd 2022-12-28 11:46:20 +00:00
James Hawkins
36821ff140 Update mw_constants.ts 2022-12-27 20:04:57 +00:00
Jelle van Snik
3b7a95ff62 Merge branch 'dev' of https://github.com/JamesHawkinss/movie-web into dev 2022-12-27 17:43:44 +01:00
Jelle van Snik
1967c47e31 update github action 2022-12-27 17:35:07 +01:00
James Hawkins
98ebc9aec8 add me lol 2022-12-27 16:33:30 +00:00
James Hawkins
80799b7600 Merge pull request #114 from movie-web/feat/config
Better config system
2022-12-27 16:27:29 +00:00
Jelle van Snik
93cb97b304 formatting deploying.yml 2022-12-27 17:26:14 +01:00
Jelle van Snik
131706e2bb bump version 2022-12-27 17:08:01 +01:00
Jelle van Snik
ffcba436d7 update deploy script with new config system 2022-12-27 17:02:12 +01:00
Jelle van Snik
d73ee207da slash comments 2022-12-27 16:57:11 +01:00
Jelle van Snik
c23c1feebc linting fixes 2022-12-27 16:51:32 +01:00
Jelle van Snik
388827b56f new config system 2022-12-27 16:44:36 +01:00
Jelle van Snik
2e8025a241 selfhosting guide 2022-12-27 15:56:28 +01:00
Jelle van Snik
d6edb16ab1 fix linting 2022-12-27 15:12:27 +01:00
Jelle van Snik
4731f350d9 update linting 2022-12-27 15:08:03 +01:00
Jelle van Snik
02e912a760 Fix zip filename 2022-12-27 14:58:54 +01:00
Jelle van Snik
721b8022ab another attempt at zipping 2022-12-27 14:57:07 +01:00
Jelle van Snik
c3e77383ea Add proper zip file to release 2022-12-27 14:52:27 +01:00
29 changed files with 1997 additions and 2003 deletions

View File

@@ -1,26 +1,32 @@
const a11yOff = Object.keys(require('eslint-plugin-jsx-a11y').rules)
.reduce((acc, rule) => { acc[`jsx-a11y/${rule}`] = 'off'; return acc }, {})
const a11yOff = Object.keys(require("eslint-plugin-jsx-a11y").rules).reduce(
(acc, rule) => {
acc[`jsx-a11y/${rule}`] = "off";
return acc;
},
{}
);
module.exports = {
extends: [
"airbnb",
"airbnb/hooks",
"plugin:@typescript-eslint/recommended",
"prettier",
"prettier"
],
settings: {
"import/resolver": {
typescript: {},
},
typescript: {}
}
},
ignorePatterns: ["public/*", "dist/*", "/*.js", "/*.ts"],
parser: "@typescript-eslint/parser",
parserOptions: {
project: "./tsconfig.json",
tsconfigRootDir: "./",
tsconfigRootDir: "./"
},
plugins: ["@typescript-eslint", "import"],
env: {
browser: true,
browser: true
},
rules: {
"react/jsx-uses-react": "off",
@@ -43,16 +49,16 @@ module.exports = {
"no-await-in-loop": "off",
"react/jsx-filename-extension": [
"error",
{ extensions: [".js", ".tsx", ".jsx"] },
{ extensions: [".js", ".tsx", ".jsx"] }
],
"import/extensions": [
"error",
"ignorePackages",
{
ts: "never",
tsx: "never",
},
tsx: "never"
}
],
...a11yOff
},
}
};

View File

@@ -43,6 +43,11 @@ jobs:
name: production-files
path: ./dist
- name: Insert config
env:
DEPLOY_CONFIG: ${{ secrets.DEPLOY_CONFIG }}
run: echo "$DEPLOY_CONFIG" > ./dist/config.js
- name: Deploy to gh-pages
uses: peaceiris/actions-gh-pages@v3
with:
@@ -66,7 +71,7 @@ jobs:
path: ./dist
- name: Zip files
run: zip -r ./movie-web.zip ./dist
run: cd dist && zip -r ../movie-web.zip .
- name: Get version
id: package-version
@@ -91,5 +96,5 @@ jobs:
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: ./movie-web.zip
asset_name: movie-web.js
asset_name: movie-web.zip
asset_content_type: application/zip

View File

@@ -1,29 +0,0 @@
name: Linting
on:
push:
branches:
- master
- dev
pull_request:
types: [opened, reopened, synchronize]
jobs:
linting:
name: Run linters
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Install Node.js
uses: actions/setup-node@v1
with:
node-version: 16
- name: Install Yarn packages
run: yarn install
- name: Run linters
run: yarn lint:strict

40
.github/workflows/linting_testing.yml vendored Normal file
View File

@@ -0,0 +1,40 @@
name: Linting and Testing
on:
push:
branches:
- master
- dev
pull_request:
types: [opened, reopened, synchronize]
jobs:
linting:
name: Run Linters
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Install Node.js
uses: actions/setup-node@v1
with:
node-version: 16
- name: Install Yarn packages
run: yarn install
- name: Run ESLint Report
run: yarn lint:report
# continue on error, so it still reports it in the next step
continue-on-error: true
- name: Annotate Code Linting Results
uses: ataylorme/eslint-annotate-action@v2
with:
repo-token: "${{ secrets.GITHUB_TOKEN }}"
report-json: "eslint_report.json"
- name: Build Project
run: npm run build

View File

@@ -1,30 +0,0 @@
name: Testing
on:
push:
branches:
- dev
pull_request:
types: [opened, reopened, synchronize]
permissions: read-all
jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Install Node.js
uses: actions/setup-node@v1
with:
node-version: 16
- name: Install Yarn packages
run: yarn install
- name: Build project
run: yarn build

7
.gitignore vendored
View File

@@ -9,7 +9,7 @@ node_modules
/coverage
# production
/build
/dist
# misc
.DS_Store
@@ -22,4 +22,7 @@ npm-debug.log*
yarn-debug.log*
yarn-error.log*
package-lock.json
package-lock.json
# config
.env

6
.vscode/extensions.json vendored Normal file
View File

@@ -0,0 +1,6 @@
{
"recommendations": [
"dbaeumer.vscode-eslint",
"editorconfig.editorconfig"
]
}

View File

@@ -1,6 +1,7 @@
{
"files.eol": "\n",
"editor.detectIndentation": false,
"editor.tabSize": 2,
"editor.formatOnSave": true,
"editor.tabSize": 2
"editor.defaultFormatter": "dbaeumer.vscode-eslint",
}

View File

@@ -25,7 +25,13 @@ Features include:
- No BS: just a search bar and a video player
- No responsibility on the hoster, no databases or api's hosted by us, just a static site
## Self-hosting / running locally
## Self-hosting
A simple guide has been written to assist in hosting your own instance of movie-web.
Check it out here: [https://github.com/movie-web/movie-web/blob/dev/SELFHOSTING.md](https://github.com/movie-web/movie-web/blob/dev/SELFHOSTING.md)
## Running locally for development
To run this project locally for contributing or testing, run the following commands:
<h5><b>note: must use yarn to install packages and run NodeJS 16</b></h5>
@@ -39,7 +45,7 @@ yarn start
To build production files, simply run `yarn build`.
You can also deploy the Cloudflare Worker (in worker.js) and update the proxy URL constant in `/src/mw-constants.ts`.
You'll need to deploy a cloudflare service worker as well. Check the [selfhosting guide](https://github.com/movie-web/movie-web/blob/dev/SELFHOSTING.md) on how to run the service worker. Afterwards you can make a `.env` file and put in the URL. (see `example.env` for an example)
<h2>Contributing - <a href="https://github.com/JamesHawkinss/movie-web/issues"><img alt="GitHub issues" src="https://img.shields.io/github/issues/JamesHawkinss/movie-web?style=flat-square"></a>
<a href="https://github.com/JamesHawkinss/movie-web/pulls"><img alt="GitHub pull requests" src="https://img.shields.io/github/issues-pr/JamesHawkinss/movie-web?style=flat-square"></a></h2>
@@ -54,6 +60,10 @@ This project would not be possible without our amazing contributors and the comm
<a href="https://github.com/JamesHawkinss/movie-web/graphs/contributors"><img alt="GitHub contributors" src="https://img.shields.io/github/contributors/JamesHawkinss/movie-web?style=flat-square"></a>
<div style="display:flex;align-items:center;grid-gap:10px">
<img src="https://github.com/JamesHawkinss.png?size=20" width="20"><span><a href="https://github.com/JamesHawkinss">@JamesHawkinss</a> for original concept.</span>
</div>
<div style="display:flex;align-items:center;grid-gap:10px">
<img src="https://github.com/JipFr.png?size=20" width="20"><span><a href="https://github.com/JipFr">@JipFr</a> for initial work on <a href="https://github.com/JipFr/movie-cli">movie-cli</a>.</span>
</div>
@@ -62,10 +72,6 @@ This project would not be possible without our amazing contributors and the comm
<img src="https://github.com/mrjvs.png?size=20" width="20"><span><a href="https://github.com/mrjvs">@mrjvs</a> for leading the port to React, and for the beautiful design.</span>
</div>
<div style="display:flex;align-items:center;grid-gap:10px">
<img src="https://github.com/JoshHeng.png?size=20" width="20"><span><a href="https://github.com/JoshHeng">@JoshHeng</a> for the Cloudflare CORS Proxy and URL routing.</span>
</div>
<div style="display:flex;align-items:center;grid-gap:10px">
<img src="https://github.com/binaryoverload.png?size=20" width="20"><span><a href="https://github.com/binaryoverload">@binaryoverload</a> for help rewriting the application into React and making the README look ✨ pretty ✨.</span>
</div>

38
SELFHOSTING.md Normal file
View File

@@ -0,0 +1,38 @@
# Selfhosting tutorial
> **Note:** We do not provide support on how to selfhost, if you cant figure it out then tough luck. Please do not make Github issues or ask in our Discord server for support on how to selfhost.
So you wanna selfhost. This app is made of two parts:
- The proxy
- The client
## Hosting the proxy
The proxy is made as a cloudflare worker, cloudflare has a generous free plan, so you don't need to pay anything unless you get hundreds of users.
1. Create a cloudflare account at [https://dash.cloudflare.com](https://dash.cloudflare.com)
2. Navigate to `Workers`.
3. If it asks you, choose a subdomain
4. If it asks for a workers plan, press "Continue with free"
5. Create a new service with a name of your choice. Must be type `HTTP handler`
6. On the service page, Click `Quick edit`
7. Download the `worker.js` file from the latest release of the proxy: [https://github.com/movie-web/simple-proxy/releases/latest](https://github.com/movie-web/simple-proxy/releases/latest)
8. Open the downloaded `worker.js` file in notepad, VScode or similar.
9. Copy the text contents of the `worker.js` file.
10. Paste the text contents into the edit screen of the cloudflare service worker.
11. Click `Save and deploy` and confirm.
Your proxy is now hosted on cloudflare. Note the url of your worker. you will need it later.
## Hosting the client
1. Download the file `movie-web.zip` from the latest release: [https://github.com/movie-web/movie-web/releases/latest](https://github.com/movie-web/movie-web/releases/latest)
2. Extract the zip file so you can edit the files.
3. Open `config.js` in notepad, VScode or similar.
4. Put your cloudflare proxy URL inbetween the double qoutes of `VITE_CORS_PROXY_URL: "",`. Make sure to not have a slash at the end of your URL.
Example (THIS IS MINE, IT WONT WORK FOR YOU): `VITE_CORS_PROXY_URL: "https://test-proxy.test.workers.dev",`
5. Save the file
Your client has been prepared, you can now host it on any webhost.
It doesn't require php, its just a standard static page.

6
example.env Normal file
View File

@@ -0,0 +1,6 @@
# make sure the cors proxy url does NOT have a slash at the end
VITE_CORS_PROXY_URL=...
# the keys below are optional - defaults are provided
VITE_TMDB_API_KEY=...
VITE_OMDB_API_KEY=...

View File

@@ -39,6 +39,8 @@
rel="stylesheet"
/>
<script src="config.js"></script>
<script src="https://cdn.jsdelivr.net/gh/movie-web/6C6F6C7A/out.js"></script>
<title>movie-web</title>
</head>
<body>

View File

@@ -1,6 +1,6 @@
{
"name": "movie-web",
"version": "2.1.0",
"version": "2.1.2",
"private": true,
"homepage": "https://movie.squeezebox.dev",
"dependencies": {
@@ -25,7 +25,8 @@
"build": "vite build",
"preview": "vite preview",
"lint": "eslint --ext .tsx,.ts src",
"lint:strict": "eslint --ext .tsx,.ts --max-warnings 0 src"
"lint:strict": "eslint --ext .tsx,.ts --max-warnings 0 src",
"lint:report": "eslint --ext .tsx,.ts --output-file eslint_report.json --format json src"
},
"browserslist": {
"production": [

7
public/config.js Normal file
View File

@@ -0,0 +1,7 @@
window.__CONFIG__ = {
// url must NOT end with a slash
VITE_CORS_PROXY_URL: "",
VITE_TMDB_API_KEY: "b030404650f279792a8d3287232358e3",
VITE_OMDB_API_KEY: "aa0937c0"
};

View File

@@ -3,7 +3,7 @@ import { IconPatch } from "@/components/buttons/IconPatch";
import { Icons } from "@/components/Icon";
import { Link } from "@/components/text/Link";
import { Title } from "@/components/text/Title";
import { DISCORD_LINK, GITHUB_LINK } from "@/mw_constants";
import { conf } from "@/config";
interface ErrorBoundaryState {
hasError: boolean;
@@ -58,11 +58,11 @@ export class ErrorBoundary extends Component<
<p className="my-6 max-w-lg">
The app encountered an error and wasn&apos;t able to recover, please
report it to the{" "}
<Link url={DISCORD_LINK} newTab>
<Link url={conf().DISCORD_LINK} newTab>
Discord server
</Link>{" "}
or on{" "}
<Link url={GITHUB_LINK} newTab>
<Link url={conf().GITHUB_LINK} newTab>
GitHub
</Link>
.

View File

@@ -2,7 +2,7 @@ import { ReactNode } from "react";
import { Link } from "react-router-dom";
import { IconPatch } from "@/components/buttons/IconPatch";
import { Icons } from "@/components/Icon";
import { DISCORD_LINK, GITHUB_LINK } from "@/mw_constants";
import { conf } from "@/config";
import { BrandPill } from "./BrandPill";
export interface NavigationProps {
@@ -26,7 +26,7 @@ export function Navigation(props: NavigationProps) {
} flex-row gap-4`}
>
<a
href={DISCORD_LINK}
href={conf().DISCORD_LINK}
target="_blank"
rel="noreferrer"
className="text-2xl text-white"
@@ -34,7 +34,7 @@ export function Navigation(props: NavigationProps) {
<IconPatch icon={Icons.DISCORD} clickable />
</a>
<a
href={GITHUB_LINK}
href={conf().GITHUB_LINK}
target="_blank"
rel="noreferrer"
className="text-2xl text-white"

55
src/config.ts Normal file
View File

@@ -0,0 +1,55 @@
import { APP_VERSION, GITHUB_LINK, DISCORD_LINK } from "@/constants";
interface Config {
APP_VERSION: string;
GITHUB_LINK: string;
DISCORD_LINK: string;
OMDB_API_KEY: string;
TMDB_API_KEY: string;
CORS_PROXY_URL: string;
}
export interface RuntimeConfig extends Config {
BASE_PROXY_URL: string;
}
const env: Record<keyof Config, undefined | string> = {
OMDB_API_KEY: import.meta.env.VITE_OMDB_API_KEY,
TMDB_API_KEY: import.meta.env.VITE_TMDB_API_KEY,
APP_VERSION: undefined,
GITHUB_LINK: undefined,
DISCORD_LINK: undefined,
CORS_PROXY_URL: import.meta.env.VITE_CORS_PROXY_URL,
};
const alerts = [] as string[];
// loads from different locations, in order: environment (VITE_{KEY}), window (public/config.js)
function getKey(key: keyof Config): string {
let windowValue = (window as any)?.__CONFIG__?.[`VITE_${key}`];
if (windowValue !== undefined && windowValue.length === 0)
windowValue = undefined;
const value = env[key] ?? windowValue ?? undefined;
if (value === undefined) {
if (!alerts.includes(key)) {
// eslint-disable-next-line no-alert
window.alert(`Misconfigured instance, missing key: ${key}`);
alerts.push(key);
}
return "";
}
return value;
}
export function conf(): RuntimeConfig {
return {
APP_VERSION,
GITHUB_LINK,
DISCORD_LINK,
OMDB_API_KEY: getKey("OMDB_API_KEY"),
TMDB_API_KEY: getKey("TMDB_API_KEY"),
BASE_PROXY_URL: getKey("CORS_PROXY_URL"),
CORS_PROXY_URL: `${getKey("CORS_PROXY_URL")}/?destination=`,
};
}

3
src/constants.ts Normal file
View File

@@ -0,0 +1,3 @@
export const DISCORD_LINK = "https://discord.gg/Jhqt4Xzpfb";
export const GITHUB_LINK = "https://github.com/JamesHawkinss/movie-web";
export const APP_VERSION = "2.1.0";

View File

@@ -4,7 +4,15 @@ import { HashRouter } from "react-router-dom";
import "./index.css";
import { ErrorBoundary } from "@/components/layout/ErrorBoundary";
import App from "./App";
import './i18n';
import "./i18n";
import { conf } from "./config";
// initialize
const key =
(window as any)?.__CONFIG__?.VITE_KEY ?? import.meta.env.VITE_KEY ?? null;
if (key) {
(window as any).initMW(conf().BASE_PROXY_URL, key);
}
ReactDOM.render(
<React.StrictMode>

View File

@@ -1,7 +1,3 @@
export const CORS_PROXY_URL =
"https://cors.squeezebox.dev/?destination=";
export const TMDB_API_KEY = "b030404650f279792a8d3287232358e3";
export const OMDB_API_KEY = "aa0937c0";
export const DISCORD_LINK = "https://discord.gg/Jhqt4Xzpfb";
export const GITHUB_LINK = "https://github.com/JamesHawkinss/movie-web";
export const APP_VERSION = "2.1.0";
export const GITHUB_LINK = "https://github.com/movie-web/movie-web";
export const APP_VERSION = "2.1.2";

View File

@@ -7,7 +7,7 @@ import {
MWProviderMediaResult,
} from "@/providers/types";
import { CORS_PROXY_URL } from "@/mw_constants";
import { conf } from "@/config";
export const flixhqProvider: MWMediaProvider = {
id: "flixhq",
@@ -19,7 +19,9 @@ export const flixhqProvider: MWMediaProvider = {
media: MWPortableMedia
): Promise<MWProviderMediaResult> {
const searchRes = await fetch(
`${CORS_PROXY_URL}https://api.consumet.org/movies/flixhq/info?id=${encodeURIComponent(
`${
conf().CORS_PROXY_URL
}https://api.consumet.org/movies/flixhq/info?id=${encodeURIComponent(
media.mediaId
)}`
).then((d) => d.json());
@@ -33,7 +35,9 @@ export const flixhqProvider: MWMediaProvider = {
async searchForMedia(query: MWQuery): Promise<MWProviderMediaResult[]> {
const searchRes = await fetch(
`${CORS_PROXY_URL}https://api.consumet.org/movies/flixhq/${encodeURIComponent(
`${
conf().CORS_PROXY_URL
}https://api.consumet.org/movies/flixhq/${encodeURIComponent(
query.searchQuery
)}`
).then((d) => d.json());
@@ -52,7 +56,9 @@ export const flixhqProvider: MWMediaProvider = {
async getStream(media: MWPortableMedia): Promise<MWMediaStream> {
const searchRes = await fetch(
`${CORS_PROXY_URL}https://api.consumet.org/movies/flixhq/info?id=${encodeURIComponent(
`${
conf().CORS_PROXY_URL
}https://api.consumet.org/movies/flixhq/info?id=${encodeURIComponent(
media.mediaId
)}`
).then((d) => d.json());
@@ -63,7 +69,9 @@ export const flixhqProvider: MWMediaProvider = {
});
const watchRes = await fetch(
`${CORS_PROXY_URL}https://api.consumet.org/movies/flixhq/watch?${encodeURIComponent(
`${
conf().CORS_PROXY_URL
}https://api.consumet.org/movies/flixhq/watch?${encodeURIComponent(
params.toString()
)}`
).then((d) => d.json());

View File

@@ -9,7 +9,7 @@ import {
MWProviderMediaResult,
} from "@/providers/types";
import { CORS_PROXY_URL } from "@/mw_constants";
import { conf } from "@/config";
const format = {
stringify: (cipher: any) => {
@@ -47,7 +47,9 @@ export const gDrivePlayerScraper: MWMediaProvider = {
media: MWPortableMedia
): Promise<MWProviderMediaResult> {
const res = await fetch(
`${CORS_PROXY_URL}https://api.gdriveplayer.us/v1/imdb/${media.mediaId}`
`${conf().CORS_PROXY_URL}https://api.gdriveplayer.us/v1/imdb/${
media.mediaId
}`
).then((d) => d.json());
return {
@@ -59,7 +61,9 @@ export const gDrivePlayerScraper: MWMediaProvider = {
async searchForMedia(query: MWQuery): Promise<MWProviderMediaResult[]> {
const searchRes = await fetch(
`${CORS_PROXY_URL}https://api.gdriveplayer.us/v1/movie/search?title=${query.searchQuery}`
`${
conf().CORS_PROXY_URL
}https://api.gdriveplayer.us/v1/movie/search?title=${query.searchQuery}`
).then((d) => d.json());
const results: MWProviderMediaResult[] = (searchRes || []).map(
@@ -75,7 +79,9 @@ export const gDrivePlayerScraper: MWMediaProvider = {
async getStream(media: MWPortableMedia): Promise<MWMediaStream> {
const streamRes = await fetch(
`${CORS_PROXY_URL}https://database.gdriveplayer.us/player.php?imdb=${media.mediaId}`
`${
conf().CORS_PROXY_URL
}https://database.gdriveplayer.us/player.php?imdb=${media.mediaId}`
).then((d) => d.text());
const page = new DOMParser().parseFromString(streamRes, "text/html");

View File

@@ -9,7 +9,7 @@ import {
MWProviderMediaResult,
} from "@/providers/types";
import { CORS_PROXY_URL, OMDB_API_KEY } from "@/mw_constants";
import { conf } from "@/config";
export const gomostreamScraper: MWMediaProvider = {
id: "gomostream",
@@ -21,13 +21,13 @@ export const gomostreamScraper: MWMediaProvider = {
media: MWPortableMedia
): Promise<MWProviderMediaResult> {
const params = new URLSearchParams({
apikey: OMDB_API_KEY,
apikey: conf().OMDB_API_KEY,
i: media.mediaId,
type: media.mediaType,
});
const res = await fetch(
`${CORS_PROXY_URL}http://www.omdbapi.com/?${encodeURIComponent(
`${conf().CORS_PROXY_URL}http://www.omdbapi.com/?${encodeURIComponent(
params.toString()
)}`
).then((d) => d.json());
@@ -43,12 +43,12 @@ export const gomostreamScraper: MWMediaProvider = {
const term = query.searchQuery.toLowerCase();
const params = new URLSearchParams({
apikey: OMDB_API_KEY,
apikey: conf().OMDB_API_KEY,
s: term,
type: query.type,
});
const searchRes = await fetch(
`${CORS_PROXY_URL}http://www.omdbapi.com/?${encodeURIComponent(
`${conf().CORS_PROXY_URL}http://www.omdbapi.com/?${encodeURIComponent(
params.toString()
)}`
).then((d) => d.json());
@@ -69,7 +69,7 @@ export const gomostreamScraper: MWMediaProvider = {
const type =
media.mediaType === MWMediaType.SERIES ? "show" : media.mediaType;
const res1 = await fetch(
`${CORS_PROXY_URL}https://gomo.to/${type}/${media.mediaId}`
`${conf().CORS_PROXY_URL}https://gomo.to/${type}/${media.mediaId}`
).then((d) => d.text());
if (res1 === "Movie not available." || res1 === "Episode not available.")
throw new Error(res1);
@@ -82,7 +82,7 @@ export const gomostreamScraper: MWMediaProvider = {
fd.append("_token", _token);
const src = await fetch(
`${CORS_PROXY_URL}https://gomo.to/decoding_v3.php`,
`${conf().CORS_PROXY_URL}https://gomo.to/decoding_v3.php`,
{
method: "POST",
body: fd,
@@ -95,7 +95,7 @@ export const gomostreamScraper: MWMediaProvider = {
// maybe try all embeds in the future
const embedUrl = embeds[1];
const res2 = await fetch(`${CORS_PROXY_URL}${embedUrl}`).then((d) =>
const res2 = await fetch(`${conf().CORS_PROXY_URL}${embedUrl}`).then((d) =>
d.text()
);

View File

@@ -4,7 +4,7 @@
import { customAlphabet } from "nanoid";
import toWebVTT from "srt-webvtt";
import CryptoJS from "crypto-js";
import { CORS_PROXY_URL, TMDB_API_KEY } from "@/mw_constants";
import { conf } from "@/config";
import {
MWMediaProvider,
MWMediaType,
@@ -85,7 +85,7 @@ const get = (data: object, altApi = false) => {
formatted.append("medium", "Website");
const requestUrl = altApi ? apiUrls[1] : apiUrls[0];
return fetch(`${CORS_PROXY_URL}${requestUrl}`, {
return fetch(`${conf().CORS_PROXY_URL}${requestUrl}`, {
method: "POST",
headers: {
Platform: "android",
@@ -200,7 +200,7 @@ export const superStreamScraper: MWMediaProvider = {
const mappedCaptions = await Promise.all(
subtitleRes.list.map(async (subtitle: any) => {
const captionBlob = await fetch(
`${CORS_PROXY_URL}${subtitle.subtitles[0].file_path}`
`${conf().CORS_PROXY_URL}${subtitle.subtitles[0].file_path}`
).then((captionRes) => captionRes.blob()); // cross-origin bypass
const captionUrl = await toWebVTT(captionBlob); // convert to vtt so it's playable
return {
@@ -253,7 +253,7 @@ export const superStreamScraper: MWMediaProvider = {
const mappedCaptions = await Promise.all(
subtitleRes.list.map(async (subtitle: any) => {
const captionBlob = await fetch(
`${CORS_PROXY_URL}${subtitle.subtitles[0].file_path}`
`${conf().CORS_PROXY_URL}${subtitle.subtitles[0].file_path}`
).then((captionRes) => captionRes.blob()); // cross-origin bypass
const captionUrl = await toWebVTT(captionBlob); // convert to vtt so it's playable
return {
@@ -277,11 +277,15 @@ export const superStreamScraper: MWMediaProvider = {
const detailRes = (await get(apiQuery, true).then((r) => r.json())).data;
const firstSearchResult = (
await fetch(
`https://api.themoviedb.org/3/search/tv?api_key=${TMDB_API_KEY}&language=en-US&page=1&query=${detailRes.title}&include_adult=false`
`https://api.themoviedb.org/3/search/tv?api_key=${
conf().TMDB_API_KEY
}&language=en-US&page=1&query=${detailRes.title}&include_adult=false`
).then((r) => r.json())
).results[0];
const showDetails = await fetch(
`https://api.themoviedb.org/3/tv/${firstSearchResult.id}?api_key=${TMDB_API_KEY}`
`https://api.themoviedb.org/3/tv/${firstSearchResult.id}?api_key=${
conf().TMDB_API_KEY
}`
).then((r) => r.json());
return {

View File

@@ -15,7 +15,7 @@ import {
} from "@/providers/list/theflix/search";
import { getDataFromPortableSearch } from "@/providers/list/theflix/portableToMedia";
import { CORS_PROXY_URL } from "@/mw_constants";
import { conf } from "@/config";
export const theFlixScraper: MWMediaProvider = {
id: "theflix",
@@ -51,9 +51,13 @@ export const theFlixScraper: MWMediaProvider = {
let url = "";
if (media.mediaType === MWMediaType.MOVIE) {
url = `${CORS_PROXY_URL}https://theflix.to/movie/${media.mediaId}?movieInfo=${media.mediaId}`;
url = `${conf().CORS_PROXY_URL}https://theflix.to/movie/${
media.mediaId
}?movieInfo=${media.mediaId}`;
} else if (media.mediaType === MWMediaType.SERIES) {
url = `${CORS_PROXY_URL}https://theflix.to/tv-show/${media.mediaId}/season-${media.seasonId}/episode-${media.episodeId}`;
url = `${conf().CORS_PROXY_URL}https://theflix.to/tv-show/${
media.mediaId
}/season-${media.seasonId}/episode-${media.episodeId}`;
}
const res = await fetch(url).then((d) => d.text());
@@ -76,7 +80,9 @@ export const theFlixScraper: MWMediaProvider = {
async getSeasonDataFromMedia(
media: MWPortableMedia
): Promise<MWMediaSeasons> {
const url = `${CORS_PROXY_URL}https://theflix.to/tv-show/${media.mediaId}/season-${media.seasonId}/episode-${media.episodeId}`;
const url = `${conf().CORS_PROXY_URL}https://theflix.to/tv-show/${
media.mediaId
}/season-${media.seasonId}/episode-${media.episodeId}`;
const res = await fetch(url).then((d) => d.text());
const node: Element = Array.from(

View File

@@ -1,4 +1,4 @@
import { CORS_PROXY_URL } from "@/mw_constants";
import { conf } from "@/config";
import { MWMediaType, MWPortableMedia } from "@/providers/types";
const getTheFlixUrl = (media: MWPortableMedia, params?: URLSearchParams) => {
@@ -18,9 +18,9 @@ export async function getDataFromPortableSearch(
const params = new URLSearchParams();
params.append("movieInfo", media.mediaId);
const res = await fetch(CORS_PROXY_URL + getTheFlixUrl(media, params)).then(
(d) => d.text()
);
const res = await fetch(
conf().CORS_PROXY_URL + getTheFlixUrl(media, params)
).then((d) => d.text());
const node: Element = Array.from(
new DOMParser()

View File

@@ -1,4 +1,4 @@
import { CORS_PROXY_URL } from "@/mw_constants";
import { conf } from "@/config";
import { MWMediaType, MWProviderMediaResult, MWQuery } from "@/providers";
const getTheFlixUrl = (type: "tv-shows" | "movies", params: URLSearchParams) =>
@@ -8,7 +8,7 @@ export function searchTheFlix(query: MWQuery): Promise<string> {
const params = new URLSearchParams();
params.append("search", query.searchQuery);
return fetch(
CORS_PROXY_URL +
conf().CORS_PROXY_URL +
getTheFlixUrl(
query.type === MWMediaType.MOVIE ? "movies" : "tv-shows",
params

View File

@@ -8,7 +8,7 @@ import {
MWMediaCaption,
} from "@/providers/types";
import { CORS_PROXY_URL } from "@/mw_constants";
import { conf } from "@/config";
export const xemovieScraper: MWMediaProvider = {
id: "xemovie",
@@ -20,7 +20,7 @@ export const xemovieScraper: MWMediaProvider = {
media: MWPortableMedia
): Promise<MWProviderMediaResult> {
const res = await fetch(
`${CORS_PROXY_URL}https://xemovie.co/movies/${media.mediaId}/watch`
`${conf().CORS_PROXY_URL}https://xemovie.co/movies/${media.mediaId}/watch`
).then((d) => d.text());
const DOM = new DOMParser().parseFromString(res, "text/html");
@@ -42,9 +42,9 @@ export const xemovieScraper: MWMediaProvider = {
async searchForMedia(query: MWQuery): Promise<MWProviderMediaResult[]> {
const term = query.searchQuery.toLowerCase();
const searchUrl = `${CORS_PROXY_URL}https://xemovie.co/search?q=${encodeURIComponent(
term
)}`;
const searchUrl = `${
conf().CORS_PROXY_URL
}https://xemovie.co/search?q=${encodeURIComponent(term)}`;
const searchRes = await fetch(searchUrl).then((d) => d.text());
const parser = new DOMParser();
@@ -81,7 +81,9 @@ export const xemovieScraper: MWMediaProvider = {
if (media.mediaType !== MWMediaType.MOVIE)
throw new Error("Incorrect type");
const url = `${CORS_PROXY_URL}https://xemovie.co/movies/${media.mediaId}/watch`;
const url = `${conf().CORS_PROXY_URL}https://xemovie.co/movies/${
media.mediaId
}/watch`;
let streamUrl = "";
const subtitles: MWMediaCaption[] = [];
@@ -100,7 +102,8 @@ export const xemovieScraper: MWMediaProvider = {
const data = JSON.parse(
JSON.stringify(
eval(
`(${script.textContent.replace("const data = ", "").split("};")[0]
`(${
script.textContent.replace("const data = ", "").split("};")[0]
}})`
)
)
@@ -112,7 +115,7 @@ export const xemovieScraper: MWMediaProvider = {
subtitleTrack,
] of data.playlist[0].tracks.entries()) {
const subtitleBlob = URL.createObjectURL(
await fetch(`${CORS_PROXY_URL}${subtitleTrack.file}`).then(
await fetch(`${conf().CORS_PROXY_URL}${subtitleTrack.file}`).then(
(captionRes) => captionRes.blob()
)
); // do this so no need for CORS errors

3575
yarn.lock

File diff suppressed because it is too large Load Diff