nextcloud app that replicates basic gpodder.net api
Go to file
Renovate Bot 2afd340994
Some checks failed
NPM build / js (pull_request) Successful in 1m18s
PHPUnit / php${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }} (sqlite, 8.1, stable27) (pull_request) Failing after 41s
PHPUnit / php${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }} (sqlite, 8.1, stable28) (pull_request) Failing after 39s
PHPUnit / php${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }} (sqlite, 8.1, stable29) (pull_request) Failing after 32s
PHPUnit / php${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }} (sqlite, 8.2, stable27) (pull_request) Failing after 33s
PHPUnit / php${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }} (mysql, 8.1, stable27) (pull_request) Failing after 59s
PHPUnit / php${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }} (mysql, 8.1, stable28) (pull_request) Failing after 38s
PHPUnit / php${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }} (mysql, 8.2, stable27) (pull_request) Failing after 36s
PHPUnit / php${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }} (mysql, 8.2, stable29) (pull_request) Failing after 38s
PHPUnit / php${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }} (pgsql, 8.1, stable28) (pull_request) Failing after 41s
PHPUnit / php${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }} (pgsql, 8.1, stable29) (pull_request) Failing after 42s
PHPUnit / php${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }} (pgsql, 8.2, stable27) (pull_request) Failing after 45s
PHPUnit / php${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }} (sqlite, 8.2, stable28) (pull_request) Failing after 33s
PHPUnit / php${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }} (sqlite, 8.2, stable29) (pull_request) Failing after 35s
PHPUnit / php${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }} (mysql, 8.1, stable29) (pull_request) Failing after 37s
PHPUnit / php${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }} (mysql, 8.2, stable28) (pull_request) Failing after 40s
PHPUnit / php${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }} (pgsql, 8.1, stable27) (pull_request) Failing after 54s
PHPUnit / php${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }} (pgsql, 8.2, stable28) (pull_request) Failing after 44s
PHPUnit / php${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }} (pgsql, 8.2, stable29) (pull_request) Failing after 46s
Add renovate.json
2024-09-12 06:51:00 +00:00
.github Use correct phpunit in ci 2024-05-21 01:14:49 +02:00
appinfo release 3.9.0 2024-05-21 01:14:49 +02:00
lib Fix getId() on null in deleteConflictingEpisodeAction 2024-01-12 20:43:01 +01:00
src Apply suggestions from code review 2022-10-28 09:50:44 +02:00
templates/settings Removed old code 2022-10-28 09:50:44 +02:00
tests Fix getId() on null in deleteConflictingEpisodeAction 2024-01-12 20:43:01 +01:00
.eslintrc.js Initial test version 2022-10-28 09:50:44 +02:00
.gitignore Ignore phpunit cache 2022-10-28 09:50:44 +02:00
babel.config.js Initial test version 2022-10-28 09:50:44 +02:00
CHANGELOG.md release 3.9.0 2024-05-21 01:14:49 +02:00
composer.json Use correct phpunit in ci 2024-05-21 01:14:49 +02:00
composer.lock Use correct phpunit in ci 2024-05-21 01:14:49 +02:00
jsconfig.json Smallfix for TS intellisense 2022-10-28 09:50:44 +02:00
LICENSE Add AGPL 3.0 LICENSE 2022-07-20 20:13:05 +02:00
Makefile ignore releases directory from tarball 2021-08-14 20:15:31 +02:00
package-lock.json Updated npm packages 2022-10-28 09:50:44 +02:00
package.json Updated npm packages 2022-10-28 09:50:44 +02:00
README.md Add RePod to README 2024-01-31 15:28:25 +01:00
renovate.json Add renovate.json 2024-09-12 06:51:00 +00:00
stylelint.config.js Initial test version 2022-10-28 09:50:44 +02:00
webpack.config.js Initial test version 2022-10-28 09:50:44 +02:00

nextcloud-gpodder

