nextcloud app that replicates basic gpodder.net api
Go to file
Jonathan Flueren 33c5a28250 Define return value of overriding jsonSerialize()
Threw DEPRECATED warnings on php8.x systems
2022-11-08 21:11:51 +01:00
.github/workflows Added CI action for building JS 2022-10-28 09:50:44 +02:00
appinfo Bump version to 3.6.0 2022-10-30 10:41:01 +01:00
lib Define return value of overriding jsonSerialize() 2022-11-08 21:11:51 +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 indentation 2022-11-08 20:51:38 +01:00
vendor Ran composer update 2022-10-28 09:50:44 +02: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 Add 3.6.0 note to changelog 2022-10-30 10:41:01 +01:00
composer.json Ran composer update 2022-10-28 09:50:44 +02:00
composer.lock Remove unused composer.lock entries 2022-10-24 19:10:42 +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 Removed 'no settings' note from README.md 2022-10-28 09:50:44 +02: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
Garmin Podcasts Only for compatible Garmin watches, supported since version 3.3.4

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",
  }
]