Compare commits

...

23 Commits
3.5.2 ... main

Author SHA1 Message Date
6a64545380 fix: 🎨 run rector
All checks were successful
repod / xml (push) Successful in 9s
repod / php (push) Successful in 1m8s
repod / nodejs (push) Successful in 1m32s
repod / release (push) Has been skipped
2025-01-21 10:50:20 +01:00
4e4edf40f0 refactor: 🏗️ move script and style to template
Some checks failed
repod / nodejs (push) Waiting to run
repod / release (push) Waiting to run
repod / xml (push) Successful in 12s
repod / php (push) Has been cancelled
2025-01-21 10:49:49 +01:00
df3d6e824d chore: 📌 update to nextcloud 31
All checks were successful
repod / xml (push) Successful in 11s
repod / php (push) Successful in 1m1s
repod / nodejs (push) Successful in 1m25s
repod / release (push) Has been skipped
2025-01-21 10:33:40 +01:00
1abcee87ea fix: ⬆️ update nextcloud vue to alpha 6
All checks were successful
repod / xml (push) Successful in 32s
repod / php (push) Successful in 1m12s
repod / nodejs (push) Successful in 2m2s
repod / release (push) Has been skipped
2025-01-21 10:29:18 +01:00
f96ec96f56 Merge pull request 'chore(deps): update dependency eslint-plugin-prettier to ^5.2.3' (#238) from renovate/eslint-plugin-prettier-5.x into main
All checks were successful
repod / xml (push) Successful in 29s
repod / php (push) Successful in 1m4s
repod / nodejs (push) Successful in 1m18s
repod / release (push) Has been skipped
Reviewed-on: #238
2025-01-20 08:16:41 +00:00
afbfbe8487 chore(deps): update dependency eslint-plugin-prettier to ^5.2.3
All checks were successful
repod / xml (push) Successful in 33s
repod / php (push) Successful in 58s
repod / nodejs (push) Successful in 1m4s
repod / release (push) Has been skipped
2025-01-20 00:04:26 +00:00
87ad98f341 fix: fix paslm
All checks were successful
repod / xml (push) Successful in 14s
repod / php (push) Successful in 1m1s
repod / nodejs (push) Successful in 1m0s
repod / release (push) Has been skipped
2025-01-18 10:14:08 +00:00
cc5434004e Merge pull request 'chore(deps): update dependency nextcloud/ocp to ^30.0.5' (#236) from renovate/nextcloud-ocp-30.x into main
Some checks failed
repod / xml (push) Successful in 32s
repod / php (push) Failing after 1m11s
repod / nodejs (push) Successful in 1m25s
repod / release (push) Has been skipped
Reviewed-on: #236
2025-01-18 10:02:10 +00:00
519cf82703 chore(deps): update dependency nextcloud/ocp to ^30.0.5
Some checks failed
repod / xml (push) Successful in 32s
repod / php (push) Failing after 1m36s
repod / nodejs (push) Successful in 1m10s
repod / release (push) Has been skipped
2025-01-18 00:04:45 +00:00
abfa1491fc chore: ⬆️ update lock
All checks were successful
repod / xml (push) Successful in 14s
repod / php (push) Successful in 1m6s
repod / nodejs (push) Successful in 1m2s
repod / release (push) Has been skipped
2025-01-15 08:45:13 +00:00
59c02ba994 Merge pull request 'chore(deps): update dependency eslint-config-prettier to v10' (#234) from renovate/eslint-config-prettier-10.x into main
All checks were successful
repod / xml (push) Successful in 34s
repod / php (push) Successful in 1m37s
repod / nodejs (push) Successful in 1m13s
repod / release (push) Has been skipped
Reviewed-on: #234
2025-01-15 08:34:57 +00:00
6cd74a9482 chore(deps): update dependency eslint-config-prettier to v10
All checks were successful
repod / xml (push) Successful in 48s
repod / php (push) Successful in 1m15s
repod / nodejs (push) Successful in 1m8s
repod / release (push) Has been skipped
2025-01-15 00:05:16 +00:00
Weblate
40f13d92aa Update translation files
All checks were successful
repod / xml (push) Successful in 9s
repod / php (push) Successful in 54s
repod / nodejs (push) Successful in 1m0s
repod / release (push) Has been skipped
Updated by "Update PO files to match POT (msgmerge)" add-on in Weblate.

Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.crystalyx.net/projects/repod/gitea/
Translation: RePod/Gitea
2025-01-10 22:55:55 +00:00
172085bf2d chore: 🌐 update de language
Some checks failed
repod / php (push) Waiting to run
repod / nodejs (push) Waiting to run
repod / release (push) Waiting to run
repod / xml (push) Has been cancelled
2025-01-10 23:55:48 +01:00
4a93cb9964 chore: ⬆️ update vite-config
Some checks failed
repod / nodejs (push) Waiting to run
repod / release (push) Waiting to run
repod / xml (push) Successful in 14s
repod / php (push) Has been cancelled
2025-01-10 23:54:58 +01:00
markus phi
cace2c5fb8 Translated using Weblate (German)
All checks were successful
repod / xml (push) Successful in 32s
repod / php (push) Successful in 58s
repod / nodejs (push) Successful in 1m15s
repod / release (push) Has been skipped
Currently translated at 98.3% (59 of 60 strings)

Co-authored-by: markus phi <repodtranslate@solinetcafe.org>
Translate-URL: https://translate.crystalyx.net/projects/repod/gitea/de/
Translation: RePod/Gitea
2025-01-04 19:02:52 +00:00
c6915193db fix: 🩹 fix blank bubble if no duration
All checks were successful
repod / xml (push) Successful in 26s
repod / php (push) Successful in 55s
repod / nodejs (push) Successful in 1m34s
repod / release (push) Has been skipped
2025-01-03 18:36:47 +01:00
2a3d30f018 feat: add notifications and author
All checks were successful
repod / xml (push) Successful in 12s
repod / php (push) Successful in 1m0s
repod / nodejs (push) Successful in 1m38s
repod / release (push) Successful in 1m16s
2025-01-03 16:17:12 +01:00
514a12d756 chore: ⬆️ update lock
All checks were successful
repod / xml (push) Successful in 13s
repod / php (push) Successful in 56s
repod / nodejs (push) Successful in 1m41s
repod / release (push) Successful in 1m27s
2025-01-03 14:24:07 +01:00
66e2406a81 chore: 🔖 update version and changelog
All checks were successful
repod / xml (push) Successful in 12s
repod / php (push) Successful in 1m11s
repod / nodejs (push) Successful in 1m36s
repod / release (push) Has been skipped
2025-01-03 14:19:53 +01:00
2546df30fc Revert "fix: 🎨 simplify undefined test for filters"
Some checks failed
repod / release (push) Waiting to run
repod / xml (push) Successful in 16s
repod / php (push) Successful in 1m16s
repod / nodejs (push) Has been cancelled
This reverts commit c37783d814a8d3dea2f8c12178cdd2f04fecad81.
2025-01-03 14:17:27 +01:00
b33a0fdb40 Merge pull request 'chore(deps): update dependency @formatjs/intl-segmenter to ^11.7.8' (#232) from renovate/formatjs-intl-segmenter-11.x into main
All checks were successful
repod / xml (push) Successful in 42s
repod / php (push) Successful in 1m21s
repod / nodejs (push) Successful in 1m44s
repod / release (push) Has been skipped
Reviewed-on: #232
2025-01-03 10:57:30 +00:00
c0ca6258bd chore(deps): update dependency @formatjs/intl-segmenter to ^11.7.8
All checks were successful
repod / xml (push) Successful in 12s
repod / php (push) Successful in 1m1s
repod / nodejs (push) Successful in 1m51s
repod / release (push) Has been skipped
2025-01-03 00:07:59 +00:00
26 changed files with 1094 additions and 771 deletions

View File

@ -1,11 +1,9 @@
module.exports = { module.exports = {
extends: [ extends: [
'@nextcloud', '@nextcloud/eslint-config/vue3',
'@vue/eslint-config-typescript/recommended',
'plugin:pinia/recommended', 'plugin:pinia/recommended',
'plugin:prettier/recommended', 'plugin:prettier/recommended',
], ],
parser: 'vue-eslint-parser',
rules: { rules: {
'jsdoc/require-jsdoc': 'off', 'jsdoc/require-jsdoc': 'off',
'vue/first-attribute-linebreak': 'off', 'vue/first-attribute-linebreak': 'off',

View File

@ -1,5 +1,17 @@
## 3.5.4 - Under the spotlight - 2025-01-03
### Added
- 🧑‍🎤 Added the episode author on the list and modal
- ✨ Added cover image and episode infos on desktop and mobile notifications
## 3.5.3 - Hangover - 2025-01-03
### Fixed
- 🚑 Regression on filters
## 3.5.2 - Happy New Year - 2025-01-01 ## 3.5.2 - Happy New Year - 2025-01-01
### Changed
- 🌐 Updated german language (thanks markus phi) - 🌐 Updated german language (thanks markus phi)
🎉 Happy new year ! 🎉 Happy new year !

View File

@ -14,7 +14,7 @@
## Requirements ## Requirements
You need to have [GPodderSync](https://apps.nextcloud.com/apps/gpoddersync) installed to use this app!]]></description> You need to have [GPodderSync](https://apps.nextcloud.com/apps/gpoddersync) installed to use this app!]]></description>
<version>3.5.2</version> <version>3.5.4</version>
<licence>agpl</licence> <licence>agpl</licence>
<author mail="xefir@crystalyx.net" homepage="https://crystalyx.net">Michel Roux</author> <author mail="xefir@crystalyx.net" homepage="https://crystalyx.net">Michel Roux</author>
<namespace>RePod</namespace> <namespace>RePod</namespace>
@ -29,7 +29,7 @@ You need to have [GPodderSync](https://apps.nextcloud.com/apps/gpoddersync) inst
<screenshot>https://git.crystalyx.net/Xefir/repod/raw/branch/main/screens/modal.png</screenshot> <screenshot>https://git.crystalyx.net/Xefir/repod/raw/branch/main/screens/modal.png</screenshot>
<dependencies> <dependencies>
<php min-version="8.1"/> <php min-version="8.1"/>
<nextcloud min-version="29" max-version="30"/> <nextcloud min-version="29" max-version="31"/>
</dependencies> </dependencies>
<navigations> <navigations>
<navigation> <navigation>

View File

@ -19,7 +19,7 @@
"php": "^8.1" "php": "^8.1"
}, },
"require-dev": { "require-dev": {
"nextcloud/ocp": "^30.0.4", "nextcloud/ocp": "^30.0.5",
"roave/security-advisories": "dev-latest", "roave/security-advisories": "dev-latest",
"nextcloud/coding-standard": "^1.3.2", "nextcloud/coding-standard": "^1.3.2",
"nextcloud/rector": "^0.2.1", "nextcloud/rector": "^0.2.1",

74
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "8985893a48af49654e50784bda34fb89", "content-hash": "413d85cb041646dc7aa0da4bcdf8f65c",
"packages": [], "packages": [],
"packages-dev": [ "packages-dev": [
{ {
@ -778,16 +778,16 @@
}, },
{ {
"name": "nextcloud/ocp", "name": "nextcloud/ocp",
"version": "v30.0.4", "version": "v30.0.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/nextcloud-deps/ocp.git", "url": "https://github.com/nextcloud-deps/ocp.git",
"reference": "6f98dac2ddd6c42e605bc453e5328c0a61f75b8d" "reference": "8f9f1452b564a514938d0e7361479bb9afacab27"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/nextcloud-deps/ocp/zipball/6f98dac2ddd6c42e605bc453e5328c0a61f75b8d", "url": "https://api.github.com/repos/nextcloud-deps/ocp/zipball/8f9f1452b564a514938d0e7361479bb9afacab27",
"reference": "6f98dac2ddd6c42e605bc453e5328c0a61f75b8d", "reference": "8f9f1452b564a514938d0e7361479bb9afacab27",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -816,9 +816,9 @@
"description": "Composer package containing Nextcloud's public API (classes, interfaces)", "description": "Composer package containing Nextcloud's public API (classes, interfaces)",
"support": { "support": {
"issues": "https://github.com/nextcloud-deps/ocp/issues", "issues": "https://github.com/nextcloud-deps/ocp/issues",
"source": "https://github.com/nextcloud-deps/ocp/tree/v30.0.4" "source": "https://github.com/nextcloud-deps/ocp/tree/v30.0.5"
}, },
"time": "2024-11-29T00:46:59+00:00" "time": "2025-01-08T10:49:45+00:00"
}, },
{ {
"name": "nextcloud/rector", "name": "nextcloud/rector",
@ -940,16 +940,16 @@
}, },
{ {
"name": "php-cs-fixer/shim", "name": "php-cs-fixer/shim",
"version": "v3.66.0", "version": "v3.68.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/PHP-CS-Fixer/shim.git", "url": "https://github.com/PHP-CS-Fixer/shim.git",
"reference": "6824b91b16d2e123afed9bf9c96ec283882346c9" "reference": "eca7a809b6b5d35d0a033c63a14881107e22a7b6"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/PHP-CS-Fixer/shim/zipball/6824b91b16d2e123afed9bf9c96ec283882346c9", "url": "https://api.github.com/repos/PHP-CS-Fixer/shim/zipball/eca7a809b6b5d35d0a033c63a14881107e22a7b6",
"reference": "6824b91b16d2e123afed9bf9c96ec283882346c9", "reference": "eca7a809b6b5d35d0a033c63a14881107e22a7b6",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -986,9 +986,9 @@
"description": "A tool to automatically fix PHP code style", "description": "A tool to automatically fix PHP code style",
"support": { "support": {
"issues": "https://github.com/PHP-CS-Fixer/shim/issues", "issues": "https://github.com/PHP-CS-Fixer/shim/issues",
"source": "https://github.com/PHP-CS-Fixer/shim/tree/v3.66.0" "source": "https://github.com/PHP-CS-Fixer/shim/tree/v3.68.1"
}, },
"time": "2024-12-29T13:46:48+00:00" "time": "2025-01-17T09:21:08+00:00"
}, },
{ {
"name": "phpdocumentor/reflection-common", "name": "phpdocumentor/reflection-common",
@ -1214,16 +1214,16 @@
}, },
{ {
"name": "phpstan/phpstan", "name": "phpstan/phpstan",
"version": "1.12.14", "version": "1.12.15",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/phpstan/phpstan.git", "url": "https://github.com/phpstan/phpstan.git",
"reference": "e73868f809e68fff33be961ad4946e2e43ec9e38" "reference": "c91d4e8bc056f46cf653656e6f71004b254574d1"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/phpstan/phpstan/zipball/e73868f809e68fff33be961ad4946e2e43ec9e38", "url": "https://api.github.com/repos/phpstan/phpstan/zipball/c91d4e8bc056f46cf653656e6f71004b254574d1",
"reference": "e73868f809e68fff33be961ad4946e2e43ec9e38", "reference": "c91d4e8bc056f46cf653656e6f71004b254574d1",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1268,7 +1268,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2024-12-31T07:26:13+00:00" "time": "2025-01-05T16:40:22+00:00"
}, },
{ {
"name": "psr/clock", "name": "psr/clock",
@ -1536,12 +1536,12 @@
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/Roave/SecurityAdvisories.git", "url": "https://github.com/Roave/SecurityAdvisories.git",
"reference": "1b5fbfd0ff8484f7cc650978bfce4b8273633341" "reference": "e7a38fcc13e4ddfe9a28d5c7bf50aa9a9da758ec"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/1b5fbfd0ff8484f7cc650978bfce4b8273633341", "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/e7a38fcc13e4ddfe9a28d5c7bf50aa9a9da758ec",
"reference": "1b5fbfd0ff8484f7cc650978bfce4b8273633341", "reference": "e7a38fcc13e4ddfe9a28d5c7bf50aa9a9da758ec",
"shasum": "" "shasum": ""
}, },
"conflict": { "conflict": {
@ -1777,6 +1777,7 @@
"gilacms/gila": "<=1.15.4", "gilacms/gila": "<=1.15.4",
"gleez/cms": "<=1.3|==2", "gleez/cms": "<=1.3|==2",
"globalpayments/php-sdk": "<2", "globalpayments/php-sdk": "<2",
"goalgorilla/open_social": "<12.3.8|>=12.4,<12.4.5|>=13.0.0.0-alpha1,<13.0.0.0-alpha11",
"gogentooss/samlbase": "<1.2.7", "gogentooss/samlbase": "<1.2.7",
"google/protobuf": "<3.15", "google/protobuf": "<3.15",
"gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3", "gos/web-socket-bundle": "<1.10.4|>=2,<2.6.1|>=3,<3.3",
@ -1785,6 +1786,7 @@
"grumpydictator/firefly-iii": "<6.1.17", "grumpydictator/firefly-iii": "<6.1.17",
"gugoan/economizzer": "<=0.9.0.0-beta1", "gugoan/economizzer": "<=0.9.0.0-beta1",
"guzzlehttp/guzzle": "<6.5.8|>=7,<7.4.5", "guzzlehttp/guzzle": "<6.5.8|>=7,<7.4.5",
"guzzlehttp/oauth-subscriber": "<0.8.1",
"guzzlehttp/psr7": "<1.9.1|>=2,<2.4.5", "guzzlehttp/psr7": "<1.9.1|>=2,<2.4.5",
"haffner/jh_captcha": "<=2.1.3|>=3,<=3.0.2", "haffner/jh_captcha": "<=2.1.3|>=3,<=3.0.2",
"harvesthq/chosen": "<1.8.7", "harvesthq/chosen": "<1.8.7",
@ -1823,6 +1825,7 @@
"intelliants/subrion": "<4.2.2", "intelliants/subrion": "<4.2.2",
"inter-mediator/inter-mediator": "==5.5", "inter-mediator/inter-mediator": "==5.5",
"ipl/web": "<0.10.1", "ipl/web": "<0.10.1",
"islandora/crayfish": "<4.1",
"islandora/islandora": ">=2,<2.4.1", "islandora/islandora": ">=2,<2.4.1",
"ivankristianto/phpwhois": "<=4.3", "ivankristianto/phpwhois": "<=4.3",
"jackalope/jackalope-doctrine-dbal": "<1.7.4", "jackalope/jackalope-doctrine-dbal": "<1.7.4",
@ -1905,6 +1908,7 @@
"mediawiki/abuse-filter": "<1.39.9|>=1.40,<1.41.3|>=1.42,<1.42.2", "mediawiki/abuse-filter": "<1.39.9|>=1.40,<1.41.3|>=1.42,<1.42.2",
"mediawiki/cargo": "<3.6.1", "mediawiki/cargo": "<3.6.1",
"mediawiki/core": "<1.39.5|==1.40", "mediawiki/core": "<1.39.5|==1.40",
"mediawiki/data-transfer": ">=1.39,<1.39.11|>=1.41,<1.41.3|>=1.42,<1.42.2",
"mediawiki/matomo": "<2.4.3", "mediawiki/matomo": "<2.4.3",
"mediawiki/semantic-media-wiki": "<4.0.2", "mediawiki/semantic-media-wiki": "<4.0.2",
"melisplatform/melis-asset-manager": "<5.0.1", "melisplatform/melis-asset-manager": "<5.0.1",
@ -1945,6 +1949,8 @@
"neos/media-browser": "<7.3.19|>=8,<8.0.16|>=8.1,<8.1.11|>=8.2,<8.2.11|>=8.3,<8.3.9", "neos/media-browser": "<7.3.19|>=8,<8.0.16|>=8.1,<8.1.11|>=8.2,<8.2.11|>=8.3,<8.3.9",
"neos/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<5.3.10|>=7,<7.0.9|>=7.1,<7.1.7|>=7.2,<7.2.6|>=7.3,<7.3.4|>=8,<8.0.2", "neos/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<5.3.10|>=7,<7.0.9|>=7.1,<7.1.7|>=7.2,<7.2.6|>=7.3,<7.3.4|>=8,<8.0.2",
"neos/swiftmailer": "<5.4.5", "neos/swiftmailer": "<5.4.5",
"nesbot/carbon": "<2.72.6|>=3,<3.8.4",
"netcarver/textile": "<=4.1.2",
"netgen/tagsbundle": ">=3.4,<3.4.11|>=4,<4.0.15", "netgen/tagsbundle": ">=3.4,<3.4.11|>=4,<4.0.15",
"nette/application": ">=2,<2.0.19|>=2.1,<2.1.13|>=2.2,<2.2.10|>=2.3,<2.3.14|>=2.4,<2.4.16|>=3,<3.0.6", "nette/application": ">=2,<2.0.19|>=2.1,<2.1.13|>=2.2,<2.2.10|>=2.3,<2.3.14|>=2.4,<2.4.16|>=3,<3.0.6",
"nette/nette": ">=2,<2.0.19|>=2.1,<2.1.13", "nette/nette": ">=2,<2.0.19|>=2.1,<2.1.13",
@ -2009,10 +2015,10 @@
"phpmailer/phpmailer": "<6.5", "phpmailer/phpmailer": "<6.5",
"phpmussel/phpmussel": ">=1,<1.6", "phpmussel/phpmussel": ">=1,<1.6",
"phpmyadmin/phpmyadmin": "<5.2.1", "phpmyadmin/phpmyadmin": "<5.2.1",
"phpmyfaq/phpmyfaq": "<3.2.5|==3.2.5", "phpmyfaq/phpmyfaq": "<3.2.5|==3.2.5|>=3.2.10,<=4.0.1",
"phpoffice/common": "<0.2.9", "phpoffice/common": "<0.2.9",
"phpoffice/phpexcel": "<1.8.1", "phpoffice/phpexcel": "<1.8.1",
"phpoffice/phpspreadsheet": "<1.29.4|>=2,<2.1.3|>=2.2,<2.3.2|>=3.3,<3.4", "phpoffice/phpspreadsheet": "<=1.29.6|>=2,<=2.1.5|>=2.2,<=2.3.4|>=3,<3.7",
"phpseclib/phpseclib": "<2.0.47|>=3,<3.0.36", "phpseclib/phpseclib": "<2.0.47|>=3,<3.0.36",
"phpservermon/phpservermon": "<3.6", "phpservermon/phpservermon": "<3.6",
"phpsysinfo/phpsysinfo": "<3.4.3", "phpsysinfo/phpsysinfo": "<3.4.3",
@ -2098,7 +2104,7 @@
"silverstripe/cms": "<4.11.3", "silverstripe/cms": "<4.11.3",
"silverstripe/comments": ">=1.3,<3.1.1", "silverstripe/comments": ">=1.3,<3.1.1",
"silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3",
"silverstripe/framework": "<5.2.16", "silverstripe/framework": "<5.3.8",
"silverstripe/graphql": ">=2,<2.0.5|>=3,<3.8.2|>=4,<4.3.7|>=5,<5.1.3", "silverstripe/graphql": ">=2,<2.0.5|>=3,<3.8.2|>=4,<4.3.7|>=5,<5.1.3",
"silverstripe/hybridsessions": ">=1,<2.4.1|>=2.5,<2.5.1", "silverstripe/hybridsessions": ">=1,<2.4.1|>=2.5,<2.5.1",
"silverstripe/recipe-cms": ">=4.5,<4.5.3", "silverstripe/recipe-cms": ">=4.5,<4.5.3",
@ -2138,6 +2144,7 @@
"squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1",
"ssddanbrown/bookstack": "<24.05.1", "ssddanbrown/bookstack": "<24.05.1",
"starcitizentools/citizen-skin": ">=2.6.3,<2.31", "starcitizentools/citizen-skin": ">=2.6.3,<2.31",
"starcitizentools/tabber-neue": ">=1.9.1,<2.7.2",
"statamic/cms": "<=5.16", "statamic/cms": "<=5.16",
"stormpath/sdk": "<9.9.99", "stormpath/sdk": "<9.9.99",
"studio-42/elfinder": "<=2.1.64", "studio-42/elfinder": "<=2.1.64",
@ -2209,7 +2216,7 @@
"thelia/thelia": ">=2.1,<2.1.3", "thelia/thelia": ">=2.1,<2.1.3",
"theonedemon/phpwhois": "<=4.2.5", "theonedemon/phpwhois": "<=4.2.5",
"thinkcmf/thinkcmf": "<6.0.8", "thinkcmf/thinkcmf": "<6.0.8",
"thorsten/phpmyfaq": "<4", "thorsten/phpmyfaq": "<=4.0.1",
"tikiwiki/tiki-manager": "<=17.1", "tikiwiki/tiki-manager": "<=17.1",
"timber/timber": ">=0.16.6,<1.23.1|>=1.24,<1.24.1|>=2,<2.1", "timber/timber": ">=0.16.6,<1.23.1|>=1.24,<1.24.1|>=2,<2.1",
"tinymce/tinymce": "<7.2", "tinymce/tinymce": "<7.2",
@ -2229,13 +2236,20 @@
"twig/twig": "<3.11.2|>=3.12,<3.14.1", "twig/twig": "<3.11.2|>=3.12,<3.14.1",
"typo3/cms": "<9.5.29|>=10,<10.4.35|>=11,<11.5.23|>=12,<12.2", "typo3/cms": "<9.5.29|>=10,<10.4.35|>=11,<11.5.23|>=12,<12.2",
"typo3/cms-backend": "<4.1.14|>=4.2,<4.2.15|>=4.3,<4.3.7|>=4.4,<4.4.4|>=7,<=7.6.50|>=8,<=8.7.39|>=9,<=9.5.24|>=10,<10.4.46|>=11,<11.5.40|>=12,<12.4.21|>=13,<13.3.1", "typo3/cms-backend": "<4.1.14|>=4.2,<4.2.15|>=4.3,<4.3.7|>=4.4,<4.4.4|>=7,<=7.6.50|>=8,<=8.7.39|>=9,<=9.5.24|>=10,<10.4.46|>=11,<11.5.40|>=12,<12.4.21|>=13,<13.3.1",
"typo3/cms-core": "<=8.7.56|>=9,<=9.5.47|>=10,<=10.4.44|>=11,<=11.5.36|>=12,<=12.4.14|>=13,<=13.1", "typo3/cms-belog": ">=10,<=10.4.47|>=11,<=11.5.41|>=12,<=12.4.24|>=13,<=13.4.2",
"typo3/cms-beuser": ">=10,<=10.4.47|>=11,<=11.5.41|>=12,<=12.4.24|>=13,<=13.4.2",
"typo3/cms-core": "<=8.7.56|>=9,<=9.5.48|>=10,<=10.4.47|>=11,<=11.5.41|>=12,<=12.4.24|>=13,<=13.4.2",
"typo3/cms-dashboard": ">=10,<=10.4.47|>=11,<=11.5.41|>=12,<=12.4.24|>=13,<=13.4.2",
"typo3/cms-extbase": "<6.2.24|>=7,<7.6.8|==8.1.1", "typo3/cms-extbase": "<6.2.24|>=7,<7.6.8|==8.1.1",
"typo3/cms-extensionmanager": ">=10,<=10.4.47|>=11,<=11.5.41|>=12,<=12.4.24|>=13,<=13.4.2",
"typo3/cms-fluid": "<4.3.4|>=4.4,<4.4.1", "typo3/cms-fluid": "<4.3.4|>=4.4,<4.4.1",
"typo3/cms-form": ">=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.13|>=11,<=11.1", "typo3/cms-form": ">=8,<=8.7.39|>=9,<=9.5.24|>=10,<=10.4.47|>=11,<=11.5.41|>=12,<=12.4.24|>=13,<=13.4.2",
"typo3/cms-frontend": "<4.3.9|>=4.4,<4.4.5", "typo3/cms-frontend": "<4.3.9|>=4.4,<4.4.5",
"typo3/cms-install": "<4.1.14|>=4.2,<4.2.16|>=4.3,<4.3.9|>=4.4,<4.4.5|>=12.2,<12.4.8", "typo3/cms-indexed-search": ">=10,<=10.4.47|>=11,<=11.5.41|>=12,<=12.4.24|>=13,<=13.4.2",
"typo3/cms-install": "<4.1.14|>=4.2,<4.2.16|>=4.3,<4.3.9|>=4.4,<4.4.5|>=12.2,<12.4.8|==13.4.2",
"typo3/cms-lowlevel": ">=11,<=11.5.41",
"typo3/cms-rte-ckeditor": ">=9.5,<9.5.42|>=10,<10.4.39|>=11,<11.5.30", "typo3/cms-rte-ckeditor": ">=9.5,<9.5.42|>=10,<10.4.39|>=11,<11.5.30",
"typo3/cms-scheduler": ">=11,<=11.5.41",
"typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6", "typo3/flow": ">=1,<1.0.4|>=1.1,<1.1.1|>=2,<2.0.1|>=2.3,<2.3.16|>=3,<3.0.12|>=3.1,<3.1.10|>=3.2,<3.2.13|>=3.3,<3.3.13|>=4,<4.0.6",
"typo3/html-sanitizer": ">=1,<=1.5.2|>=2,<=2.1.3", "typo3/html-sanitizer": ">=1,<=1.5.2|>=2,<=2.1.3",
"typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.3.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3", "typo3/neos": ">=1.1,<1.1.3|>=1.2,<1.2.13|>=2,<2.0.4|>=2.3,<2.3.99|>=3,<3.0.20|>=3.1,<3.1.18|>=3.2,<3.2.14|>=3.3,<3.3.23|>=4,<4.0.17|>=4.1,<4.1.16|>=4.2,<4.2.12|>=4.3,<4.3.3",
@ -2293,7 +2307,7 @@
"xpressengine/xpressengine": "<3.0.15", "xpressengine/xpressengine": "<3.0.15",
"yab/quarx": "<2.4.5", "yab/quarx": "<2.4.5",
"yeswiki/yeswiki": "<=4.4.4", "yeswiki/yeswiki": "<=4.4.4",
"yetiforce/yetiforce-crm": "<=6.4", "yetiforce/yetiforce-crm": "<6.5",
"yidashi/yii2cmf": "<=2", "yidashi/yii2cmf": "<=2",
"yii2mod/yii2-cms": "<1.9.2", "yii2mod/yii2-cms": "<1.9.2",
"yiisoft/yii": "<1.1.29", "yiisoft/yii": "<1.1.29",
@ -2383,7 +2397,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-12-30T19:04:40+00:00" "time": "2025-01-15T23:05:13+00:00"
}, },
{ {
"name": "sebastian/diff", "name": "sebastian/diff",

View File

@ -19,9 +19,9 @@ OC.L10N.register(
"Link copied to the clipboard" : "Link in die Zwischenablage kopiert", "Link copied to the clipboard" : "Link in die Zwischenablage kopiert",
"Play" : "Abspielen", "Play" : "Abspielen",
"Stop" : "Stopp", "Stop" : "Stopp",
"Read" : "Gelesen", "Read" : "gehört",
"Open website" : "Webseite aufrufen", "Open website" : "Webseite aufrufen",
"Select" : "Wählen", "Select" : "Auswählen",
"Could not change the status of the episode" : "Kann den Status der Folge nicht ändern", "Could not change the status of the episode" : "Kann den Status der Folge nicht ändern",
"Read all" : "Alles lesen", "Read all" : "Alles lesen",
"Unread all" : "Ungelesen", "Unread all" : "Ungelesen",
@ -58,7 +58,7 @@ OC.L10N.register(
"Error loading feed" : "Fehler beim Laden des Feeds", "Error loading feed" : "Fehler beim Laden des Feeds",
"Missing required app" : "Benötigte App fehlt", "Missing required app" : "Benötigte App fehlt",
"Install GPodder Sync" : "Installiere GPodder Sync", "Install GPodder Sync" : "Installiere GPodder Sync",
"Pin some subscriptions to see their latest updates" : "Pinne einige Abonnements, um ihre neuesten Updates zu sehen", "Pin some subscriptions to see their latest updates" : "Markiere Abonnements, um die neuesten Updates zu sehen",
"No favorites" : "Keine Favoriten", "No favorites" : "Keine Favoriten",
"A browser extension conflict with RePod" : "Ein Browser-Plugin Problem mit RePod" "A browser extension conflict with RePod" : "Ein Browser-Plugin Problem mit RePod"
}, },

View File

@ -17,9 +17,9 @@
"Link copied to the clipboard" : "Link in die Zwischenablage kopiert", "Link copied to the clipboard" : "Link in die Zwischenablage kopiert",
"Play" : "Abspielen", "Play" : "Abspielen",
"Stop" : "Stopp", "Stop" : "Stopp",
"Read" : "Gelesen", "Read" : "gehört",
"Open website" : "Webseite aufrufen", "Open website" : "Webseite aufrufen",
"Select" : "Wählen", "Select" : "Auswählen",
"Could not change the status of the episode" : "Kann den Status der Folge nicht ändern", "Could not change the status of the episode" : "Kann den Status der Folge nicht ändern",
"Read all" : "Alles lesen", "Read all" : "Alles lesen",
"Unread all" : "Ungelesen", "Unread all" : "Ungelesen",
@ -56,7 +56,7 @@
"Error loading feed" : "Fehler beim Laden des Feeds", "Error loading feed" : "Fehler beim Laden des Feeds",
"Missing required app" : "Benötigte App fehlt", "Missing required app" : "Benötigte App fehlt",
"Install GPodder Sync" : "Installiere GPodder Sync", "Install GPodder Sync" : "Installiere GPodder Sync",
"Pin some subscriptions to see their latest updates" : "Pinne einige Abonnements, um ihre neuesten Updates zu sehen", "Pin some subscriptions to see their latest updates" : "Markiere Abonnements, um die neuesten Updates zu sehen",
"No favorites" : "Keine Favoriten", "No favorites" : "Keine Favoriten",
"A browser extension conflict with RePod" : "Ein Browser-Plugin Problem mit RePod" "A browser extension conflict with RePod" : "Ein Browser-Plugin Problem mit RePod"
},"pluralForm" :"nplurals=2; plural=n != 1;" },"pluralForm" :"nplurals=2; plural=n != 1;"

View File

@ -40,7 +40,10 @@ class EpisodesController extends Controller
usort($episodes, fn (EpisodeActionExtraData $a, EpisodeActionExtraData $b): int => $b->getPubDate() <=> $a->getPubDate()); usort($episodes, fn (EpisodeActionExtraData $a, EpisodeActionExtraData $b): int => $b->getPubDate() <=> $a->getPubDate());
$episodes = array_values(array_intersect_key($episodes, array_unique(array_map(fn (EpisodeActionExtraData $episode): string => $episode->getGuid(), $episodes)))); $episodes = array_values(array_intersect_key($episodes, array_unique(array_map(fn (EpisodeActionExtraData $episode): string => $episode->getGuid(), $episodes))));
return new JSONResponse($episodes, $feed->getStatusCode()); /** @var Http::STATUS_* $returnStatusCode */
$returnStatusCode = $feed->getStatusCode();
return new JSONResponse($episodes, $returnStatusCode);
} }
#[NoAdminRequired] #[NoAdminRequired]

View File

@ -12,7 +12,6 @@ use OCP\AppFramework\Http\Attribute\NoCSRFRequired;
use OCP\AppFramework\Http\ContentSecurityPolicy; use OCP\AppFramework\Http\ContentSecurityPolicy;
use OCP\AppFramework\Http\TemplateResponse; use OCP\AppFramework\Http\TemplateResponse;
use OCP\IRequest; use OCP\IRequest;
use OCP\Util;
class PageController extends Controller class PageController extends Controller
{ {
@ -26,9 +25,6 @@ class PageController extends Controller
#[NoCSRFRequired] #[NoCSRFRequired]
#[FrontpageRoute(verb: 'GET', url: '/')] #[FrontpageRoute(verb: 'GET', url: '/')]
public function index(): TemplateResponse { public function index(): TemplateResponse {
Util::addScript(Application::APP_ID, Application::APP_ID.'-main');
Util::addStyle(Application::APP_ID, Application::APP_ID.'-main');
$csp = new ContentSecurityPolicy(); $csp = new ContentSecurityPolicy();
$csp->addAllowedImageDomain('*'); $csp->addAllowedImageDomain('*');
$csp->addAllowedMediaDomain('*'); $csp->addAllowedMediaDomain('*');

View File

@ -8,6 +8,7 @@ use OCA\GPodderSync\Core\PodcastData\PodcastData;
use OCA\GPodderSync\Core\PodcastData\PodcastDataReader; use OCA\GPodderSync\Core\PodcastData\PodcastDataReader;
use OCA\RePod\AppInfo\Application; use OCA\RePod\AppInfo\Application;
use OCP\AppFramework\Controller; use OCP\AppFramework\Controller;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\Attribute\FrontpageRoute; use OCP\AppFramework\Http\Attribute\FrontpageRoute;
use OCP\AppFramework\Http\Attribute\NoAdminRequired; use OCP\AppFramework\Http\Attribute\NoAdminRequired;
use OCP\AppFramework\Http\Attribute\NoCSRFRequired; use OCP\AppFramework\Http\Attribute\NoCSRFRequired;
@ -55,6 +56,9 @@ class PodcastController extends Controller
} }
} }
return new JSONResponse($podcast, $feed->getStatusCode()); /** @var Http::STATUS_* $returnStatusCode */
$returnStatusCode = $feed->getStatusCode();
return new JSONResponse($podcast, $returnStatusCode);
} }
} }

View File

@ -18,6 +18,7 @@ use OCA\GPodderSync\Core\EpisodeAction\EpisodeAction;
* name: string, * name: string,
* link: ?string, * link: ?string,
* image: ?string, * image: ?string,
* author: ?string,
* description: ?string, * description: ?string,
* fetchedAtUnix: int, * fetchedAtUnix: int,
* guid: string, * guid: string,
@ -36,6 +37,7 @@ class EpisodeActionExtraData implements \JsonSerializable, \Stringable
private readonly string $name, private readonly string $name,
private readonly ?string $link, private readonly ?string $link,
private readonly ?string $image, private readonly ?string $image,
private readonly ?string $author,
private readonly ?string $description, private readonly ?string $description,
private readonly int $fetchedAtUnix, private readonly int $fetchedAtUnix,
private readonly string $guid, private readonly string $guid,
@ -70,6 +72,10 @@ class EpisodeActionExtraData implements \JsonSerializable, \Stringable
return $this->image; return $this->image;
} }
public function getAuthor(): ?string {
return $this->author;
}
public function getDescription(): ?string { public function getDescription(): ?string {
return $this->description; return $this->description;
} }
@ -113,6 +119,7 @@ class EpisodeActionExtraData implements \JsonSerializable, \Stringable
'name' => $this->name, 'name' => $this->name,
'link' => $this->link, 'link' => $this->link,
'image' => $this->image, 'image' => $this->image,
'author' => $this->author,
'description' => $this->description, 'description' => $this->description,
'fetchedAtUnix' => $this->fetchedAtUnix, 'fetchedAtUnix' => $this->fetchedAtUnix,
'guid' => $this->guid, 'guid' => $this->guid,

View File

@ -81,6 +81,13 @@ class EpisodeActionReader extends CoreEpisodeActionReader
} }
} }
// Get episode author
if (isset($iTunesItemChildren)) {
$author = $this->stringOrNull($iTunesItemChildren->author);
} else {
$author = $this->stringOrNull($item->author);
}
// Get episode description // Get episode description
$itemContent = $item->children('content', true); $itemContent = $item->children('content', true);
if (isset($itemContent)) { if (isset($itemContent)) {
@ -116,6 +123,7 @@ class EpisodeActionReader extends CoreEpisodeActionReader
$name, $name,
$link, $link,
$image, $image,
$author,
$description, $description,
$fetchedAtUnix ?? (new \DateTime())->getTimestamp(), $fetchedAtUnix ?? (new \DateTime())->getTimestamp(),
$guid, $guid,

1510
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -16,18 +16,18 @@
], ],
"prettier": "@nextcloud/prettier-config", "prettier": "@nextcloud/prettier-config",
"dependencies": { "dependencies": {
"@formatjs/intl-segmenter": "^11.7.7", "@formatjs/intl-segmenter": "^11.7.8",
"@nextcloud/axios": "^2.5.1", "@nextcloud/axios": "^2.5.1",
"@nextcloud/initial-state": "^2.2.0", "@nextcloud/initial-state": "^2.2.0",
"@nextcloud/l10n": "^3.1.0", "@nextcloud/l10n": "^3.1.0",
"@nextcloud/router": "^3.0.1", "@nextcloud/router": "^3.0.1",
"@nextcloud/vite-config": "^2.2.2", "@nextcloud/vite-config": "^2.3.0",
"@nextcloud/vue": "9.0.0-alpha.5", "@nextcloud/vue": "9.0.0-alpha.6",
"dompurify": "^3.2.3", "dompurify": "^3.2.3",
"linkify-html": "^4.2.0", "linkify-html": "^4.2.0",
"pinia": "^2.3.0", "pinia": "^2.3.1",
"toastify-js": "^1.12.0", "toastify-js": "^1.12.0",
"vite": "~5.4.11", "vite": "~5.4.13",
"vue": "^3.5.13", "vue": "^3.5.13",
"vue-material-design-icons": "^5.3.1", "vue-material-design-icons": "^5.3.1",
"vue-router": "^4.5.0" "vue-router": "^4.5.0"
@ -38,11 +38,10 @@
"@nextcloud/prettier-config": "^1.1.0", "@nextcloud/prettier-config": "^1.1.0",
"@nextcloud/stylelint-config": "^3.0.1", "@nextcloud/stylelint-config": "^3.0.1",
"@types/toastify-js": "^1.12.3", "@types/toastify-js": "^1.12.3",
"@vue/eslint-config-typescript": "~13.0.0",
"@vue/tsconfig": "^0.7.0", "@vue/tsconfig": "^0.7.0",
"eslint-config-prettier": "^9.1.0", "eslint-config-prettier": "^10.0.1",
"eslint-plugin-pinia": "^0.4.1", "eslint-plugin-pinia": "^0.4.1",
"eslint-plugin-prettier": "^5.2.1", "eslint-plugin-prettier": "^5.2.3",
"typescript": "~5.5.4", "typescript": "~5.5.4",
"vue-tsc": "^2.2.0" "vue-tsc": "^2.2.0"
} }

