diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index d728715a2..6782e9d8e 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -27,7 +27,7 @@ jobs:
version: 10
run_install: false
- name: Setup node
- uses: actions/setup-node@v5
+ uses: actions/setup-node@v6
with:
node-version-file: .nvmrc
cache: "pnpm"
diff --git a/.github/workflows/pages_cleanup.yml b/.github/workflows/pages_cleanup.yml
index 58ba548a7..2147b25d6 100644
--- a/.github/workflows/pages_cleanup.yml
+++ b/.github/workflows/pages_cleanup.yml
@@ -9,7 +9,7 @@ permissions:
contents: write
jobs:
- build:
+ cleanup:
runs-on: ubuntu-latest
steps:
- name: Checkout
@@ -18,13 +18,30 @@ jobs:
ref: gh-pages
fetch-depth: 0
- - name: Delete directories older than 1 year
+ - name: Delete directories that don't have existing branch
run: |
- for dir in $(find . -mindepth 1 -maxdepth 2 -type d -not -path '*/\.*'); do
- if ! git log -1 --since="1 year ago" -- "$dir" | grep -q .; then
- echo "Deleting $dir"
- rm -rf "$dir"
- fi
+ branches=( $(git branch -r | grep origin | grep -v HEAD | sed 's|origin/||') )
+ declare -p branches
+
+ find . -mindepth 1 -maxdepth 2 -type d -not -path '*/\.*' | while read -r dir; do
+ path="${dir#./}"
+
+ if [[ " ${branches[*]} " =~ " $path " ]]; then
+ continue
+ fi
+
+ keep_parent=false
+ for branch in "${branches[@]}"; do
+ if [[ "$branch" == "$path/"* ]]; then
+ keep_parent=true
+ break
+ fi
+ done
+
+ if ! $keep_parent; then
+ echo "Deleting $dir"
+ rm -rf "$dir"
+ fi
done
- name: Commit and push
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
index 921fba0a7..ae01c05f5 100644
--- a/CODE_OF_CONDUCT.md
+++ b/CODE_OF_CONDUCT.md
@@ -29,10 +29,10 @@ Project maintainers are responsible for enforcing this code of conduct. They can
## Suggestions for newbies
- Contributors are welcomed to use AI models as "help" in solving issues, but you must always double check the code that you're submitting.
-- Refrain from excesive comments generated by AI.
+- Refrain from excessive comments generated by AI.
- Refrain from docs generated entirely by AI.
- Always check what files you are committing and submitting to the PR when you are using any agent for help or an AI model.
-- If you don't how to tackle a problem and AI can't help you, please just ask or look in Stack Overlflow, Google, Medium etc.
+- If you don't know how to tackle a problem and AI can't help you, please just ask or look in Stack Overlflow, Google, Medium etc.
- Learning how to code is fun and easier when using AI, but sometimes it might be just too much ... what are you going to learn, if AI does everything for you and you don't know what the code you are submitting actually does?!
## Scope
diff --git a/Dockerfile b/Dockerfile
index a0a3c597a..c9aa2cb23 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -3,29 +3,39 @@
ARG NODE_VERSION=20-alpine
FROM node:$NODE_VERSION AS base
+# Setup pnpm
+ENV PNPM_HOME="/pnpm"
+ENV PATH="$PNPM_HOME:$PATH"
+
+RUN corepack enable
+RUN apk add --no-cache git
+
# Meta
LABEL Description="Stremio Web" Vendor="Smart Code OOD" Version="1.0.0"
RUN mkdir -p /var/www/stremio-web
WORKDIR /var/www/stremio-web
-# Install app dependencies
-FROM base AS prebuild
+# Setup app
+FROM base AS app
-RUN apk update && apk upgrade && \
- apk add --no-cache git
-WORKDIR /var/www/stremio-web
-COPY . .
-RUN npm install
-RUN npm run build
+COPY package.json pnpm-lock.yaml /var/www/stremio-web
+RUN pnpm i --frozen-lockfile
-# Bundle app source
-FROM base AS final
+COPY . /var/www/stremio-web
+RUN pnpm build
-WORKDIR /var/www/stremio-web
-COPY . .
-COPY --from=prebuild /var/www/stremio-web/node_modules ./node_modules
-COPY --from=prebuild /var/www/stremio-web/build ./build
+# Setup server
+FROM base AS server
+
+RUN pnpm i express@4
+
+# Finalize
+FROM base
+
+COPY http_server.js /var/www/stremio-web
+COPY --from=server /var/www/stremio-web/node_modules /var/www/stremio-web/node_modules
+COPY --from=app /var/www/stremio-web/build /var/www/stremio-web/build
EXPOSE 8080
CMD ["node", "http_server.js"]
diff --git a/README.md b/README.md
index f84c3bb0c..b7cd999dc 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
# Stremio - Freedom to Stream
-
+[](https://github.com/Stremio/stremio-web/actions/workflows/build.yml)
[](https://stremio.github.io/stremio-web/development)
Stremio is a modern media center that's a one-stop solution for your video entertainment. You discover, watch and organize video content from easy to install addons.
diff --git a/package.json b/package.json
index c824ad411..284696840 100644
--- a/package.json
+++ b/package.json
@@ -17,9 +17,9 @@
"@babel/runtime": "7.26.0",
"@sentry/browser": "8.42.0",
"@stremio/stremio-colors": "5.2.0",
- "@stremio/stremio-core-web": "0.49.4",
+ "@stremio/stremio-core-web": "0.50.0",
"@stremio/stremio-icons": "5.7.1",
- "@stremio/stremio-video": "0.0.62",
+ "@stremio/stremio-video": "0.0.64",
"a-color-picker": "1.2.1",
"bowser": "2.11.0",
"buffer": "6.0.3",
@@ -41,7 +41,7 @@
"react-i18next": "^15.1.3",
"react-is": "18.3.1",
"spatial-navigation-polyfill": "github:Stremio/spatial-navigation#64871b1422466f5f45d24ebc8bbd315b2ebab6a6",
- "stremio-translations": "github:Stremio/stremio-translations#abe7684165a031755e9aee39da26daa806ba7824",
+ "stremio-translations": "github:Stremio/stremio-translations#01aaa201e419782b26b9f2cbe4430795021426e5",
"url": "0.11.4",
"use-long-press": "^3.2.0"
},
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 121d0dbea..3f0659a55 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -18,14 +18,14 @@ importers:
specifier: 5.2.0
version: 5.2.0
'@stremio/stremio-core-web':
- specifier: 0.49.4
- version: 0.49.4
+ specifier: 0.50.0
+ version: 0.50.0
'@stremio/stremio-icons':
specifier: 5.7.1
version: 5.7.1
'@stremio/stremio-video':
- specifier: 0.0.62
- version: 0.0.62
+ specifier: 0.0.64
+ version: 0.0.64
a-color-picker:
specifier: 1.2.1
version: 1.2.1
@@ -90,8 +90,8 @@ importers:
specifier: github:Stremio/spatial-navigation#64871b1422466f5f45d24ebc8bbd315b2ebab6a6
version: https://codeload.github.com/Stremio/spatial-navigation/tar.gz/64871b1422466f5f45d24ebc8bbd315b2ebab6a6
stremio-translations:
- specifier: github:Stremio/stremio-translations#abe7684165a031755e9aee39da26daa806ba7824
- version: https://codeload.github.com/Stremio/stremio-translations/tar.gz/abe7684165a031755e9aee39da26daa806ba7824
+ specifier: github:Stremio/stremio-translations#01aaa201e419782b26b9f2cbe4430795021426e5
+ version: https://codeload.github.com/Stremio/stremio-translations/tar.gz/01aaa201e419782b26b9f2cbe4430795021426e5
url:
specifier: 0.11.4
version: 0.11.4
@@ -1302,14 +1302,14 @@ packages:
'@stremio/stremio-colors@5.2.0':
resolution: {integrity: sha512-dYlPgu9W/H7c9s1zmW5tiDnRenaUa4Hg1QCyOg1lhOcgSfM/bVTi5nnqX+IfvGTTUNA0zgzh8hI3o3miwnZxTg==}
- '@stremio/stremio-core-web@0.49.4':
- resolution: {integrity: sha512-K9LJGKXs8juV3pZOHH6thWTwOShAhjFt9bLL6K1VlORAe6AiieZ2uRp9wdOwFmPX+UgzWLIOd0r2aFXJ4OsJCw==}
+ '@stremio/stremio-core-web@0.50.0':
+ resolution: {integrity: sha512-SRE9nStgYNbhjJAw7mXfmM0wdnSLS4GMSJsSMTXvoGxnUgd+yisJUkN/9Sughe4t2IU7Uct8QWpdx9zFdlil+g==}
'@stremio/stremio-icons@5.7.1':
resolution: {integrity: sha512-Z96p36LLX3G+ewMnFKmNZVsO/AtcHA33WQ3wGOYFubxiYADPRAkcLVU5rHIfiGSC9IUaUVhxQWTPVB9ScY4Q5Q==}
- '@stremio/stremio-video@0.0.62':
- resolution: {integrity: sha512-lzm1sWLVN9Z3qr8mZm3MRLw7S9v7QYIe6swWava3Ao4sjhVc8jVlwzF5un0LcHxY8hQe0OjK7TDCvPRbw+spBQ==}
+ '@stremio/stremio-video@0.0.64':
+ resolution: {integrity: sha512-29w/lwU8BB6ai8LUyCnpRc2F9kPf7cpys40NCobt70MqBP/UqvYISsrnD/ijoBwvtpKdZ6ptv5h9BbDj6rrerw==}
'@stylistic/eslint-plugin-jsx@4.4.1':
resolution: {integrity: sha512-83SInq4u7z71vWwGG+6ViOtlOmZ6tSrDkMPhrvdBBTGMLA0gs22WSdhQ4vZP3oJ5Xg4ythvqeUiFSedvVxzhyA==}
@@ -4527,9 +4527,9 @@ packages:
resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==}
engines: {node: '>= 0.4'}
- stremio-translations@https://codeload.github.com/Stremio/stremio-translations/tar.gz/abe7684165a031755e9aee39da26daa806ba7824:
- resolution: {tarball: https://codeload.github.com/Stremio/stremio-translations/tar.gz/abe7684165a031755e9aee39da26daa806ba7824}
- version: 1.44.12
+ stremio-translations@https://codeload.github.com/Stremio/stremio-translations/tar.gz/01aaa201e419782b26b9f2cbe4430795021426e5:
+ resolution: {tarball: https://codeload.github.com/Stremio/stremio-translations/tar.gz/01aaa201e419782b26b9f2cbe4430795021426e5}
+ version: 1.44.13
string-length@4.0.2:
resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==}
@@ -6561,13 +6561,13 @@ snapshots:
'@stremio/stremio-colors@5.2.0': {}
- '@stremio/stremio-core-web@0.49.4':
+ '@stremio/stremio-core-web@0.50.0':
dependencies:
'@babel/runtime': 7.24.1
'@stremio/stremio-icons@5.7.1': {}
- '@stremio/stremio-video@0.0.62':
+ '@stremio/stremio-video@0.0.64':
dependencies:
buffer: 6.0.3
color: 4.2.3
@@ -10283,7 +10283,7 @@ snapshots:
es-errors: 1.3.0
internal-slot: 1.1.0
- stremio-translations@https://codeload.github.com/Stremio/stremio-translations/tar.gz/abe7684165a031755e9aee39da26daa806ba7824: {}
+ stremio-translations@https://codeload.github.com/Stremio/stremio-translations/tar.gz/01aaa201e419782b26b9f2cbe4430795021426e5: {}
string-length@4.0.2:
dependencies:
diff --git a/screenshots/board.png b/screenshots/board.png
index 1fa83799a..8a54886f7 100644
Binary files a/screenshots/board.png and b/screenshots/board.png differ
diff --git a/screenshots/discover.png b/screenshots/discover.png
index eab8b5a2e..53f03a3e1 100644
Binary files a/screenshots/discover.png and b/screenshots/discover.png differ
diff --git a/screenshots/metadetails.png b/screenshots/metadetails.png
index 9aec4a302..ff0abe6f8 100644
Binary files a/screenshots/metadetails.png and b/screenshots/metadetails.png differ
diff --git a/src/App/App.js b/src/App/App.js
index 3e816be9f..7a1383dc4 100644
--- a/src/App/App.js
+++ b/src/App/App.js
@@ -6,11 +6,12 @@ const { useTranslation } = require('react-i18next');
const { Router } = require('stremio-router');
const { Core, Shell, Chromecast, DragAndDrop, KeyboardShortcuts, ServicesProvider } = require('stremio/services');
const { NotFound } = require('stremio/routes');
-const { FileDropProvider, PlatformProvider, ToastProvider, TooltipProvider, CONSTANTS, withCoreSuspender, useShell } = require('stremio/common');
+const { FileDropProvider, PlatformProvider, ToastProvider, TooltipProvider, ShortcutsProvider, CONSTANTS, withCoreSuspender, useShell, useBinaryState } = require('stremio/common');
const ServicesToaster = require('./ServicesToaster');
const DeepLinkHandler = require('./DeepLinkHandler');
const SearchParamsHandler = require('./SearchParamsHandler');
const { default: UpdaterBanner } = require('./UpdaterBanner');
+const { default: ShortcutsModal } = require('./ShortcutsModal');
const ErrorDialog = require('./ErrorDialog');
const withProtectedRoutes = require('./withProtectedRoutes');
const routerViewsConfig = require('./routerViewsConfig');
@@ -38,6 +39,14 @@ const App = () => {
};
}, []);
const [initialized, setInitialized] = React.useState(false);
+ const [shortcutModalOpen,, closeShortcutsModal, toggleShortcutModal] = useBinaryState(false);
+
+ const onShortcut = React.useCallback((name) => {
+ if (name === 'shortcuts') {
+ toggleShortcutModal();
+ }
+ }, [toggleShortcutModal]);
+
React.useEffect(() => {
let prevPath = window.location.hash.slice(1);
const onLocationHashChange = () => {
@@ -159,7 +168,8 @@ const App = () => {
services.core.transport.dispatch({
action: 'Ctx',
args: {
- action: 'PullUserFromAPI'
+ action: 'PullUserFromAPI',
+ args: {}
}
});
services.core.transport.dispatch({
@@ -203,15 +213,20 @@ const App = () => {