fix: episode listing crashing if an invalid publication date is present in the RSS
Some checks failed
repod / nodejs (push) Waiting to run
repod / release (push) Waiting to run
repod / xml (push) Successful in 39s
repod / php (push) Has been cancelled

This commit is contained in:
Michel Roux 2024-02-01 22:30:20 +01:00
parent abf73c0ce9
commit d808ac0609
8 changed files with 51 additions and 40 deletions

View File

@ -1,3 +1,11 @@
## 1.5.3 - 2024-02-01
### Changed
- Update @nextcloud/vue to v8.6.1
### Fixed
- Fix episode listing crashing if an invalid publication date is present in the RSS
## 1.5.2 - 2024-02-01 ## 1.5.2 - 2024-02-01
### Changed ### Changed

View File

@ -11,7 +11,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>1.5.2</version> <version>1.5.3</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>

View File

@ -3,11 +3,11 @@
"description": "🔊 Browse, manage and listen to podcasts", "description": "🔊 Browse, manage and listen to podcasts",
"type": "project", "type": "project",
"license": "AGPL-3.0-or-later", "license": "AGPL-3.0-or-later",
"version": "1.5.2", "version": "1.5.3",
"require-dev": { "require-dev": {
"nextcloud/ocp": "^28.0.1", "nextcloud/ocp": "^28.0.1",
"psalm/phar": "^5.21.1", "psalm/phar": "^5.21.1",
"nextcloud/coding-standard": "^v1.2.0" "nextcloud/coding-standard": "v1.2.1"
}, },
"scripts": { "scripts": {
"lint": "find . -name \\*.php -not -path './vendor/*' -print0 | xargs -0 -n1 php -l", "lint": "find . -name \\*.php -not -path './vendor/*' -print0 | xargs -0 -n1 php -l",

14
composer.lock generated
View File

@ -4,21 +4,21 @@
"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": "f3354db16358ec4a9e1cd09f8d24b2c2", "content-hash": "541949d4ff9cb82157134483415930b6",
"packages": [], "packages": [],
"packages-dev": [ "packages-dev": [
{ {
"name": "nextcloud/coding-standard", "name": "nextcloud/coding-standard",
"version": "v1.2.0", "version": "v1.2.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/nextcloud/coding-standard.git", "url": "https://github.com/nextcloud/coding-standard.git",
"reference": "424cdd9e3befacd71fdd923cb52ccb3693de0e1a" "reference": "cf5f18d989ec62fb4cdc7fc92a36baf34b3d829e"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/nextcloud/coding-standard/zipball/424cdd9e3befacd71fdd923cb52ccb3693de0e1a", "url": "https://api.github.com/repos/nextcloud/coding-standard/zipball/cf5f18d989ec62fb4cdc7fc92a36baf34b3d829e",
"reference": "424cdd9e3befacd71fdd923cb52ccb3693de0e1a", "reference": "cf5f18d989ec62fb4cdc7fc92a36baf34b3d829e",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -44,9 +44,9 @@
"description": "Nextcloud coding standards for the php cs fixer", "description": "Nextcloud coding standards for the php cs fixer",
"support": { "support": {
"issues": "https://github.com/nextcloud/coding-standard/issues", "issues": "https://github.com/nextcloud/coding-standard/issues",
"source": "https://github.com/nextcloud/coding-standard/tree/v1.2.0" "source": "https://github.com/nextcloud/coding-standard/tree/v1.2.1"
}, },
"time": "2024-02-01T12:54:46+00:00" "time": "2024-02-01T14:54:37+00:00"
}, },
{ {
"name": "nextcloud/ocp", "name": "nextcloud/ocp",

View File

@ -99,8 +99,14 @@ class EpisodeActionReader extends CoreEpisodeActionReader
} }
// Get episode pubDate // Get episode pubDate
$rawPubDate = $this->stringOrNull($item->pubDate); $pubDate = $this->stringOrNull($item->pubDate);
$pubDate = isset($rawPubDate) ? new \DateTime($rawPubDate) : null; if (isset($pubDate)) {
try {
$pubDate = new \DateTime($pubDate);
} catch (\Exception $e) {
$pubDate = null;
}
}
$episodes[] = new EpisodeActionExtraData( $episodes[] = new EpisodeActionExtraData(
$title, $title,

45
package-lock.json generated
View File

@ -1,12 +1,12 @@
{ {
"name": "repod", "name": "repod",
"version": "1.5.2", "version": "1.5.3",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "repod", "name": "repod",
"version": "1.5.2", "version": "1.5.3",
"license": "agpl", "license": "agpl",
"dependencies": { "dependencies": {
"@nextcloud/axios": "^2.4.0", "@nextcloud/axios": "^2.4.0",
@ -14,7 +14,7 @@
"@nextcloud/initial-state": "^2.1.0", "@nextcloud/initial-state": "^2.1.0",
"@nextcloud/l10n": "^2.2.0", "@nextcloud/l10n": "^2.2.0",
"@nextcloud/router": "^3.0.0", "@nextcloud/router": "^3.0.0",
"@nextcloud/vue": "^8.6.0", "@nextcloud/vue": "^8.6.1",
"vue": "^2", "vue": "^2",
"vue-material-design-icons": "^5.3.0", "vue-material-design-icons": "^5.3.0",
"vue-router": "^3", "vue-router": "^3",
@ -3333,9 +3333,9 @@
} }
}, },
"node_modules/@nextcloud/vue": { "node_modules/@nextcloud/vue": {
"version": "8.6.0", "version": "8.6.1",
"resolved": "https://registry.npmjs.org/@nextcloud/vue/-/vue-8.6.0.tgz", "resolved": "https://registry.npmjs.org/@nextcloud/vue/-/vue-8.6.1.tgz",
"integrity": "sha512-0nW8qHvPHAmF/NuWWMiYnWSGNNtDAtfev3OK/mjcwru6G6lBRlEcxHleud03d8f4FMEReLpgdtVcAPNLORPEnQ==", "integrity": "sha512-CPPo3A1Az0DDRNI0pn7w6Yn8pJtEDktTXnrfym2Pd+lTzqTj4P2ywf+spArXMHu0BPIB95Eero7XlCiRpmhg/g==",
"dependencies": { "dependencies": {
"@floating-ui/dom": "^1.1.0", "@floating-ui/dom": "^1.1.0",
"@linusborg/vue-simple-portal": "^0.1.5", "@linusborg/vue-simple-portal": "^0.1.5",
@ -3750,9 +3750,9 @@
"integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g=="
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "20.11.15", "version": "20.11.16",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.15.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.16.tgz",
"integrity": "sha512-gscmuADZfvNULx1eyirVbr3kVOVZtpQtzKMCZpeSZcN6MfbkRXAR4s9/gsQ4CzxLHw6EStDtKLNtSDL3vbq05A==", "integrity": "sha512-gKb0enTmRCzXSSUJDq6/sPcqrfCv2mkkG6Jt/clpn5eiCbKTY+SgZUxo+p8ZKMof5dCp9vHQUAB7wOUTod22wQ==",
"dependencies": { "dependencies": {
"undici-types": "~5.26.4" "undici-types": "~5.26.4"
} }
@ -9387,14 +9387,11 @@
} }
}, },
"node_modules/has-tostringtag": { "node_modules/has-tostringtag": {
"version": "1.0.0", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.1.tgz",
"integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "integrity": "sha512-6J4rC9ROz0UkOpjn0BRtSSqlewDTDYJNQvy8N8RSrPCduUWId1o9BQPEVII/KKBqRk/ZIQff1YbRkUDCH2N5Sg==",
"dev": true, "dev": true,
"peer": true, "peer": true,
"dependencies": {
"has-symbols": "^1.0.2"
},
"engines": { "engines": {
"node": ">= 0.4" "node": ">= 0.4"
}, },
@ -18075,9 +18072,9 @@
} }
}, },
"node_modules/webpack": { "node_modules/webpack": {
"version": "5.90.0", "version": "5.90.1",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.0.tgz", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.1.tgz",
"integrity": "sha512-bdmyXRCXeeNIePv6R6tGPyy20aUobw4Zy8r0LUS2EWO+U+Ke/gYDgsCh7bl5rB6jPpr4r0SZa6dPxBxLooDT3w==", "integrity": "sha512-SstPdlAC5IvgFnhiRok8hqJo/+ArAbNv7rhU4fnWGHNVfN59HSQFaxZDSAL3IFG2YmqxuRs+IU33milSxbPlog==",
"dev": true, "dev": true,
"peer": true, "peer": true,
"dependencies": { "dependencies": {
@ -18363,17 +18360,17 @@
} }
}, },
"node_modules/which-typed-array": { "node_modules/which-typed-array": {
"version": "1.1.13", "version": "1.1.14",
"resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz",
"integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==",
"dev": true, "dev": true,
"peer": true, "peer": true,
"dependencies": { "dependencies": {
"available-typed-arrays": "^1.0.5", "available-typed-arrays": "^1.0.6",
"call-bind": "^1.0.4", "call-bind": "^1.0.5",
"for-each": "^0.3.3", "for-each": "^0.3.3",
"gopd": "^1.0.1", "gopd": "^1.0.1",
"has-tostringtag": "^1.0.0" "has-tostringtag": "^1.0.1"
}, },
"engines": { "engines": {
"node": ">= 0.4" "node": ">= 0.4"

View File

@ -1,7 +1,7 @@
{ {
"name": "repod", "name": "repod",
"description": "🔊 Browse, manage and listen to podcasts", "description": "🔊 Browse, manage and listen to podcasts",
"version": "1.5.2", "version": "1.5.3",
"bugs": { "bugs": {
"url": "https://git.crystalyx.net/Xefir/repod/issues" "url": "https://git.crystalyx.net/Xefir/repod/issues"
}, },
@ -23,7 +23,7 @@
"@nextcloud/initial-state": "^2.1.0", "@nextcloud/initial-state": "^2.1.0",
"@nextcloud/l10n": "^2.2.0", "@nextcloud/l10n": "^2.2.0",
"@nextcloud/router": "^3.0.0", "@nextcloud/router": "^3.0.0",
"@nextcloud/vue": "^8.6.0", "@nextcloud/vue": "^8.6.1",
"vue": "^2", "vue": "^2",
"vue-material-design-icons": "^5.3.0", "vue-material-design-icons": "^5.3.0",
"vue-router": "^3", "vue-router": "^3",

View File

@ -6,7 +6,7 @@
:key="episode.guid" :key="episode.guid"
:active="isCurrentEpisode(episode)" :active="isCurrentEpisode(episode)"
:class="hasEnded(episode) ? 'ended': ''" :class="hasEnded(episode) ? 'ended': ''"
:details="formatLocaleDate(new Date(episode.pubDate.date))" :details="formatLocaleDate(new Date(episode.pubDate?.date))"
:force-display-actions="true" :force-display-actions="true"
:name="episode.name" :name="episode.name"
:title="episode.description" :title="episode.description"
@ -116,7 +116,7 @@ export default {
try { try {
this.loading = true this.loading = true
const episodes = await axios.get(generateUrl('/apps/repod/episodes/list?url={url}', { url: this.url })) const episodes = await axios.get(generateUrl('/apps/repod/episodes/list?url={url}', { url: this.url }))
this.episodes = [...episodes.data].sort((a, b) => new Date(b.pubDate.date) - new Date(a.pubDate.date)) this.episodes = [...episodes.data].sort((a, b) => new Date(b.pubDate?.date) - new Date(a.pubDate?.date))
} catch (e) { } catch (e) {
console.error(e) console.error(e)
showError(t('repod', 'Could not fetch episodes')) showError(t('repod', 'Could not fetch episodes'))