View File

@ -6,6 +6,8 @@
:size="256" :size="256"
:url="episode.image" /> :url="episode.image" />
<h2>{{ episode.name }}</h2> <h2>{{ episode.name }}</h2>
<i v-if="episode.author">{{ episode.author }}</i>
<br />
<SafeHtml :source="episode.description || ''" /> <SafeHtml :source="episode.description || ''" />
<div class="flex"> <div class="flex">
<NcButton v-if="episode.link" :href="episode.link" target="_blank"> <NcButton v-if="episode.link" :href="episode.link" target="_blank">

View File

@ -12,7 +12,7 @@
:one-line="oneLine" :one-line="oneLine"
:style="{ opacity: hasEnded(episode) ? 0.4 : 1 }" :style="{ opacity: hasEnded(episode) ? 0.4 : 1 }"
@click="modalEpisode = episode"> @click="modalEpisode = episode">
<template #actions> <template #extra-actions>
<NcActionButton <NcActionButton
v-if="!isCurrentEpisode(episode)" v-if="!isCurrentEpisode(episode)"
:aria-label="t('repod', 'Play')" :aria-label="t('repod', 'Play')"
@ -32,43 +32,43 @@
</template> </template>
</NcActionButton> </NcActionButton>
</template> </template>
<template #actions>
<NcActionButton
v-if="episode.duration"
:aria-label="t('repod', 'Read')"
:disabled="loading"
:model-value="hasEnded(episode)"
:name="t('repod', 'Read')"
:title="t('repod', 'Read')"
@click="read(episode, !hasEnded(episode))">
<template #icon>
<PlaylistPlayIcon v-if="!hasEnded(episode)" :size="20" />
<PlaylistRemoveIcon v-if="hasEnded(episode)" :size="20" />
</template>
</NcActionButton>
<NcActionLink
v-if="episode.link"
:href="episode.link"
:name="t('repod', 'Open website')"
target="_blank"
:title="t('repod', 'Open website')">
<template #icon>
<OpenInNewIcon :size="20" />
</template>
</NcActionLink>
<NcActionLink
v-if="episode.url"
:download="filenameFromUrl(episode.url)"
:href="episode.url"
:name="t('repod', 'Download')"
target="_blank"
:title="t('repod', 'Download')">
<template #icon>
<DownloadIcon :size="20" />
</template>
</NcActionLink>
</template>
<template #extra> <template #extra>
<NcActions v-if="displayActions">
<NcActionButton
v-if="episode.duration"
:aria-label="t('repod', 'Read')"
:disabled="loading"
:model-value="hasEnded(episode)"
:name="t('repod', 'Read')"
:title="t('repod', 'Read')"
@click="read(episode, !hasEnded(episode))">
<template #icon>
<PlaylistPlayIcon v-if="!hasEnded(episode)" :size="20" />
<PlaylistRemoveIcon v-if="hasEnded(episode)" :size="20" />
</template>
</NcActionButton>
<NcActionLink
v-if="episode.link"
:href="episode.link"
:name="t('repod', 'Open website')"
target="_blank"
:title="t('repod', 'Open website')">
<template #icon>
<OpenInNewIcon :size="20" />
</template>
</NcActionLink>
<NcActionLink
v-if="episode.url"
:download="filenameFromUrl(episode.url)"
:href="episode.url"
:name="t('repod', 'Download')"
target="_blank"
:title="t('repod', 'Download')">
<template #icon>
<DownloadIcon :size="20" />
</template>
</NcActionLink>
</NcActions>
<NcModal v-if="modalEpisode" @close="modalEpisode = null"> <NcModal v-if="modalEpisode" @close="modalEpisode = null">
<Modal :episode="episode" /> <Modal :episode="episode" />
</NcModal> </NcModal>
@ -86,13 +86,18 @@
</NcAvatar> </NcAvatar>
</template> </template>
<template #indicator> <template #indicator>
<NcProgressBar <div class="indicator">
v-if="episode.action && isListening(episode) && !oneLine" <NcProgressBar
class="progress" v-if="episode.action && isListening(episode) && !oneLine"
:value="(episode.action.position * 100) / episode.action.total" /> class="progress"
:value="
(episode.action.position * 100) / episode.action.total
" />
{{ episode.duration }}
</div>
</template> </template>
<template #subname> <template #subname>
{{ episode.duration }} {{ !oneLine ? episode.author : '' }}
</template> </template>
</NcListItem> </NcListItem>
</template> </template>
@ -101,7 +106,6 @@
import { import {
NcActionButton, NcActionButton,
NcActionLink, NcActionLink,
NcActions,
NcAvatar, NcAvatar,
NcListItem, NcListItem,
NcModal, NcModal,
@ -134,7 +138,6 @@ export default {
Modal, Modal,
NcActionButton, NcActionButton,
NcActionLink, NcActionLink,
NcActions,
NcAvatar, NcAvatar,
NcListItem, NcListItem,
NcModal, NcModal,
@ -146,10 +149,6 @@ export default {
StopIcon, StopIcon,
}, },
props: { props: {
displayActions: {
type: Boolean,
default: true,
},
episode: { episode: {
type: Object as () => EpisodeInterface, type: Object as () => EpisodeInterface,
required: true, required: true,
@ -207,13 +206,14 @@ export default {
.progress { .progress {
margin-top: 0.4rem; margin-top: 0.4rem;
} }
.indicator {
display: flex;
gap: 1rem;
}
</style> </style>
<style> <style>
.episode .list-item-content__name {
max-width: 100%;
}
.episode .list-item-content__subname { .episode .list-item-content__subname {
flex-basis: auto; flex-basis: auto;
flex-grow: 0; flex-grow: 0;

View File

@ -61,6 +61,7 @@
episodes.filter((e: EpisodeInterface) => e.selected) episodes.filter((e: EpisodeInterface) => e.selected)
.length < episodes.length .length < episodes.length
" "
class="avatar"
:display-name="t('repod', 'Select all')" :display-name="t('repod', 'Select all')"
:is-no-user="true"> :is-no-user="true">
<template #icon> <template #icon>
@ -75,6 +76,7 @@
episodes.filter((e: EpisodeInterface) => e.selected) episodes.filter((e: EpisodeInterface) => e.selected)
.length >= episodes.length .length >= episodes.length
" "
class="avatar"
:display-name="t('repod', 'Unselect all')" :display-name="t('repod', 'Unselect all')"
:is-no-user="true"> :is-no-user="true">
<template #icon> <template #icon>
@ -89,9 +91,6 @@
<Episode <Episode
v-for="episode in filteredEpisodes" v-for="episode in filteredEpisodes"
:key="episode.guid" :key="episode.guid"
:display-actions="
episodes.every((e: EpisodeInterface) => !e.selected)
"
:episode="episode" :episode="episode"
:url="url" :url="url"
@select="episode.selected = !episode.selected" /> @select="episode.selected = !episode.selected" />
@ -217,6 +216,10 @@ export default {
</script> </script>
<style scoped> <style scoped>
.avatar {
color: var(--color-main-text);
}
.progress { .progress {
margin-top: 0.4rem; margin-top: 0.4rem;
} }

View File

@ -3,7 +3,10 @@
<template #extra> <template #extra>
<div class="extra"> <div class="extra">
<MinusIcon class="pointer" :size="20" @click="changeRate(-0.1)" /> <MinusIcon class="pointer" :size="20" @click="changeRate(-0.1)" />
<NcCounterBubble class="counter">x{{ rate }}</NcCounterBubble> <NcCounterBubble
:active="rate !== 1"
class="counter"
:count="rate" />
<PlusIcon class="pointer" :size="20" @click="changeRate(0.1)" /> <PlusIcon class="pointer" :size="20" @click="changeRate(0.1)" />
</div> </div>
</template> </template>

View File

@ -9,7 +9,7 @@
:model-value="feed?.isFavorite" :model-value="feed?.isFavorite"
:name="t('repod', 'Favorite')" :name="t('repod', 'Favorite')"
:title="t('repod', 'Favorite')" :title="t('repod', 'Favorite')"
@update:modelValue="switchFavorite($event)"> @update:model-value="switchFavorite($event)">
<template #icon> <template #icon>
<StarPlusIcon v-if="!feed?.isFavorite" :size="20" /> <StarPlusIcon v-if="!feed?.isFavorite" :size="20" />
<StarRemoveIcon v-if="feed?.isFavorite" :size="20" /> <StarRemoveIcon v-if="feed?.isFavorite" :size="20" />
@ -29,9 +29,10 @@
<NcAvatar <NcAvatar
:display-name="feed?.data?.author || feed?.data?.title" :display-name="feed?.data?.author || feed?.data?.title"
:is-no-user="true" :is-no-user="true"
:size="20"
:title="feed?.data?.author" :title="feed?.data?.author"
:url="feed?.data?.imageUrl" /> :url="feed?.data?.imageUrl" />
<StarIcon v-if="feed?.isFavorite" class="star" :size="20" /> <StarIcon v-if="feed?.isFavorite" class="star" :size="10" />
<AlertIcon v-if="failed" /> <AlertIcon v-if="failed" />
</template> </template>
</NcAppNavigationItem> </NcAppNavigationItem>

View File

@ -48,6 +48,34 @@ export const usePlayer = defineStore('player', {
conflict() { conflict() {
this.playCount = 0 this.playCount = 0
}, },
metadatas(episode: EpisodeInterface) {
// https://developer.mozilla.org/en-US/docs/Web/API/Media_Session_API
navigator.mediaSession.metadata = new MediaMetadata({
title: episode.name,
artist: episode.author,
album: episode.title,
artwork: episode.image ? [{ src: episode.image }] : [],
})
navigator.mediaSession.setActionHandler('play', this.play)
navigator.mediaSession.setActionHandler('pause', this.pause)
navigator.mediaSession.setActionHandler('stop', this.stop)
navigator.mediaSession.setActionHandler(
'seekbackward',
(details: MediaSessionActionDetails) =>
this.seek(audio.currentTime - (details.seekOffset || 10)),
)
navigator.mediaSession.setActionHandler(
'seekforward',
(details: MediaSessionActionDetails) =>
this.seek(audio.currentTime + (details.seekOffset || 30)),
)
navigator.mediaSession.setActionHandler(
'seekto',
(details: MediaSessionActionDetails) =>
!details.fastSeek && this.seek(details.seekTime || 0),
)
},
async load(episode: EpisodeInterface | null, podcastUrl?: string) { async load(episode: EpisodeInterface | null, podcastUrl?: string) {
this.episode = episode this.episode = episode
this.podcastUrl = podcastUrl || null this.podcastUrl = podcastUrl || null
@ -75,6 +103,7 @@ export const usePlayer = defineStore('player', {
} }
audio.play() audio.play()
this.metadatas(this.episode)
} else { } else {
this.loaded = false this.loaded = false
this.podcastUrl = null this.podcastUrl = null

View File

@ -9,9 +9,12 @@ export const useSettings = defineStore('settings', {
return { return {
filters: { filters: {
listened: !!filters.listened, listened:
listening: !!filters.listening, filters.listened === undefined ? true : filters.listened,
unlistened: !!filters.unlistened, listening:
filters.listening === undefined ? true : filters.listening,
unlistened:
filters.unlistened === undefined ? true : filters.unlistened,
}, },
} }
} catch { } catch {

View File

@ -16,6 +16,7 @@ export interface EpisodeInterface {
name: string name: string
link?: string link?: string
image?: string image?: string
author?: string
description?: string description?: string
fetchedAtUnix: number fetchedAtUnix: number
guid: string guid: string

View File

@ -1 +1,10 @@
<?php
use OCA\RePod\AppInfo\Application;
use OCP\Util;
Util::addScript(Application::APP_ID, Application::APP_ID.'-main');
Util::addStyle(Application::APP_ID, Application::APP_ID.'-main');
?>
<div id="content"></div> <div id="content"></div>

View File

@ -3,13 +3,13 @@
# This file is distributed under the same license as the Nextcloud package. # This file is distributed under the same license as the Nextcloud package.
# OiledAmoeba <florian+crystalyx@ruhnke.cloud>, 2024. # OiledAmoeba <florian+crystalyx@ruhnke.cloud>, 2024.
# Michel Roux <xefir@crystalyx.net>, 2024. # Michel Roux <xefir@crystalyx.net>, 2024.
# markus phi <repodtranslate@solinetcafe.org>, 2024. # markus phi <repodtranslate@solinetcafe.org>, 2024, 2025.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Nextcloud 3.14159\n" "Project-Id-Version: Nextcloud 3.14159\n"
"Report-Msgid-Bugs-To: translations\\@example.com\n" "Report-Msgid-Bugs-To: translations\\@example.com\n"
"POT-Creation-Date: 2024-12-11 20:03+0000\n" "POT-Creation-Date: 2025-01-10 22:55+0000\n"
"PO-Revision-Date: 2024-12-25 21:02+0000\n" "PO-Revision-Date: 2025-01-04 19:02+0000\n"
"Last-Translator: markus phi <repodtranslate@solinetcafe.org>\n" "Last-Translator: markus phi <repodtranslate@solinetcafe.org>\n"
"Language-Team: German <https://translate.crystalyx.net/projects/repod/gitea/" "Language-Team: German <https://translate.crystalyx.net/projects/repod/gitea/"
"de/>\n" "de/>\n"
@ -58,8 +58,8 @@ msgstr ""
"## Funktionen\n" "## Funktionen\n"
"- 🔍 Durchsuchen und abonnieren einer großen Sammlung von Podcasts\n" "- 🔍 Durchsuchen und abonnieren einer großen Sammlung von Podcasts\n"
"- 🔊 Episoden direkt in Nextcloud anhören\n" "- 🔊 Episoden direkt in Nextcloud anhören\n"
"- 🌐 Synchronisiere deine Aktivität mit [AntennaPod](https://antennapod.org/)" "- 🌐 Synchronisiere deine Aktivität mit [AntennaPod](https://antennapod."
"\n" "org/)\n"
"- 📱 Handy-freundliche Schnittstelle\n" "- 📱 Handy-freundliche Schnittstelle\n"
"- 📡 Importieren und Exportieren Ihrer Abonnements\n" "- 📡 Importieren und Exportieren Ihrer Abonnements\n"
"- ➡️ Vollständiger Funktionsvergleich [hier](https://git.crystalyx.net/Xefir/" "- ➡️ Vollständiger Funktionsvergleich [hier](https://git.crystalyx.net/Xefir/"
@ -133,9 +133,8 @@ msgstr "Stopp"
#: /app/specialVueFakeDummyForL10nScript.js:20 #: /app/specialVueFakeDummyForL10nScript.js:20
#: /app/specialVueFakeDummyForL10nScript.js:21 #: /app/specialVueFakeDummyForL10nScript.js:21
#: /app/specialVueFakeDummyForL10nScript.js:22 #: /app/specialVueFakeDummyForL10nScript.js:22
#, fuzzy
msgid "Read" msgid "Read"
msgstr "Gelesen" msgstr "gehört"
#: /app/specialVueFakeDummyForL10nScript.js:23 #: /app/specialVueFakeDummyForL10nScript.js:23
#: /app/specialVueFakeDummyForL10nScript.js:24 #: /app/specialVueFakeDummyForL10nScript.js:24
@ -143,9 +142,8 @@ msgid "Open website"
msgstr "Webseite aufrufen" msgstr "Webseite aufrufen"
#: /app/specialVueFakeDummyForL10nScript.js:27 #: /app/specialVueFakeDummyForL10nScript.js:27
#, fuzzy
msgid "Select" msgid "Select"
msgstr "Wählen" msgstr "Auswählen"
#: /app/specialVueFakeDummyForL10nScript.js:28 #: /app/specialVueFakeDummyForL10nScript.js:28
#: /app/specialVueFakeDummyForL10nScript.js:38 #: /app/specialVueFakeDummyForL10nScript.js:38
@ -309,14 +307,13 @@ msgid "Install GPodder Sync"
msgstr "Installiere GPodder Sync" msgstr "Installiere GPodder Sync"
#: /app/specialVueFakeDummyForL10nScript.js:75 #: /app/specialVueFakeDummyForL10nScript.js:75
#, fuzzy
msgid "Pin some subscriptions to see their latest updates" msgid "Pin some subscriptions to see their latest updates"
msgstr "Pinne einige Abonnements, um ihre neuesten Updates zu sehen" msgstr "Markiere Abonnements, um die neuesten Updates zu sehen"
#: /app/specialVueFakeDummyForL10nScript.js:76 #: /app/specialVueFakeDummyForL10nScript.js:76
msgid "No favorites" msgid "No favorites"
msgstr "Keine Favoriten" msgstr "Keine Favoriten"
#: /app/src/store/player.ts:93 #: /app/src/store/player.ts:122
msgid "A browser extension conflict with RePod" msgid "A browser extension conflict with RePod"
msgstr "Ein Browser-Plugin Problem mit RePod" msgstr "Ein Browser-Plugin Problem mit RePod"

View File

@ -6,7 +6,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Nextcloud 3.14159\n" "Project-Id-Version: Nextcloud 3.14159\n"
"Report-Msgid-Bugs-To: translations\\@example.com\n" "Report-Msgid-Bugs-To: translations\\@example.com\n"
"POT-Creation-Date: 2024-12-11 20:03+0000\n" "POT-Creation-Date: 2025-01-10 22:55+0000\n"
"PO-Revision-Date: 2024-12-11 20:06+0000\n" "PO-Revision-Date: 2024-12-11 20:06+0000\n"
"Last-Translator: Michel Roux <xefir@crystalyx.net>\n" "Last-Translator: Michel Roux <xefir@crystalyx.net>\n"
"Language-Team: French <https://translate.crystalyx.net/projects/repod/gitea/" "Language-Team: French <https://translate.crystalyx.net/projects/repod/gitea/"
@ -313,6 +313,6 @@ msgstr ""
msgid "No favorites" msgid "No favorites"
msgstr "Aucun favoris" msgstr "Aucun favoris"
#: /app/src/store/player.ts:93 #: /app/src/store/player.ts:122
msgid "A browser extension conflict with RePod" msgid "A browser extension conflict with RePod"
msgstr "Une extension de votre navigateur entre en conflit avec RePod" msgstr "Une extension de votre navigateur entre en conflit avec RePod"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Nextcloud 3.14159\n" "Project-Id-Version: Nextcloud 3.14159\n"
"Report-Msgid-Bugs-To: translations\\@example.com\n" "Report-Msgid-Bugs-To: translations\\@example.com\n"
"POT-Creation-Date: 2024-12-11 20:03+0000\n" "POT-Creation-Date: 2025-01-10 22:55+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -298,6 +298,6 @@ msgstr ""
msgid "No favorites" msgid "No favorites"
msgstr "" msgstr ""
#: /app/src/store/player.ts:93 #: /app/src/store/player.ts:122
msgid "A browser extension conflict with RePod" msgid "A browser extension conflict with RePod"
msgstr "" msgstr ""