Compare commits

..

No commits in common. "main" and "3.5.0" have entirely different histories.
main ... 3.5.0

12 changed files with 473 additions and 537 deletions

View File

@ -19,11 +19,11 @@
"php": "^8.1"
},
"require-dev": {
"nextcloud/ocp": "^30.0.4",
"nextcloud/ocp": "^30.0.3",
"roave/security-advisories": "dev-latest",
"nextcloud/coding-standard": "^1.3.2",
"nextcloud/rector": "^0.2.1",
"rector/rector": "~1.2.10",
"rector/rector": "^1.2.10",
"vimeo/psalm": "^5.26.1"
},
"config": {

51
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "8985893a48af49654e50784bda34fb89",
"content-hash": "637d36247b6b2a581d855299334035e8",
"packages": [],
"packages-dev": [
{
@ -194,13 +194,13 @@
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "3.x-dev"
},
"phpstan": {
"includes": [
"extension.neon"
]
},
"branch-alias": {
"dev-main": "3.x-dev"
}
},
"autoload": {
@ -778,7 +778,7 @@
},
{
"name": "nextcloud/ocp",
"version": "v30.0.4",
"version": "v30.0.3",
"source": {
"type": "git",
"url": "https://github.com/nextcloud-deps/ocp.git",
@ -816,7 +816,7 @@
"description": "Composer package containing Nextcloud's public API (classes, interfaces)",
"support": {
"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.3"
},
"time": "2024-11-29T00:46:59+00:00"
},
@ -1214,16 +1214,16 @@
},
{
"name": "phpstan/phpstan",
"version": "1.12.13",
"version": "1.12.12",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpstan.git",
"reference": "9b469068840cfa031e1deaf2fa1886d00e20680f"
"reference": "b5ae1b88f471d3fd4ba1aa0046234b5ca3776dd0"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpstan/phpstan/zipball/9b469068840cfa031e1deaf2fa1886d00e20680f",
"reference": "9b469068840cfa031e1deaf2fa1886d00e20680f",
"url": "https://api.github.com/repos/phpstan/phpstan/zipball/b5ae1b88f471d3fd4ba1aa0046234b5ca3776dd0",
"reference": "b5ae1b88f471d3fd4ba1aa0046234b5ca3776dd0",
"shasum": ""
},
"require": {
@ -1268,7 +1268,7 @@
"type": "github"
}
],
"time": "2024-12-17T17:00:20+00:00"
"time": "2024-11-28T22:13:23+00:00"
},
{
"name": "psr/clock",
@ -1536,12 +1536,12 @@
"source": {
"type": "git",
"url": "https://github.com/Roave/SecurityAdvisories.git",
"reference": "4aa68d3ea343b9576b5fdebef1332f701a7bc994"
"reference": "1fd8b74024b8938b25df3a9971c7ad9d57d4f592"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/4aa68d3ea343b9576b5fdebef1332f701a7bc994",
"reference": "4aa68d3ea343b9576b5fdebef1332f701a7bc994",
"url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/1fd8b74024b8938b25df3a9971c7ad9d57d4f592",
"reference": "1fd8b74024b8938b25df3a9971c7ad9d57d4f592",
"shasum": ""
},
"conflict": {
@ -1651,7 +1651,7 @@
"contao/managed-edition": "<=1.5",
"corveda/phpsandbox": "<1.3.5",
"cosenary/instagram": "<=2.3",
"craftcms/cms": "<4.13.2|>=5,<5.5.2",
"craftcms/cms": "<=4.12.6.1|>=5,<=5.4.7.1",
"croogo/croogo": "<4",
"cuyz/valinor": "<0.12",
"czim/file-handling": "<1.5|>=2,<2.3",
@ -1865,7 +1865,6 @@
"laravel/fortify": "<1.11.1",
"laravel/framework": "<6.20.45|>=7,<7.30.7|>=8,<8.83.28|>=9,<9.52.17|>=10,<10.48.23|>=11,<11.31",
"laravel/laravel": ">=5.4,<5.4.22",
"laravel/pulse": "<1.3.1",
"laravel/reverb": "<1.4",
"laravel/socialite": ">=1,<2.0.10",
"latte/latte": "<2.10.8",
@ -1946,6 +1945,7 @@
"neos/swiftmailer": "<5.4.5",
"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/database": "<=3.2.4",
"nette/nette": ">=2,<2.0.19|>=2.1,<2.1.13",
"nilsteampassnet/teampass": "<3.0.10",
"nonfiction/nterchange": "<4.1.1",
@ -2090,7 +2090,6 @@
"shopware/storefront": "<=6.4.8.1|>=6.5.8,<6.5.8.7-dev",
"shopxo/shopxo": "<=6.1",
"showdoc/showdoc": "<2.10.4",
"shuchkin/simplexlsx": ">=1.0.12,<1.1.12",
"silverstripe-australia/advancedreports": ">=1,<=2",
"silverstripe/admin": "<1.13.19|>=2,<2.1.8",
"silverstripe/assets": ">=1,<1.11.1",
@ -2128,7 +2127,7 @@
"snipe/snipe-it": "<=7.0.13",
"socalnick/scn-social-auth": "<1.15.2",
"socialiteproviders/steam": "<1.1",
"spatie/browsershot": "<5.0.2",
"spatie/browsershot": "<3.57.4",
"spatie/image-optimizer": "<1.7.3",
"spencer14420/sp-php-email-handler": "<1",
"spipu/html2pdf": "<5.2.8",
@ -2241,7 +2240,7 @@
"typo3fluid/fluid": ">=2,<2.0.8|>=2.1,<2.1.7|>=2.2,<2.2.4|>=2.3,<2.3.7|>=2.4,<2.4.4|>=2.5,<2.5.11|>=2.6,<2.6.10",
"ua-parser/uap-php": "<3.8",
"uasoft-indonesia/badaso": "<=2.9.7",
"unisharp/laravel-filemanager": "<2.9.1",
"unisharp/laravel-filemanager": "<2.6.4",
"unopim/unopim": "<0.1.5",
"userfrosting/userfrosting": ">=0.3.1,<4.6.3",
"usmanhalalit/pixie": "<1.0.3|>=2,<2.0.2",
@ -2380,7 +2379,7 @@
"type": "tidelift"
}
],
"time": "2024-12-18T20:05:40+00:00"
"time": "2024-12-10T21:04:50+00:00"
},
{
"name": "sebastian/diff",
@ -2451,16 +2450,16 @@
},
{
"name": "spatie/array-to-xml",
"version": "3.4.0",
"version": "3.3.0",
"source": {
"type": "git",
"url": "https://github.com/spatie/array-to-xml.git",
"reference": "7dcfc67d60b0272926dabad1ec01f6b8a5fb5e67"
"reference": "f56b220fe2db1ade4c88098d83413ebdfc3bf876"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/spatie/array-to-xml/zipball/7dcfc67d60b0272926dabad1ec01f6b8a5fb5e67",
"reference": "7dcfc67d60b0272926dabad1ec01f6b8a5fb5e67",
"url": "https://api.github.com/repos/spatie/array-to-xml/zipball/f56b220fe2db1ade4c88098d83413ebdfc3bf876",
"reference": "f56b220fe2db1ade4c88098d83413ebdfc3bf876",
"shasum": ""
},
"require": {
@ -2503,7 +2502,7 @@
"xml"
],
"support": {
"source": "https://github.com/spatie/array-to-xml/tree/3.4.0"
"source": "https://github.com/spatie/array-to-xml/tree/3.3.0"
},
"funding": [
{
@ -2515,7 +2514,7 @@
"type": "github"
}
],
"time": "2024-12-16T12:45:15+00:00"
"time": "2024-05-01T10:20:27+00:00"
},
{
"name": "symfony/console",

847
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -2,7 +2,7 @@
<NcAppNavigationList class="list">
<NcAppNavigationNewItem
:name="t('repod', 'Add a RSS link')"
@new-item="(url: string) => $router.push(toFeedUrl(url))">
@new-item="(url) => $router.push(toFeedUrl(url))">
<template #icon>
<PlusIcon :size="20" />
</template>

View File

@ -110,8 +110,7 @@ export default {
)
if (currentSearch === this.value) {
this.feeds = [...feeds.data].sort(
(a: PodcastDataInterface, b: PodcastDataInterface) =>
b.fetchedAtUnix - a.fetchedAtUnix,
(a, b) => b.fetchedAtUnix - a.fetchedAtUnix,
)
}
} catch (e) {

View File

@ -3,7 +3,7 @@
<Loading v-if="loading" />
<ul v-if="!loading">
<NcListItem
v-if="!episodes.every((e: EpisodeInterface) => !e.selected)"
v-if="!episodes.every((e) => !e.selected)"
:active="true"
:force-display-actions="true"
:name="
@ -11,7 +11,7 @@
'repod',
'%n episode selected',
'%n episodes selected',
episodes.filter((e: EpisodeInterface) => e.selected).length,
episodes.filter((e) => e.selected).length,
)
"
:one-line="true">
@ -19,14 +19,14 @@
<NcActionButton
v-if="
episodes
.filter((e: EpisodeInterface) => e.selected)
.filter((e: EpisodeInterface) => !hasEnded(e)).length
.filter((e) => e.selected)
.filter((e) => !hasEnded(e)).length
"
:aria-label="t('repod', 'Read all')"
:disabled="
!episodes
.filter((e: EpisodeInterface) => e.selected)
.every((e: EpisodeInterface) => e.duration)
.filter((e) => e.selected)
.every((e) => e.duration)
"
:name="t('repod', 'Read all')"
:title="t('repod', 'Read all')"
@ -38,14 +38,14 @@
<NcActionButton
v-if="
episodes
.filter((e: EpisodeInterface) => e.selected)
.every((e: EpisodeInterface) => hasEnded(e))
.filter((e) => e.selected)
.every((e) => hasEnded(e))
"
:aria-label="t('repod', 'Unread all')"
:disabled="
!episodes
.filter((e: EpisodeInterface) => e.selected)
.every((e: EpisodeInterface) => e.duration)
.filter((e) => e.selected)
.every((e) => e.duration)
"
:name="t('repod', 'Unread all')"
:title="t('repod', 'Unread all')"
@ -58,8 +58,8 @@
<template #icon>
<NcAvatar
v-if="
episodes.filter((e: EpisodeInterface) => e.selected)
.length < episodes.length
episodes.filter((e) => e.selected).length <
episodes.length
"
:display-name="t('repod', 'Select all')"
:is-no-user="true">
@ -72,8 +72,8 @@
</NcAvatar>
<NcAvatar
v-if="
episodes.filter((e: EpisodeInterface) => e.selected)
.length >= episodes.length
episodes.filter((e) => e.selected).length >=
episodes.length
"
:display-name="t('repod', 'Unselect all')"
:is-no-user="true">
@ -89,9 +89,7 @@
<Episode
v-for="episode in filteredEpisodes"
:key="episode.guid"
:display-actions="
episodes.every((e: EpisodeInterface) => !e.selected)
"
:display-actions="episodes.every((e) => !e.selected)"
:episode="episode"
:url="url"
@select="episode.selected = !episode.selected" />
@ -139,7 +137,7 @@ export default {
...mapState(usePlayer, ['episode']),
...mapState(useSettings, ['filters']),
filteredEpisodes() {
return this.episodes.filter((episode: EpisodeInterface) => {
return this.episodes.filter((episode) => {
if (!this.filters.listened && this.hasEnded(episode)) {
return false
}
@ -159,7 +157,7 @@ export default {
watch: {
episode() {
if (this.episode) {
this.episodes = this.episodes.map((episode: EpisodeInterface) =>
this.episodes = this.episodes.map((episode) =>
episode.url === this.episode?.url ? this.episode : episode,
)
}
@ -174,7 +172,7 @@ export default {
}),
)
this.episodes = [...episodes.data].sort(
(a: EpisodeInterface, b: EpisodeInterface) =>
(a, b) =>
new Date(b.pubDate?.date || '').getTime() -
new Date(a.pubDate?.date || '').getTime(),
)
@ -192,14 +190,14 @@ export default {
t,
async read(read: boolean) {
try {
this.episodes = this.episodes.map((episode: EpisodeInterface) =>
this.episodes = this.episodes.map((episode) =>
episode.selected ? markAs(episode, read, this.url) : episode,
)
await axios.post(
generateUrl('/apps/gpoddersync/episode_action/create'),
this.episodes
.filter((episode: EpisodeInterface) => episode.selected)
.map((episode: EpisodeInterface) => episode.action),
.filter((episode) => episode.selected)
.map((episode) => episode.action),
)
} catch (e) {
console.error(e)
@ -207,7 +205,7 @@ export default {
}
},
select(all: boolean) {
this.episodes = this.episodes.map((episode: EpisodeInterface) => {
this.episodes = this.episodes.map((episode) => {
episode.selected = all
return episode
})

View File

@ -63,11 +63,11 @@ export default {
)
this.episodes = [...episodes.data]
.sort(
(a: EpisodeInterface, b: EpisodeInterface) =>
(a, b) =>
new Date(b.pubDate?.date || '').getTime() -
new Date(a.pubDate?.date || '').getTime(),
)
.filter((episode: EpisodeInterface) => !this.hasEnded(episode))
.filter((episode) => !this.hasEnded(episode))
.slice(0, 4)
} catch (e) {
console.error(e)

View File

@ -39,13 +39,10 @@
<script lang="ts">
import { NcActionButton, NcAppNavigationItem, NcAvatar } from '@nextcloud/vue'
import type {
PersonalSettingsPodcastDataInterface,
SubscriptionInterface,
} from '../../utils/types.ts'
import { mapActions, mapState } from 'pinia'
import AlertIcon from 'vue-material-design-icons/Alert.vue'
import DeleteIcon from 'vue-material-design-icons/Delete.vue'
import type { PersonalSettingsPodcastDataInterface } from '../../utils/types.ts'
import StarIcon from 'vue-material-design-icons/Star.vue'
import StarPlusIcon from 'vue-material-design-icons/StarPlus.vue'
import StarRemoveIcon from 'vue-material-design-icons/StarRemove.vue'
@ -131,10 +128,7 @@ export default {
},
switchFavorite(value: boolean) {
if (value) {
if (
this.subs.filter((sub: SubscriptionInterface) => sub.isFavorite)
.length >= 10
) {
if (this.subs.filter((sub) => sub.isFavorite).length >= 10) {
showError(t('repod', 'You can only have 10 favorites'))
return
}

View File

@ -1,7 +1,6 @@
import type {
PersonalSettingsMetricsInterface,
PodcastDataInterface,
PodcastMetricsInterface,
SubscriptionInterface,
} from '../utils/types.ts'
import { getCookie, setCookie } from '../utils/cookies.ts'
@ -15,7 +14,7 @@ export const useSubscriptions = defineStore('subscriptions', {
}),
getters: {
getSubByUrl: (state) => (url: string) =>
state.subs.find((sub: SubscriptionInterface) => sub.metrics.url === url),
state.subs.find((sub) => sub.metrics.url === url),
},
actions: {
async fetch() {
@ -29,23 +28,20 @@ export const useSubscriptions = defineStore('subscriptions', {
)
this.subs = [...metrics.data.subscriptions]
.sort(
(a: PodcastMetricsInterface, b: PodcastMetricsInterface) =>
b.listenedSeconds - a.listenedSeconds,
)
.map((sub: PodcastMetricsInterface) => ({
.sort((a, b) => b.listenedSeconds - a.listenedSeconds)
.map((sub) => ({
metrics: sub,
isFavorite: favorites.includes(sub.url),
data: this.getSubByUrl(sub.url)?.data,
}))
},
addMetadatas(link: string, data: PodcastDataInterface) {
this.subs = this.subs.map((sub: SubscriptionInterface) =>
this.subs = this.subs.map((sub) =>
sub.metrics.url === link ? { ...sub, data } : sub,
)
},
setFavorite(link: string, isFavorite: boolean) {
this.subs = this.subs.map((sub: SubscriptionInterface) =>
this.subs = this.subs.map((sub) =>
sub.metrics.url === link ? { ...sub, isFavorite } : sub,
)
@ -53,8 +49,8 @@ export const useSubscriptions = defineStore('subscriptions', {
'repod.favorites',
JSON.stringify(
this.subs
.filter((sub: SubscriptionInterface) => sub.isFavorite)
.map((sub: SubscriptionInterface) => sub.metrics.url),
.filter((sub) => sub.isFavorite)
.map((sub) => sub.metrics.url),
),
365,
)

View File

@ -6,9 +6,7 @@
*/
export const getCookie = (name: string): string | null => {
const cookies = document.cookie.split('; ')
const value = cookies
.find((c: string) => c.startsWith(name + '='))
?.split('=')[1]
const value = cookies.find((c) => c.startsWith(name + '='))?.split('=')[1]
if (value === undefined) {
return null
}

View File

@ -24,7 +24,6 @@ import AppContent from '../components/Atoms/AppContent.vue'
import EmptyContent from '../components/Atoms/EmptyContent.vue'
import Favorite from '../components/Feed/Favorite.vue'
import StarOffIcon from 'vue-material-design-icons/StarOff.vue'
import type { SubscriptionInterface } from '../utils/types.ts'
import { mapState } from 'pinia'
import { t } from '@nextcloud/l10n'
import { useSubscriptions } from '../store/subscriptions.ts'
@ -40,7 +39,7 @@ export default {
computed: {
...mapState(useSubscriptions, ['subs']),
favorites() {
return this.subs.filter((sub: SubscriptionInterface) => sub.isFavorite)
return this.subs.filter((sub) => sub.isFavorite)
},
},
methods: {

View File

@ -3,14 +3,13 @@
# This file is distributed under the same license as the Nextcloud package.
# OiledAmoeba <florian+crystalyx@ruhnke.cloud>, 2024.
# Michel Roux <xefir@crystalyx.net>, 2024.
# markus phi <repodtranslate@solinetcafe.org>, 2024.
msgid ""
msgstr ""
"Project-Id-Version: Nextcloud 3.14159\n"
"Report-Msgid-Bugs-To: translations\\@example.com\n"
"POT-Creation-Date: 2024-12-11 20:03+0000\n"
"PO-Revision-Date: 2024-12-12 23:02+0000\n"
"Last-Translator: markus phi <repodtranslate@solinetcafe.org>\n"
"PO-Revision-Date: 2024-12-11 20:06+0000\n"
"Last-Translator: Michel Roux <xefir@crystalyx.net>\n"
"Language-Team: German <https://translate.crystalyx.net/projects/repod/gitea/"
"de/>\n"
"Language: de\n"
@ -39,6 +38,7 @@ msgid "🔊 Browse, manage and listen to podcasts"
msgstr "🔊 Suchen, Verwalten und Anhören von Podcasts"
#: /app/specialAppInfoFakeDummyForL10nScript.php:5
#, fuzzy
msgid ""
"## Features\n"
"- 🔍 Browse and subscribe huge collection of podcasts\n"
@ -58,9 +58,9 @@ msgstr ""
"## Funktionen\n"
"- 🔍 Durchsuchen und abonnieren einer großen Sammlung von Podcasts\n"
"- 🔊 Episoden direkt in Nextcloud anhören\n"
"- 🌐 Synchronisiere deine Aktivität mit [AntennaPod](https://antennapod.org/)"
"\n"
"- 📱 Handy-freundliche Schnittstelle\n"
"- 🌐 Synchronisiere deine Aktivität mit [AntennaPod](https://antennapod."
"org/)\n"
"- 📱 Mobile-freundliche Schnittstelle\n"
"- 📡 Importieren und Exportieren Ihrer Abonnements\n"
"- ➡️ Vollständiger Funktionsvergleich [hier](https://git.crystalyx.net/Xefir/"
"repod#comparaison-with-similar-apps-for-nextcloud)\n"
@ -76,8 +76,9 @@ msgid "Download"
msgstr "Herunterladen"
#: /app/specialVueFakeDummyForL10nScript.js:2
#, fuzzy
msgid "Skip to {match}"
msgstr "Springe zu {match}"
msgstr "Springen zu {match}"
#: /app/specialVueFakeDummyForL10nScript.js:3
msgid "Add a RSS link"
@ -116,8 +117,9 @@ msgid "Copy feed"
msgstr "Feed kopieren"
#: /app/specialVueFakeDummyForL10nScript.js:15
#, fuzzy
msgid "Link copied to the clipboard"
msgstr "Link in die Zwischenablage kopiert"
msgstr "Der Link des Feeds wurde in die Zwischenablage kopiert"
#: /app/specialVueFakeDummyForL10nScript.js:16
#: /app/specialVueFakeDummyForL10nScript.js:17