Nextcloud app that replicates basic gpodder.net api to sync podcast consumer apps (podcatchers) like AntennaPod.

Clients supporting sync

client support status
AntennaPod Initial purpose for this project, as a synchronization endpoint for this client.
Support is available as of version 2.5.1.
KDE Kasts Supported since version 21.12
Podcast Merlin Full sync support podcast client for Windows
RePod Nextcloud app for playing and managing podcasts with sync support
Garmin Podcasts Repository archived, app is no longer available

Installation

Either from the official Nextcloud app store (link to app page) or by downloading the latest release and extracting it into your Nextcloud apps/ directory.

API

subscription

  • get subscription changes: GET /index.php/apps/gpoddersync/subscriptions
    • (optional) GET parameter since (UNIX time)
  • upload subscription changes : POST /index.php/apps/gpoddersync/subscription_change/create
    • returns JSON with current timestamp

The API replicates this: https://gpoddernet.readthedocs.io/en/latest/api/reference/subscriptions.html

Example requests:

GET /index.php/apps/gpoddersync/subscriptions?since=1633240761

{
  "add": [
    "https://example.com/feed.xml",
    "https://example.org/feed/"
  ],
  "remove": [
    "https://example.net/feed.rss"
  ],
  "timestamp": 1663540502
}
POST /index.php/apps/gpoddersync/subscription_change/create

{
  "add": [
    "https://example.com/feed.xml",
    "https://example.org/feed/"
  ],
  "remove": [
    "https://example.net/feed.rss"
  ]
}

episode action

  • get episode actions: GET /index.php/apps/gpoddersync/episode_action
    • (optional) GET parameter since (UNIX time)
    • fields: podcast, episode, guid, action, timestamp, position, started, total
  • create episode actions: POST /index.php/apps/gpoddersync/episode_action/create
    • fields: podcast, episode, guid, action, timestamp, position, started, total
    • position, started and total are optional, default value is -1
    • guid is also optional, but should be sent if available
    • identification is done by guid, or episode if guid is missing
    • returns JSON with current timestamp

The API replicates this: https://gpoddernet.readthedocs.io/en/latest/api/reference/events.html

Example requests:

GET /index.php/apps/gpoddersync/episode_action?since=1633240761

{
    "actions": [
      {
       "podcast": "http://example.com/feed.rss",
       "episode": "http://example.com/files/s01e20.mp3",
       "guid": "s01e20-example-org",
       "action": "PLAY",
       "timestamp": "2009-12-12T09:00:00",
       "started": 15,
       "position": 120,
       "total":  500
      },
      {
       "podcast": "http://example.com/feed.rss",
       "episode": "http://example.com/files/s01e20.mp3",
       "guid": "s01e20-example-org",
       "action": "DOWNLOAD",
       "timestamp": "2009-12-12T09:00:00",
       "started": -1,
       "position": -1,
       "total":  -1
      },
    ],
    "timestamp": 12345
}
POST /index.php/apps/gpoddersync/episode_action/create

[
  {
   "podcast": "http://example.com/feed.rss",
   "episode": "http://example.com/files/s01e20.mp3",
   "guid": "s01e20-example-org",
   "action": "play",
   "timestamp": "2009-12-12T09:00:00",
   "started": 15,
   "position": 120,
   "total":  500
  },
  {
   "podcast": "http://example.org/podcast.php",
   "episode": "http://ftp.example.org/foo.ogg",
   "guid": "foo-bar-123",
   "action": "DOWNLOAD",
   "timestamp": "2009-12-12T09:05:21",
  }
]

Development

Testing

  • mount project into apps-extra of nextcloud environment (https://github.com/juliushaertl/nextcloud-docker-dev)
  • docker-compose exec nextcloud occ app:enable gpoddersync enable app so we have database tables
  • docker-compose exec nextcloud phpunit9 -c apps-extra/nextcloud-gpodder/tests/phpunit.xml