Fix Docker provider search dependencies
This commit is contained in:
@@ -1,5 +1,10 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## 0.52.6 - 2026-08-09
|
||||||
|
|
||||||
|
- Fixed Docker search failures by pinning Cheerio to the Node 18-compatible `1.0.0` release.
|
||||||
|
- Made Docker installs deterministic by copying `package-lock.json` and using `npm ci`.
|
||||||
|
|
||||||
## 0.52.5 - 2026-08-09
|
## 0.52.5 - 2026-08-09
|
||||||
|
|
||||||
- Changed Watchlist title links to open the anime on the provider it was added from instead of the retired metadata source.
|
- Changed Watchlist title links to open the anime on the provider it was added from instead of the retired metadata source.
|
||||||
|
|||||||
+2
-2
@@ -22,8 +22,8 @@ RUN apt-get update \
|
|||||||
|
|
||||||
RUN mkdir -p /app
|
RUN mkdir -p /app
|
||||||
|
|
||||||
COPY package.json /app/
|
COPY package.json package-lock.json /app/
|
||||||
RUN cd /app && npm install --omit=dev
|
RUN cd /app && npm ci --omit=dev
|
||||||
|
|
||||||
COPY app.py app_support.py config_page.py http_handler.py provider_bridge.py provider_downloader.py queue_jobs.py queue_page.py search_page.py template_helpers.py title_matching.py watchlist_identity.py watchlist_page.py web_templates.py VERSION CHANGELOG.md favicon.png /app/
|
COPY app.py app_support.py config_page.py http_handler.py provider_bridge.py provider_downloader.py queue_jobs.py queue_page.py search_page.py template_helpers.py title_matching.py watchlist_identity.py watchlist_page.py web_templates.py VERSION CHANGELOG.md favicon.png /app/
|
||||||
COPY providers /app/providers
|
COPY providers /app/providers
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ Kaizoku is a local web app for searching, tracking, and downloading anime from A
|
|||||||
- Node.js and npm for the provider bridge.
|
- Node.js and npm for the provider bridge.
|
||||||
- `ffmpeg` available in `PATH`.
|
- `ffmpeg` available in `PATH`.
|
||||||
- `openssl` available in `PATH` for AES-128 encrypted HLS segments.
|
- `openssl` available in `PATH` for AES-128 encrypted HLS segments.
|
||||||
|
- Docker builds install the locked Node dependencies with `npm ci`; rebuild the image after dependency updates.
|
||||||
|
|
||||||
Install Node dependencies once:
|
Install Node dependencies once:
|
||||||
|
|
||||||
|
|||||||
Generated
+20
-32
@@ -9,7 +9,7 @@
|
|||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"axios": "^1.7.9",
|
"axios": "^1.7.9",
|
||||||
"cheerio": "^1.0.0"
|
"cheerio": "1.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/agent-base": {
|
"node_modules/agent-base": {
|
||||||
@@ -62,25 +62,25 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/cheerio": {
|
"node_modules/cheerio": {
|
||||||
"version": "1.2.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0.tgz",
|
||||||
"integrity": "sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==",
|
"integrity": "sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"cheerio-select": "^2.1.0",
|
"cheerio-select": "^2.1.0",
|
||||||
"dom-serializer": "^2.0.0",
|
"dom-serializer": "^2.0.0",
|
||||||
"domhandler": "^5.0.3",
|
"domhandler": "^5.0.3",
|
||||||
"domutils": "^3.2.2",
|
"domutils": "^3.1.0",
|
||||||
"encoding-sniffer": "^0.2.1",
|
"encoding-sniffer": "^0.2.0",
|
||||||
"htmlparser2": "^10.1.0",
|
"htmlparser2": "^9.1.0",
|
||||||
"parse5": "^7.3.0",
|
"parse5": "^7.1.2",
|
||||||
"parse5-htmlparser2-tree-adapter": "^7.1.0",
|
"parse5-htmlparser2-tree-adapter": "^7.0.0",
|
||||||
"parse5-parser-stream": "^7.1.2",
|
"parse5-parser-stream": "^7.1.2",
|
||||||
"undici": "^7.19.0",
|
"undici": "^6.19.5",
|
||||||
"whatwg-mimetype": "^4.0.0"
|
"whatwg-mimetype": "^4.0.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=20.18.1"
|
"node": ">=18.17"
|
||||||
},
|
},
|
||||||
"funding": {
|
"funding": {
|
||||||
"url": "https://github.com/cheeriojs/cheerio?sponsor=1"
|
"url": "https://github.com/cheeriojs/cheerio?sponsor=1"
|
||||||
@@ -442,9 +442,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/htmlparser2": {
|
"node_modules/htmlparser2": {
|
||||||
"version": "10.1.0",
|
"version": "9.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz",
|
||||||
"integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==",
|
"integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==",
|
||||||
"funding": [
|
"funding": [
|
||||||
"https://github.com/fb55/htmlparser2?sponsor=1",
|
"https://github.com/fb55/htmlparser2?sponsor=1",
|
||||||
{
|
{
|
||||||
@@ -456,20 +456,8 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"domelementtype": "^2.3.0",
|
"domelementtype": "^2.3.0",
|
||||||
"domhandler": "^5.0.3",
|
"domhandler": "^5.0.3",
|
||||||
"domutils": "^3.2.2",
|
"domutils": "^3.1.0",
|
||||||
"entities": "^7.0.1"
|
"entities": "^4.5.0"
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/htmlparser2/node_modules/entities": {
|
|
||||||
"version": "7.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz",
|
|
||||||
"integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==",
|
|
||||||
"license": "BSD-2-Clause",
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.12"
|
|
||||||
},
|
|
||||||
"funding": {
|
|
||||||
"url": "https://github.com/fb55/entities?sponsor=1"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/https-proxy-agent": {
|
"node_modules/https-proxy-agent": {
|
||||||
@@ -610,12 +598,12 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/undici": {
|
"node_modules/undici": {
|
||||||
"version": "7.29.0",
|
"version": "6.28.0",
|
||||||
"resolved": "https://registry.npmjs.org/undici/-/undici-7.29.0.tgz",
|
"resolved": "https://registry.npmjs.org/undici/-/undici-6.28.0.tgz",
|
||||||
"integrity": "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==",
|
"integrity": "sha512-LIY910g9TI13YS95lrMFrs8Rm/u/irgHeTWoKCoteeJ04CUJ92eEfj0rVn+7VKMPBpUPiUoBKfhNyLI23EE/KA==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=20.18.1"
|
"node": ">=18.17"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/whatwg-encoding": {
|
"node_modules/whatwg-encoding": {
|
||||||
|
|||||||
+1
-1
@@ -6,6 +6,6 @@
|
|||||||
"description": "Local provider bridge for Kaizoku anime metadata and stream resolution.",
|
"description": "Local provider bridge for Kaizoku anime metadata and stream resolution.",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"axios": "^1.7.9",
|
"axios": "^1.7.9",
|
||||||
"cheerio": "^1.0.0"
|
"cheerio": "1.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+10
@@ -4050,6 +4050,16 @@ class TemplateHelperTests(unittest.TestCase):
|
|||||||
self.assertNotIn("What you can do here", APP.QUEUE_HTML)
|
self.assertNotIn("What you can do here", APP.QUEUE_HTML)
|
||||||
self.assertNotIn("How it works", APP.WATCHLIST_HTML)
|
self.assertNotIn("How it works", APP.WATCHLIST_HTML)
|
||||||
|
|
||||||
|
def test_docker_uses_locked_node_dependencies(self):
|
||||||
|
package = json.loads((ROOT / "package.json").read_text(encoding="utf-8"))
|
||||||
|
lock = json.loads((ROOT / "package-lock.json").read_text(encoding="utf-8"))
|
||||||
|
dockerfile = (ROOT / "Dockerfile").read_text(encoding="utf-8")
|
||||||
|
|
||||||
|
self.assertEqual(package["dependencies"]["cheerio"], "1.0.0")
|
||||||
|
self.assertEqual(lock["packages"]["node_modules/cheerio"]["version"], "1.0.0")
|
||||||
|
self.assertIn("COPY package.json package-lock.json /app/", dockerfile)
|
||||||
|
self.assertIn("npm ci --omit=dev", dockerfile)
|
||||||
|
|
||||||
def test_queue_page_formats_jellyfin_handoff_jobs(self):
|
def test_queue_page_formats_jellyfin_handoff_jobs(self):
|
||||||
self.assertIn('job.job_type === "jellyfin_handoff"', APP.QUEUE_HTML)
|
self.assertIn('job.job_type === "jellyfin_handoff"', APP.QUEUE_HTML)
|
||||||
self.assertIn('const progress = `${job.completed || 0}/${job.total || 0} entries`;', APP.QUEUE_HTML)
|
self.assertIn('const progress = `${job.completed || 0}/${job.total || 0} entries`;', APP.QUEUE_HTML)
|
||||||
|
|||||||
Reference in New Issue
Block a user