Applicazione Nextcloud che replica l'API di base di gpodder.net per sincronizzare le applicazioni dei podcast (podcatcher) come AntennaPod.
https://castopod.it
Previously, it would take the guid and try to search for that in the episode URL column, which may not find a match (or possibly even find the wrong match). testDoNotFailToUpdateEpisodeActionByGuidIfThereIsAnotherWithTheSameValueForEpisodeUrl didn't catch this issue because it used the same value for episode and guid when updating at line 84, so fix that as well. And for good measure, give the save actions different position values, so the asserts actually check that the saves have succeeded and they found the right episode. |
||
---|---|---|
.github | ||
appinfo | ||
lib | ||
src | ||
templates/settings | ||
tests | ||
vendor | ||
.eslintrc.js | ||
.gitignore | ||
CHANGELOG.md | ||
LICENSE | ||
Makefile | ||
README.md | ||
babel.config.js | ||
composer.json | ||
composer.lock | ||
jsconfig.json | ||
package-lock.json | ||
package.json | ||
stylelint.config.js | ||
webpack.config.js |
README.md
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 |
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)
- (optional) GET parameter
- 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
- (optional) GET parameter
- 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 tablesdocker-compose exec nextcloud phpunit9 -c apps-extra/nextcloud-gpodder/tests/phpunit.xml