chore(i18n): new Crowdin updates

This commit is contained in:
crowdin 2022-11-04 11:03:24 +00:00 committed by Yassine Doghri
parent 379b9be2b9
commit fa90decdd1
196 changed files with 5321 additions and 2182 deletions

View File

@ -18,12 +18,12 @@ return [
'follow' => 'Folgen', 'follow' => 'Folgen',
'followTitle' => 'Folge {actorDisplayName} im Fediversum', 'followTitle' => 'Folge {actorDisplayName} im Fediversum',
'followers' => '{numberOfFollowers, plural, 'followers' => '{numberOfFollowers, plural,
one {# follower} one {# Follower}
other {# followers} other {# Follower}
}', }',
'posts' => '{numberOfPosts, plural, 'posts' => '{numberOfPosts, plural,
one {# post} one {# Beitrag}
other {# posts} other {# Beiträge}
}', }',
'activity' => 'Aktivitäten', 'activity' => 'Aktivitäten',
'episodes' => 'Episoden', 'episodes' => 'Episoden',
@ -32,8 +32,8 @@ return [
'stats' => [ 'stats' => [
'title' => 'Statistiken', 'title' => 'Statistiken',
'number_of_seasons' => '{0, plural, 'number_of_seasons' => '{0, plural,
one {# season} one {# Staffel}
other {# seasons} other {# Staffeln}
}', }',
'number_of_episodes' => '{0, plural, 'number_of_episodes' => '{0, plural,
one {# Episode} one {# Episode}

View File

@ -26,5 +26,5 @@ return [
'read_less' => 'Les mindre', 'read_less' => 'Les mindre',
'see_more' => 'Sjå meir', 'see_more' => 'Sjå meir',
'see_less' => 'Sjå mindre', 'see_less' => 'Sjå mindre',
'legal_notice' => 'Legal notice', 'legal_notice' => 'Juridisk merknad',
]; ];

View File

@ -18,12 +18,12 @@ return [
'follow' => 'Fylg', 'follow' => 'Fylg',
'followTitle' => 'Fylg {actorDisplayName} på fødiverset!', 'followTitle' => 'Fylg {actorDisplayName} på fødiverset!',
'followers' => '{numberOfFollowers, plural, 'followers' => '{numberOfFollowers, plural,
one {# follower} one {# fylgjar}
other {# followers} other {# fylgjarar}
}', }',
'posts' => '{numberOfPosts, plural, 'posts' => '{numberOfPosts, plural,
one {# post} one {# innlegg}
other {# posts} other {# innlegg}
}', }',
'activity' => 'Aktivitet', 'activity' => 'Aktivitet',
'episodes' => 'Episodar', 'episodes' => 'Episodar',
@ -32,14 +32,14 @@ return [
'stats' => [ 'stats' => [
'title' => 'Statistikk', 'title' => 'Statistikk',
'number_of_seasons' => '{0, plural, 'number_of_seasons' => '{0, plural,
one {# season} one {# sesong}
other {# seasons} other {# sesongar}
}', }',
'number_of_episodes' => '{0, plural, 'number_of_episodes' => '{0, plural,
one {# episode} one {# episode}
other {# episodes} other {# episodar}
}', }',
'first_published_at' => 'First episode published on {0, date, medium}', 'first_published_at' => 'Den fyrste episoden vart utgjeven {0, date, medium}',
], ],
'sponsor' => 'Sponsor', 'sponsor' => 'Sponsor',
'funding_links' => 'Finansieringslenker for {podcastTitle}', 'funding_links' => 'Finansieringslenker for {podcastTitle}',

View File

@ -9,26 +9,26 @@ declare(strict_types=1);
*/ */
return [ return [
'title' => "{actorDisplayName}'s comment for {episodeTitle}", 'title' => "{actorDisplayName}s kommentar till {episodeTitle}",
'back_to_comments' => 'Back to comments', 'back_to_comments' => 'Tillbaka till kommentarer',
'form' => [ 'form' => [
'episode_message_placeholder' => 'Write a comment…', 'episode_message_placeholder' => 'Skriv en kommentar…',
'reply_to_placeholder' => 'Reply to @{actorUsername}', 'reply_to_placeholder' => 'Svara på @{actorUsername}',
'submit' => 'Send', 'submit' => 'Skicka',
'submit_reply' => 'Reply', 'submit_reply' => 'Svara',
], ],
'likes' => '{numberOfLikes, plural, 'likes' => '{numberOfLikes, plural,
one {# like} one {# gillar}
other {# likes} other {# gillar}
}', }',
'replies' => '{numberOfReplies, plural, 'replies' => '{numberOfReplies, plural,
one {# reply} one {# svar}
other {# replies} other {# svar}
}', }',
'like' => 'Like', 'like' => 'Gilla',
'reply' => 'Reply', 'reply' => 'Svara',
'view_replies' => 'View replies ({numberOfReplies})', 'view_replies' => 'Visa svar ({numberOfReplies})',
'block_actor' => 'Block user @{actorUsername}', 'block_actor' => 'Blockera användare @{actorUsername}',
'block_domain' => 'Block domain @{actorDomain}', 'block_domain' => 'Blockera domän @{actorDomain}',
'delete' => 'Delete comment', 'delete' => 'Radera kommentar',
]; ];

View File

@ -9,22 +9,22 @@ declare(strict_types=1);
*/ */
return [ return [
'yes' => 'Yes', 'yes' => 'Ja',
'no' => 'No', 'no' => 'Nej',
'cancel' => 'Cancel', 'cancel' => 'Avbryt',
'optional' => 'Optional', 'optional' => 'Valfritt',
'close' => 'Close', 'close' => 'Stäng',
'home' => 'Home', 'home' => 'Hem',
'explicit' => 'Explicit', 'explicit' => 'Explicit',
'powered_by' => 'Powered by {castopod}', 'powered_by' => 'Drivs av {castopod}',
'go_back' => 'Go back', 'go_back' => 'Gå tillbaka',
'play_episode_button' => [ 'play_episode_button' => [
'play' => 'Play', 'play' => 'Spela',
'playing' => 'Playing', 'playing' => 'Spelar',
], ],
'read_more' => 'Read more', 'read_more' => 'Läs mer',
'read_less' => 'Read less', 'read_less' => 'Läs mindre',
'see_more' => 'See more', 'see_more' => 'Se mer',
'see_less' => 'See less', 'see_less' => 'Se mindre',
'legal_notice' => 'Legal notice', 'legal_notice' => 'Villkor',
]; ];

View File

@ -9,25 +9,25 @@ declare(strict_types=1);
*/ */
return [ return [
'season' => 'Season {seasonNumber}', 'season' => 'Säsong {seasonNumber}',
'season_abbr' => 'S{seasonNumber}', 'season_abbr' => 'S{seasonNumber}',
'number' => 'Episode {episodeNumber}', 'number' => 'Avsnitt {episodeNumber}',
'number_abbr' => 'Ep. {episodeNumber}', 'number_abbr' => 'Av. {episodeNumber}',
'season_episode' => 'Season {seasonNumber} episode {episodeNumber}', 'season_episode' => 'Säsong {seasonNumber} avsnitt {episodeNumber}',
'season_episode_abbr' => 'S{seasonNumber}:E{episodeNumber}', 'season_episode_abbr' => 'S{seasonNumber}:A{episodeNumber}',
'persons' => '{personsCount, plural, 'persons' => '{personsCount, plural,
one {# person} one {# person}
other {# persons} other {# personer}
}', }',
'persons_list' => 'Persons', 'persons_list' => 'Personer',
'back_to_episodes' => 'Back to episodes of {podcast}', 'back_to_episodes' => 'Tillbaka till avsnitten av {podcast}',
'comments' => 'Comments', 'comments' => 'Kommentarer',
'activity' => 'Activity', 'activity' => 'Aktivitet',
'description' => 'Episode description', 'description' => 'Beskrivning av avsnitt',
'number_of_comments' => '{numberOfComments, plural, 'number_of_comments' => '{numberOfComments, plural,
one {# comment} one {# kommentar}
other {# comments} other {# kommentarer}
}', }',
'all_podcast_episodes' => 'All podcast episodes', 'all_podcast_episodes' => 'Alla podcast avsnitt',
'back_to_podcast' => 'Go back to podcast', 'back_to_podcast' => 'Gå tillbaka till podcasten',
]; ];

View File

@ -9,29 +9,29 @@ declare(strict_types=1);
*/ */
return [ return [
'your_handle' => 'Your handle', 'your_handle' => 'Ditt handtag',
'your_handle_hint' => 'Enter the @username@domain you want to act from.', 'your_handle_hint' => 'Ange @användarnamn@domän som du vill agera från.',
'follow' => [ 'follow' => [
'label' => 'Follow', 'label' => 'Följ',
'title' => 'Follow {actorDisplayName}', 'title' => 'Följ {actorDisplayName}',
'subtitle' => 'You are going to follow:', 'subtitle' => 'Du kommer att följa:',
'accountNotFound' => 'The account could not be found.', 'accountNotFound' => 'Det gick inte att hitta kontot.',
'remoteFollowNotAllowed' => 'Seems like the account server does not allow remote follows…', 'remoteFollowNotAllowed' => 'Verkar som om kontots server inte tillåter fjärråtkomst följare…',
'submit' => 'Proceed to follow', 'submit' => 'Fortsätt för att följa',
], ],
'favourite' => [ 'favourite' => [
'title' => "Favourite {actorDisplayName}'s post", 'title' => "Favorit {actorDisplayName}s inlägg",
'subtitle' => 'You are going to favourite:', 'subtitle' => 'Du kommer att favorisera:',
'submit' => 'Proceed to favourite', 'submit' => 'Fortsätt för att favorisera',
], ],
'reblog' => [ 'reblog' => [
'title' => "Share {actorDisplayName}'s post", 'title' => "Dela {actorDisplayName}s inlägg",
'subtitle' => 'You are going to share:', 'subtitle' => 'Du kommer att dela:',
'submit' => 'Proceed to share', 'submit' => 'Fortsätt för att dela',
], ],
'reply' => [ 'reply' => [
'title' => "Reply to {actorDisplayName}'s post", 'title' => "Svara på {actorDisplayName}s inlägg",
'subtitle' => 'You are going to reply to:', 'subtitle' => 'Du kommer att svara på:',
'submit' => 'Proceed to reply', 'submit' => 'Fortsätt för att svara',
], ],
]; ];

View File

@ -9,12 +9,12 @@ declare(strict_types=1);
*/ */
return [ return [
'all_podcasts' => 'All podcasts', 'all_podcasts' => 'Alla podcasts',
'sort_by' => 'Sort by', 'sort_by' => 'Sortera efter',
'sort_options' => [ 'sort_options' => [
'activity' => 'Recent activity', 'activity' => 'Senaste aktivitet',
'created_desc' => 'Newest first', 'created_desc' => 'Nyaste först',
'created_asc' => 'Oldest first', 'created_asc' => 'Äldsta först',
], ],
'no_podcast' => 'No podcast found', 'no_podcast' => 'Ingen podcast hittades',
]; ];

View File

@ -9,9 +9,9 @@ declare(strict_types=1);
*/ */
return [ return [
'back_to_home' => 'Back to home', 'back_to_home' => 'Tillbaka till startsidan',
'map' => [ 'map' => [
'title' => 'Map', 'title' => 'Karta',
'description' => 'Discover podcast episodes on {siteName} that are placed on a map! Travel through the map and listen to episodes that talk about specific locations.', 'description' => 'Upptäck podcast avsnitt på {siteName} som placeras på en karta! Res genom kartan och lyssna på avsnitt som talar om specifika platser.',
], ],
]; ];

View File

@ -9,45 +9,45 @@ declare(strict_types=1);
*/ */
return [ return [
'feed' => 'RSS Podcast feed', 'feed' => 'RSS Podcast flöde',
'season' => 'Season {seasonNumber}', 'season' => 'Säsong {seasonNumber}',
'list_of_episodes_year' => '{year} episodes ({episodeCount})', 'list_of_episodes_year' => '{year} avsnitt ({episodeCount})',
'list_of_episodes_season' => 'list_of_episodes_season' =>
'Season {seasonNumber} episodes ({episodeCount})', 'Säsong {seasonNumber} avsnitt ({episodeCount})',
'no_episode' => 'No episode found!', 'no_episode' => 'Inga avsnitt hittades!',
'follow' => 'Follow', 'follow' => 'Följ',
'followTitle' => 'Follow {actorDisplayName} on the fediverse!', 'followTitle' => 'Följ {actorDisplayName} på fediverse!',
'followers' => '{numberOfFollowers, plural, 'followers' => '{numberOfFollowers, plural,
one {# follower} one {# följare}
other {# followers} other {# följare}
}', }',
'posts' => '{numberOfPosts, plural, 'posts' => '{numberOfPosts, plural,
one {# post} one {# inlägg}
other {# posts} other {# inlägg}
}', }',
'activity' => 'Activity', 'activity' => 'Aktivitet',
'episodes' => 'Episodes', 'episodes' => 'Avsnitt',
'episodes_title' => 'Episodes of {podcastTitle}', 'episodes_title' => 'Avsnitt av {podcastTitle}',
'about' => 'About', 'about' => 'Om',
'stats' => [ 'stats' => [
'title' => 'Stats', 'title' => 'Statistik',
'number_of_seasons' => '{0, plural, 'number_of_seasons' => '{0, plural,
one {# season} one {# säsong}
other {# seasons} other {# säsonger}
}', }',
'number_of_episodes' => '{0, plural, 'number_of_episodes' => '{0, plural,
one {# episode} one {# avsnitt}
other {# episodes} other {# avsnitt}
}', }',
'first_published_at' => 'First episode published on {0, date, medium}', 'first_published_at' => 'Första avsnittet publicerades den {0, date, medium}',
], ],
'sponsor' => 'Sponsor', 'sponsor' => 'Sponsor',
'funding_links' => 'Funding links for {podcastTitle}', 'funding_links' => 'Finansiera länkar för {podcastTitle}',
'find_on' => 'Find {podcastTitle} on', 'find_on' => 'Hitta {podcastTitle} på',
'listen_on' => 'Listen on', 'listen_on' => 'Lyssna på',
'persons' => '{personsCount, plural, 'persons' => '{personsCount, plural,
one {# person} one {# person}
other {# persons} other {# personer}
}', }',
'persons_list' => 'Persons', 'persons_list' => 'Personer',
]; ];

View File

@ -9,32 +9,32 @@ declare(strict_types=1);
*/ */
return [ return [
'title' => "{actorDisplayName}'s post", 'title' => "{actorDisplayName}s inlägg",
'back_to_actor_posts' => 'Back to {actor} posts', 'back_to_actor_posts' => 'Tillbaka till {actor} inlägg',
'actor_shared' => '{actor} shared', 'actor_shared' => '{actor} delades',
'reply_to' => 'Reply to @{actorUsername}', 'reply_to' => 'Svara på @{actorUsername}',
'form' => [ 'form' => [
'message_placeholder' => 'Write a message…', 'message_placeholder' => 'Skriv ett meddelande…',
'episode_message_placeholder' => 'Write a message for the episode…', 'episode_message_placeholder' => 'Skriv ett meddelande för avsnittet…',
'episode_url_placeholder' => 'Episode URL', 'episode_url_placeholder' => 'Avsnitt URL',
'reply_to_placeholder' => 'Reply to @{actorUsername}', 'reply_to_placeholder' => 'Svara på @{actorUsername}',
'submit' => 'Send', 'submit' => 'Skicka',
'submit_reply' => 'Reply', 'submit_reply' => 'Svara',
], ],
'favourites' => '{numberOfFavourites, plural, 'favourites' => '{numberOfFavourites, plural,
one {# favourite} one {# favorit}
other {# favourites} other {# favoriter}
}', }',
'reblogs' => '{numberOfReblogs, plural, 'reblogs' => '{numberOfReblogs, plural,
one {# share} one {# delning}
other {# shares} other {# delningar}
}', }',
'replies' => '{numberOfReplies, plural, 'replies' => '{numberOfReplies, plural,
one {# reply} one {# svar}
other {# replies} other {# svar}
}', }',
'expand' => 'Expand post', 'expand' => 'Expandera inlägg',
'block_actor' => 'Block user @{actorUsername}', 'block_actor' => 'Blockera användare @{actorUsername}',
'block_domain' => 'Block domain @{actorDomain}', 'block_domain' => 'Blockera domän @{actorDomain}',
'delete' => 'Delete post', 'delete' => 'Ta bort inlägg',
]; ];

View File

@ -0,0 +1,87 @@
---
title: Authentication & Authorization
sidebarDepth: 3
---
# Authentication & Authorization
Castopod handles authentication and authorization using `codeigniter/shield`
coupled with custom rules. Roles and permissions are defined at two levels:
1. [instance wide](#1-instance-wide-roles-and-permissions)
2. [per podcast](#2-per-podcast-roles-and-permissions)
## 1. Instance wide roles and permissions
### Instance roles
<!-- AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section -->
| role | description | permissions |
| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ |
| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podcaster | General users of Castopod. | admin.access |
<!-- AUTH-INSTANCE-ROLES-LIST:END -->
### Instance permissions
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| permission | description |
| ----------------------- | ------------------------------------------------------------------ |
| admin.access | Can access the Castopod admin area. |
| admin.settings | Can access the Castopod settings. |
| users.manage | Can manage Castopod users. |
| persons.manage | Can manage persons. |
| pages.manage | Can manage pages. |
| podcasts.view | Can view all podcasts. |
| podcasts.create | Can create new podcasts. |
| podcasts.import | Can import podcasts. |
| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
## 2. Per podcast roles and permissions
### Per podcast roles
<!-- AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section -->
| role | description | permissions |
| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Admin | Has complete control of podcast #{id}. | \* |
| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications |
| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Guest | General contributor of the podcast #{id}. | view, episodes.view |
<!-- AUTH-PODCAST-ROLES-LIST:END -->
### Per podcast permissions
<!-- AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| permission | description |
| ---------------------------- | ------------------------------------------------------------------------ |
| view | Can view dashboard and analytics of podcast #{id}. |
| edit | Can edit podcast #{id}. |
| delete | Can delete podcast #{id}. |
| manage-import | Can synchronize imported podcast #{id}. |
| manage-persons | Can manage subscriptions of podcast #{id}. |
| manage-subscriptions | Can manage subscriptions of podcast #{id}. |
| manage-contributors | Can manage contributors of podcast #{id}. |
| manage-platforms | Can set/remove platform links of podcast #{id}. |
| manage-publications | Can publish podcast #{id}. |
| manage-notifications | Can view and mark notifications as read for podcast #{id}. |
| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. |
| episodes.view | Can view dashboard and analytics of podcast #{id}. |
| episodes.create | Can create episodes for podcast #{id}. |
| episodes.edit | Can edit podcast #{id}. |
| episodes.delete | Can delete podcast #{id}. |
| episodes.manage-persons | Can manage subscriptions of podcast #{id}. |
| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. |
| episodes.manage-publications | Can publish podcast #{id}. |
| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. |
<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->

View File

@ -5,13 +5,15 @@ sidebarDepth: 3
# Official Docker images # Official Docker images
Castopod pushes 2 Docker images to the Docker Hub during its automated build Castopod pushes 3 Docker images to the Docker Hub during its automated build
process: process:
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
Nginx configuration for Castopod Nginx configuration for Castopod
- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper):
an optional image building videoclips thanks to ffmpeg
Additionally, Castopod requires a MySQL-compatible database. A Redis database Additionally, Castopod requires a MySQL-compatible database. A Redis database
can be added as a cache handler. can be added as a cache handler.
@ -21,6 +23,8 @@ can be added as a cache handler.
- `develop` [unstable], latest development branch build - `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build - `beta` [stable], latest beta version build
- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) - `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
- `latest` [stable], latest version build
- `1.x.x` [stable], specific version build (since `1.0.0`)
## Example usage ## Example usage
@ -33,7 +37,7 @@ can be added as a cache handler.
services: services:
app: app:
image: castopod/app:beta image: castopod/app:latest
container_name: "castopod-app" container_name: "castopod-app"
volumes: volumes:
- castopod-media:/opt/castopod/public/media - castopod-media:/opt/castopod/public/media
@ -51,7 +55,7 @@ can be added as a cache handler.
restart: unless-stopped restart: unless-stopped
web-server: web-server:
image: castopod/web-server:beta image: castopod/web-server:latest
container_name: "castopod-web-server" container_name: "castopod-web-server"
volumes: volumes:
- castopod-media:/var/www/html/media - castopod-media:/var/www/html/media
@ -83,6 +87,21 @@ can be added as a cache handler.
networks: networks:
- castopod-app - castopod-app
# this container is optional
# add this if you want to use the videoclips feature
ffmpeg:
image: castopod/video-clipper:latest
container_name: "castopod-video-clipper"
volumes:
- castopod-media:/opt/castopod/public/media
environment:
MYSQL_DATABASE: castopod
MYSQL_USER: castopod
MYSQL_PASSWORD: changeme
networks:
- castopod-db
restart: unless-stopped
volumes: volumes:
castopod-media: castopod-media:
castopod-db: castopod-db:
@ -115,6 +134,16 @@ can be added as a cache handler.
## Environment Variables ## Environment Variables
- **castopod/video-clipper**
| Variable name | Type (`default`) | Default |
| -------------------------- | ---------------- | ---------------- |
| **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` |
| **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` |
| **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` |
| **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` |
| **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` |
- **castopod/app** - **castopod/app**
| Variable name | Type (`default`) | Default | | Variable name | Type (`default`) | Default |

View File

@ -0,0 +1,87 @@
---
title: Authentication & Authorization
sidebarDepth: 3
---
# Authentication & Authorization
Castopod handles authentication and authorization using `codeigniter/shield`
coupled with custom rules. Roles and permissions are defined at two levels:
1. [instance wide](#1-instance-wide-roles-and-permissions)
2. [per podcast](#2-per-podcast-roles-and-permissions)
## 1. Instance wide roles and permissions
### Instance roles
<!-- AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section -->
| role | description | permissions |
| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ |
| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podcaster | General users of Castopod. | admin.access |
<!-- AUTH-INSTANCE-ROLES-LIST:END -->
### Instance permissions
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| permission | description |
| ----------------------- | ------------------------------------------------------------------ |
| admin.access | Can access the Castopod admin area. |
| admin.settings | Can access the Castopod settings. |
| users.manage | Can manage Castopod users. |
| persons.manage | Can manage persons. |
| pages.manage | Can manage pages. |
| podcasts.view | Can view all podcasts. |
| podcasts.create | Can create new podcasts. |
| podcasts.import | Can import podcasts. |
| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
## 2. Per podcast roles and permissions
### Per podcast roles
<!-- AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section -->
| role | description | permissions |
| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Admin | Has complete control of podcast #{id}. | \* |
| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications |
| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Guest | General contributor of the podcast #{id}. | view, episodes.view |
<!-- AUTH-PODCAST-ROLES-LIST:END -->
### Per podcast permissions
<!-- AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| permission | description |
| ---------------------------- | ------------------------------------------------------------------------ |
| view | Can view dashboard and analytics of podcast #{id}. |
| edit | Can edit podcast #{id}. |
| delete | Can delete podcast #{id}. |
| manage-import | Can synchronize imported podcast #{id}. |
| manage-persons | Can manage subscriptions of podcast #{id}. |
| manage-subscriptions | Can manage subscriptions of podcast #{id}. |
| manage-contributors | Can manage contributors of podcast #{id}. |
| manage-platforms | Can set/remove platform links of podcast #{id}. |
| manage-publications | Can publish podcast #{id}. |
| manage-notifications | Can view and mark notifications as read for podcast #{id}. |
| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. |
| episodes.view | Can view dashboard and analytics of podcast #{id}. |
| episodes.create | Can create episodes for podcast #{id}. |
| episodes.edit | Can edit podcast #{id}. |
| episodes.delete | Can delete podcast #{id}. |
| episodes.manage-persons | Can manage subscriptions of podcast #{id}. |
| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. |
| episodes.manage-publications | Can publish podcast #{id}. |
| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. |
<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->

View File

@ -5,13 +5,15 @@ sidebarDepth: 3
# Official Docker images # Official Docker images
Castopod pushes 2 Docker images to the Docker Hub during its automated build Castopod pushes 3 Docker images to the Docker Hub during its automated build
process: process:
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
Nginx configuration for Castopod Nginx configuration for Castopod
- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper):
an optional image building videoclips thanks to ffmpeg
Additionally, Castopod requires a MySQL-compatible database. A Redis database Additionally, Castopod requires a MySQL-compatible database. A Redis database
can be added as a cache handler. can be added as a cache handler.
@ -21,6 +23,8 @@ can be added as a cache handler.
- `develop` [unstable], latest development branch build - `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build - `beta` [stable], latest beta version build
- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) - `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
- `latest` [stable], latest version build
- `1.x.x` [stable], specific version build (since `1.0.0`)
## Example usage ## Example usage
@ -33,7 +37,7 @@ can be added as a cache handler.
services: services:
app: app:
image: castopod/app:beta image: castopod/app:latest
container_name: "castopod-app" container_name: "castopod-app"
volumes: volumes:
- castopod-media:/opt/castopod/public/media - castopod-media:/opt/castopod/public/media
@ -51,7 +55,7 @@ can be added as a cache handler.
restart: unless-stopped restart: unless-stopped
web-server: web-server:
image: castopod/web-server:beta image: castopod/web-server:latest
container_name: "castopod-web-server" container_name: "castopod-web-server"
volumes: volumes:
- castopod-media:/var/www/html/media - castopod-media:/var/www/html/media
@ -83,6 +87,21 @@ can be added as a cache handler.
networks: networks:
- castopod-app - castopod-app
# this container is optional
# add this if you want to use the videoclips feature
ffmpeg:
image: castopod/video-clipper:latest
container_name: "castopod-video-clipper"
volumes:
- castopod-media:/opt/castopod/public/media
environment:
MYSQL_DATABASE: castopod
MYSQL_USER: castopod
MYSQL_PASSWORD: changeme
networks:
- castopod-db
restart: unless-stopped
volumes: volumes:
castopod-media: castopod-media:
castopod-db: castopod-db:
@ -115,6 +134,16 @@ can be added as a cache handler.
## Environment Variables ## Environment Variables
- **castopod/video-clipper**
| Variable name | Type (`default`) | Default |
| -------------------------- | ---------------- | ---------------- |
| **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` |
| **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` |
| **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` |
| **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` |
| **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` |
- **castopod/app** - **castopod/app**
| Variable name | Type (`default`) | Default | | Variable name | Type (`default`) | Default |

View File

@ -0,0 +1,87 @@
---
title: Authentication & Authorization
sidebarDepth: 3
---
# Authentication & Authorization
Castopod handles authentication and authorization using `codeigniter/shield`
coupled with custom rules. Roles and permissions are defined at two levels:
1. [instance wide](#1-instance-wide-roles-and-permissions)
2. [per podcast](#2-per-podcast-roles-and-permissions)
## 1. Instance wide roles and permissions
### Instance roles
<!-- AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section -->
| role | description | permissions |
| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ |
| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podcaster | General users of Castopod. | admin.access |
<!-- AUTH-INSTANCE-ROLES-LIST:END -->
### Instance permissions
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| permission | description |
| ----------------------- | ------------------------------------------------------------------ |
| admin.access | Can access the Castopod admin area. |
| admin.settings | Can access the Castopod settings. |
| users.manage | Can manage Castopod users. |
| persons.manage | Can manage persons. |
| pages.manage | Can manage pages. |
| podcasts.view | Can view all podcasts. |
| podcasts.create | Can create new podcasts. |
| podcasts.import | Can import podcasts. |
| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
## 2. Per podcast roles and permissions
### Per podcast roles
<!-- AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section -->
| role | description | permissions |
| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Admin | Has complete control of podcast #{id}. | \* |
| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications |
| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Guest | General contributor of the podcast #{id}. | view, episodes.view |
<!-- AUTH-PODCAST-ROLES-LIST:END -->
### Per podcast permissions
<!-- AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| permission | description |
| ---------------------------- | ------------------------------------------------------------------------ |
| view | Can view dashboard and analytics of podcast #{id}. |
| edit | Can edit podcast #{id}. |
| delete | Can delete podcast #{id}. |
| manage-import | Can synchronize imported podcast #{id}. |
| manage-persons | Can manage subscriptions of podcast #{id}. |
| manage-subscriptions | Can manage subscriptions of podcast #{id}. |
| manage-contributors | Can manage contributors of podcast #{id}. |
| manage-platforms | Can set/remove platform links of podcast #{id}. |
| manage-publications | Can publish podcast #{id}. |
| manage-notifications | Can view and mark notifications as read for podcast #{id}. |
| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. |
| episodes.view | Can view dashboard and analytics of podcast #{id}. |
| episodes.create | Can create episodes for podcast #{id}. |
| episodes.edit | Can edit podcast #{id}. |
| episodes.delete | Can delete podcast #{id}. |
| episodes.manage-persons | Can manage subscriptions of podcast #{id}. |
| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. |
| episodes.manage-publications | Can publish podcast #{id}. |
| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. |
<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->

View File

@ -5,13 +5,15 @@ sidebarDepth: 3
# Imatges Docker oficials # Imatges Docker oficials
Castopod envia 2 imatges de Docker al Docker Hub durant el seu procés de creació Castopod pushes 3 Docker images to the Docker Hub during its automated build
automatitzada: process:
- [** code>castopod/app</code>**](https://hub.docker.com/r/castopod/app): el - [** code>castopod/app</code>**](https://hub.docker.com/r/castopod/app): el
paquet incloent Castopod i totes les dependències paquet incloent Castopod i totes les dependències
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): una - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): una
configuració de Nginx per a Castopod configuració de Nginx per a Castopod
- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper):
an optional image building videoclips thanks to ffmpeg
A més, Castopod requereix una base de dades compatible amb MySQL. Es pot afegir A més, Castopod requereix una base de dades compatible amb MySQL. Es pot afegir
una base de dades Redis com a gestor de memòria cau. una base de dades Redis com a gestor de memòria cau.
@ -21,6 +23,8 @@ una base de dades Redis com a gestor de memòria cau.
- `develop` [no-estable], darrera versió de la branca de desenvolupament - `develop` [no-estable], darrera versió de la branca de desenvolupament
- `beta` [stable], latest beta version build - `beta` [stable], latest beta version build
- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) - `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
- `latest` [stable], latest version build
- `1.x.x` [stable], specific version build (since `1.0.0`)
## Exemple d'ús ## Exemple d'ús
@ -33,7 +37,7 @@ una base de dades Redis com a gestor de memòria cau.
services: services:
app: app:
image: castopod/app:beta image: castopod/app:latest
container_name: "castopod-app" container_name: "castopod-app"
volumes: volumes:
- castopod-media:/opt/castopod/public/media - castopod-media:/opt/castopod/public/media
@ -51,7 +55,7 @@ una base de dades Redis com a gestor de memòria cau.
restart: unless-stopped restart: unless-stopped
web-server: web-server:
image: castopod/web-server:beta image: castopod/web-server:latest
container_name: "castopod-web-server" container_name: "castopod-web-server"
volumes: volumes:
- castopod-media:/var/www/html/media - castopod-media:/var/www/html/media
@ -83,6 +87,21 @@ una base de dades Redis com a gestor de memòria cau.
networks: networks:
- castopod-app - castopod-app
# this container is optional
# add this if you want to use the videoclips feature
ffmpeg:
image: castopod/video-clipper:latest
container_name: "castopod-video-clipper"
volumes:
- castopod-media:/opt/castopod/public/media
environment:
MYSQL_DATABASE: castopod
MYSQL_USER: castopod
MYSQL_PASSWORD: changeme
networks:
- castopod-db
restart: unless-stopped
volumes: volumes:
castopod-media: castopod-media:
castopod-db: castopod-db:
@ -117,9 +136,19 @@ una base de dades Redis com a gestor de memòria cau.
## Variables d'entorn ## Variables d'entorn
- **castopod/video-clipper**
| Nom de la variable | Tipus (`default`) | Default |
| -------------------------- | ----------------- | ---------------- |
| **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` |
| **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` |
| **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` |
| **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` |
| **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` |
- **castopod/app** - **castopod/app**
| Nom de la variable | Tipus (`default`) | Default | | Nom de la variable | Type (`default`) | Default |
| ---------------------------- | ----------------------- | ---------------- | | ---------------------------- | ----------------------- | ---------------- |
| **`CP_BASEURL`** | string | `undefined` | | **`CP_BASEURL`** | string | `undefined` |
| **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` |
@ -145,6 +174,6 @@ una base de dades Redis com a gestor de memòria cau.
- **castopod/web-server** - **castopod/web-server**
| Nom de la variable | Type | Default | | Variable name | Type | Default |
| --------------------- | ------- | ------- | | --------------------- | ------- | ------- |
| **`CP_APP_HOSTNAME`** | ?string | `"app"` | | **`CP_APP_HOSTNAME`** | ?string | `"app"` |

View File

@ -87,8 +87,8 @@ descentralització i així garantir que la creativitat dels podcasters pugui
expressar-se. expressar-se.
Aquest projecte és impulsat per la comunitat de codi obert, i concretament pels Aquest projecte és impulsat per la comunitat de codi obert, i concretament pels
moviments [Fediverse](https://fediverse.party/en/fediverse/) i [Podcasting moviments [Fediverse](https://fediverse.party/en/fediverse/) i \[Podcasting
2.0](https://podcastindex .org/). 2.0\](https://podcastindex .org/).
## Comparació amb altres solucions ## Comparació amb altres solucions

View File

@ -0,0 +1,87 @@
---
title: Authentication & Authorization
sidebarDepth: 3
---
# Authentication & Authorization
Castopod handles authentication and authorization using `codeigniter/shield`
coupled with custom rules. Roles and permissions are defined at two levels:
1. [instance wide](#1-instance-wide-roles-and-permissions)
2. [per podcast](#2-per-podcast-roles-and-permissions)
## 1. Instance wide roles and permissions
### Instance roles
<!-- AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section -->
| role | description | permissions |
| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ |
| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podcaster | General users of Castopod. | admin.access |
<!-- AUTH-INSTANCE-ROLES-LIST:END -->
### Instance permissions
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| permission | description |
| ----------------------- | ------------------------------------------------------------------ |
| admin.access | Can access the Castopod admin area. |
| admin.settings | Can access the Castopod settings. |
| users.manage | Can manage Castopod users. |
| persons.manage | Can manage persons. |
| pages.manage | Can manage pages. |
| podcasts.view | Can view all podcasts. |
| podcasts.create | Can create new podcasts. |
| podcasts.import | Can import podcasts. |
| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
## 2. Per podcast roles and permissions
### Per podcast roles
<!-- AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section -->
| role | description | permissions |
| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Admin | Has complete control of podcast #{id}. | \* |
| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications |
| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Guest | General contributor of the podcast #{id}. | view, episodes.view |
<!-- AUTH-PODCAST-ROLES-LIST:END -->
### Per podcast permissions
<!-- AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| permission | description |
| ---------------------------- | ------------------------------------------------------------------------ |
| view | Can view dashboard and analytics of podcast #{id}. |
| edit | Can edit podcast #{id}. |
| delete | Can delete podcast #{id}. |
| manage-import | Can synchronize imported podcast #{id}. |
| manage-persons | Can manage subscriptions of podcast #{id}. |
| manage-subscriptions | Can manage subscriptions of podcast #{id}. |
| manage-contributors | Can manage contributors of podcast #{id}. |
| manage-platforms | Can set/remove platform links of podcast #{id}. |
| manage-publications | Can publish podcast #{id}. |
| manage-notifications | Can view and mark notifications as read for podcast #{id}. |
| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. |
| episodes.view | Can view dashboard and analytics of podcast #{id}. |
| episodes.create | Can create episodes for podcast #{id}. |
| episodes.edit | Can edit podcast #{id}. |
| episodes.delete | Can delete podcast #{id}. |
| episodes.manage-persons | Can manage subscriptions of podcast #{id}. |
| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. |
| episodes.manage-publications | Can publish podcast #{id}. |
| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. |
<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->

View File

@ -5,13 +5,15 @@ sidebarDepth: 3
# Official Docker images # Official Docker images
Castopod pushes 2 Docker images to the Docker Hub during its automated build Castopod pushes 3 Docker images to the Docker Hub during its automated build
process: process:
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
Nginx configuration for Castopod Nginx configuration for Castopod
- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper):
an optional image building videoclips thanks to ffmpeg
Additionally, Castopod requires a MySQL-compatible database. A Redis database Additionally, Castopod requires a MySQL-compatible database. A Redis database
can be added as a cache handler. can be added as a cache handler.
@ -21,6 +23,8 @@ can be added as a cache handler.
- `develop` [unstable], latest development branch build - `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build - `beta` [stable], latest beta version build
- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) - `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
- `latest` [stable], latest version build
- `1.x.x` [stable], specific version build (since `1.0.0`)
## Example usage ## Example usage
@ -33,7 +37,7 @@ can be added as a cache handler.
services: services:
app: app:
image: castopod/app:beta image: castopod/app:latest
container_name: "castopod-app" container_name: "castopod-app"
volumes: volumes:
- castopod-media:/opt/castopod/public/media - castopod-media:/opt/castopod/public/media
@ -51,7 +55,7 @@ can be added as a cache handler.
restart: unless-stopped restart: unless-stopped
web-server: web-server:
image: castopod/web-server:beta image: castopod/web-server:latest
container_name: "castopod-web-server" container_name: "castopod-web-server"
volumes: volumes:
- castopod-media:/var/www/html/media - castopod-media:/var/www/html/media
@ -83,6 +87,21 @@ can be added as a cache handler.
networks: networks:
- castopod-app - castopod-app
# this container is optional
# add this if you want to use the videoclips feature
ffmpeg:
image: castopod/video-clipper:latest
container_name: "castopod-video-clipper"
volumes:
- castopod-media:/opt/castopod/public/media
environment:
MYSQL_DATABASE: castopod
MYSQL_USER: castopod
MYSQL_PASSWORD: changeme
networks:
- castopod-db
restart: unless-stopped
volumes: volumes:
castopod-media: castopod-media:
castopod-db: castopod-db:
@ -115,6 +134,16 @@ can be added as a cache handler.
## Environment Variables ## Environment Variables
- **castopod/video-clipper**
| Variable name | Type (`default`) | Default |
| -------------------------- | ---------------- | ---------------- |
| **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` |
| **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` |
| **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` |
| **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` |
| **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` |
- **castopod/app** - **castopod/app**
| Variable name | Type (`default`) | Default | | Variable name | Type (`default`) | Default |

View File

@ -142,6 +142,8 @@ You may add your email configuration in your instance's `.env` like so:
```ini ```ini
# […] # […]
# […]
email.fromEmail="your_email_address" email.fromEmail="your_email_address"
email.SMTPHost="your_smtp_host" email.SMTPHost="your_smtp_host"
email.SMTPUser="your_smtp_user" email.SMTPUser="your_smtp_user"

View File

@ -0,0 +1,87 @@
---
title: Authentication & Authorization
sidebarDepth: 3
---
# Authentication & Authorization
Castopod handles authentication and authorization using `codeigniter/shield`
coupled with custom rules. Roles and permissions are defined at two levels:
1. [instance wide](#1-instance-wide-roles-and-permissions)
2. [per podcast](#2-per-podcast-roles-and-permissions)
## 1. Instance wide roles and permissions
### Instance roles
<!-- AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section -->
| role | description | permissions |
| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ |
| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podcaster | General users of Castopod. | admin.access |
<!-- AUTH-INSTANCE-ROLES-LIST:END -->
### Instance permissions
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| permission | description |
| ----------------------- | ------------------------------------------------------------------ |
| admin.access | Can access the Castopod admin area. |
| admin.settings | Can access the Castopod settings. |
| users.manage | Can manage Castopod users. |
| persons.manage | Can manage persons. |
| pages.manage | Can manage pages. |
| podcasts.view | Can view all podcasts. |
| podcasts.create | Can create new podcasts. |
| podcasts.import | Can import podcasts. |
| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
## 2. Per podcast roles and permissions
### Per podcast roles
<!-- AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section -->
| role | description | permissions |
| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Admin | Has complete control of podcast #{id}. | \* |
| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications |
| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Guest | General contributor of the podcast #{id}. | view, episodes.view |
<!-- AUTH-PODCAST-ROLES-LIST:END -->
### Per podcast permissions
<!-- AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| permission | description |
| ---------------------------- | ------------------------------------------------------------------------ |
| view | Can view dashboard and analytics of podcast #{id}. |
| edit | Can edit podcast #{id}. |
| delete | Can delete podcast #{id}. |
| manage-import | Can synchronize imported podcast #{id}. |
| manage-persons | Can manage subscriptions of podcast #{id}. |
| manage-subscriptions | Can manage subscriptions of podcast #{id}. |
| manage-contributors | Can manage contributors of podcast #{id}. |
| manage-platforms | Can set/remove platform links of podcast #{id}. |
| manage-publications | Can publish podcast #{id}. |
| manage-notifications | Can view and mark notifications as read for podcast #{id}. |
| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. |
| episodes.view | Can view dashboard and analytics of podcast #{id}. |
| episodes.create | Can create episodes for podcast #{id}. |
| episodes.edit | Can edit podcast #{id}. |
| episodes.delete | Can delete podcast #{id}. |
| episodes.manage-persons | Can manage subscriptions of podcast #{id}. |
| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. |
| episodes.manage-publications | Can publish podcast #{id}. |
| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. |
<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->

View File

@ -5,13 +5,15 @@ sidebarDepth: 3
# Official Docker images # Official Docker images
Castopod pushes 2 Docker images to the Docker Hub during its automated build Castopod pushes 3 Docker images to the Docker Hub during its automated build
process: process:
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
Nginx configuration for Castopod Nginx configuration for Castopod
- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper):
an optional image building videoclips thanks to ffmpeg
Additionally, Castopod requires a MySQL-compatible database. A Redis database Additionally, Castopod requires a MySQL-compatible database. A Redis database
can be added as a cache handler. can be added as a cache handler.
@ -21,6 +23,8 @@ can be added as a cache handler.
- `develop` [unstable], latest development branch build - `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build - `beta` [stable], latest beta version build
- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) - `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
- `latest` [stable], latest version build
- `1.x.x` [stable], specific version build (since `1.0.0`)
## Example usage ## Example usage
@ -33,7 +37,7 @@ can be added as a cache handler.
services: services:
app: app:
image: castopod/app:beta image: castopod/app:latest
container_name: "castopod-app" container_name: "castopod-app"
volumes: volumes:
- castopod-media:/opt/castopod/public/media - castopod-media:/opt/castopod/public/media
@ -51,7 +55,7 @@ can be added as a cache handler.
restart: unless-stopped restart: unless-stopped
web-server: web-server:
image: castopod/web-server:beta image: castopod/web-server:latest
container_name: "castopod-web-server" container_name: "castopod-web-server"
volumes: volumes:
- castopod-media:/var/www/html/media - castopod-media:/var/www/html/media
@ -83,6 +87,21 @@ can be added as a cache handler.
networks: networks:
- castopod-app - castopod-app
# this container is optional
# add this if you want to use the videoclips feature
ffmpeg:
image: castopod/video-clipper:latest
container_name: "castopod-video-clipper"
volumes:
- castopod-media:/opt/castopod/public/media
environment:
MYSQL_DATABASE: castopod
MYSQL_USER: castopod
MYSQL_PASSWORD: changeme
networks:
- castopod-db
restart: unless-stopped
volumes: volumes:
castopod-media: castopod-media:
castopod-db: castopod-db:
@ -115,6 +134,16 @@ can be added as a cache handler.
## Environment Variables ## Environment Variables
- **castopod/video-clipper**
| Variable name | Type (`default`) | Default |
| -------------------------- | ---------------- | ---------------- |
| **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` |
| **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` |
| **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` |
| **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` |
| **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` |
- **castopod/app** - **castopod/app**
| Variable name | Type (`default`) | Default | | Variable name | Type (`default`) | Default |

View File

@ -0,0 +1,87 @@
---
title: Authentication & Authorization
sidebarDepth: 3
---
# Authentication & Authorization
Castopod handles authentication and authorization using `codeigniter/shield`
coupled with custom rules. Roles and permissions are defined at two levels:
1. [instance wide](#1-instance-wide-roles-and-permissions)
2. [per podcast](#2-per-podcast-roles-and-permissions)
## 1. Instance wide roles and permissions
### Instance roles
<!-- AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section -->
| role | description | permissions |
| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ |
| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podcaster | General users of Castopod. | admin.access |
<!-- AUTH-INSTANCE-ROLES-LIST:END -->
### Instance permissions
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| permission | description |
| ----------------------- | ------------------------------------------------------------------ |
| admin.access | Can access the Castopod admin area. |
| admin.settings | Can access the Castopod settings. |
| users.manage | Can manage Castopod users. |
| persons.manage | Can manage persons. |
| pages.manage | Can manage pages. |
| podcasts.view | Can view all podcasts. |
| podcasts.create | Can create new podcasts. |
| podcasts.import | Can import podcasts. |
| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
## 2. Per podcast roles and permissions
### Per podcast roles
<!-- AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section -->
| role | description | permissions |
| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Admin | Has complete control of podcast #{id}. | \* |
| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications |
| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Guest | General contributor of the podcast #{id}. | view, episodes.view |
<!-- AUTH-PODCAST-ROLES-LIST:END -->
### Per podcast permissions
<!-- AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| permission | description |
| ---------------------------- | ------------------------------------------------------------------------ |
| view | Can view dashboard and analytics of podcast #{id}. |
| edit | Can edit podcast #{id}. |
| delete | Can delete podcast #{id}. |
| manage-import | Can synchronize imported podcast #{id}. |
| manage-persons | Can manage subscriptions of podcast #{id}. |
| manage-subscriptions | Can manage subscriptions of podcast #{id}. |
| manage-contributors | Can manage contributors of podcast #{id}. |
| manage-platforms | Can set/remove platform links of podcast #{id}. |
| manage-publications | Can publish podcast #{id}. |
| manage-notifications | Can view and mark notifications as read for podcast #{id}. |
| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. |
| episodes.view | Can view dashboard and analytics of podcast #{id}. |
| episodes.create | Can create episodes for podcast #{id}. |
| episodes.edit | Can edit podcast #{id}. |
| episodes.delete | Can delete podcast #{id}. |
| episodes.manage-persons | Can manage subscriptions of podcast #{id}. |
| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. |
| episodes.manage-publications | Can publish podcast #{id}. |
| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. |
<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->

View File

@ -5,13 +5,15 @@ sidebarDepth: 3
# Imágenes oficiales de Docker # Imágenes oficiales de Docker
Castopod lanza 2 imágenes Docker al Docker Hub durante su proceso de Castopod pushes 3 Docker images to the Docker Hub during its automated build
construcción automatizada: process:
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): el paquete - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): el paquete
completo de Castopod con todas las dependencias. completo de Castopod con todas las dependencias.
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): una - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): una
configuración Nginx para Castopod configuración Nginx para Castopod
- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper):
an optional image building videoclips thanks to ffmpeg
Adicionalmente, Castopod requiere una base de datos compatible con MySQL. Adicionalmente, Castopod requiere una base de datos compatible con MySQL.
También se puede añadir una base de datos Redis como gestor de caché. También se puede añadir una base de datos Redis como gestor de caché.
@ -21,6 +23,8 @@ También se puede añadir una base de datos Redis como gestor de caché.
- `develop` [unstable], última rama de desarrollo construida - `develop` [unstable], última rama de desarrollo construida
- `beta` [stable], latest beta version build - `beta` [stable], latest beta version build
- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) - `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
- `latest` [stable], latest version build
- `1.x.x` [stable], specific version build (since `1.0.0`)
## Ejemplo de uso ## Ejemplo de uso
@ -33,7 +37,7 @@ También se puede añadir una base de datos Redis como gestor de caché.
services: services:
app: app:
image: castopod/app:beta image: castopod/app:latest
container_name: "castopod-app" container_name: "castopod-app"
volumes: volumes:
- castopod-media:/opt/castopod/public/media - castopod-media:/opt/castopod/public/media
@ -51,7 +55,7 @@ También se puede añadir una base de datos Redis como gestor de caché.
restart: unless-stopped restart: unless-stopped
web-server: web-server:
image: castopod/web-server:beta image: castopod/web-server:latest
container_name: "castopod-web-server" container_name: "castopod-web-server"
volumes: volumes:
- castopod-media:/var/www/html/media - castopod-media:/var/www/html/media
@ -83,6 +87,21 @@ También se puede añadir una base de datos Redis como gestor de caché.
networks: networks:
- castopod-app - castopod-app
# this container is optional
# add this if you want to use the videoclips feature
ffmpeg:
image: castopod/video-clipper:latest
container_name: "castopod-video-clipper"
volumes:
- castopod-media:/opt/castopod/public/media
environment:
MYSQL_DATABASE: castopod
MYSQL_USER: castopod
MYSQL_PASSWORD: changeme
networks:
- castopod-db
restart: unless-stopped
volumes: volumes:
castopod-media: castopod-media:
castopod-db: castopod-db:
@ -113,13 +132,23 @@ También se puede añadir una base de datos Redis como gestor de caché.
`https://castopod.mi_dominio.com/cp-install` para terminar de configurar `https://castopod.mi_dominio.com/cp-install` para terminar de configurar
Castopod! Castopod!
5. Todo listo, empieza a hacer podcasting! 🎙️🚀 5. Todo listo, empieza a hacer podcasting! 🎙️🚀 🎙️🚀
## Variables de Entorno ## Variables de Entorno
- **castopod/video-clipper**
| Nombre de la Variable | Tipo (`predeterminado`) | Default |
| -------------------------- | ----------------------- | ---------------- |
| **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` |
| **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` |
| **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` |
| **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` |
| **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` |
- **castopod/app** - **castopod/app**
| Nombre de la Variable | Tipo (`predeterminado`) | Default | | Nombre de la variable | Type (`default`) | Default |
| ---------------------------- | ----------------------- | ---------------- | | ---------------------------- | ----------------------- | ---------------- |
| **`CP_URLBASE`** | string | `undefined` | | **`CP_URLBASE`** | string | `undefined` |
| **`CP_MEDIA_URLBASE`** | ?string | `CP_BASEURL` | | **`CP_MEDIA_URLBASE`** | ?string | `CP_BASEURL` |
@ -145,6 +174,6 @@ También se puede añadir una base de datos Redis como gestor de caché.
- **castopod/web-server** - **castopod/web-server**
| Nombre de la variable | Type | Default | | Variable name | Type | Default |
| --------------------- | ------- | ------- | | --------------------- | ------- | ------- |
| **`CP_APP_HOSTNAME`** | ?string | `"app"` | | **`CP_APP_HOSTNAME`** | ?string | `"app"` |

View File

@ -120,9 +120,7 @@ extensiones:
> Estas tareas así definidas se ejecutarán **cada minuto**. Pero puedes > Estas tareas así definidas se ejecutarán **cada minuto**. Pero puedes
> definir una frecuencia más acorde a tus necesidades: cada 5, 10 minutos o > definir una frecuencia más acorde a tus necesidades: cada 5, 10 minutos o
> más. Ejemplo: si reemplazas el último asterisco por \*/30 se ejecutará cada > más.
> 30 minutos.
> ([más ejemplos](https://blog.carreralinux.com.ar/2016/09/ejemplos-de-cron-tareas-linux/))
### (recomendado) Asistente web de instalación ### (recomendado) Asistente web de instalación
@ -150,10 +148,9 @@ You may add your email configuration in your instance's `.env` like so:
```ini ```ini
# […] # […]
email.fromEmail="your_email_address" SMTPHost="your_smtp_host"
email.SMTPHost="your_smtp_host" email. SMTPUser="your_smtp_user"
email.SMTPUser="your_smtp_user" email. SMTPPass="your_smtp_password"
email.SMTPPass="your_smtp_password"
``` ```
#### Email config options #### Email config options

View File

@ -66,7 +66,7 @@ Releases may come with additional update instructions (see
## Fully Automated updates ## Fully Automated updates
> Próximamente... 👀 > Próximamente...
## Preguntas Frecuentes (FAQ) ## Preguntas Frecuentes (FAQ)
@ -80,9 +80,9 @@ file.
### No he actualizado mi instancia en mucho tiempo… ¿Qué debo hacer? ### No he actualizado mi instancia en mucho tiempo… ¿Qué debo hacer?
No problem! Just get the latest release as described above. Only, when going No problem! No problem! Just get the latest release as described above. Only,
through the release instructions (4), perform them sequentially, from the oldest when going through the release instructions (4), perform them sequentially, from
to the newest. the oldest to the newest.
> Puede que quieras hacer una copia de seguridad de tu instancia dependiendo del > Puede que quieras hacer una copia de seguridad de tu instancia dependiendo del
> tiempo que no hayas actualizado Castopod. > tiempo que no hayas actualizado Castopod.

View File

@ -149,7 +149,7 @@ y usar Castopod si quieres alojar tus podcasts.
### Castopod vs. otras plataformas de podcast ### Castopod vs. otras plataformas de podcast
Hay muchas soluciones para alojar tus podcasts, algunas de las cuales son Hay muchas soluciones para alojar tus podcasts, algunas de las cuales son
realmente geniales y [muchas de ellas](https://podcastindex. org/apps) están realmente geniales y \[muchas de ellas\](https://podcastindex. org/apps) están
dando el salto al tren del Podcasting 2.0, ¡como ya ha hecho Castopod! dando el salto al tren del Podcasting 2.0, ¡como ya ha hecho Castopod!
Cada una de estas soluciones difiere entre sí, puedes compararlas en esta Cada una de estas soluciones difiere entre sí, puedes compararlas en esta

View File

@ -0,0 +1,87 @@
---
title: Authentication & Authorization
sidebarDepth: 3
---
# Authentication & Authorization
Castopod handles authentication and authorization using `codeigniter/shield`
coupled with custom rules. Roles and permissions are defined at two levels:
1. [instance wide](#1-instance-wide-roles-and-permissions)
2. [per podcast](#2-per-podcast-roles-and-permissions)
## 1. Instance wide roles and permissions
### Instance roles
<!-- AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section -->
| role | description | permissions |
| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ |
| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podcaster | General users of Castopod. | admin.access |
<!-- AUTH-INSTANCE-ROLES-LIST:END -->
### Instance permissions
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| permission | description |
| ----------------------- | ------------------------------------------------------------------ |
| admin.access | Can access the Castopod admin area. |
| admin.settings | Can access the Castopod settings. |
| users.manage | Can manage Castopod users. |
| persons.manage | Can manage persons. |
| pages.manage | Can manage pages. |
| podcasts.view | Can view all podcasts. |
| podcasts.create | Can create new podcasts. |
| podcasts.import | Can import podcasts. |
| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
## 2. Per podcast roles and permissions
### Per podcast roles
<!-- AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section -->
| role | description | permissions |
| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Admin | Has complete control of podcast #{id}. | \* |
| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications |
| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Guest | General contributor of the podcast #{id}. | view, episodes.view |
<!-- AUTH-PODCAST-ROLES-LIST:END -->
### Per podcast permissions
<!-- AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| permission | description |
| ---------------------------- | ------------------------------------------------------------------------ |
| view | Can view dashboard and analytics of podcast #{id}. |
| edit | Can edit podcast #{id}. |
| delete | Can delete podcast #{id}. |
| manage-import | Can synchronize imported podcast #{id}. |
| manage-persons | Can manage subscriptions of podcast #{id}. |
| manage-subscriptions | Can manage subscriptions of podcast #{id}. |
| manage-contributors | Can manage contributors of podcast #{id}. |
| manage-platforms | Can set/remove platform links of podcast #{id}. |
| manage-publications | Can publish podcast #{id}. |
| manage-notifications | Can view and mark notifications as read for podcast #{id}. |
| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. |
| episodes.view | Can view dashboard and analytics of podcast #{id}. |
| episodes.create | Can create episodes for podcast #{id}. |
| episodes.edit | Can edit podcast #{id}. |
| episodes.delete | Can delete podcast #{id}. |
| episodes.manage-persons | Can manage subscriptions of podcast #{id}. |
| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. |
| episodes.manage-publications | Can publish podcast #{id}. |
| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. |
<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->

View File

@ -5,13 +5,15 @@ sidebarDepth: 3
# Official Docker images # Official Docker images
Castopod pushes 2 Docker images to the Docker Hub during its automated build Castopod pushes 3 Docker images to the Docker Hub during its automated build
process: process:
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
Nginx configuration for Castopod Nginx configuration for Castopod
- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper):
an optional image building videoclips thanks to ffmpeg
Additionally, Castopod requires a MySQL-compatible database. A Redis database Additionally, Castopod requires a MySQL-compatible database. A Redis database
can be added as a cache handler. can be added as a cache handler.
@ -21,6 +23,8 @@ can be added as a cache handler.
- `develop` [unstable], latest development branch build - `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build - `beta` [stable], latest beta version build
- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) - `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
- `latest` [stable], latest version build
- `1.x.x` [stable], specific version build (since `1.0.0`)
## Example usage ## Example usage
@ -33,7 +37,7 @@ can be added as a cache handler.
services: services:
app: app:
image: castopod/app:beta image: castopod/app:latest
container_name: "castopod-app" container_name: "castopod-app"
volumes: volumes:
- castopod-media:/opt/castopod/public/media - castopod-media:/opt/castopod/public/media
@ -51,7 +55,7 @@ can be added as a cache handler.
restart: unless-stopped restart: unless-stopped
web-server: web-server:
image: castopod/web-server:beta image: castopod/web-server:latest
container_name: "castopod-web-server" container_name: "castopod-web-server"
volumes: volumes:
- castopod-media:/var/www/html/media - castopod-media:/var/www/html/media
@ -83,6 +87,21 @@ can be added as a cache handler.
networks: networks:
- castopod-app - castopod-app
# this container is optional
# add this if you want to use the videoclips feature
ffmpeg:
image: castopod/video-clipper:latest
container_name: "castopod-video-clipper"
volumes:
- castopod-media:/opt/castopod/public/media
environment:
MYSQL_DATABASE: castopod
MYSQL_USER: castopod
MYSQL_PASSWORD: changeme
networks:
- castopod-db
restart: unless-stopped
volumes: volumes:
castopod-media: castopod-media:
castopod-db: castopod-db:
@ -115,6 +134,16 @@ can be added as a cache handler.
## Environment Variables ## Environment Variables
- **castopod/video-clipper**
| Variable name | Type (`default`) | Default |
| -------------------------- | ---------------- | ---------------- |
| **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` |
| **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` |
| **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` |
| **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` |
| **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` |
- **castopod/app** - **castopod/app**
| Variable name | Type (`default`) | Default | | Variable name | Type (`default`) | Default |

View File

@ -0,0 +1,87 @@
---
title: Authentication & Authorization
sidebarDepth: 3
---
# Authentication & Authorization
Castopod handles authentication and authorization using `codeigniter/shield`
coupled with custom rules. Roles and permissions are defined at two levels:
1. [instance wide](#1-instance-wide-roles-and-permissions)
2. [per podcast](#2-per-podcast-roles-and-permissions)
## 1. Instance wide roles and permissions
### Instance roles
<!-- AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section -->
| role | description | permissions |
| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ |
| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podcaster | General users of Castopod. | admin.access |
<!-- AUTH-INSTANCE-ROLES-LIST:END -->
### Instance permissions
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| permission | description |
| ----------------------- | ------------------------------------------------------------------ |
| admin.access | Can access the Castopod admin area. |
| admin.settings | Can access the Castopod settings. |
| users.manage | Can manage Castopod users. |
| persons.manage | Can manage persons. |
| pages.manage | Can manage pages. |
| podcasts.view | Can view all podcasts. |
| podcasts.create | Can create new podcasts. |
| podcasts.import | Can import podcasts. |
| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
## 2. Per podcast roles and permissions
### Per podcast roles
<!-- AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section -->
| role | description | permissions |
| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Admin | Has complete control of podcast #{id}. | \* |
| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications |
| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Guest | General contributor of the podcast #{id}. | view, episodes.view |
<!-- AUTH-PODCAST-ROLES-LIST:END -->
### Per podcast permissions
<!-- AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| permission | description |
| ---------------------------- | ------------------------------------------------------------------------ |
| view | Can view dashboard and analytics of podcast #{id}. |
| edit | Can edit podcast #{id}. |
| delete | Can delete podcast #{id}. |
| manage-import | Can synchronize imported podcast #{id}. |
| manage-persons | Can manage subscriptions of podcast #{id}. |
| manage-subscriptions | Can manage subscriptions of podcast #{id}. |
| manage-contributors | Can manage contributors of podcast #{id}. |
| manage-platforms | Can set/remove platform links of podcast #{id}. |
| manage-publications | Can publish podcast #{id}. |
| manage-notifications | Can view and mark notifications as read for podcast #{id}. |
| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. |
| episodes.view | Can view dashboard and analytics of podcast #{id}. |
| episodes.create | Can create episodes for podcast #{id}. |
| episodes.edit | Can edit podcast #{id}. |
| episodes.delete | Can delete podcast #{id}. |
| episodes.manage-persons | Can manage subscriptions of podcast #{id}. |
| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. |
| episodes.manage-publications | Can publish podcast #{id}. |
| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. |
<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->

View File

@ -5,13 +5,15 @@ sidebarDepth: 3
# Official Docker images # Official Docker images
Castopod pushes 2 Docker images to the Docker Hub during its automated build Castopod pushes 3 Docker images to the Docker Hub during its automated build
process: process:
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
Nginx configuration for Castopod Nginx configuration for Castopod
- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper):
an optional image building videoclips thanks to ffmpeg
Additionally, Castopod requires a MySQL-compatible database. A Redis database Additionally, Castopod requires a MySQL-compatible database. A Redis database
can be added as a cache handler. can be added as a cache handler.
@ -21,6 +23,8 @@ can be added as a cache handler.
- `develop` [unstable], latest development branch build - `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build - `beta` [stable], latest beta version build
- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) - `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
- `latest` [stable], latest version build
- `1.x.x` [stable], specific version build (since `1.0.0`)
## Example usage ## Example usage
@ -33,7 +37,7 @@ can be added as a cache handler.
services: services:
app: app:
image: castopod/app:beta image: castopod/app:latest
container_name: "castopod-app" container_name: "castopod-app"
volumes: volumes:
- castopod-media:/opt/castopod/public/media - castopod-media:/opt/castopod/public/media
@ -51,7 +55,7 @@ can be added as a cache handler.
restart: unless-stopped restart: unless-stopped
web-server: web-server:
image: castopod/web-server:beta image: castopod/web-server:latest
container_name: "castopod-web-server" container_name: "castopod-web-server"
volumes: volumes:
- castopod-media:/var/www/html/media - castopod-media:/var/www/html/media
@ -83,6 +87,21 @@ can be added as a cache handler.
networks: networks:
- castopod-app - castopod-app
# this container is optional
# add this if you want to use the videoclips feature
ffmpeg:
image: castopod/video-clipper:latest
container_name: "castopod-video-clipper"
volumes:
- castopod-media:/opt/castopod/public/media
environment:
MYSQL_DATABASE: castopod
MYSQL_USER: castopod
MYSQL_PASSWORD: changeme
networks:
- castopod-db
restart: unless-stopped
volumes: volumes:
castopod-media: castopod-media:
castopod-db: castopod-db:
@ -115,6 +134,16 @@ can be added as a cache handler.
## Environment Variables ## Environment Variables
- **castopod/video-clipper**
| Variable name | Type (`default`) | Default |
| -------------------------- | ---------------- | ---------------- |
| **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` |
| **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` |
| **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` |
| **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` |
| **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` |
- **castopod/app** - **castopod/app**
| Variable name | Type (`default`) | Default | | Variable name | Type (`default`) | Default |

View File

@ -0,0 +1,87 @@
---
title: Authentication & Authorization
sidebarDepth: 3
---
# Authentication & Authorization
Castopod handles authentication and authorization using `codeigniter/shield`
coupled with custom rules. Roles and permissions are defined at two levels:
1. [instance wide](#1-instance-wide-roles-and-permissions)
2. [per podcast](#2-per-podcast-roles-and-permissions)
## 1. Instance wide roles and permissions
### Instance roles
<!-- AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section -->
| role | description | permissions |
| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ |
| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podcaster | General users of Castopod. | admin.access |
<!-- AUTH-INSTANCE-ROLES-LIST:END -->
### Instance permissions
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| permission | description |
| ----------------------- | ------------------------------------------------------------------ |
| admin.access | Can access the Castopod admin area. |
| admin.settings | Can access the Castopod settings. |
| users.manage | Can manage Castopod users. |
| persons.manage | Can manage persons. |
| pages.manage | Can manage pages. |
| podcasts.view | Can view all podcasts. |
| podcasts.create | Can create new podcasts. |
| podcasts.import | Can import podcasts. |
| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
## 2. Per podcast roles and permissions
### Per podcast roles
<!-- AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section -->
| role | description | permissions |
| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Admin | Has complete control of podcast #{id}. | \* |
| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications |
| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Guest | General contributor of the podcast #{id}. | view, episodes.view |
<!-- AUTH-PODCAST-ROLES-LIST:END -->
### Per podcast permissions
<!-- AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| permission | description |
| ---------------------------- | ------------------------------------------------------------------------ |
| view | Can view dashboard and analytics of podcast #{id}. |
| edit | Can edit podcast #{id}. |
| delete | Can delete podcast #{id}. |
| manage-import | Can synchronize imported podcast #{id}. |
| manage-persons | Can manage subscriptions of podcast #{id}. |
| manage-subscriptions | Can manage subscriptions of podcast #{id}. |
| manage-contributors | Can manage contributors of podcast #{id}. |
| manage-platforms | Can set/remove platform links of podcast #{id}. |
| manage-publications | Can publish podcast #{id}. |
| manage-notifications | Can view and mark notifications as read for podcast #{id}. |
| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. |
| episodes.view | Can view dashboard and analytics of podcast #{id}. |
| episodes.create | Can create episodes for podcast #{id}. |
| episodes.edit | Can edit podcast #{id}. |
| episodes.delete | Can delete podcast #{id}. |
| episodes.manage-persons | Can manage subscriptions of podcast #{id}. |
| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. |
| episodes.manage-publications | Can publish podcast #{id}. |
| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. |
<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->

View File

@ -5,13 +5,15 @@ sidebarDepth: 3
# Official Docker images # Official Docker images
Castopod pushes 2 Docker images to the Docker Hub during its automated build Castopod pushes 3 Docker images to the Docker Hub during its automated build
process: process:
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
Nginx configuration for Castopod Nginx configuration for Castopod
- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper):
an optional image building videoclips thanks to ffmpeg
Additionally, Castopod requires a MySQL-compatible database. A Redis database Additionally, Castopod requires a MySQL-compatible database. A Redis database
can be added as a cache handler. can be added as a cache handler.
@ -21,6 +23,8 @@ can be added as a cache handler.
- `develop` [unstable], latest development branch build - `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build - `beta` [stable], latest beta version build
- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) - `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
- `latest` [stable], latest version build
- `1.x.x` [stable], specific version build (since `1.0.0`)
## Example usage ## Example usage
@ -33,7 +37,7 @@ can be added as a cache handler.
services: services:
app: app:
image: castopod/app:beta image: castopod/app:latest
container_name: "castopod-app" container_name: "castopod-app"
volumes: volumes:
- castopod-media:/opt/castopod/public/media - castopod-media:/opt/castopod/public/media
@ -51,7 +55,7 @@ can be added as a cache handler.
restart: unless-stopped restart: unless-stopped
web-server: web-server:
image: castopod/web-server:beta image: castopod/web-server:latest
container_name: "castopod-web-server" container_name: "castopod-web-server"
volumes: volumes:
- castopod-media:/var/www/html/media - castopod-media:/var/www/html/media
@ -83,6 +87,21 @@ can be added as a cache handler.
networks: networks:
- castopod-app - castopod-app
# this container is optional
# add this if you want to use the videoclips feature
ffmpeg:
image: castopod/video-clipper:latest
container_name: "castopod-video-clipper"
volumes:
- castopod-media:/opt/castopod/public/media
environment:
MYSQL_DATABASE: castopod
MYSQL_USER: castopod
MYSQL_PASSWORD: changeme
networks:
- castopod-db
restart: unless-stopped
volumes: volumes:
castopod-media: castopod-media:
castopod-db: castopod-db:
@ -115,6 +134,16 @@ can be added as a cache handler.
## Environment Variables ## Environment Variables
- **castopod/video-clipper**
| Variable name | Type (`default`) | Default |
| -------------------------- | ---------------- | ---------------- |
| **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` |
| **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` |
| **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` |
| **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` |
| **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` |
- **castopod/app** - **castopod/app**
| Variable name | Type (`default`) | Default | | Variable name | Type (`default`) | Default |

View File

@ -285,6 +285,11 @@ https://img.shields.io/github/license/ad-aures/castopod?color=blue
https://img.shields.io/badge/contributions-welcome-brightgreen.svg https://img.shields.io/badge/contributions-welcome-brightgreen.svg
https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg
https://img.shields.io/github/stars/ad-aures/castopod?style=social https://img.shields.io/github/stars/ad-aures/castopod?style=social
https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release
https://img.shields.io/github/license/ad-aures/castopod?color=blue
https://img.shields.io/badge/contributions-welcome-brightgreen.svg
https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg
https://img.shields.io/github/stars/ad-aures/castopod?style=social
[release]: https://code.castopod.org/adaures/castopod/-/releases [release]: https://code.castopod.org/adaures/castopod/-/releases
[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md [license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md

View File

@ -0,0 +1,87 @@
---
title: Authentication & Authorization
sidebarDepth: 3
---
# Authentication & Authorization
Castopod handles authentication and authorization using `codeigniter/shield`
coupled with custom rules. Roles and permissions are defined at two levels:
1. [instance wide](#1-instance-wide-roles-and-permissions)
2. [per podcast](#2-per-podcast-roles-and-permissions)
## 1. Instance wide roles and permissions
### Instance roles
<!-- AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section -->
| role | description | permissions |
| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ |
| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podcaster | General users of Castopod. | admin.access |
<!-- AUTH-INSTANCE-ROLES-LIST:END -->
### Instance permissions
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| permission | description |
| ----------------------- | ------------------------------------------------------------------ |
| admin.access | Can access the Castopod admin area. |
| admin.settings | Can access the Castopod settings. |
| users.manage | Can manage Castopod users. |
| persons.manage | Can manage persons. |
| pages.manage | Can manage pages. |
| podcasts.view | Can view all podcasts. |
| podcasts.create | Can create new podcasts. |
| podcasts.import | Can import podcasts. |
| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
## 2. Per podcast roles and permissions
### Per podcast roles
<!-- AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section -->
| role | description | permissions |
| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Admin | Has complete control of podcast #{id}. | \* |
| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications |
| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Guest | General contributor of the podcast #{id}. | view, episodes.view |
<!-- AUTH-PODCAST-ROLES-LIST:END -->
### Per podcast permissions
<!-- AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| permission | description |
| ---------------------------- | ------------------------------------------------------------------------ |
| view | Can view dashboard and analytics of podcast #{id}. |
| edit | Can edit podcast #{id}. |
| delete | Can delete podcast #{id}. |
| manage-import | Can synchronize imported podcast #{id}. |
| manage-persons | Can manage subscriptions of podcast #{id}. |
| manage-subscriptions | Can manage subscriptions of podcast #{id}. |
| manage-contributors | Can manage contributors of podcast #{id}. |
| manage-platforms | Can set/remove platform links of podcast #{id}. |
| manage-publications | Can publish podcast #{id}. |
| manage-notifications | Can view and mark notifications as read for podcast #{id}. |
| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. |
| episodes.view | Can view dashboard and analytics of podcast #{id}. |
| episodes.create | Can create episodes for podcast #{id}. |
| episodes.edit | Can edit podcast #{id}. |
| episodes.delete | Can delete podcast #{id}. |
| episodes.manage-persons | Can manage subscriptions of podcast #{id}. |
| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. |
| episodes.manage-publications | Can publish podcast #{id}. |
| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. |
<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->

View File

@ -5,13 +5,15 @@ sidebarDepth: 3
# Official Docker images # Official Docker images
Castopod pushes 2 Docker images to the Docker Hub during its automated build Castopod pushes 3 Docker images to the Docker Hub during its automated build
process: process:
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
Nginx configuration for Castopod Nginx configuration for Castopod
- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper):
an optional image building videoclips thanks to ffmpeg
Additionally, Castopod requires a MySQL-compatible database. A Redis database Additionally, Castopod requires a MySQL-compatible database. A Redis database
can be added as a cache handler. can be added as a cache handler.
@ -21,6 +23,8 @@ can be added as a cache handler.
- `develop` [unstable], latest development branch build - `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build - `beta` [stable], latest beta version build
- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) - `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
- `latest` [stable], latest version build
- `1.x.x` [stable], specific version build (since `1.0.0`)
## Example usage ## Example usage
@ -33,7 +37,7 @@ can be added as a cache handler.
services: services:
app: app:
image: castopod/app:beta image: castopod/app:latest
container_name: "castopod-app" container_name: "castopod-app"
volumes: volumes:
- castopod-media:/opt/castopod/public/media - castopod-media:/opt/castopod/public/media
@ -51,7 +55,7 @@ can be added as a cache handler.
restart: unless-stopped restart: unless-stopped
web-server: web-server:
image: castopod/web-server:beta image: castopod/web-server:latest
container_name: "castopod-web-server" container_name: "castopod-web-server"
volumes: volumes:
- castopod-media:/var/www/html/media - castopod-media:/var/www/html/media
@ -83,6 +87,21 @@ can be added as a cache handler.
networks: networks:
- castopod-app - castopod-app
# this container is optional
# add this if you want to use the videoclips feature
ffmpeg:
image: castopod/video-clipper:latest
container_name: "castopod-video-clipper"
volumes:
- castopod-media:/opt/castopod/public/media
environment:
MYSQL_DATABASE: castopod
MYSQL_USER: castopod
MYSQL_PASSWORD: changeme
networks:
- castopod-db
restart: unless-stopped
volumes: volumes:
castopod-media: castopod-media:
castopod-db: castopod-db:
@ -115,6 +134,16 @@ can be added as a cache handler.
## Environment Variables ## Environment Variables
- **castopod/video-clipper**
| Variable name | Type (`default`) | Default |
| -------------------------- | ---------------- | ---------------- |
| **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` |
| **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` |
| **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` |
| **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` |
| **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` |
- **castopod/app** - **castopod/app**
| Variable name | Type (`default`) | Default | | Variable name | Type (`default`) | Default |

View File

@ -0,0 +1,87 @@
---
title: Authentication & Authorization
sidebarDepth: 3
---
# Authentication & Authorization
Castopod handles authentication and authorization using `codeigniter/shield`
coupled with custom rules. Roles and permissions are defined at two levels:
1. [instance wide](#1-instance-wide-roles-and-permissions)
2. [per podcast](#2-per-podcast-roles-and-permissions)
## 1. Instance wide roles and permissions
### Instance roles
<!-- AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section -->
| role | description | permissions |
| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ |
| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podcaster | General users of Castopod. | admin.access |
<!-- AUTH-INSTANCE-ROLES-LIST:END -->
### Instance permissions
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| permission | description |
| ----------------------- | ------------------------------------------------------------------ |
| admin.access | Can access the Castopod admin area. |
| admin.settings | Can access the Castopod settings. |
| users.manage | Can manage Castopod users. |
| persons.manage | Can manage persons. |
| pages.manage | Can manage pages. |
| podcasts.view | Can view all podcasts. |
| podcasts.create | Can create new podcasts. |
| podcasts.import | Can import podcasts. |
| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
## 2. Per podcast roles and permissions
### Per podcast roles
<!-- AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section -->
| role | description | permissions |
| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Admin | Has complete control of podcast #{id}. | \* |
| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications |
| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Guest | General contributor of the podcast #{id}. | view, episodes.view |
<!-- AUTH-PODCAST-ROLES-LIST:END -->
### Per podcast permissions
<!-- AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| permission | description |
| ---------------------------- | ------------------------------------------------------------------------ |
| view | Can view dashboard and analytics of podcast #{id}. |
| edit | Can edit podcast #{id}. |
| delete | Can delete podcast #{id}. |
| manage-import | Can synchronize imported podcast #{id}. |
| manage-persons | Can manage subscriptions of podcast #{id}. |
| manage-subscriptions | Can manage subscriptions of podcast #{id}. |
| manage-contributors | Can manage contributors of podcast #{id}. |
| manage-platforms | Can set/remove platform links of podcast #{id}. |
| manage-publications | Can publish podcast #{id}. |
| manage-notifications | Can view and mark notifications as read for podcast #{id}. |
| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. |
| episodes.view | Can view dashboard and analytics of podcast #{id}. |
| episodes.create | Can create episodes for podcast #{id}. |
| episodes.edit | Can edit podcast #{id}. |
| episodes.delete | Can delete podcast #{id}. |
| episodes.manage-persons | Can manage subscriptions of podcast #{id}. |
| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. |
| episodes.manage-publications | Can publish podcast #{id}. |
| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. |
<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->

View File

@ -5,13 +5,15 @@ sidebarDepth: 3
# Official Docker images # Official Docker images
Castopod pushes 2 Docker images to the Docker Hub during its automated build Castopod pushes 3 Docker images to the Docker Hub during its automated build
process: process:
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
Nginx configuration for Castopod Nginx configuration for Castopod
- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper):
an optional image building videoclips thanks to ffmpeg
Additionally, Castopod requires a MySQL-compatible database. A Redis database Additionally, Castopod requires a MySQL-compatible database. A Redis database
can be added as a cache handler. can be added as a cache handler.
@ -21,6 +23,8 @@ can be added as a cache handler.
- `develop` [unstable], latest development branch build - `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build - `beta` [stable], latest beta version build
- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) - `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
- `latest` [stable], latest version build
- `1.x.x` [stable], specific version build (since `1.0.0`)
## Example usage ## Example usage
@ -33,7 +37,7 @@ can be added as a cache handler.
services: services:
app: app:
image: castopod/app:beta image: castopod/app:latest
container_name: "castopod-app" container_name: "castopod-app"
volumes: volumes:
- castopod-media:/opt/castopod/public/media - castopod-media:/opt/castopod/public/media
@ -51,7 +55,7 @@ can be added as a cache handler.
restart: unless-stopped restart: unless-stopped
web-server: web-server:
image: castopod/web-server:beta image: castopod/web-server:latest
container_name: "castopod-web-server" container_name: "castopod-web-server"
volumes: volumes:
- castopod-media:/var/www/html/media - castopod-media:/var/www/html/media
@ -83,6 +87,21 @@ can be added as a cache handler.
networks: networks:
- castopod-app - castopod-app
# this container is optional
# add this if you want to use the videoclips feature
ffmpeg:
image: castopod/video-clipper:latest
container_name: "castopod-video-clipper"
volumes:
- castopod-media:/opt/castopod/public/media
environment:
MYSQL_DATABASE: castopod
MYSQL_USER: castopod
MYSQL_PASSWORD: changeme
networks:
- castopod-db
restart: unless-stopped
volumes: volumes:
castopod-media: castopod-media:
castopod-db: castopod-db:
@ -115,6 +134,16 @@ can be added as a cache handler.
## Environment Variables ## Environment Variables
- **castopod/video-clipper**
| Variable name | Type (`default`) | Default |
| -------------------------- | ---------------- | ---------------- |
| **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` |
| **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` |
| **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` |
| **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` |
| **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` |
- **castopod/app** - **castopod/app**
| Variable name | Type (`default`) | Default | | Variable name | Type (`default`) | Default |

View File

@ -0,0 +1,87 @@
---
title: Authentication & Authorization
sidebarDepth: 3
---
# Authentication & Authorization
Castopod handles authentication and authorization using `codeigniter/shield`
coupled with custom rules. Roles and permissions are defined at two levels:
1. [instance wide](#1-instance-wide-roles-and-permissions)
2. [per podcast](#2-per-podcast-roles-and-permissions)
## 1. Instance wide roles and permissions
### Instance roles
<!-- AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section -->
| role | description | permissions |
| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ |
| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podcaster | General users of Castopod. | admin.access |
<!-- AUTH-INSTANCE-ROLES-LIST:END -->
### Instance permissions
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| permission | description |
| ----------------------- | ------------------------------------------------------------------ |
| admin.access | Can access the Castopod admin area. |
| admin.settings | Can access the Castopod settings. |
| users.manage | Can manage Castopod users. |
| persons.manage | Can manage persons. |
| pages.manage | Can manage pages. |
| podcasts.view | Can view all podcasts. |
| podcasts.create | Can create new podcasts. |
| podcasts.import | Can import podcasts. |
| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
## 2. Per podcast roles and permissions
### Per podcast roles
<!-- AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section -->
| role | description | permissions |
| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Admin | Has complete control of podcast #{id}. | \* |
| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications |
| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Guest | General contributor of the podcast #{id}. | view, episodes.view |
<!-- AUTH-PODCAST-ROLES-LIST:END -->
### Per podcast permissions
<!-- AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| permission | description |
| ---------------------------- | ------------------------------------------------------------------------ |
| view | Can view dashboard and analytics of podcast #{id}. |
| edit | Can edit podcast #{id}. |
| delete | Can delete podcast #{id}. |
| manage-import | Can synchronize imported podcast #{id}. |
| manage-persons | Can manage subscriptions of podcast #{id}. |
| manage-subscriptions | Can manage subscriptions of podcast #{id}. |
| manage-contributors | Can manage contributors of podcast #{id}. |
| manage-platforms | Can set/remove platform links of podcast #{id}. |
| manage-publications | Can publish podcast #{id}. |
| manage-notifications | Can view and mark notifications as read for podcast #{id}. |
| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. |
| episodes.view | Can view dashboard and analytics of podcast #{id}. |
| episodes.create | Can create episodes for podcast #{id}. |
| episodes.edit | Can edit podcast #{id}. |
| episodes.delete | Can delete podcast #{id}. |
| episodes.manage-persons | Can manage subscriptions of podcast #{id}. |
| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. |
| episodes.manage-publications | Can publish podcast #{id}. |
| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. |
<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->

View File

@ -5,13 +5,15 @@ sidebarDepth: 3
# Official Docker images # Official Docker images
Castopod pushes 2 Docker images to the Docker Hub during its automated build Castopod pushes 3 Docker images to the Docker Hub during its automated build
process: process:
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
Nginx configuration for Castopod Nginx configuration for Castopod
- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper):
an optional image building videoclips thanks to ffmpeg
Additionally, Castopod requires a MySQL-compatible database. A Redis database Additionally, Castopod requires a MySQL-compatible database. A Redis database
can be added as a cache handler. can be added as a cache handler.
@ -21,6 +23,8 @@ can be added as a cache handler.
- `develop` [unstable], latest development branch build - `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build - `beta` [stable], latest beta version build
- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) - `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
- `latest` [stable], latest version build
- `1.x.x` [stable], specific version build (since `1.0.0`)
## Example usage ## Example usage
@ -33,7 +37,7 @@ can be added as a cache handler.
services: services:
app: app:
image: castopod/app:beta image: castopod/app:latest
container_name: "castopod-app" container_name: "castopod-app"
volumes: volumes:
- castopod-media:/opt/castopod/public/media - castopod-media:/opt/castopod/public/media
@ -51,7 +55,7 @@ can be added as a cache handler.
restart: unless-stopped restart: unless-stopped
web-server: web-server:
image: castopod/web-server:beta image: castopod/web-server:latest
container_name: "castopod-web-server" container_name: "castopod-web-server"
volumes: volumes:
- castopod-media:/var/www/html/media - castopod-media:/var/www/html/media
@ -83,6 +87,21 @@ can be added as a cache handler.
networks: networks:
- castopod-app - castopod-app
# this container is optional
# add this if you want to use the videoclips feature
ffmpeg:
image: castopod/video-clipper:latest
container_name: "castopod-video-clipper"
volumes:
- castopod-media:/opt/castopod/public/media
environment:
MYSQL_DATABASE: castopod
MYSQL_USER: castopod
MYSQL_PASSWORD: changeme
networks:
- castopod-db
restart: unless-stopped
volumes: volumes:
castopod-media: castopod-media:
castopod-db: castopod-db:
@ -115,6 +134,16 @@ can be added as a cache handler.
## Environment Variables ## Environment Variables
- **castopod/video-clipper**
| Variable name | Type (`default`) | Default |
| -------------------------- | ---------------- | ---------------- |
| **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` |
| **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` |
| **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` |
| **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` |
| **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` |
- **castopod/app** - **castopod/app**
| Variable name | Type (`default`) | Default | | Variable name | Type (`default`) | Default |

View File

@ -0,0 +1,87 @@
---
title: Authentication & Authorization
sidebarDepth: 3
---
# Authentication & Authorization
Castopod handles authentication and authorization using `codeigniter/shield`
coupled with custom rules. Roles and permissions are defined at two levels:
1. [instance wide](#1-instance-wide-roles-and-permissions)
2. [per podcast](#2-per-podcast-roles-and-permissions)
## 1. Instance wide roles and permissions
### Instance roles
<!-- AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section -->
| role | description | permissions |
| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ |
| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podcaster | General users of Castopod. | admin.access |
<!-- AUTH-INSTANCE-ROLES-LIST:END -->
### Instance permissions
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| permission | description |
| ----------------------- | ------------------------------------------------------------------ |
| admin.access | Can access the Castopod admin area. |
| admin.settings | Can access the Castopod settings. |
| users.manage | Can manage Castopod users. |
| persons.manage | Can manage persons. |
| pages.manage | Can manage pages. |
| podcasts.view | Can view all podcasts. |
| podcasts.create | Can create new podcasts. |
| podcasts.import | Can import podcasts. |
| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
## 2. Per podcast roles and permissions
### Per podcast roles
<!-- AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section -->
| role | description | permissions |
| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Admin | Has complete control of podcast #{id}. | \* |
| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications |
| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Guest | General contributor of the podcast #{id}. | view, episodes.view |
<!-- AUTH-PODCAST-ROLES-LIST:END -->
### Per podcast permissions
<!-- AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| permission | description |
| ---------------------------- | ------------------------------------------------------------------------ |
| view | Can view dashboard and analytics of podcast #{id}. |
| edit | Can edit podcast #{id}. |
| delete | Can delete podcast #{id}. |
| manage-import | Can synchronize imported podcast #{id}. |
| manage-persons | Can manage subscriptions of podcast #{id}. |
| manage-subscriptions | Can manage subscriptions of podcast #{id}. |
| manage-contributors | Can manage contributors of podcast #{id}. |
| manage-platforms | Can set/remove platform links of podcast #{id}. |
| manage-publications | Can publish podcast #{id}. |
| manage-notifications | Can view and mark notifications as read for podcast #{id}. |
| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. |
| episodes.view | Can view dashboard and analytics of podcast #{id}. |
| episodes.create | Can create episodes for podcast #{id}. |
| episodes.edit | Can edit podcast #{id}. |
| episodes.delete | Can delete podcast #{id}. |
| episodes.manage-persons | Can manage subscriptions of podcast #{id}. |
| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. |
| episodes.manage-publications | Can publish podcast #{id}. |
| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. |
<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->

View File

@ -5,13 +5,15 @@ sidebarDepth: 3
# Official Docker images # Official Docker images
Castopod pushes 2 Docker images to the Docker Hub during its automated build Castopod pushes 3 Docker images to the Docker Hub during its automated build
process: process:
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
Nginx configuration for Castopod Nginx configuration for Castopod
- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper):
an optional image building videoclips thanks to ffmpeg
Additionally, Castopod requires a MySQL-compatible database. A Redis database Additionally, Castopod requires a MySQL-compatible database. A Redis database
can be added as a cache handler. can be added as a cache handler.
@ -21,6 +23,8 @@ can be added as a cache handler.
- `develop` [unstable], latest development branch build - `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build - `beta` [stable], latest beta version build
- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) - `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
- `latest` [stable], latest version build
- `1.x.x` [stable], specific version build (since `1.0.0`)
## Example usage ## Example usage
@ -33,7 +37,7 @@ can be added as a cache handler.
services: services:
app: app:
image: castopod/app:beta image: castopod/app:latest
container_name: "castopod-app" container_name: "castopod-app"
volumes: volumes:
- castopod-media:/opt/castopod/public/media - castopod-media:/opt/castopod/public/media
@ -51,7 +55,7 @@ can be added as a cache handler.
restart: unless-stopped restart: unless-stopped
web-server: web-server:
image: castopod/web-server:beta image: castopod/web-server:latest
container_name: "castopod-web-server" container_name: "castopod-web-server"
volumes: volumes:
- castopod-media:/var/www/html/media - castopod-media:/var/www/html/media
@ -83,6 +87,21 @@ can be added as a cache handler.
networks: networks:
- castopod-app - castopod-app
# this container is optional
# add this if you want to use the videoclips feature
ffmpeg:
image: castopod/video-clipper:latest
container_name: "castopod-video-clipper"
volumes:
- castopod-media:/opt/castopod/public/media
environment:
MYSQL_DATABASE: castopod
MYSQL_USER: castopod
MYSQL_PASSWORD: changeme
networks:
- castopod-db
restart: unless-stopped
volumes: volumes:
castopod-media: castopod-media:
castopod-db: castopod-db:
@ -115,6 +134,16 @@ can be added as a cache handler.
## Environment Variables ## Environment Variables
- **castopod/video-clipper**
| Variable name | Type (`default`) | Default |
| -------------------------- | ---------------- | ---------------- |
| **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` |
| **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` |
| **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` |
| **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` |
| **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` |
- **castopod/app** - **castopod/app**
| Variable name | Type (`default`) | Default | | Variable name | Type (`default`) | Default |

View File

@ -0,0 +1,87 @@
---
title: Authentication & Authorization
sidebarDepth: 3
---
# Authentication & Authorization
Castopod handles authentication and authorization using `codeigniter/shield`
coupled with custom rules. Roles and permissions are defined at two levels:
1. [instance wide](#1-instance-wide-roles-and-permissions)
2. [per podcast](#2-per-podcast-roles-and-permissions)
## 1. Instance wide roles and permissions
### Instance roles
<!-- AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section -->
| role | description | permissions |
| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ |
| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podcaster | General users of Castopod. | admin.access |
<!-- AUTH-INSTANCE-ROLES-LIST:END -->
### Instance permissions
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| permission | description |
| ----------------------- | ------------------------------------------------------------------ |
| admin.access | Can access the Castopod admin area. |
| admin.settings | Can access the Castopod settings. |
| users.manage | Can manage Castopod users. |
| persons.manage | Can manage persons. |
| pages.manage | Can manage pages. |
| podcasts.view | Can view all podcasts. |
| podcasts.create | Can create new podcasts. |
| podcasts.import | Can import podcasts. |
| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
## 2. Per podcast roles and permissions
### Per podcast roles
<!-- AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section -->
| role | description | permissions |
| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Admin | Has complete control of podcast #{id}. | \* |
| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications |
| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Guest | General contributor of the podcast #{id}. | view, episodes.view |
<!-- AUTH-PODCAST-ROLES-LIST:END -->
### Per podcast permissions
<!-- AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| permission | description |
| ---------------------------- | ------------------------------------------------------------------------ |
| view | Can view dashboard and analytics of podcast #{id}. |
| edit | Can edit podcast #{id}. |
| delete | Can delete podcast #{id}. |
| manage-import | Can synchronize imported podcast #{id}. |
| manage-persons | Can manage subscriptions of podcast #{id}. |
| manage-subscriptions | Can manage subscriptions of podcast #{id}. |
| manage-contributors | Can manage contributors of podcast #{id}. |
| manage-platforms | Can set/remove platform links of podcast #{id}. |
| manage-publications | Can publish podcast #{id}. |
| manage-notifications | Can view and mark notifications as read for podcast #{id}. |
| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. |
| episodes.view | Can view dashboard and analytics of podcast #{id}. |
| episodes.create | Can create episodes for podcast #{id}. |
| episodes.edit | Can edit podcast #{id}. |
| episodes.delete | Can delete podcast #{id}. |
| episodes.manage-persons | Can manage subscriptions of podcast #{id}. |
| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. |
| episodes.manage-publications | Can publish podcast #{id}. |
| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. |
<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->

View File

@ -5,13 +5,15 @@ sidebarDepth: 3
# Official Docker images # Official Docker images
Castopod pushes 2 Docker images to the Docker Hub during its automated build Castopod pushes 3 Docker images to the Docker Hub during its automated build
process: process:
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
Nginx configuration for Castopod Nginx configuration for Castopod
- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper):
an optional image building videoclips thanks to ffmpeg
Additionally, Castopod requires a MySQL-compatible database. A Redis database Additionally, Castopod requires a MySQL-compatible database. A Redis database
can be added as a cache handler. can be added as a cache handler.
@ -21,6 +23,8 @@ can be added as a cache handler.
- `develop` [unstable], latest development branch build - `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build - `beta` [stable], latest beta version build
- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) - `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
- `latest` [stable], latest version build
- `1.x.x` [stable], specific version build (since `1.0.0`)
## Example usage ## Example usage
@ -33,7 +37,7 @@ can be added as a cache handler.
services: services:
app: app:
image: castopod/app:beta image: castopod/app:latest
container_name: "castopod-app" container_name: "castopod-app"
volumes: volumes:
- castopod-media:/opt/castopod/public/media - castopod-media:/opt/castopod/public/media
@ -51,7 +55,7 @@ can be added as a cache handler.
restart: unless-stopped restart: unless-stopped
web-server: web-server:
image: castopod/web-server:beta image: castopod/web-server:latest
container_name: "castopod-web-server" container_name: "castopod-web-server"
volumes: volumes:
- castopod-media:/var/www/html/media - castopod-media:/var/www/html/media
@ -83,6 +87,21 @@ can be added as a cache handler.
networks: networks:
- castopod-app - castopod-app
# this container is optional
# add this if you want to use the videoclips feature
ffmpeg:
image: castopod/video-clipper:latest
container_name: "castopod-video-clipper"
volumes:
- castopod-media:/opt/castopod/public/media
environment:
MYSQL_DATABASE: castopod
MYSQL_USER: castopod
MYSQL_PASSWORD: changeme
networks:
- castopod-db
restart: unless-stopped
volumes: volumes:
castopod-media: castopod-media:
castopod-db: castopod-db:
@ -115,6 +134,16 @@ can be added as a cache handler.
## Environment Variables ## Environment Variables
- **castopod/video-clipper**
| Variable name | Type (`default`) | Default |
| -------------------------- | ---------------- | ---------------- |
| **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` |
| **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` |
| **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` |
| **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` |
| **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` |
- **castopod/app** - **castopod/app**
| Variable name | Type (`default`) | Default | | Variable name | Type (`default`) | Default |

View File

@ -0,0 +1,87 @@
---
title: Authentication & Authorization
sidebarDepth: 3
---
# Authentication & Authorization
Castopod handles authentication and authorization using `codeigniter/shield`
coupled with custom rules. Roles and permissions are defined at two levels:
1. [instance wide](#1-instance-wide-roles-and-permissions)
2. [per podcast](#2-per-podcast-roles-and-permissions)
## 1. Instance wide roles and permissions
### Instance roles
<!-- AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section -->
| role | description | permissions |
| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ |
| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podcaster | General users of Castopod. | admin.access |
<!-- AUTH-INSTANCE-ROLES-LIST:END -->
### Instance permissions
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| permission | description |
| ----------------------- | ------------------------------------------------------------------ |
| admin.access | Can access the Castopod admin area. |
| admin.settings | Can access the Castopod settings. |
| users.manage | Can manage Castopod users. |
| persons.manage | Can manage persons. |
| pages.manage | Can manage pages. |
| podcasts.view | Can view all podcasts. |
| podcasts.create | Can create new podcasts. |
| podcasts.import | Can import podcasts. |
| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
## 2. Per podcast roles and permissions
### Per podcast roles
<!-- AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section -->
| role | description | permissions |
| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Admin | Has complete control of podcast #{id}. | \* |
| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications |
| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Guest | General contributor of the podcast #{id}. | view, episodes.view |
<!-- AUTH-PODCAST-ROLES-LIST:END -->
### Per podcast permissions
<!-- AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| permission | description |
| ---------------------------- | ------------------------------------------------------------------------ |
| view | Can view dashboard and analytics of podcast #{id}. |
| edit | Can edit podcast #{id}. |
| delete | Can delete podcast #{id}. |
| manage-import | Can synchronize imported podcast #{id}. |
| manage-persons | Can manage subscriptions of podcast #{id}. |
| manage-subscriptions | Can manage subscriptions of podcast #{id}. |
| manage-contributors | Can manage contributors of podcast #{id}. |
| manage-platforms | Can set/remove platform links of podcast #{id}. |
| manage-publications | Can publish podcast #{id}. |
| manage-notifications | Can view and mark notifications as read for podcast #{id}. |
| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. |
| episodes.view | Can view dashboard and analytics of podcast #{id}. |
| episodes.create | Can create episodes for podcast #{id}. |
| episodes.edit | Can edit podcast #{id}. |
| episodes.delete | Can delete podcast #{id}. |
| episodes.manage-persons | Can manage subscriptions of podcast #{id}. |
| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. |
| episodes.manage-publications | Can publish podcast #{id}. |
| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. |
<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->

View File

@ -5,13 +5,15 @@ sidebarDepth: 3
# Official Docker images # Official Docker images
Castopod pushes 2 Docker images to the Docker Hub during its automated build Castopod pushes 3 Docker images to the Docker Hub during its automated build
process: process:
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
Nginx configuration for Castopod Nginx configuration for Castopod
- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper):
an optional image building videoclips thanks to ffmpeg
Additionally, Castopod requires a MySQL-compatible database. A Redis database Additionally, Castopod requires a MySQL-compatible database. A Redis database
can be added as a cache handler. can be added as a cache handler.
@ -21,6 +23,8 @@ can be added as a cache handler.
- `develop` [unstable], latest development branch build - `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build - `beta` [stable], latest beta version build
- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) - `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
- `latest` [stable], latest version build
- `1.x.x` [stable], specific version build (since `1.0.0`)
## Example usage ## Example usage
@ -33,7 +37,7 @@ can be added as a cache handler.
services: services:
app: app:
image: castopod/app:beta image: castopod/app:latest
container_name: "castopod-app" container_name: "castopod-app"
volumes: volumes:
- castopod-media:/opt/castopod/public/media - castopod-media:/opt/castopod/public/media
@ -51,7 +55,7 @@ can be added as a cache handler.
restart: unless-stopped restart: unless-stopped
web-server: web-server:
image: castopod/web-server:beta image: castopod/web-server:latest
container_name: "castopod-web-server" container_name: "castopod-web-server"
volumes: volumes:
- castopod-media:/var/www/html/media - castopod-media:/var/www/html/media
@ -83,6 +87,21 @@ can be added as a cache handler.
networks: networks:
- castopod-app - castopod-app
# this container is optional
# add this if you want to use the videoclips feature
ffmpeg:
image: castopod/video-clipper:latest
container_name: "castopod-video-clipper"
volumes:
- castopod-media:/opt/castopod/public/media
environment:
MYSQL_DATABASE: castopod
MYSQL_USER: castopod
MYSQL_PASSWORD: changeme
networks:
- castopod-db
restart: unless-stopped
volumes: volumes:
castopod-media: castopod-media:
castopod-db: castopod-db:
@ -115,6 +134,16 @@ can be added as a cache handler.
## Environment Variables ## Environment Variables
- **castopod/video-clipper**
| Variable name | Type (`default`) | Default |
| -------------------------- | ---------------- | ---------------- |
| **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` |
| **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` |
| **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` |
| **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` |
| **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` |
- **castopod/app** - **castopod/app**
| Variable name | Type (`default`) | Default | | Variable name | Type (`default`) | Default |

View File

@ -286,6 +286,11 @@ https://img.shields.io/github/license/ad-aures/castopod?color=blue
https://img.shields.io/badge/contributions-welcome-brightgreen.svg https://img.shields.io/badge/contributions-welcome-brightgreen.svg
https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg
https://img.shields.io/github/stars/ad-aures/castopod?style=social https://img.shields.io/github/stars/ad-aures/castopod?style=social
https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release
https://img.shields.io/github/license/ad-aures/castopod?color=blue
https://img.shields.io/badge/contributions-welcome-brightgreen.svg
https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg
https://img.shields.io/github/stars/ad-aures/castopod?style=social
[release]: https://code.castopod.org/adaures/castopod/-/releases [release]: https://code.castopod.org/adaures/castopod/-/releases
[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md [license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md

View File

@ -0,0 +1,87 @@
---
title: Authentication & Authorization
sidebarDepth: 3
---
# Authentication & Authorization
Castopod handles authentication and authorization using `codeigniter/shield`
coupled with custom rules. Roles and permissions are defined at two levels:
1. [instance wide](#1-instance-wide-roles-and-permissions)
2. [per podcast](#2-per-podcast-roles-and-permissions)
## 1. Instance wide roles and permissions
### Instance roles
<!-- AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section -->
| role | description | permissions |
| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ |
| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podcaster | General users of Castopod. | admin.access |
<!-- AUTH-INSTANCE-ROLES-LIST:END -->
### Instance permissions
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| permission | description |
| ----------------------- | ------------------------------------------------------------------ |
| admin.access | Can access the Castopod admin area. |
| admin.settings | Can access the Castopod settings. |
| users.manage | Can manage Castopod users. |
| persons.manage | Can manage persons. |
| pages.manage | Can manage pages. |
| podcasts.view | Can view all podcasts. |
| podcasts.create | Can create new podcasts. |
| podcasts.import | Can import podcasts. |
| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
## 2. Per podcast roles and permissions
### Per podcast roles
<!-- AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section -->
| role | description | permissions |
| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Admin | Has complete control of podcast #{id}. | \* |
| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications |
| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Guest | General contributor of the podcast #{id}. | view, episodes.view |
<!-- AUTH-PODCAST-ROLES-LIST:END -->
### Per podcast permissions
<!-- AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| permission | description |
| ---------------------------- | ------------------------------------------------------------------------ |
| view | Can view dashboard and analytics of podcast #{id}. |
| edit | Can edit podcast #{id}. |
| delete | Can delete podcast #{id}. |
| manage-import | Can synchronize imported podcast #{id}. |
| manage-persons | Can manage subscriptions of podcast #{id}. |
| manage-subscriptions | Can manage subscriptions of podcast #{id}. |
| manage-contributors | Can manage contributors of podcast #{id}. |
| manage-platforms | Can set/remove platform links of podcast #{id}. |
| manage-publications | Can publish podcast #{id}. |
| manage-notifications | Can view and mark notifications as read for podcast #{id}. |
| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. |
| episodes.view | Can view dashboard and analytics of podcast #{id}. |
| episodes.create | Can create episodes for podcast #{id}. |
| episodes.edit | Can edit podcast #{id}. |
| episodes.delete | Can delete podcast #{id}. |
| episodes.manage-persons | Can manage subscriptions of podcast #{id}. |
| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. |
| episodes.manage-publications | Can publish podcast #{id}. |
| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. |
<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->

View File

@ -5,13 +5,15 @@ sidebarDepth: 3
# Official Docker images # Official Docker images
Castopod pushes 2 Docker images to the Docker Hub during its automated build Castopod pushes 3 Docker images to the Docker Hub during its automated build
process: process:
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
Nginx configuration for Castopod Nginx configuration for Castopod
- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper):
an optional image building videoclips thanks to ffmpeg
Additionally, Castopod requires a MySQL-compatible database. A Redis database Additionally, Castopod requires a MySQL-compatible database. A Redis database
can be added as a cache handler. can be added as a cache handler.
@ -21,6 +23,8 @@ can be added as a cache handler.
- `develop` [unstable], latest development branch build - `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build - `beta` [stable], latest beta version build
- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) - `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
- `latest` [stable], latest version build
- `1.x.x` [stable], specific version build (since `1.0.0`)
## Example usage ## Example usage
@ -33,7 +37,7 @@ can be added as a cache handler.
services: services:
app: app:
image: castopod/app:beta image: castopod/app:latest
container_name: "castopod-app" container_name: "castopod-app"
volumes: volumes:
- castopod-media:/opt/castopod/public/media - castopod-media:/opt/castopod/public/media
@ -51,7 +55,7 @@ can be added as a cache handler.
restart: unless-stopped restart: unless-stopped
web-server: web-server:
image: castopod/web-server:beta image: castopod/web-server:latest
container_name: "castopod-web-server" container_name: "castopod-web-server"
volumes: volumes:
- castopod-media:/var/www/html/media - castopod-media:/var/www/html/media
@ -83,6 +87,21 @@ can be added as a cache handler.
networks: networks:
- castopod-app - castopod-app
# this container is optional
# add this if you want to use the videoclips feature
ffmpeg:
image: castopod/video-clipper:latest
container_name: "castopod-video-clipper"
volumes:
- castopod-media:/opt/castopod/public/media
environment:
MYSQL_DATABASE: castopod
MYSQL_USER: castopod
MYSQL_PASSWORD: changeme
networks:
- castopod-db
restart: unless-stopped
volumes: volumes:
castopod-media: castopod-media:
castopod-db: castopod-db:
@ -115,6 +134,16 @@ can be added as a cache handler.
## Environment Variables ## Environment Variables
- **castopod/video-clipper**
| Variable name | Type (`default`) | Default |
| -------------------------- | ---------------- | ---------------- |
| **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` |
| **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` |
| **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` |
| **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` |
| **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` |
- **castopod/app** - **castopod/app**
| Variable name | Type (`default`) | Default | | Variable name | Type (`default`) | Default |

View File

@ -285,6 +285,11 @@ https://img.shields.io/github/license/ad-aures/castopod?color=blue
https://img.shields.io/badge/contributions-welcome-brightgreen.svg https://img.shields.io/badge/contributions-welcome-brightgreen.svg
https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg
https://img.shields.io/github/stars/ad-aures/castopod?style=social https://img.shields.io/github/stars/ad-aures/castopod?style=social
https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release
https://img.shields.io/github/license/ad-aures/castopod?color=blue
https://img.shields.io/badge/contributions-welcome-brightgreen.svg
https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg
https://img.shields.io/github/stars/ad-aures/castopod?style=social
[release]: https://code.castopod.org/adaures/castopod/-/releases [release]: https://code.castopod.org/adaures/castopod/-/releases
[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md [license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md

View File

@ -0,0 +1,87 @@
---
title: Authentication & Authorization
sidebarDepth: 3
---
# Authentication & Authorization
Castopod handles authentication and authorization using `codeigniter/shield`
coupled with custom rules. Roles and permissions are defined at two levels:
1. [instance wide](#1-instance-wide-roles-and-permissions)
2. [per podcast](#2-per-podcast-roles-and-permissions)
## 1. Instance wide roles and permissions
### Instance roles
<!-- AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section -->
| role | description | permissions |
| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ |
| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podcaster | General users of Castopod. | admin.access |
<!-- AUTH-INSTANCE-ROLES-LIST:END -->
### Instance permissions
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| permission | description |
| ----------------------- | ------------------------------------------------------------------ |
| admin.access | Can access the Castopod admin area. |
| admin.settings | Can access the Castopod settings. |
| users.manage | Can manage Castopod users. |
| persons.manage | Can manage persons. |
| pages.manage | Can manage pages. |
| podcasts.view | Can view all podcasts. |
| podcasts.create | Can create new podcasts. |
| podcasts.import | Can import podcasts. |
| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
## 2. Per podcast roles and permissions
### Per podcast roles
<!-- AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section -->
| role | description | permissions |
| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Admin | Has complete control of podcast #{id}. | \* |
| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications |
| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Guest | General contributor of the podcast #{id}. | view, episodes.view |
<!-- AUTH-PODCAST-ROLES-LIST:END -->
### Per podcast permissions
<!-- AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| permission | description |
| ---------------------------- | ------------------------------------------------------------------------ |
| view | Can view dashboard and analytics of podcast #{id}. |
| edit | Can edit podcast #{id}. |
| delete | Can delete podcast #{id}. |
| manage-import | Can synchronize imported podcast #{id}. |
| manage-persons | Can manage subscriptions of podcast #{id}. |
| manage-subscriptions | Can manage subscriptions of podcast #{id}. |
| manage-contributors | Can manage contributors of podcast #{id}. |
| manage-platforms | Can set/remove platform links of podcast #{id}. |
| manage-publications | Can publish podcast #{id}. |
| manage-notifications | Can view and mark notifications as read for podcast #{id}. |
| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. |
| episodes.view | Can view dashboard and analytics of podcast #{id}. |
| episodes.create | Can create episodes for podcast #{id}. |
| episodes.edit | Can edit podcast #{id}. |
| episodes.delete | Can delete podcast #{id}. |
| episodes.manage-persons | Can manage subscriptions of podcast #{id}. |
| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. |
| episodes.manage-publications | Can publish podcast #{id}. |
| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. |
<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->

View File

@ -5,13 +5,15 @@ sidebarDepth: 3
# Official Docker images # Official Docker images
Castopod pushes 2 Docker images to the Docker Hub during its automated build Castopod pushes 3 Docker images to the Docker Hub during its automated build
process: process:
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
Nginx configuration for Castopod Nginx configuration for Castopod
- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper):
an optional image building videoclips thanks to ffmpeg
Additionally, Castopod requires a MySQL-compatible database. A Redis database Additionally, Castopod requires a MySQL-compatible database. A Redis database
can be added as a cache handler. can be added as a cache handler.
@ -21,6 +23,8 @@ can be added as a cache handler.
- `develop` [unstable], latest development branch build - `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build - `beta` [stable], latest beta version build
- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) - `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
- `latest` [stable], latest version build
- `1.x.x` [stable], specific version build (since `1.0.0`)
## Example usage ## Example usage
@ -33,7 +37,7 @@ can be added as a cache handler.
services: services:
app: app:
image: castopod/app:beta image: castopod/app:latest
container_name: "castopod-app" container_name: "castopod-app"
volumes: volumes:
- castopod-media:/opt/castopod/public/media - castopod-media:/opt/castopod/public/media
@ -51,7 +55,7 @@ can be added as a cache handler.
restart: unless-stopped restart: unless-stopped
web-server: web-server:
image: castopod/web-server:beta image: castopod/web-server:latest
container_name: "castopod-web-server" container_name: "castopod-web-server"
volumes: volumes:
- castopod-media:/var/www/html/media - castopod-media:/var/www/html/media
@ -83,6 +87,21 @@ can be added as a cache handler.
networks: networks:
- castopod-app - castopod-app
# this container is optional
# add this if you want to use the videoclips feature
ffmpeg:
image: castopod/video-clipper:latest
container_name: "castopod-video-clipper"
volumes:
- castopod-media:/opt/castopod/public/media
environment:
MYSQL_DATABASE: castopod
MYSQL_USER: castopod
MYSQL_PASSWORD: changeme
networks:
- castopod-db
restart: unless-stopped
volumes: volumes:
castopod-media: castopod-media:
castopod-db: castopod-db:
@ -115,6 +134,16 @@ can be added as a cache handler.
## Environment Variables ## Environment Variables
- **castopod/video-clipper**
| Variable name | Type (`default`) | Default |
| -------------------------- | ---------------- | ---------------- |
| **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` |
| **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` |
| **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` |
| **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` |
| **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` |
- **castopod/app** - **castopod/app**
| Variable name | Type (`default`) | Default | | Variable name | Type (`default`) | Default |

View File

@ -0,0 +1,87 @@
---
title: Authentication & Authorization
sidebarDepth: 3
---
# Authentication & Authorization
Castopod handles authentication and authorization using `codeigniter/shield`
coupled with custom rules. Roles and permissions are defined at two levels:
1. [instance wide](#1-instance-wide-roles-and-permissions)
2. [per podcast](#2-per-podcast-roles-and-permissions)
## 1. Instance wide roles and permissions
### Instance roles
<!-- AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section -->
| role | description | permissions |
| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ |
| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podcaster | General users of Castopod. | admin.access |
<!-- AUTH-INSTANCE-ROLES-LIST:END -->
### Instance permissions
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| permission | description |
| ----------------------- | ------------------------------------------------------------------ |
| admin.access | Can access the Castopod admin area. |
| admin.settings | Can access the Castopod settings. |
| users.manage | Can manage Castopod users. |
| persons.manage | Can manage persons. |
| pages.manage | Can manage pages. |
| podcasts.view | Can view all podcasts. |
| podcasts.create | Can create new podcasts. |
| podcasts.import | Can import podcasts. |
| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
## 2. Per podcast roles and permissions
### Per podcast roles
<!-- AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section -->
| role | description | permissions |
| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Admin | Has complete control of podcast #{id}. | \* |
| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications |
| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Guest | General contributor of the podcast #{id}. | view, episodes.view |
<!-- AUTH-PODCAST-ROLES-LIST:END -->
### Per podcast permissions
<!-- AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| permission | description |
| ---------------------------- | ------------------------------------------------------------------------ |
| view | Can view dashboard and analytics of podcast #{id}. |
| edit | Can edit podcast #{id}. |
| delete | Can delete podcast #{id}. |
| manage-import | Can synchronize imported podcast #{id}. |
| manage-persons | Can manage subscriptions of podcast #{id}. |
| manage-subscriptions | Can manage subscriptions of podcast #{id}. |
| manage-contributors | Can manage contributors of podcast #{id}. |
| manage-platforms | Can set/remove platform links of podcast #{id}. |
| manage-publications | Can publish podcast #{id}. |
| manage-notifications | Can view and mark notifications as read for podcast #{id}. |
| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. |
| episodes.view | Can view dashboard and analytics of podcast #{id}. |
| episodes.create | Can create episodes for podcast #{id}. |
| episodes.edit | Can edit podcast #{id}. |
| episodes.delete | Can delete podcast #{id}. |
| episodes.manage-persons | Can manage subscriptions of podcast #{id}. |
| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. |
| episodes.manage-publications | Can publish podcast #{id}. |
| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. |
<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->

View File

@ -5,13 +5,15 @@ sidebarDepth: 3
# Official Docker images # Official Docker images
Castopod pushes 2 Docker images to the Docker Hub during its automated build Castopod pushes 3 Docker images to the Docker Hub during its automated build
process: process:
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
Nginx configuration for Castopod Nginx configuration for Castopod
- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper):
an optional image building videoclips thanks to ffmpeg
Additionally, Castopod requires a MySQL-compatible database. A Redis database Additionally, Castopod requires a MySQL-compatible database. A Redis database
can be added as a cache handler. can be added as a cache handler.
@ -21,6 +23,8 @@ can be added as a cache handler.
- `develop` [unstable], latest development branch build - `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build - `beta` [stable], latest beta version build
- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) - `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
- `latest` [stable], latest version build
- `1.x.x` [stable], specific version build (since `1.0.0`)
## Example usage ## Example usage
@ -33,7 +37,7 @@ can be added as a cache handler.
services: services:
app: app:
image: castopod/app:beta image: castopod/app:latest
container_name: "castopod-app" container_name: "castopod-app"
volumes: volumes:
- castopod-media:/opt/castopod/public/media - castopod-media:/opt/castopod/public/media
@ -51,7 +55,7 @@ can be added as a cache handler.
restart: unless-stopped restart: unless-stopped
web-server: web-server:
image: castopod/web-server:beta image: castopod/web-server:latest
container_name: "castopod-web-server" container_name: "castopod-web-server"
volumes: volumes:
- castopod-media:/var/www/html/media - castopod-media:/var/www/html/media
@ -83,6 +87,21 @@ can be added as a cache handler.
networks: networks:
- castopod-app - castopod-app
# this container is optional
# add this if you want to use the videoclips feature
ffmpeg:
image: castopod/video-clipper:latest
container_name: "castopod-video-clipper"
volumes:
- castopod-media:/opt/castopod/public/media
environment:
MYSQL_DATABASE: castopod
MYSQL_USER: castopod
MYSQL_PASSWORD: changeme
networks:
- castopod-db
restart: unless-stopped
volumes: volumes:
castopod-media: castopod-media:
castopod-db: castopod-db:
@ -115,6 +134,16 @@ can be added as a cache handler.
## Environment Variables ## Environment Variables
- **castopod/video-clipper**
| Variable name | Type (`default`) | Default |
| -------------------------- | ---------------- | ---------------- |
| **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` |
| **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` |
| **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` |
| **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` |
| **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` |
- **castopod/app** - **castopod/app**
| Variable name | Type (`default`) | Default | | Variable name | Type (`default`) | Default |

View File

@ -144,6 +144,8 @@ You may add your email configuration in your instance's `.env` like so:
```ini ```ini
# […] # […]
# […]
email.fromEmail="your_email_address" email.fromEmail="your_email_address"
email.SMTPHost="your_smtp_host" email.SMTPHost="your_smtp_host"
email.SMTPUser="your_smtp_user" email.SMTPUser="your_smtp_user"

View File

@ -0,0 +1,87 @@
---
title: Authentication & Authorization
sidebarDepth: 3
---
# Authentication & Authorization
Castopod handles authentication and authorization using `codeigniter/shield`
coupled with custom rules. Roles and permissions are defined at two levels:
1. [instance wide](#1-instance-wide-roles-and-permissions)
2. [per podcast](#2-per-podcast-roles-and-permissions)
## 1. Instance wide roles and permissions
### Instance roles
<!-- AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section -->
| role | description | permissions |
| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ |
| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podcaster | General users of Castopod. | admin.access |
<!-- AUTH-INSTANCE-ROLES-LIST:END -->
### Instance permissions
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| permission | description |
| ----------------------- | ------------------------------------------------------------------ |
| admin.access | Can access the Castopod admin area. |
| admin.settings | Can access the Castopod settings. |
| users.manage | Can manage Castopod users. |
| persons.manage | Can manage persons. |
| pages.manage | Can manage pages. |
| podcasts.view | Can view all podcasts. |
| podcasts.create | Can create new podcasts. |
| podcasts.import | Can import podcasts. |
| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
## 2. Per podcast roles and permissions
### Per podcast roles
<!-- AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section -->
| role | description | permissions |
| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Admin | Has complete control of podcast #{id}. | \* |
| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications |
| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Guest | General contributor of the podcast #{id}. | view, episodes.view |
<!-- AUTH-PODCAST-ROLES-LIST:END -->
### Per podcast permissions
<!-- AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| permission | description |
| ---------------------------- | ------------------------------------------------------------------------ |
| view | Can view dashboard and analytics of podcast #{id}. |
| edit | Can edit podcast #{id}. |
| delete | Can delete podcast #{id}. |
| manage-import | Can synchronize imported podcast #{id}. |
| manage-persons | Can manage subscriptions of podcast #{id}. |
| manage-subscriptions | Can manage subscriptions of podcast #{id}. |
| manage-contributors | Can manage contributors of podcast #{id}. |
| manage-platforms | Can set/remove platform links of podcast #{id}. |
| manage-publications | Can publish podcast #{id}. |
| manage-notifications | Can view and mark notifications as read for podcast #{id}. |
| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. |
| episodes.view | Can view dashboard and analytics of podcast #{id}. |
| episodes.create | Can create episodes for podcast #{id}. |
| episodes.edit | Can edit podcast #{id}. |
| episodes.delete | Can delete podcast #{id}. |
| episodes.manage-persons | Can manage subscriptions of podcast #{id}. |
| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. |
| episodes.manage-publications | Can publish podcast #{id}. |
| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. |
<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->

View File

@ -5,13 +5,15 @@ sidebarDepth: 3
# Official Docker images # Official Docker images
Castopod pushes 2 Docker images to the Docker Hub during its automated build Castopod pushes 3 Docker images to the Docker Hub during its automated build
process: process:
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
Nginx configuration for Castopod Nginx configuration for Castopod
- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper):
an optional image building videoclips thanks to ffmpeg
Additionally, Castopod requires a MySQL-compatible database. A Redis database Additionally, Castopod requires a MySQL-compatible database. A Redis database
can be added as a cache handler. can be added as a cache handler.
@ -21,6 +23,8 @@ can be added as a cache handler.
- `develop` [unstable], latest development branch build - `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build - `beta` [stable], latest beta version build
- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) - `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
- `latest` [stable], latest version build
- `1.x.x` [stable], specific version build (since `1.0.0`)
## Example usage ## Example usage
@ -33,7 +37,7 @@ can be added as a cache handler.
services: services:
app: app:
image: castopod/app:beta image: castopod/app:latest
container_name: "castopod-app" container_name: "castopod-app"
volumes: volumes:
- castopod-media:/opt/castopod/public/media - castopod-media:/opt/castopod/public/media
@ -51,7 +55,7 @@ can be added as a cache handler.
restart: unless-stopped restart: unless-stopped
web-server: web-server:
image: castopod/web-server:beta image: castopod/web-server:latest
container_name: "castopod-web-server" container_name: "castopod-web-server"
volumes: volumes:
- castopod-media:/var/www/html/media - castopod-media:/var/www/html/media
@ -83,6 +87,21 @@ can be added as a cache handler.
networks: networks:
- castopod-app - castopod-app
# this container is optional
# add this if you want to use the videoclips feature
ffmpeg:
image: castopod/video-clipper:latest
container_name: "castopod-video-clipper"
volumes:
- castopod-media:/opt/castopod/public/media
environment:
MYSQL_DATABASE: castopod
MYSQL_USER: castopod
MYSQL_PASSWORD: changeme
networks:
- castopod-db
restart: unless-stopped
volumes: volumes:
castopod-media: castopod-media:
castopod-db: castopod-db:
@ -115,6 +134,16 @@ can be added as a cache handler.
## Environment Variables ## Environment Variables
- **castopod/video-clipper**
| Variable name | Type (`default`) | Default |
| -------------------------- | ---------------- | ---------------- |
| **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` |
| **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` |
| **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` |
| **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` |
| **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` |
- **castopod/app** - **castopod/app**
| Variable name | Type (`default`) | Default | | Variable name | Type (`default`) | Default |

View File

@ -142,6 +142,8 @@ You may add your email configuration in your instance's `.env` like so:
```ini ```ini
# […] # […]
# […]
email.fromEmail="your_email_address" email.fromEmail="your_email_address"
email.SMTPHost="your_smtp_host" email.SMTPHost="your_smtp_host"
email.SMTPUser="your_smtp_user" email.SMTPUser="your_smtp_user"

View File

@ -0,0 +1,87 @@
---
title: Authentication & Authorization
sidebarDepth: 3
---
# Authentication & Authorization
Castopod handles authentication and authorization using `codeigniter/shield`
coupled with custom rules. Roles and permissions are defined at two levels:
1. [instance wide](#1-instance-wide-roles-and-permissions)
2. [per podcast](#2-per-podcast-roles-and-permissions)
## 1. Instance wide roles and permissions
### Instance roles
<!-- AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section -->
| role | description | permissions |
| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ |
| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podcaster | General users of Castopod. | admin.access |
<!-- AUTH-INSTANCE-ROLES-LIST:END -->
### Instance permissions
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| permission | description |
| ----------------------- | ------------------------------------------------------------------ |
| admin.access | Can access the Castopod admin area. |
| admin.settings | Can access the Castopod settings. |
| users.manage | Can manage Castopod users. |
| persons.manage | Can manage persons. |
| pages.manage | Can manage pages. |
| podcasts.view | Can view all podcasts. |
| podcasts.create | Can create new podcasts. |
| podcasts.import | Can import podcasts. |
| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
## 2. Per podcast roles and permissions
### Per podcast roles
<!-- AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section -->
| role | description | permissions |
| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Admin | Has complete control of podcast #{id}. | \* |
| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications |
| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Guest | General contributor of the podcast #{id}. | view, episodes.view |
<!-- AUTH-PODCAST-ROLES-LIST:END -->
### Per podcast permissions
<!-- AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| permission | description |
| ---------------------------- | ------------------------------------------------------------------------ |
| view | Can view dashboard and analytics of podcast #{id}. |
| edit | Can edit podcast #{id}. |
| delete | Can delete podcast #{id}. |
| manage-import | Can synchronize imported podcast #{id}. |
| manage-persons | Can manage subscriptions of podcast #{id}. |
| manage-subscriptions | Can manage subscriptions of podcast #{id}. |
| manage-contributors | Can manage contributors of podcast #{id}. |
| manage-platforms | Can set/remove platform links of podcast #{id}. |
| manage-publications | Can publish podcast #{id}. |
| manage-notifications | Can view and mark notifications as read for podcast #{id}. |
| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. |
| episodes.view | Can view dashboard and analytics of podcast #{id}. |
| episodes.create | Can create episodes for podcast #{id}. |
| episodes.edit | Can edit podcast #{id}. |
| episodes.delete | Can delete podcast #{id}. |
| episodes.manage-persons | Can manage subscriptions of podcast #{id}. |
| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. |
| episodes.manage-publications | Can publish podcast #{id}. |
| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. |
<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->

View File

@ -5,13 +5,15 @@ sidebarDepth: 3
# Official Docker images # Official Docker images
Castopod pushes 2 Docker images to the Docker Hub during its automated build Castopod pushes 3 Docker images to the Docker Hub during its automated build
process: process:
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
Nginx configuration for Castopod Nginx configuration for Castopod
- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper):
an optional image building videoclips thanks to ffmpeg
Additionally, Castopod requires a MySQL-compatible database. A Redis database Additionally, Castopod requires a MySQL-compatible database. A Redis database
can be added as a cache handler. can be added as a cache handler.
@ -21,6 +23,8 @@ can be added as a cache handler.
- `develop` [unstable], latest development branch build - `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build - `beta` [stable], latest beta version build
- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) - `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
- `latest` [stable], latest version build
- `1.x.x` [stable], specific version build (since `1.0.0`)
## Example usage ## Example usage
@ -33,7 +37,7 @@ can be added as a cache handler.
services: services:
app: app:
image: castopod/app:beta image: castopod/app:latest
container_name: "castopod-app" container_name: "castopod-app"
volumes: volumes:
- castopod-media:/opt/castopod/public/media - castopod-media:/opt/castopod/public/media
@ -51,7 +55,7 @@ can be added as a cache handler.
restart: unless-stopped restart: unless-stopped
web-server: web-server:
image: castopod/web-server:beta image: castopod/web-server:latest
container_name: "castopod-web-server" container_name: "castopod-web-server"
volumes: volumes:
- castopod-media:/var/www/html/media - castopod-media:/var/www/html/media
@ -83,6 +87,21 @@ can be added as a cache handler.
networks: networks:
- castopod-app - castopod-app
# this container is optional
# add this if you want to use the videoclips feature
ffmpeg:
image: castopod/video-clipper:latest
container_name: "castopod-video-clipper"
volumes:
- castopod-media:/opt/castopod/public/media
environment:
MYSQL_DATABASE: castopod
MYSQL_USER: castopod
MYSQL_PASSWORD: changeme
networks:
- castopod-db
restart: unless-stopped
volumes: volumes:
castopod-media: castopod-media:
castopod-db: castopod-db:
@ -115,6 +134,16 @@ can be added as a cache handler.
## Environment Variables ## Environment Variables
- **castopod/video-clipper**
| Variable name | Type (`default`) | Default |
| -------------------------- | ---------------- | ---------------- |
| **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` |
| **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` |
| **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` |
| **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` |
| **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` |
- **castopod/app** - **castopod/app**
| Variable name | Type (`default`) | Default | | Variable name | Type (`default`) | Default |

View File

@ -142,6 +142,8 @@ You may add your email configuration in your instance's `.env` like so:
```ini ```ini
# […] # […]
# […]
email.fromEmail="your_email_address" email.fromEmail="your_email_address"
email.SMTPHost="your_smtp_host" email.SMTPHost="your_smtp_host"
email.SMTPUser="your_smtp_user" email.SMTPUser="your_smtp_user"

View File

@ -0,0 +1,87 @@
---
title: Authentication & Authorization
sidebarDepth: 3
---
# Authentication & Authorization
Castopod handles authentication and authorization using `codeigniter/shield`
coupled with custom rules. Roles and permissions are defined at two levels:
1. [instance wide](#1-instance-wide-roles-and-permissions)
2. [per podcast](#2-per-podcast-roles-and-permissions)
## 1. Instance wide roles and permissions
### Instance roles
<!-- AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section -->
| role | description | permissions |
| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ |
| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podcaster | General users of Castopod. | admin.access |
<!-- AUTH-INSTANCE-ROLES-LIST:END -->
### Instance permissions
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| permission | description |
| ----------------------- | ------------------------------------------------------------------ |
| admin.access | Can access the Castopod admin area. |
| admin.settings | Can access the Castopod settings. |
| users.manage | Can manage Castopod users. |
| persons.manage | Can manage persons. |
| pages.manage | Can manage pages. |
| podcasts.view | Can view all podcasts. |
| podcasts.create | Can create new podcasts. |
| podcasts.import | Can import podcasts. |
| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
## 2. Per podcast roles and permissions
### Per podcast roles
<!-- AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section -->
| role | description | permissions |
| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Admin | Has complete control of podcast #{id}. | \* |
| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications |
| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Guest | General contributor of the podcast #{id}. | view, episodes.view |
<!-- AUTH-PODCAST-ROLES-LIST:END -->
### Per podcast permissions
<!-- AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| permission | description |
| ---------------------------- | ------------------------------------------------------------------------ |
| view | Can view dashboard and analytics of podcast #{id}. |
| edit | Can edit podcast #{id}. |
| delete | Can delete podcast #{id}. |
| manage-import | Can synchronize imported podcast #{id}. |
| manage-persons | Can manage subscriptions of podcast #{id}. |
| manage-subscriptions | Can manage subscriptions of podcast #{id}. |
| manage-contributors | Can manage contributors of podcast #{id}. |
| manage-platforms | Can set/remove platform links of podcast #{id}. |
| manage-publications | Can publish podcast #{id}. |
| manage-notifications | Can view and mark notifications as read for podcast #{id}. |
| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. |
| episodes.view | Can view dashboard and analytics of podcast #{id}. |
| episodes.create | Can create episodes for podcast #{id}. |
| episodes.edit | Can edit podcast #{id}. |
| episodes.delete | Can delete podcast #{id}. |
| episodes.manage-persons | Can manage subscriptions of podcast #{id}. |
| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. |
| episodes.manage-publications | Can publish podcast #{id}. |
| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. |
<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->

View File

@ -5,13 +5,15 @@ sidebarDepth: 3
# Official Docker images # Official Docker images
Castopod pushes 2 Docker images to the Docker Hub during its automated build Castopod pushes 3 Docker images to the Docker Hub during its automated build
process: process:
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
Nginx configuration for Castopod Nginx configuration for Castopod
- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper):
an optional image building videoclips thanks to ffmpeg
Additionally, Castopod requires a MySQL-compatible database. A Redis database Additionally, Castopod requires a MySQL-compatible database. A Redis database
can be added as a cache handler. can be added as a cache handler.
@ -21,6 +23,8 @@ can be added as a cache handler.
- `develop` [unstable], latest development branch build - `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build - `beta` [stable], latest beta version build
- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) - `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
- `latest` [stable], latest version build
- `1.x.x` [stable], specific version build (since `1.0.0`)
## Example usage ## Example usage
@ -33,7 +37,7 @@ can be added as a cache handler.
services: services:
app: app:
image: castopod/app:beta image: castopod/app:latest
container_name: "castopod-app" container_name: "castopod-app"
volumes: volumes:
- castopod-media:/opt/castopod/public/media - castopod-media:/opt/castopod/public/media
@ -51,7 +55,7 @@ can be added as a cache handler.
restart: unless-stopped restart: unless-stopped
web-server: web-server:
image: castopod/web-server:beta image: castopod/web-server:latest
container_name: "castopod-web-server" container_name: "castopod-web-server"
volumes: volumes:
- castopod-media:/var/www/html/media - castopod-media:/var/www/html/media
@ -83,6 +87,21 @@ can be added as a cache handler.
networks: networks:
- castopod-app - castopod-app
# this container is optional
# add this if you want to use the videoclips feature
ffmpeg:
image: castopod/video-clipper:latest
container_name: "castopod-video-clipper"
volumes:
- castopod-media:/opt/castopod/public/media
environment:
MYSQL_DATABASE: castopod
MYSQL_USER: castopod
MYSQL_PASSWORD: changeme
networks:
- castopod-db
restart: unless-stopped
volumes: volumes:
castopod-media: castopod-media:
castopod-db: castopod-db:
@ -115,6 +134,16 @@ can be added as a cache handler.
## Environment Variables ## Environment Variables
- **castopod/video-clipper**
| Variable name | Type (`default`) | Default |
| -------------------------- | ---------------- | ---------------- |
| **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` |
| **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` |
| **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` |
| **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` |
| **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` |
- **castopod/app** - **castopod/app**
| Variable name | Type (`default`) | Default | | Variable name | Type (`default`) | Default |

View File

@ -0,0 +1,87 @@
---
title: Authentication & Authorization
sidebarDepth: 3
---
# Authentication & Authorization
Castopod handles authentication and authorization using `codeigniter/shield`
coupled with custom rules. Roles and permissions are defined at two levels:
1. [instance wide](#1-instance-wide-roles-and-permissions)
2. [per podcast](#2-per-podcast-roles-and-permissions)
## 1. Instance wide roles and permissions
### Instance roles
<!-- AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section -->
| role | description | permissions |
| ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ |
| Super admin | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
| Manager | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage |
| Podcaster | General users of Castopod. | admin.access |
<!-- AUTH-INSTANCE-ROLES-LIST:END -->
### Instance permissions
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| permission | description |
| ----------------------- | ------------------------------------------------------------------ |
| admin.access | Can access the Castopod admin area. |
| admin.settings | Can access the Castopod settings. |
| users.manage | Can manage Castopod users. |
| persons.manage | Can manage persons. |
| pages.manage | Can manage pages. |
| podcasts.view | Can view all podcasts. |
| podcasts.create | Can create new podcasts. |
| podcasts.import | Can import podcasts. |
| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. |
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
## 2. Per podcast roles and permissions
### Per podcast roles
<!-- AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section -->
| role | description | permissions |
| ------ | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Admin | Has complete control of podcast #{id}. | \* |
| Editor | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications |
| Author | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| Guest | General contributor of the podcast #{id}. | view, episodes.view |
<!-- AUTH-PODCAST-ROLES-LIST:END -->
### Per podcast permissions
<!-- AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| permission | description |
| ---------------------------- | ------------------------------------------------------------------------ |
| view | Can view dashboard and analytics of podcast #{id}. |
| edit | Can edit podcast #{id}. |
| delete | Can delete podcast #{id}. |
| manage-import | Can synchronize imported podcast #{id}. |
| manage-persons | Can manage subscriptions of podcast #{id}. |
| manage-subscriptions | Can manage subscriptions of podcast #{id}. |
| manage-contributors | Can manage contributors of podcast #{id}. |
| manage-platforms | Can set/remove platform links of podcast #{id}. |
| manage-publications | Can publish podcast #{id}. |
| manage-notifications | Can view and mark notifications as read for podcast #{id}. |
| interact-as | Can interact as the podcast #{id} to favourite, share or reply to posts. |
| episodes.view | Can view dashboard and analytics of podcast #{id}. |
| episodes.create | Can create episodes for podcast #{id}. |
| episodes.edit | Can edit podcast #{id}. |
| episodes.delete | Can delete podcast #{id}. |
| episodes.manage-persons | Can manage subscriptions of podcast #{id}. |
| episodes.manage-clips | Can manage video clips or soundbites of podcast #{id}. |
| episodes.manage-publications | Can publish podcast #{id}. |
| episodes.manage-comments | Can create/remove episode comments of podcast #{id}. |
<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->

View File

@ -1,39 +1,43 @@
--- ---
title: Official Docker images title: Officiella Docker images
sidebarDepth: 3 sidebarDepth: 3
--- ---
# Official Docker images # Officiella Docker images
Castopod pushes 2 Docker images to the Docker Hub during its automated build Castopod pushes 3 Docker images to the Docker Hub during its automated build
process: process:
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle - [**`castopod/app`**](https://hub.docker.com/r/castopod/app): apppaketet med
with all of Castopod dependencies alla Castopod-beroenden
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): en
Nginx configuration for Castopod Nginx konfiguration för Castopod
- [**`castopod/video-clipper`**](https://hub.docker.com/r/castopod/video-clipper):
an optional image building videoclips thanks to ffmpeg
Additionally, Castopod requires a MySQL-compatible database. A Redis database Dessutom kräver Castopod en MySQL-kompatibel databas. En Redis databas kan
can be added as a cache handler. läggas till som cachehanterare.
## Supported tags ## Taggar som stöds
- `develop` [unstable], latest development branch build - `utveckla` [unstable], senaste utvecklingsgrenen
- `beta` [stable], latest beta version build - `beta` [stable], senaste betaversionen bygger
- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`) - `1.0.0-beta.x` [stable], specifik betaversion build (sedan `1.0.0-beta.22`)
- `latest` [stable], latest version build
- `1.x.x` [stable], specific version build (since `1.0.0`)
## Example usage ## Exempel på användning
1. Install [docker](https://docs.docker.com/get-docker/) and 1. Installera [docker](https://docs.docker.com/get-docker/) och
[docker-compose](https://docs.docker.com/compose/install/) [docker-komponera](https://docs.docker.com/compose/install/)
2. Create a `docker-compose.yml` file with the following: 2. Skapa en `docker-compose.yml` fil med följande:
```yml ```yml
version: "3.7" version: "3.7"
services: services:
app: app:
image: castopod/app:beta image: castopod/app:latest
container_name: "castopod-app" container_name: "castopod-app"
volumes: volumes:
- castopod-media:/opt/castopod/public/media - castopod-media:/opt/castopod/public/media
@ -51,7 +55,7 @@ can be added as a cache handler.
restart: unless-stopped restart: unless-stopped
web-server: web-server:
image: castopod/web-server:beta image: castopod/web-server:latest
container_name: "castopod-web-server" container_name: "castopod-web-server"
volumes: volumes:
- castopod-media:/var/www/html/media - castopod-media:/var/www/html/media
@ -83,6 +87,21 @@ can be added as a cache handler.
networks: networks:
- castopod-app - castopod-app
# this container is optional
# add this if you want to use the videoclips feature
ffmpeg:
image: castopod/video-clipper:latest
container_name: "castopod-video-clipper"
volumes:
- castopod-media:/opt/castopod/public/media
environment:
MYSQL_DATABASE: castopod
MYSQL_USER: castopod
MYSQL_PASSWORD: changeme
networks:
- castopod-db
restart: unless-stopped
volumes: volumes:
castopod-media: castopod-media:
castopod-db: castopod-db:
@ -93,13 +112,14 @@ can be added as a cache handler.
castopod-db: castopod-db:
``` ```
You have to adapt some variables to your needs (e.g. `CP_BASEURL`, Du måste anpassa vissa variabler efter dina behov (t.ex. `CP_BASEURL`,
`MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` och `CP_ANALYTICS_SALT`).
3. Setup a reverse proxy for TLS (SSL/HTTPS) 3. Ställ in en omvänd proxy för TLS (SSL/HTTPS)
TLS is mandatory for ActivityPub to work. This job can easily be handled by TLS är obligatoriskt för ActivityPub att arbeta. Detta jobb kan enkelt
a reverse proxy, for example with [Caddy](https://caddyserver.com/): hanteras av en omvänd proxy, till exempel med
[Caddy](https://caddyserver.com/):
``` ```
#castopod #castopod
@ -108,28 +128,39 @@ can be added as a cache handler.
} }
``` ```
4. Run `docker-compose up -d`, wait for it to initialize and head on to 4. Kör `docker-komponera upp -d`, vänta på att den initieras och gå vidare till
`https://castopod.example.com/cp-install` to finish setting up Castopod! `https://castopod.example.com/cp-install` för att slutföra installationen av
Castopod!
5. You're all set, start podcasting! 🎙️🚀 5. Ni är alla klara, börja podcasting! 🎙️🚀
## Environment Variables ## Miljövariabler
- **castopod/video-clipper**
| Variabel namn | Type (`default`) | Standard |
| -------------------------- | ---------------- | ---------------- |
| **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` |
| **`CP_DATABASE_NAME`** | ?sträng | `MYSQL_DATABASE` |
| **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` |
| **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` |
| **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` |
- **castopod/app** - **castopod/app**
| Variable name | Type (`default`) | Default | | Variabelt namn | Type (`default`) | Standard |
| ---------------------------- | ----------------------- | ---------------- | | ---------------------------- | ----------------------- | ---------------- |
| **`CP_BASEURL`** | string | `undefined` | | **`CP_BASEURL`** | sträng | `odefinierad` |
| **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` |
| **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` |
| **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` |
| **`CP_ANALYTICS_SALT`** | string | `undefined` | | **`CP_ANALYTICS_SALT`** | string | `odefinierad` |
| **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` | | **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` |
| **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` | | **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` |
| **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` | | **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` |
| **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` | | **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` |
| **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` | | **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` |
| **`CP_CACHE_HANDLER`** | [`"file"` or `"redis"`] | `"file"` | | **`CP_CACHE_HANDLER`** | [`"file"` `"redis"`] | `"file"` |
| **`CP_REDIS_HOST`** | ?string | `"localhost"` | | **`CP_REDIS_HOST`** | ?string | `"localhost"` |
| **`CP_REDIS_PASSWORD`** | ?string | `null` | | **`CP_REDIS_PASSWORD`** | ?string | `null` |
| **`CP_REDIS_PORT`** | ?number | `6379` | | **`CP_REDIS_PORT`** | ?number | `6379` |
@ -139,10 +170,10 @@ can be added as a cache handler.
| **`CP_EMAIL_SMTP_USERNAME`** | ?string | `"localhost"` | | **`CP_EMAIL_SMTP_USERNAME`** | ?string | `"localhost"` |
| **`CP_EMAIL_SMTP_PASSWORD`** | ?string | `null` | | **`CP_EMAIL_SMTP_PASSWORD`** | ?string | `null` |
| **`CP_EMAIL_SMTP_PORT`** | ?number | `25` | | **`CP_EMAIL_SMTP_PORT`** | ?number | `25` |
| **`CP_EMAIL_SMTP_CRYPTO`** | [`"tls"` or `"ssl"`] | `"tls"` | | **`CP_EMAIL_SMTP_CRYPTO`** | [`"tls"` eller `"ssl"`] | `"tls"` |
- **castopod/web-server** - **castopod/web-server**
| Variable name | Type | Default | | Variable name | Typ | Default |
| --------------------- | ------- | ------- | | --------------------- | ------- | ------- |
| **`CP_APP_HOSTNAME`** | ?string | `"app"` | | **`CP_APP_HOSTNAME`** | ?string | `"app"` |

View File

@ -3,25 +3,26 @@ title: Installation
sidebarDepth: 3 sidebarDepth: 3
--- ---
# How to install Castopod? # Hur man installerar Castopod?
Castopod was thought-out to be easy to install. Whether using dedicated or Castopod var tänkt att vara lätt att installera. Oavsett om du använder
shared hosting, you can install it on most PHP-MySQL compatible web servers. dedikerade eller delade webbhotell kan du installera det på de flesta
PHP-MySQL-kompatibla webbservrar.
::: tip Note ::: tips Anteckning
We've released official Docker images for Castopod! Vi har släppt officiella Docker-bilder för Castopod!
If you prefer using Docker, you may skip this and go straight to the Om du föredrar att använda Docker, kan du hoppa över detta och gå direkt till
[docker documentation](./docker.md) for Castopod. [dockerdokumentationen](./docker.md) för Castopod.
::: :::
## Requirements ## Krav
- PHP v8.1 or higher - PHP v8.1 or higher
- MySQL version 5.7 or higher or MariaDB version 10.2 or higher - MySQL version 5.7 eller högre eller MariaDB version 10.2 eller högre
- HTTPS support - Stöd för HTTPS
### PHP v8.1 or higher ### PHP v8.1 or higher
@ -30,114 +31,114 @@ PHP version 8.1 or higher is required, with the following extensions installed:
- [intl](https://php.net/manual/en/intl.requirements.php) - [intl](https://php.net/manual/en/intl.requirements.php)
- [libcurl](https://php.net/manual/en/curl.requirements.php) - [libcurl](https://php.net/manual/en/curl.requirements.php)
- [mbstring](https://php.net/manual/en/mbstring.installation.php) - [mbstring](https://php.net/manual/en/mbstring.installation.php)
- [gd](https://www.php.net/manual/en/image.installation.php) with **JPEG**, - [gd](https://www.php.net/manual/en/image.installation.php) med **JPEG**,
**PNG** and **WEBP** libraries. **PNG** och **WEBP** bibliotek.
- [exif](https://www.php.net/manual/en/exif.installation.php) - [exif](https://www.php.net/manual/en/exif.installation.php)
Additionally, make sure that the following extensions are enabled in your PHP: Se dessutom till att följande tillägg är aktiverade i din PHP:
- json (enabled by default - don't turn it off) - json (aktiverad som standard - stäng inte av)
- xml (enabled by default - don't turn it off) - xml (aktiverat som standard - stäng inte av)
- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php) - [mysqlnd](https://php.net/manual/en/mysqlnd.install.php)
### MySQL compatible database ### MySQL kompatibel databas
> We recommend using [MariaDB](https://mariadb.org). > Vi rekommenderar att du använder [MariaDB](https://mariadb.org).
::: warning Warning ::: varning Varning
Castopod only works with supported MySQL 5.7 or higher compatible databases. It Castopod fungerar endast med stödda MySQL 5.7 eller högre kompatibla databaser.
will break with the previous MySQL v5.6 for example as its end of life was on Den kommer att bryta med den tidigare MySQL v5.6 till exempel eftersom dess slut
February 5, 2021. var den 5 februari 2021.
::: :::
You will need the server hostname, database name, username and password to Du behöver serverns värdnamn, databasnamn, användarnamn och lösenord för att
complete the installation process. If you do not have these, please contact your slutföra installationen. Om du inte har dessa kontaktar du din
server administrator. serveradministratör.
#### Privileges #### Privilegier
User must have at least these privileges on the database for Castopod to work: Användare måste ha minst dessa rättigheter i databasen för att Castopod ska
`CREATE`, `ALTER`, `DELETE`, `EXECUTE`, `INDEX`, `INSERT`, `SELECT`, `UPDATE`, fungera: `CREATE`, `ALTER`, `DELETE`, `EXECUTE`, `INDEX`, `INSERT`, `SELECT`,
`REFERENCES`, `CREATE VIEW`. `UPDATE`, `REFERENCES`, `CREATE VIEW`.
### (Optional) FFmpeg v4.1.8 or higher for Video Clips ### (Valfritt) FFmpeg v4.1.8 eller högre för videoklipp
[FFmpeg](https://www.ffmpeg.org/) version 4.1.8 or higher is required if you [FFmpeg](https://www.ffmpeg.org/) version 4.1.8 eller högre krävs om du vill
want to generate Video Clips. The following extensions must be installed: generera videoklipp. Följande tillägg måste installeras:
- **FreeType 2** library for - **FreeType 2** bibliotek för
[gd](https://www.php.net/manual/en/image.installation.php). [gd](https://www.php.net/manual/en/image.installation.php).
### (Optional) Other recommendations ### (Valfritt) Andra rekommendationer
- Redis for better cache performances. - Redis för bättre cache-prestanda.
- CDN for static files caching and better performances. - CDN för statiska filer caching och bättre prestanda.
- e-mail gateway for lost passwords. - e-post gateway för förlorade lösenord.
## Install instructions ## Installationsanvisningar
### Pre-requisites ### Förutsättningar
0. Get a Web Server with [requirements](#requirements) installed 0. Skaffa en webbserver med [krav](#requirements) installerat
1. Create a MySQL database for Castopod with a user having access and 1. Skapa en MySQL-databas för Castopod med en användare som har åtkomst till och
modification privileges (for more info, see modifieringsrättigheter (för mer info, se
[MySQL compatible database](#mysql-compatible-database)). [MySQL-kompatibel databas](#mysql-compatible-database)).
2. Activate HTTPS on your domain with an _SSL certificate_. 2. Aktivera HTTPS på din domän med ett _SSL-certifikat_.
3. Download and unzip the latest [Castopod Package](https://castopod.org/) onto 3. Ladda ner och packa upp det senaste [Castopod Package](https://castopod.org/)
the web server if you havent already. på webbservern om du inte redan har det.
- ⚠️ Set the web server document root to the `public/` sub-folder within the - ⚠️ Sätt webbserverdokumentroten till `public/` undermappen i mappen
`castopod` folder. `castopod`.
4. Add **cron tasks** on your web server for various background processes 4. Lägg till **cron-uppgifter** på din webbserver för olika bakgrundsprocesser
(replace the paths accordingly): (byt ut sökvägarna därefter):
- For social features to work properly, this task is used to broadcast social - För att sociala funktioner ska fungera korrekt, används denna uppgift för
activities to your followers on the fediverse: att sända sociala aktiviteter till dina anhängare på fediverse:
```bash ```bash
* * * * * /path/to/php /path/to/castopod/public/index.php scheduled-activities * * * * * /path/to/php /path/to/castopod/public/index.php scheduled-activities
``` ```
- For having your episodes be broadcasted on open hubs upon publication using - För att dina episoder ska sändas på öppna hubbar vid publicering med
[WebSub](https://en.wikipedia.org/wiki/WebSub): [WebSub](https://en.wikipedia.org/wiki/WebSub):
```bash ```bash
* * * * * /usr/local/bin/php /castopod/public/index.php scheduled-websub-publish * * * * * /usr/local/bin/php /castopod/public/index.php scheduled-websub-publish
``` ```
- For Video Clips to be created (see - För att videoklipp ska skapas (se
[FFmpeg requirements](#ffmpeg-v418-or-higher-for-video-clips)): [FFmpeg krav](#ffmpeg-v418-or-higher-for-video-clips)):
```bash ```bash
* * * * * /path/to/php /path/to/castopod/public/index.php scheduled-video-clips * * * * * /path/to/php /path/to/castopod/public/index.php scheduled-video-clips
``` ```
> These tasks run **every minute**. You may set the frequency depending on > Dessa uppgifter körs **varje minut**. Du kan ställa in frekvensen beroende
> your needs: every 5, 10 minutes or more. > på dina behov: var 5, 10 minuter eller mer.
### (recommended) Install Wizard ### (rekommenderas) Installationsguide
1. Run the Castopod install script by going to the install wizard page 1. Kör Castopod install script genom att gå till installationsguiden sidan
(`https://your_domain_name.com/cp-install`) in your favorite web browser. (`https://your_domain_name.com/cp-install`) i din favorit webbläsare.
2. Follow the instructions on your screen. 2. Följ instruktionerna på din enhet.
3. Start podcasting! 3. Börja podcasting!
::: info Note ::: info Notering
The install script writes a `.env` file in the package root. If you cannot go Installationsskriptet skriver en `.env` -fil i paketroten. Om du inte kan gå via
through the install wizard, you can create and edit the `.env` file manually installationsguiden kan du skapa och redigera `. nv` filen manuellt baserat på
based on the `.env.example` file. `.env.example` filen.
::: :::
### Email/SMTP setup ### Email/SMTP setup
Email configuration is required for some features to work properly (eg. E-postkonfiguration krävs för att vissa funktioner ska fungera korrekt (t.ex.
retrieving your forgotten password, sending instructions to premium subscribers, att hämta ditt glömda lösenord, skicka instruktioner till premiumprenumeranter,
…) …)
You may add your email configuration in your instance's `.env` like so: Du kan lägga till din e-postkonfiguration i din instans `.env` som så:
```ini ```ini
# […] # […]
@ -148,33 +149,33 @@ email.SMTPUser="your_smtp_user"
email.SMTPPass="your_smtp_password" email.SMTPPass="your_smtp_password"
``` ```
#### Email config options #### Alternativ för e-postkonfiguration
| Variable name | Type | Default | | Variabelt namn | Typ | Standard |
| ---------------- | -------------------- | ------------ | | ---------------- | ----------------------- | ------------- |
| **`fromEmail`** | string | `undefined` | | **`fromEmail`** | sträng | `odefinierad` |
| **`fromName`** | string | `"Castopod"` | | **`fromName`** | sträng | `"Castopod"` |
| **`SMTPHost`** | string | `undefined` | | **`SMTPHost`** | sträng | `odefinierad` |
| **`SMTPUser`** | string | `undefined` | | **`SMTPUser`** | sträng | `odefinierad` |
| **`SMTPPass`** | string | `undefined` | | **`SMTPPass`** | sträng | `odefinierad` |
| **`SMTPPort`** | number | `25` | | **`SMTPPort`** | nummer | `25` |
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` | | **`SMTPCrypto`** | [`"tls"` eller `"ssl"`] | `"tls"` |
## Community packages ## Gemenskapspaket
If you don't want to bother with installing Castopod manually, you may use one Om du inte vill bry dig om att installera Castopod manuellt, kan du använda ett
of the packages created and maintained by the open-source community. av de paket som skapats och underhålls av open source-miljön.
### Install with YunoHost ### Installera med YunoHost
[YunoHost](https://yunohost.org/) is a distribution based on Debian GNU/Linux [YunoHost](https://yunohost.org/) är en distribution baserad på Debian GNU/Linux
made up of free and open-source software packages. It manages the hardships of som består av mjukvarupaket med fri och öppen källkod. Det hanterar
self-hosting for you. svårigheterna med self-hosting för dig.
<div class="flex flex-wrap items-center gap-4"> <div class="flex flex-wrap items-center gap-4">
<a href="https://install-app.yunohost.org/?app=castopod" target="_blank" rel="noopener noreferrer"> <a href="https://install-app.yunohost.org/?app=castopod" target="_blank" rel="noopener noreferrer">
<img src="https://install-app.yunohost.org/install-with-yunohost.svg" alt="Install Castopod with YunoHost" class="align-middle" /> <img src="https://install-app.yunohost.org/install-with-yunohost.svg" alt="Installera Castopod med YunoHost" class="align-middle" />
</a> </a>
<a href="https://github.com/YunoHost-Apps/castopod_ynh" target="_blank" rel="noopener noreferrer" class="inline-flex items-center px-4 py-[.3rem] mx-auto font-semibold text-center text-black rounded-md gap-x-1 border-2 border-solid border-[#333] hover:no-underline hover:bg-gray-100"><svg <a href="https://github.com/YunoHost-Apps/castopod_ynh" target="_blank" rel="noopener noreferrer" class="inline-flex items-center px-4 py-[.3rem] mx-auto font-semibold text-center text-black rounded-md gap-x-1 border-2 border-solid border-[#333] hover:no-underline hover:bg-gray-100"><svg

View File

@ -1,23 +1,23 @@
--- ---
title: Security title: Säkerhet
--- ---
# Security concerns # Säkerhetsfrågor
Castopod is built on top of [CodeIgniter4](https://codeigniter.com/), a PHP Castopod är byggt ovanpå [CodeIgniter4](https://codeigniter.com/), ett PHP
framework that encourages ramverk som uppmuntrar
[good security practices](https://codeigniter.com/user_guide/concepts/security.html). [goda säkerhetsmetoder](https://codeigniter.com/user_guide/concepts/security.html).
To maximize your instance's safety and prevent any malicious attack, we För att maximera din instans säkerhet och förhindra alla skadliga attacker, vi
recommend you update all your Castopod files permissions after installation or rekommenderar att du uppdaterar alla dina Castopod-filer behörigheter efter
updates (to avoid any prior permission error): installation eller uppdateringar (för att undvika eventuella föregående
tillståndsfel):
- `writable/` folder must be **readable** and **writable**. - `writable/` mapp måste vara **läsbar** och **skrivbar**.
- `public/media/` folder must be **readable** and **writable**. - `public/media/` mapp måste vara **läsbar** och **skrivbar**.
- any other file must be set to **readonly**. - någon annan fil måste vara inställd på **readonly**.
For instance, if you are using Apache or NGINX with Ubuntu you may do the Till exempel, om du använder Apache eller NGINX med Ubuntu kan du göra följande:
following:
```bash ```bash
sudo chown -R root:root /path/to/castopod sudo chown -R root:root /path/to/castopod

View File

@ -1,109 +1,106 @@
--- ---
title: Update title: Uppdatera
sidebarDepth: 3 sidebarDepth: 3
--- ---
# How to update Castopod? # Hur uppdaterar man Castopod?
After installing Castopod, you may want to update your instance to the latest Efter att du installerat Castopod, kanske du vill uppdatera din instans till den
version in order to enjoy the latest features ✨, bug fixes 🐛 and performance senaste -versionen för att njuta av de senaste funktionerna ✨, buggfixar 🐛 och
improvements ⚡. prestanda förbättringar ⚡.
## Update instructions ## Uppdatera instruktioner
0. ⚠️ Before any update, we highly recommend you backup your Castopod files and 0. ⚠️ Innan någon uppdatering rekommenderar vi starkt att du säkerhetskopierar
database. dina Castopod-filer och databas.
- cf. - cf.
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating) [Ska jag göra en säkerhetskopia innan jag uppdaterar?](#should-i-make-a-backup-before-updating)
1. Go to the 1. Gå till
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and [releaser sidan](https://code.castopod.org/adaures/castopod/-/releases) och
see if your instance is up to date with the latest Castopod version se om din instans är uppdaterad med den senaste Castopod versionen
- cf. - cf.
[Where can I find my Castopod version?](#where-can-i-find-my-castopod-version) [Var hittar jag min Castopod-version?](#where-can-i-find-my-castopod-version)
2. Download the latest release package named `Castopod Package`, you may choose 2. Ladda ner det senaste utgivningspaketet som heter `Castopod Package`, du kan
between the `zip` or `tar.gz` archives välja mellan `zip` eller `tar.gz` arkiv
- ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code - ⚠️ Kontrollera att du laddar ner Castopod-paketet och **INTE** källkoden
- Note that you can also download the latest package from - Observera att du även kan ladda ner det senaste paketet från
[castopod.org](https://castopod.org/) [castopod.org](https://castopod.org/)
3. On your server: 3. På din server:
- Remove all files except `.env` and `public/media` - Ta bort alla filer utom `.env` och `publik/media`
- Copy the new files from the downloaded package into your server - Kopiera de nya filerna från det nedladdade paketet till din server
::: info Note ::: info Notering
You may need to reset files permissions as during the install process. Du kan behöva återställa filrättigheter som under installationsprocessen.
Check [Security Concerns](./security.md). Kontrollera [säkerhetsbekymmer](./security.md).
::: :::
4. Update your database schema from your `Castopod Admin` > `About` page or by 4. Uppdatera ditt databasschema från din `Castopod Admin` > `Om` sida eller kör:
running:
```bash ```bash
php spark castopod:database-update php spark castopod:database-update
``` ```
5. Clear your cache from your `Castopod Admin` > `Settings` > `general` > 5. Rensa din cache från `Castopod Admin` > `Inställningar` > `allmän` >
`Housekeeping` `Hushållning`
6. ✨ Enjoy your fresh instance, you're all done! 6. ✨ Njut av din färska instans, du är alla klara!
::: info Note ::: info Notering
Releases may come with additional update instructions (see Utgåvor kan komma med ytterligare uppdateringsinstruktioner (se
[releases page](https://code.castopod.org/adaures/castopod/-/releases)). [utgåvor sidan](https://code.castopod.org/adaures/castopod/-/releases)).
- cf. - cf.
[I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) [Jag har inte uppdaterat min instans på länge… Vad ska jag göra?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do)
::: :::
## Fully Automated updates ## Helt automatiserade uppdateringar
> Coming soon... 👀 > Kommer snart... 👀
## Frequently asked questions (FAQ) ## Vanliga frågor (FAQ)
### Where can I find my Castopod version? ### Var hittar jag min Castopod-version?
Go to your Castopod admin panel, the version is displayed on the bottom left Gå till din Castopod admin-panel, versionen visas längst ner till vänster hörn.
corner.
Alternatively, you can find the version in the `app > Config > Constants.php` Alternativt kan du hitta versionen i `appen > Config > Constants.php` filen.
file.
### I haven't updated my instance in a long time… What should I do? ### Jag har inte uppdaterat min instans på länge… Vad ska jag göra?
No problem! Just get the latest release as described above. Only, when going Inga problem! Bara få den senaste versionen som beskrivs ovan. Endast när du går
through the release instructions (4), perform them sequentially, from the oldest genom utgivningsinstruktionerna (4), utför dem sekventiellt, från de äldsta till
to the newest. de nyaste.
> You may want to backup your instance depending on how long you haven't updated > Du kanske vill säkerhetskopiera din instans beroende på hur länge du inte har
> Castopod. > uppdaterat Castopod.
For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to Till exempel, om du är på `v1.0.0-alpha.42` och vill uppgradera till
`v1.0.0-beta.1`: `v1.0.0-beta.1`:
0. (highly recommended) Make a backup of your files and database. 0. (rekommenderas starkt) Gör en säkerhetskopia av dina filer och databaser.
1. Download the latest release, overwrite your files whilst keeping `.env` and 1. Ladda ner den senaste utgåvan, skriv över dina filer samtidigt som du
`public/media`. behåller `.env` och `public/media`.
2. Go through each release update instructions sequentially (from oldest to 2. Gå igenom varje utgåva uppdateringsinstruktioner sekventiellt (från äldsta
newest) starting with `v1.0.0-alpha.43`, `v1.0.0-alpha.44`, till nyaste) börjar med `v1.0.0-alpha. 3`, `v1.0.0-alpha.44`,
`v1.0.0-alpha.45`, …, `v1.0.0-beta.1`. `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`.
3. ✨ Enjoy your fresh instance, you're all done! 3. ✨ Njut av din färska instans, du är alla klara!
### Should I make a backup before updating? ### Ska jag göra en säkerhetskopia innan jag uppdaterar?
We advise you do, so you don't lose everything if anything goes wrong! Vi råder dig att göra, så att du inte förlorar allt om något går fel!
More generally, we advise you make regular backups of your Castopod files and Mer generellt, rekommenderar vi att du gör regelbundna säkerhetskopior av dina
database to prevent you from losing it all Castopod filer och databas för att hindra dig från att förlora allt

View File

@ -2,239 +2,244 @@
sidebarDepth: 2 sidebarDepth: 2
--- ---
# Welcome 👋 # Välkommen 👋
[![release-badge]][release]&nbsp;[![license-badge]][license]&nbsp;[![contributions-badge]][contributions]&nbsp;[![semantic-release-badge]][semantic-release]&nbsp;[![crowdin-badge]][crowdin]&nbsp;[![discord-badge]][discord]&nbsp;[![stars-badge]][stars] [![release-badge]][release]&nbsp;[![license-badge]][license]&nbsp;[![contributions-badge]][contributions]&nbsp;[![semantic-release-badge]][semantic-release]&nbsp;[![crowdin-badge]][crowdin]&nbsp;[![discord-badge]][discord]&nbsp;[![stars-badge]][stars]
Castopod is a free & open-source hosting platform made for podcasters who want Castopod är en gratis hostingplattform med öppen källkod gjord för podcastare
engage and interact with their audience. som vill engagera och interagera med sin publik.
Castopod is easy to install and was built on top of Castopod är lätt att installera och byggdes ovanpå
[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very [CodeIgniter4](https://codeigniter.com/), ett kraftfullt PHP-ramverk med ett
small footprint. mycket litet fotavtryck.
::: info Status ::: info Status
Castopod is currently in **beta** but already quite stable and used by Castopod är för närvarande i **beta** men redan ganska stabil och används av
podcasters around&nbsp;the&nbsp;world! podcastare runt&nbsp;den&nbsp;världen!
::: :::
<div class="flex items-center"> <div class="flex items-center">
<a href="/getting-started/install" class="inline-flex items-center px-4 py-2 mx-auto font-semibold text-center text-white rounded-full shadow gap-x-1 bg-pine-500 hover:no-underline hover:bg-pine-600">Install<svg viewBox="0 0 24 24" width="1em" height="1em" class="text-xl text-pine-200"><path fill="currentColor" d="m16.172 11-5.364-5.364 1.414-1.414L20 12l-7.778 7.778-1.414-1.414L16.172 13H4v-2z"></path></svg></a> <a href="/getting-started/install" class="inline-flex items-center px-4 py-2 mx-auto font-semibold text-center text-white rounded-full shadow gap-x-1 bg-pine-500 hover:no-underline hover:bg-pine-600">Installera<svg viewBox="0 0 24 24" width="1em" height="1em" class="text-xl text-pine-200"><path fill="currentColor" d="m16.172 11-5.364-5.364 1.414-1.414L20 12l-7.778 7.778-1.414-1.414L16.172 13H4v-2z"></path></svg></a>
</div> </div>
## Features ## Funktioner
- 🌱 &nbsp;Free & open-source (AGPL v3 License) - 🌱 &nbsp;Gratis & öppen källkod (AGPL v3-licens)
- 🔐 &nbsp;Focused on data sovereignty: your content, audience, and analytics - 🔐 &nbsp;Fokuserad på datasuveränitet: ditt innehåll, målgrupp och analys
belong to you, and&nbsp;you&nbsp;only tillhör dig, och&nbsp;du&nbsp;bara
- 🪄 &nbsp;Podcasting 2.0 features: GUID, locked, transcripts, funding, - <unk> &nbsp;Podcasting 2.0 funktioner: GUID, låst, avskrifter, finansiering,
chapters, location, persons, soundbites, … kapitel, plats, personer, ljud, …
- 💬 &nbsp;Built-in social network: - 💬 &nbsp;Inbyggt socialt nätverk:
- 🚀 &nbsp;Castopod is part of the Fediverse, a decentralized social network - 🚀 &nbsp;Castopod är en del av Fediverse, ett decentraliserat socialt
- ❤️ &nbsp;Create posts, share, favourite, and comment on episodes nätverk
- 📈 &nbsp;Built-in analytics: - ❤️ &nbsp;Skapa inlägg, dela, favorit och kommentera avsnitt
- ⚖️ &nbsp;GDPR / CCPA / LGPD compliant - 📈 &nbsp;Inbyggd analys:
- 🪙 &nbsp;Standard IABv2 audience measurement - ⚖️ &nbsp;GDPR / CCPA / LGPD kompatibel
- 🏡 &nbsp;On-premises analytics, no third party involved - <unk> &nbsp;Standard IABv2 målgruppsmätning
- 📢 &nbsp;Built-in marketing tools: - 🏡 &nbsp;Lokalanalys, ingen tredje part involverad
- 📢 &nbsp;Inbyggda marknadsföringsverktyg:
- ✅ &nbsp;SEO ready (open-graph meta-tags, JSON-LD, …) - ✅ &nbsp;SEO ready (open-graph meta-tags, JSON-LD, …)
- 📱 &nbsp;PWA: install as a standalone app - 📱 &nbsp;PWA: installera som en fristående app
- 🎨 &nbsp;Customizable theme colors - 🎨 &nbsp;Anpassningsbara temafärger
- 🎬 &nbsp;Generate ready-to-share Video clips from episodes - 🎬 &nbsp;Generera att dela videoklipp från avsnitt
- 🔉 &nbsp;Generate soundbites - 🔉 &nbsp;Generera ljudbitar
- ▶️ &nbsp;Embeddable player, embed your episodes on any website - <unk> \_button_selector: &nbsp;Inbäddbar spelare, bädda in dina avsnitt på
valfri webbplats
- 💸 &nbsp;Monetization: - 💸 &nbsp;Monetization:
- 🔗 &nbsp;Funding links - 🔗 &nbsp;Finansierar länkar
- 📲 &nbsp;listen-to-click ads - 📲 &nbsp;lista-att-klicka annonser
- 🤝 &nbsp;value4value / WebMonetization - 🤝 &nbsp;value4value / WebMonetization
- 💎 &nbsp;Premium podcasts - 💎 &nbsp;Premium podcasts
- 📡 &nbsp;Publish your episodes everywhere with RSS: - 📡 &nbsp;Publicera dina avsnitt överallt med RSS:
- 📱 &nbsp;On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, - 📱 &nbsp;På alla index och appar: Podcast Index, Apple Podcasts, Spotify,
Google Podcasts, Deezer, Podcast Addict, Podfriend, … Google Podcasts, Deezer, Podcast Addict, Podfriend, …
- ⚡ &nbsp;Broadcast your episodes instantly with WebSub - ⚡ &nbsp;Sänd dina avsnitt direkt med WebSub
- 📥 &nbsp;Podcast import: move your existing podcast into Castopod - 📥 &nbsp;Podcast import: flytta din befintliga podcast till Castopod
- 📤 &nbsp;Move your podcast out of Castopod - 📤 &nbsp;Flytta ut din podcast från Castopod
- 🔀 &nbsp;Multi-tenant: host as many podcasts as you want - :shuffle_tracks<unk> &nbsp;Flera hyresgäst: värd så många podcasts du vill
- 👥 &nbsp;Multi-user: add contributors and set roles - 👥 &nbsp;Flera användare: lägg till bidragslämnare och ange roller
- 🌎 &nbsp;i18n support: translated in English, French, Polish, German, - 🌎 &nbsp;i18n support: översatt till engelska, franska, polska, tyska,
Brazilian Portuguese & Spanish… with brasilianska portugisiska & spanska… med
[more to come](https://translate.castopod.org)! [mer att komma](https://translate.castopod.org)!
## Motivation ## Motivation
The podcasting ecosystem is decentralized by nature: you can create your podcast Den podcasting ekosystem är decentraliserad av naturen: du kan skapa din podcast
as an RSS file, publish it on the web and have it shared everywhere online. som en RSS-fil, publicera den på webben och få den delad överallt på nätet.
It is in fact one of the only media to have stayed this way for a long time. Det är i själva verket en av de enda medierna som har stannat kvar på detta sätt
under en lång tid.
As usages are evolving, more and more people are getting into podcasts: whether I takt med att användningsområden utvecklas kommer fler och fler människor in i
it is creators finding new ways to share their ideas, or listeners in the search podcasts: om det är skapare att hitta nya sätt att dela sina idéer, eller
for better content. lyssnare i sökningen för bättre innehåll.
With podcasting becoming more widely used, some companies are trying to shift it När podcasting blir mer allmänt använd försöker vissa företag flytta den till
towards a more controlled and centralized medium. ett mer kontrollerat och centraliserat medium.
Castopod was created in an effort to provide an open and sustainable alternative Castopod skapades i ett försök att ge ett öppet och hållbart alternativ för att
to hosting your podcasts, promoting decentralization to ensure that podcasters vara värd för dina podcasts, främja decentralisering för att säkerställa att
creativity can express itself. podcastare kreativitet kan uttrycka sig.
This project is pushed by the open-source community, and specifically by the Detta projekt drivs av open source-communityn och specifikt av
[Fediverse](https://fediverse.party/en/fediverse/) and [Fediverse](https://fediverse.party/en/fediverse/) och
[Podcasting 2.0](https://podcastindex.org/) movements. [Podcasting 2.0](https://podcastindex.org/) rörelser.
## Comparison with other solutions ## Jämförelse med andra lösningar
We believe that a solution is not necessarily right for everyone, it highly Vi tror att en lösning inte nödvändigtvis är rätt för alla, det mycket beror på
depends on your needs. So, here are comparisons with other tools to help you to dina behov. Så, här är jämförelser med andra verktyg för att hjälpa dig att mäta
gauge whether Castopod is the right fit for&nbsp;you. om Castopod är rätt passform för&nbsp;du.
### Castopod vs Wordpress ### Castopod vs Wordpress
Castopod is often referred to as "the Wordpress for podcasts" because of the Castopod kallas ofta för "Wordpress för podcasts" på grund av de likheter mellan
similarities between the two. In some ways this is true. And actually, Castopod de två. På vissa sätt är detta sant. Och faktiskt, Castopod var mycket
was greatly inspired by the Wordpress ecosystem, seeing the ease of adoption inspirerad av Wordpress ekosystem, se lätthet att adoptera från gemenskapen och
from the community and the number of websites running&nbsp;it. antalet webbplatser som kör&nbsp;den.
Just like Wordpress, Castopod is free & open source, built using PHP with a Precis som Wordpress är Castopod gratis & öppen källkod, byggd med PHP med en
MySQL database and is packaged in a way that you can easily install on most web MySQL-databas och är paketerad på ett sätt som du enkelt kan installera på de
servers. flesta webb -servrar.
Wordpress is a great way to create your website and extend it with plugins to Wordpress är ett bra sätt att skapa din webbplats och utöka den med plugins för
get what you want. It is a full fledged CMS that helps you get any type of att få vad du vill. Det är en fullfjädrad CMS som hjälper dig att få någon typ
website online. av webbplats online.
On the other hand, Castopod is meant to address the podcasters needs Å andra sidan, Castopod är tänkt att ta itu med podcasters behöver specifikt,
specifically, focusing on podcasting, and nothing else. You don't need any med fokus på podcasting, och inget annat. Du behöver inte någon plugin för att
plugin to get you started on your podcasting&nbsp;journey. komma igång med din podcasting&nbsp;resa.
This allows optimizing the processes specific to podcasting: ranging from the Detta gör det möjligt att optimera de processer som är specifika för podcasting:
creation of your podcasts and the publication of new episodes all the way to allt från skapandet av dina podcasts och publiceringen av nya avsnitt hela vägen
broadcasting, marketing and analytics. till sändning, marknadsföring och analys.
Finally, depending on your needs, Wordpress and Castopod can even live side by Slutligen, beroende på dina behov, Wordpress och Castopod kan även leva sida vid
side as they share the same requirements! sida eftersom de delar samma krav!
### Castopod vs Funkwhale ### Castopod vs Funkwhale
Funkwhale is a self-hosted, modern free and open-source music server. Just as Funkwhale är en självvärd, modern gratis och öppen källkod musikserver. Precis
Castopod, Funkwhale is on the fediverse, a decentralized social network allowing som Castopod, Funkwhale är på fediverse, ett decentraliserat socialt nätverk som
interoperability between the two. möjliggör interoperabilitet mellan de två.
Funkwhale was initially built around music. And later on, as the project Funkwhale byggdes ursprungligen runt musik. Och senare när projektet utvecklades
evolved, the ability to host podcasts was introduced. introducerades förmågan att vara värd för podcasts.
Unlike Funkwhale, Castopod has been designed and built around podcasting Till skillnad från Funkwhale har Castopod designats och byggts kring podcasting
exclusively. This allows easier implementation for features related to the exklusivt. Detta möjliggör enklare implementering av funktioner relaterade till
podcasting ecosystem, such as the podcasting 2.0 features (transcripts, podcasting ekosystem, såsom podcasting 2.0 funktioner (transkript, kapitel,
chapters, locations, persons, …). platser, personer, …).
So, you should probably use Funkwhale if you want to host your music, and use Så, du bör förmodligen använda Funkwhale om du vill vara värd för din musik, och
Castopod if you want to host your podcasts. använda Castopod om du vill vara värd för dina podcasts.
### Castopod vs other podcast hosts ### Castopod vs andra podcast värdar
There are many solutions for you to host your podcasts, some of which are really Det finns många lösningar för dig att vara värd för dina podcasts, några av dem
great and [a lot of them](https://podcastindex.org/apps) are jumping into the är verkligen bra och [en hel del av dem](https://podcastindex.org/apps) hoppar
Podcasting 2.0 wagon just like Castopod! in i Podcasting 2. vagn precis som Castopod!
Each of these solutions differ from one another, you may compare with the Var och en av dessa lösningar skiljer sig från varandra, kan du jämföra med
[list of features](#features). [listan över funktioner](#features).
That being said, there are two main differences with other podcasting solutions: Med detta sagt, det finns två huvudsakliga skillnader med andra podcasting
lösningar:
- Castopod can be self-hosted and is the only solution that allows you to keep - Castopod kan vara själv värd och är den enda lösningen som gör att du kan
full control over what you produce. Also, as it is open-source, you can even hålla full kontroll över vad du producerar. Dessutom, eftersom det är öppen
customize it as you wish. källkod, kan du även anpassa det som du vill.
- Castopod is the only solution that currently integrates both a decentralized - Castopod är den enda lösningen som för närvarande integrerar både ett
social network with ActivityPub as well as many of the podcasting 2.0 decentraliserat socialt nätverk med ActivityPub samt många av podcasting 2.
features, hoping to bridge the gap between the two. funktioner, i hopp om att överbrygga gapet mellan de två.
## Contributing ## Hjälp till
Love Castopod and would like to help? Take a look at the following documentation Älskar du Castopod och vill hjälpa till? Ta en titt på följande dokumentation
to get you&nbsp;started. för att få dig&nbsp;igång.
### Code of conduct ### Uppförandekod
Castopod has adopted a Code of Conduct that we expect project participants to Castopod har antagit en uppförandekod som vi förväntar oss projektdeltagare att
adhere to. Please read the hålla sig till. Läs
[CODE_OF_CONDUCT manual](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md) [CODE_OF_CONDUCT manualen](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md)
so that you can understand what actions will and will not be&nbsp;tolerated. så att du kan förstå vilka åtgärder som kommer och inte kommer
att&nbsp;tolereras.
### Contributing guide ### Bidragande guide
Read our [contributing guide](./contributing/guidelines.md) to learn about our Läs vår [bidragande guide](./contributing/guidelines.md) för att lära dig om vår
development process, how to propose bugfixes and improvements, and how to build utvecklingsprocess, hur du föreslår buggfixar och förbättringar, och hur du
and test your changes to Castopod. bygger och testar dina ändringar till Castopod.
## Contributors ## Alla bidragsgivare
Thanks goes to these wonderful people Tack går till dessa underbara människor
([emoji key](https://allcontributors.org/docs/en/emoji-key)): ([emoji nyckel](https://allcontributors.org/docs/en/emoji-key)):
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --> <!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start --> <!-- prettier-ignore-start -->
<!-- markdownlint-disable --> <!-- markdownlint-disable -->
<table> <table>
<tr> <tr>
<td align="center"><a href="https://github.com/yassinedoghri"><img src="https://code.castopod.org/uploads/-/system/user/avatar/3/avatar.png?s=100" width="100px;" alt=""/><br /><sub><b>Yassine Doghri</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/issues?author_username=yassinedoghri" title="Bug reports">🐛</a> <a href="https://code.castopod.org/adaures/castopod/commits/master" title="Documentation">📖</a> <a href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=yassinedoghri" title="Reviewed Pull Requests">👀</a> <a href="#maintenance-yassinedoghri" title="Maintenance">🚧</a> <a href="#content-yassinedoghri" title="Content">🖋</a> <a href="#design-yassinedoghri" title="Design">🎨</a> <a href="#a11y-yassinedoghri" title="Accessibility">️️️️♿️</a> <a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#question-yassinedoghri" title="Answering Questions">💬</a> <a href="#mentoring-yassinedoghri" title="Mentoring">🧑‍🏫</a> <a href="#infra-yassinedoghri" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#ideas-yassinedoghri" title="Ideas, Planning, & Feedback">🤔</a> <a href="#projectManagement-yassinedoghri" title="Project Management">📆</a> <a href="https://blog.castopod.org/author/yassinedoghri/" title="Blogposts">📝</a></td> <td align="center"><a href="https://github.com/yassinedoghri"><img src="https://code.castopod.org/uploads/-/system/user/avatar/3/avatar.png?s=100" width="100px;" alt=""/><br /><sub><b>Yassine Doghri</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/issues?author_username=yassinedoghri" title="Bug reports">🐛</a> <a href="https://code.castopod.org/adaures/castopod/commits/master" title="Documentation">📖</a> <a href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=yassinedoghri" title="Reviewed Pull Requests">👀</a> <a href="#maintenance-yassinedoghri" title="Maintenance">🚧</a> <a href="#content-yassinedoghri" title="Content">🖋</a> <a href="#design-yassinedoghri" title="Design">:artist_palett:</a> <a href="#a11y-yassinedoghri" title="Accessibility"></a> <a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#question-yassinedoghri" title="Answering Questions">💬</a> <a href="#mentoring-yassinedoghri" title="Mentoring">🧑<unk> 🏫</a> <a href="#infra-yassinedoghri" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#ideas-yassinedoghri" title="Ideas, Planning, & Feedback">🤔</a> <a href="#projectManagement-yassinedoghri" title="Project Management">📆</a> <a href="https://blog.castopod.org/author/yassinedoghri/" title="Blogposts">memo:</a></td>
<td align="center"><a href="https://code.castopod.org/benjamin"><img src="https://code.castopod.org/uploads/-/system/user/avatar/2/avatar.png?s=100" width="100px;" alt=""/><br /><sub><b>Benjamin Bellamy</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/issues?author_username=benjamin" title="Bug reports">🐛</a> <a href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=benjamin" title="Reviewed Pull Requests">👀</a> <a href="#content-benjamin" title="Content">🖋</a> <a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#question-benjamin" title="Answering Questions">💬</a> <a href="#infra-benjamin" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#ideas-benjamin" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://blog.castopod.org/author/benjamin-bellamy/" title="Blogposts">📝</a> <a href="#projectManagement-benjamin" title="Project Management">📆</a> <a href="#talk-benjamin" title="Talks">📢</a></td> <td align="center"><a href="https://github.com/yassinedoghri"><img src="https://code.castopod.org/uploads/-/system/user/avatar/3/avatar.png?s=100" width="100px;" alt=""/><br /><sub><b>Yassine Doghri</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/issues?author_username=yassinedoghri" title="Bug reports">🐛</a> <a href="https://code.castopod.org/adaures/castopod/commits/master" title="Documentation">📖</a> <a href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=yassinedoghri" title="Reviewed Pull Requests">👀</a> <a href="#maintenance-yassinedoghri" title="Maintenance">🚧</a> <a href="#content-yassinedoghri" title="Content">🖋</a> <a href="#design-yassinedoghri" title="Design">:artist_palett:</a> <a href="#a11y-yassinedoghri" title="Accessibility"></a> <a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#question-yassinedoghri" title="Answering Questions">💬</a> <a href="#mentoring-yassinedoghri" title="Mentoring">🧑<unk> 🏫</a> <a href="#infra-yassinedoghri" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#ideas-yassinedoghri" title="Ideas, Planning, & Feedback">🤔</a> <a href="#projectManagement-yassinedoghri" title="Project Management">📆</a> <a href="https://blog.castopod.org/author/yassinedoghri/" title="Blogposts">memo:</a></td>
<td align="center"><a href="https://github.com/ola-hn"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><br /><sub><b>Ola Hneini</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=ola" title="Reviewed Pull Requests">👀</a> <a href="https://code.castopod.org/adaures/castopod/commits/master" title="Documentation">📖</a> <a href="#maintenance-ola" title="Maintenance">🚧</a> <a href="#question-ola" title="Answering Questions">💬</a> <a href="#ideas-ola" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center"><a href="https://github.com/ola-hn"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><br /><sub><b>Ola Hneini</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=ola" title="Reviewed Pull Requests">👀</a> <a href="https://code.castopod.org/adaures/castopod/commits/master" title="Documentation">📖</a> <a href="#maintenance-ola" title="Maintenance">🚧</a> <a href="#question-ola" title="Answering Questions">💬</a> <a href="#ideas-ola" title="Ideas, Planning, & Feedback">🤔</a></td> <td align="center"><a href="https://github.com/ola-hn"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><br /><sub><b>Ola Hneini</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/merge_requests?scope=all&state=all&approver_usernames[]=ola" title="Reviewed Pull Requests">👀</a> <a href="https://code.castopod.org/adaures/castopod/commits/master" title="Documentation">📖</a> <a href="#maintenance-ola" title="Maintenance">🚧</a> <a href="#question-ola" title="Answering Questions">💬</a> <a href="#ideas-ola" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center"><a href="https://mamot.fr/@rdelaage"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><br /><sub><b>Romain de Laage</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="#infra-rdelaage" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://code.castopod.org/adaures/castopod/commits/master" title="Documentation">📖</a> <a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#ideas-rdelaage" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center"><a href="https://twitter.com/lyonelbernard"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><br /><sub><b>Lyonel Bernard</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=Lyonel" title="Bug reports">🐛</a> <a href="#question-Lyonel" title="Answering Questions">💬</a> <a href="#audio-Lyonel" title="Audio">🔊</a> <a href="#ideas-Lyonel" title="Ideas, Planning, & Feedback">🤔</a></td> <td align="center"><a href="https://twitter.com/lyonelbernard"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><br /><sub><b>Lyonel Bernard</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=Lyonel" title="Bug reports">🐛</a> <a href="#question-Lyonel" title="Answering Questions">💬</a> <a href="#audio-Lyonel" title="Audio">🔊</a> <a href="#ideas-Lyonel" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center"><a href="https://www.crypticchameleon.com/"><img src="https://secure.gravatar.com/avatar/7c2a721b52d0763673a600e8f01bd745?s=80&d=identicon?s=100" width="100px;" alt=""/><br /><sub><b>Christopher Lagonick-Weitzel</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=ctlw83" title="Bug reports">🐛</a> <a href="#question-ctlw83" title="Answering Questions">💬</a> <a href="#audio-ctlw83" title="Audio">🔊</a> <a href="#ideas-ctlw83" title="Ideas, Planning, & Feedback">🤔</a></td> <td align="center"><a href="https://twitter.com/lyonelbernard"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><br /><sub><b>Lyonel Bernard</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=Lyonel" title="Bug reports">🐛</a> <a href="#question-Lyonel" title="Answering Questions">💬</a> <a href="#audio-Lyonel" title="Audio">🔊</a> <a href="#ideas-Lyonel" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center"><a href="https://ernestoacosta.me/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><br /><sub><b>Ernesto Acosta</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=ernestoacostame" title="Bug reports">🐛</a> <a href="#audio-ernestoacostame" title="Audio">🔊</a> <a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#question-ernestoacostame" title="Answering Questions">💬</a> <a href="#ideas-ernestoacostame" title="Ideas, Planning, & Feedback">🤔</a></td> <td align="center"><a href="https://twitter.com/lyonelbernard"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><br /><sub><b>Lyonel Bernard</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=Lyonel" title="Bug reports">🐛</a> <a href="#question-Lyonel" title="Answering Questions">💬</a> <a href="#audio-Lyonel" title="Audio">🔊</a> <a href="#ideas-Lyonel" title="Ideas, Planning, & Feedback">🤔</a></td>
</tr> </tr>
<tr> <tr>
<td align="center"><a href="https://code.castopod.org/Behel"><img src="https://secure.gravatar.com/avatar/ad63ee8ef8e3db8253d21e5012d2724f?s=80&d=identicon?s=100" width="100px;" alt=""/><br /><sub><b>Bastien Luneteau</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/issues?author_username=Behel" title="Bug reports">🐛</a></td> <td align="center"><a href="https://code.castopod.org/Behel"><img src="https://secure.gravatar.com/avatar/ad63ee8ef8e3db8253d21e5012d2724f?s=80&d=identicon?s=100" width="100px;" alt=""/><br /><sub><b>Bastien Luneteau</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a> <a href="https://code.castopod.org/adaures/castopod/issues?author_username=Behel" title="Bug reports">🐛</a></td>
<td align="center"><a href="https://www.cecillie.fr/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><br /><sub><b>Cécile Ricordeau</b></sub></a><br /><a href="#design-cecillie" title="Design">🎨</a></td> <td align="center"><a href="https://www.cecillie.fr/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><br /><sub><b>Patryk Miś</b></sub></a><br /><a href="#design-cecillie" title="Design">🌍</a></td>
<td align="center"><a href="https://code.castopod.org/PatrykMis"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><br /><sub><b>Patryk Miś</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td> <td align="center"><a href="https://code.castopod.org/PatrykMis"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><br /><sub><b>Patryk Mi</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center"><a href="https://code.castopod.org/mspanc"><img src="https://secure.gravatar.com/avatar/eed8337939641eac5ad0b570bd6acf96?s=80&d=identicon?s=100" width="100px;" alt=""/><br /><sub><b>Marcin Lewandowski</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=mspanc" title="Bug reports">🐛</a> <a href="#ideas-mspanc" title="Ideas, Planning, & Feedback">🤔</a></td> <td align="center"><a href="https://code.castopod.org/mspanc"><img src="https://secure.gravatar.com/avatar/eed8337939641eac5ad0b570bd6acf96?s=80&d=identicon?s=100" width="100px;" alt=""/><br /><sub><b>Bastien Luneteau</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=mspanc" title="Bug reports">💻</a> <a href="#ideas-mspanc" title="Ideas, Planning, & Feedback">🐛</a></td>
<td align="center"><a href="https://code.castopod.org/SJanik"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><br /><sub><b>Sebastian Janik</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td> <td align="center"><a href="https://code.castopod.org/SJanik"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><br /><sub><b>Patryk Miś</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">🌍</a></td>
<td align="center"><a href="https://code.castopod.org/patryk"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><br /><sub><b>Patryk Karczmarczyk</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td> <td align="center"><a href="https://code.castopod.org/patryk"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><br /><sub><b>Patryk Miś</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">🌍</a></td>
<td align="center"><a href="https://code.castopod.org/ddenis"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><br /><sub><b>denis d</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=ddenis" title="Bug reports">🐛</a> <a href="#ideas-ddenis" title="Ideas, Planning, & Feedback">🤔</a></td> <td align="center"><a href="https://code.castopod.org/ddenis"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><br /><sub><b>Bastien Luneteau</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=ddenis" title="Bug reports">💻</a> <a href="#ideas-ddenis" title="Ideas, Planning, & Feedback">🐛</a></td>
</tr> </tr>
<tr> <tr>
<td align="center"><a href="https://code.castopod.org/douglaskastle"><img src="https://secure.gravatar.com/avatar/b7e652ba4b6bcd440afa069e7f7bc9e6?s=80&d=identicon?s=100" width="100px;" alt=""/><br /><sub><b>Douglas Kastle</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=douglaskastle" title="Bug reports">🐛</a> <a href="#ideas-douglaskastle" title="Ideas, Planning, & Feedback">🤔</a></td> <td align="center"><a href="https://code.castopod.org/douglaskastle"><img src="https://secure.gravatar.com/avatar/b7e652ba4b6bcd440afa069e7f7bc9e6?s=80&d=identicon?s=100" width="100px;" alt=""/><br /><sub><b>Bastien Luneteau</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=douglaskastle" title="Bug reports">💻</a> <a href="#ideas-douglaskastle" title="Ideas, Planning, & Feedback">🐛</a></td>
<td align="center"><a href="https://code.castopod.org/cExplorer"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><br /><sub><b>cExplorer</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=cExplorer" title="Bug reports">🐛</a> <a href="https://translate.castopod.org" title="Translation">🌍</a></td> <td align="center"><a href="https://code.castopod.org/cExplorer"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><br /><sub><b>Bastien Luneteau</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=cExplorer" title="Bug reports">💻</a> <a href="https://translate.castopod.org" title="Translation">🐛</a></td>
<td align="center"><a href="https://code.castopod.org/imacrea"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><br /><sub><b>ImaCrea</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=imacrea" title="Bug reports">🐛</a> <a href="#ideas-imacrea" title="Ideas, Planning, & Feedback">🤔</a></td> <td align="center"><a href="https://code.castopod.org/imacrea"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><br /><sub><b>Bastien Luneteau</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=imacrea" title="Bug reports">💻</a> <a href="#ideas-imacrea" title="Ideas, Planning, & Feedback">🐛</a></td>
<td align="center"><a href="https://code.castopod.org/jonas"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><br /><sub><b>Jonas S</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">💻</a></td> <td align="center"><a href="https://code.castopod.org/jonas"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><br /><sub><b>Patryk Miś</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/commits/master" title="Code">🌍</a></td>
<td align="center"><a href="https://code.castopod.org/yannL"><img src="https://secure.gravatar.com/avatar/9c46600ce566ec6d526370d8e104b1c8?s=80&d=identicon?s=100" width="100px;" alt=""/><br /><sub><b>LEFEBVRE Yann</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=yannL" title="Bug reports">🐛</a></td> <td align="center"><a href="https://code.castopod.org/yannL"><img src="https://secure.gravatar.com/avatar/9c46600ce566ec6d526370d8e104b1c8?s=80&d=identicon?s=100" width="100px;" alt=""/><br /><sub><b>Patryk Miś</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=yannL" title="Bug reports">🌍</a></td>
<td align="center"><a href="https://code.castopod.org/spaetz"><img src="https://secure.gravatar.com/avatar/278e1af65e82993efd0ba7bbbacf6435?s=80&d=identicon?s=100" width="100px;" alt=""/><br /><sub><b>Sebastian Späth</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=spaetz" title="Bug reports">🐛</a> <a href="#ideas-spaetz" title="Ideas, Planning, & Feedback">🤔</a></td> <td align="center"><a href="https://code.castopod.org/spaetz"><img src="https://secure.gravatar.com/avatar/278e1af65e82993efd0ba7bbbacf6435?s=80&d=identicon?s=100" width="100px;" alt=""/><br /><sub><b>Bastien Luneteau</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=spaetz" title="Bug reports">💻</a> <a href="#ideas-spaetz" title="Ideas, Planning, & Feedback">🐛</a></td>
<td align="center"><a href="https://code.castopod.org/rocky"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><br /><sub><b>rocky III</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=rocky" title="Bug reports">🐛</a></td> <td align="center"><a href="https://code.castopod.org/rocky"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><br /><sub><b>Patryk Miś</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=rocky" title="Bug reports">🌍</a></td>
</tr> </tr>
<tr> <tr>
<td align="center"><a href="https://code.castopod.org/Regenpfeifer"><img src="https://code.castopod.org/uploads/-/system/user/avatar/103/avatar.png?s=100" width="100px;" alt=""/><br /><sub><b>Hermann Josef Eckl</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=Regenpfeifer" title="Bug reports">🐛</a></td> <td align="center"><a href="https://code.castopod.org/Regenpfeifer"><img src="https://code.castopod.org/uploads/-/system/user/avatar/103/avatar.png?s=100" width="100px;" alt=""/><br /><sub><b>Patryk Miś</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=Regenpfeifer" title="Bug reports">🌍</a></td>
<td align="center"><a href="https://code.castopod.org/cyrilledel"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><br /><sub><b>Delhaye Cyrille</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=cyrilledel" title="Bug reports">🐛</a> <a href="#ideas-cyrilledel" title="Ideas, Planning, & Feedback">🤔</a></td> <td align="center"><a href="https://code.castopod.org/cyrilledel"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><br /><sub><b>Bastien Luneteau</b></sub></a><br /><a href="https://code.castopod.org/adaures/castopod/issues?author_username=cyrilledel" title="Bug reports">💻</a> <a href="#ideas-cyrilledel" title="Ideas, Planning, & Feedback">🐛</a></td>
<td align="center"><a href="https://twitter.com/otetranome"><img src="https://code.castopod.org/uploads/-/system/user/avatar/113/avatar.png?s=100" width="100px;" alt=""/><br /><sub><b>João Leandro</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#ideas-otetranome" title="Ideas, Planning, & Feedback">🤔</a></td> <td align="center"><a href="https://twitter.com/otetranome"><img src="https://code.castopod.org/uploads/-/system/user/avatar/113/avatar.png?s=100" width="100px;" alt=""/><br /><sub><b>Joo Leandro</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#ideas-otetranome" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center"><a href="https://achouvardas.eu/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><br /><sub><b>Angelos Chouvardas</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td> <td align="center"><a href="https://achouvardas.eu/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><br /><sub><b>Patryk Miś</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center"><a href="https://mastodon.fjerland.no/@eivind"><img src="https://mastodon.fjerland.no/system/accounts/avatars/107/769/768/295/192/222/original/e5c985fea6487dcb.jpg?s=100" width="100px;" alt=""/><br /><sub><b>Eivind</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td> <td align="center"><a href="https://mastodon.fjerland.no/@eivind"><img src="https://mastodon.fjerland.no/system/accounts/avatars/107/769/768/295/192/222/original/e5c985fea6487dcb.jpg?s=100" width="100px;" alt=""/><br /><sub><b>Patryk Miś</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center"><a href="https://mastodon.fedi.bzh/@ewen"><img src="https://mastodon.fedi.bzh/system/accounts/avatars/000/000/002/original/6f387690a504ae46.jpg?s=100" width="100px;" alt=""/><br /><sub><b>Ewen</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a> <a href="#ideas-3wen" title="Ideas, Planning, & Feedback">🤔</a></td> <td align="center"><a href="https://mastodon.fedi.bzh/@ewen"><img src="https://mastodon.fedi.bzh/system/accounts/avatars/000/000/002/original/6f387690a504ae46.jpg?s=100" width="100px;" alt=""/><br /><sub><b>Bastien Luneteau</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">💻</a> <a href="#ideas-3wen" title="Ideas, Planning, & Feedback">🐛</a></td>
<td align="center"><a href="https://crowdin.com/profile/forght"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15073833/large/82d1e2e443a6df7edc43a7405dfeeb75_default.png?s=100" width="100px;" alt=""/><br /><sub><b>forght</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td> <td align="center"><a href="https://crowdin.com/profile/forght"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15073833/large/82d1e2e443a6df7edc43a7405dfeeb75_default.png?s=100" width="100px;" alt=""/><br /><sub><b>Patryk Miś</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
</tr> </tr>
<tr> <tr>
<td align="center"><a href="https://crowdin.com/profile/glottis0q"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15209934/large/8b17ef6a7399f0b82a8198f87c224195.png?s=100" width="100px;" alt=""/><br /><sub><b>glottis0q</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td> <td align="center"><a href="https://crowdin.com/profile/glottis0q"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15209934/large/8b17ef6a7399f0b82a8198f87c224195.png?s=100" width="100px;" alt=""/><br /><sub><b>Patryk Miś</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/e18d44b28edd0ada.png?s=100" width="100px;" alt=""/><br /><sub><b>ButterflyOfFire</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td> <td align="center"><a href="https://mstdn.fr/@ButterflyOfFire"><img src="https://static.mstdn.fr/static/accounts/avatars/000/065/901/original/e18d44b28edd0ada.png?s=100" width="100px;" alt=""/><br /><sub><b>Patryk Miś</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center"><a href="https://github.com/lil5"><img src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Lucian I. Last</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td> <td align="center"><a href="https://github.com/lil5"><img src="https://avatars.githubusercontent.com/u/17646836?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Patryk Miś</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center"><a href="https://crowdin.com/profile/luuzviir"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13166188/large/d03ab0abc7ce354b210d836955cd3805_default.png?s=100" width="100px;" alt=""/><br /><sub><b>LuuzViir</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td> <td align="center"><a href="https://crowdin.com/profile/luuzviir"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13166188/large/d03ab0abc7ce354b210d836955cd3805_default.png?s=100" width="100px;" alt=""/><br /><sub><b>Patryk Miś</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center"><a href="https://crowdin.com/profile/cthtc"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15211502/large/ed0651060cb8474a9519b5168bd377c1_default.png?s=100" width="100px;" alt=""/><br /><sub><b>CTHTC</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td> <td align="center"><a href="https://crowdin.com/profile/cthtc"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15211502/large/ed0651060cb8474a9519b5168bd377c1_default.png?s=100" width="100px;" alt=""/><br /><sub><b>Patryk Miś</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center"><a href="https://crowdin.com/profile/retrograde"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15021651/large/b10c4057f85bf4de49c7fdf01354ecde.jpeg?s=100" width="100px;" alt=""/><br /><sub><b>Russian Retro</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td> <td align="center"><a href="https://crowdin.com/profile/retrograde"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15021651/large/b10c4057f85bf4de49c7fdf01354ecde.jpeg?s=100" width="100px;" alt=""/><br /><sub><b>Patryk Miś</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center"><a href="https://crowdin.com/profile/mareklach"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13572324/large/3eeba8d569c247ace33862bf4ef4748f.jpeg?s=100" width="100px;" alt=""/><br /><sub><b>Marek L'ach</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td> <td align="center"><a href="https://crowdin.com/profile/mareklach"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13572324/large/3eeba8d569c247ace33862bf4ef4748f.jpeg?s=100" width="100px;" alt=""/><br /><sub><b>Patryk Miś</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
</tr> </tr>
<tr> <tr>
<td align="center"><a href="https://crowdin.com/profile/gunchleoc"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13043878/large/3223f7b606296a8b1c92c5de39c459a2_default.png?s=100" width="100px;" alt=""/><br /><sub><b>GunChleoc</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td> <td align="center"><a href="https://crowdin.com/profile/gunchleoc"><img src="https://crowdin-static.downloads.crowdin.com/avatar/13043878/large/3223f7b606296a8b1c92c5de39c459a2_default.png?s=100" width="100px;" alt=""/><br /><sub><b>Patryk Miś</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center"><a href="https://crowdin.com/profile/gabisnow"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15214858/large/5b083bdf9c9e9de67cc6ee72a6c8db18_default.png?s=100" width="100px;" alt=""/><br /><sub><b>GabiSnow</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td> <td align="center"><a href="https://crowdin.com/profile/gabisnow"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15214858/large/5b083bdf9c9e9de67cc6ee72a6c8db18_default.png?s=100" width="100px;" alt=""/><br /><sub><b>Patryk Miś</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center"><a href="https://crowdin.com/profile/bendaha"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15331656/large/cd92450d2c20202299fb3a0075903e20_default.png?s=100" width="100px;" alt=""/><br /><sub><b>bendaha</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td> <td align="center"><a href="https://crowdin.com/profile/bendaha"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15331656/large/cd92450d2c20202299fb3a0075903e20_default.png?s=100" width="100px;" alt=""/><br /><sub><b>Patryk Miś</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center"><a href="https://crowdin.com/profile/samuelroland"><img src="https://crowdin-static.downloads.crowdin.com/avatar/14980053/large/3e154a37d03d6e98ae402ed3f930f4f5.png?s=100" width="100px;" alt=""/><br /><sub><b>Samuel Roland</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td> <td align="center"><a href="https://crowdin.com/profile/samuelroland"><img src="https://crowdin-static.downloads.crowdin.com/avatar/14980053/large/3e154a37d03d6e98ae402ed3f930f4f5.png?s=100" width="100px;" alt=""/><br /><sub><b>Patryk Miś</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center"><a href="https://dimitriregnier.net/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><br /><sub><b>Dimitri Regnier</b></sub></a><br /><a href="#ideas-dimregnier" title="Ideas, Planning, & Feedback">🤔</a></td> <td align="center"><a href="https://dimitriregnier.net/"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><br /><sub><b>Patryk Miś</b></sub></a><br /><a href="#ideas-dimregnier" title="Ideas, Planning, & Feedback">🌍</a></td>
<td align="center"><a href="https://im.irithys.com/@thy"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15405614/large/e46d7f8e9f7c05997827563c3a3cf942.jpeg?s=100" width="100px;" alt=""/><br /><sub><b>irithys</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td> <td align="center"><a href="https://im.irithys.com/@thy"><img src="https://crowdin-static.downloads.crowdin.com/avatar/15405614/large/e46d7f8e9f7c05997827563c3a3cf942.jpeg?s=100" width="100px;" alt=""/><br /><sub><b>Patryk Miś</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
<td align="center"><a href="https://twitter.com/caos30"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><br /><sub><b>Sergi</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td> <td align="center"><a href="https://twitter.com/caos30"><img src="https://castopod.org/assets/images/castopod-avatar.jpg?s=100" width="100px;" alt=""/><br /><sub><b>Patryk Miś</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
</tr> </tr>
<tr> <tr>
<td align="center"><a href="https://crowdin.com/profile/xosem"><img src="https://crowdin-static.downloads.crowdin.com/avatar/12617257/large/a201650da44fed28890b0e0d8477a663.jpg?s=100" width="100px;" alt=""/><br /><sub><b>ghose (XoseM)</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td> <td align="center"><a href="https://crowdin.com/profile/xosem"><img src="https://crowdin-static.downloads.crowdin.com/avatar/12617257/large/a201650da44fed28890b0e0d8477a663.jpg?s=100" width="100px;" alt=""/><br /><sub><b>patryk Miś</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
</tr> </tr>
</table> </table>
@ -243,48 +248,47 @@ Thanks goes to these wonderful people
<!-- ALL-CONTRIBUTORS-LIST:END --> <!-- ALL-CONTRIBUTORS-LIST:END -->
This project follows the Detta projekt följer specifikationen
[all-contributors](https://github.com/all-contributors/all-contributors) [för alla bidragsgivare](https://github.com/all-contributors/all-contributors) .
specification. Contributions of any kind welcome! Bidrag av något slag välkomna!
## Contact ## Kontakt
You may reach us for help or ask any question you have on: Du kan nå oss för hjälp eller ställa någon fråga du har på:
- [Discord](https://castopod.org/discord) (for direct interaction with - [Discord](https://castopod.org/discord) (för direkt interaktion med
developers and the community) -utvecklare och gemenskapen)
- [Issue tracker](https://code.castopod.org/adaures/castopod/-/issues) (for - [Ärendespårare](https://code.castopod.org/adaures/castopod/-/issues) (för
feature requests & bug reports) funktionsförfrågningar & felrapporter)
Alternatively, you can follow us on social media platforms to get news about Alternativt kan du följa oss på sociala medier för att få nyheter om Castopod:
Castopod:
- [podlibre.social](https://podlibre.social/@Castopod) (Mastodon instance) - [podlibre.social](https://podlibre.social/@Castopod) (Mastodon instance)
- [Twitter](https://twitter.com/castopod) - [Twitter](https://twitter.com/castopod)
- [LinkedIn](https://linkedin.com/company/castopod) - [LinkedIn](https://linkedin.com/company/castopod)
- [Facebook](https://www.facebook.com/castopod) - [Facebook](https://www.facebook.com/castopod)
## Sponsors ## Sponsorer
The ongoing development of Castopod is made possible with the support of its Den pågående utvecklingen av Castopod möjliggörs med stöd av sina backers. Om du
backers. If you'd like to help, please consider vill hjälpa till, överväg
[sponsoring Castopod's development](https://opencollective.com/castopod/contribute). [sponsra Castopods utveckling](https://opencollective.com/castopod/contribute).
<div class="flex flex-wrap gap-x-16 gap-y-8"> <div class="flex flex-wrap gap-x-16 gap-y-8">
<a href="https://adaures.com/" target="_blank" rel="noopener noreferrer"><img src="/images/sponsors/adaures.svg" alt="Ad Aures Logo" class="h-16" /></a> <a href="https://adaures.com/" target="_blank" rel="noopener noreferrer"><img src="/images/sponsors/adaures.svg" alt="Ad Aures Logo" class="h-16" /></a>
<a href="https://nlnet.nl/project/Castopod/" target="_blank" rel="noopener noreferrer"><img src="/images/sponsors/nlnet.svg" alt="NLnet Logo" class="h-16" /></a> <a href="https://nlnet.nl/project/Castopod/" target="_blank" rel="noopener noreferrer"><img src="/images/sponsors/nlnet.svg" alt="NLnet Logo" class="h-16" /></a>
</div> </div>
## License ## Licens
[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) [GNU Lesser General Public License](https://choosealicense.com/licenses/agpl-3.0/)
Copyright © 2020-present, [Ad Aures](https://adaures.com/). Copyright © 2020-present, [Ad Aures](https://adaures.com/).
https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release
https://img.shields.io/github/license/ad-aures/castopod?color=blue https://img.shields.io/github/license/ad-aures/castopod?color=blå
https://img.shields.io/badge/contributions-welcome-brightgreen.svg https://img.shields. o/badge/contributions-welcome-brightgreen.svg
https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantik--release-e10079.
https://img.shields.io/github/stars/ad-aures/castopod?style=social vg https://img.shields.io/github/stars/ad-aures/castopod?style=sociala
[release]: https://code.castopod.org/adaures/castopod/-/releases [release]: https://code.castopod.org/adaures/castopod/-/releases
[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md [license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md

View File

@ -0,0 +1,87 @@
---
title: 验证 & 授权
sidebarDepth: 3
---
# 验证 & 授权
Castopod 使用 `codeigniter/shield` 处理身份验证和授权 与自定义规则。 角色和权限
在两个级别上定义:
1. [实例范围](#1-instance-wide-roles-and-permissions)
2. [每个播客](#2-per-podcast-roles-and-permissions)
## 1. 实例范围的角色和权限
### 实例角色
<!-- AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section -->
| 角色 | 描述 | 权限 |
| ---------- | ---------------------------- | ------------------------------------------------------------------------------------------ |
| 超级管理员 | 拥有对 Castopod 的完全控制。 | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks |
| 管理 | 管理 Castopod 的内容。 | podcasts.create, podcasts.import, persons.manage, pages.manage |
| 播客 | Castopod 的普通用户。 | admin.access |
<!-- AUTH-INSTANCE-ROLES-LIST:END -->
### 实例权限
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| 权限 | 描述 |
| ----------------------- | ------------------------------------------- |
| admin.access | 可以访问 Castopod 管理区域。 |
| admin.settings | 可以访问 Castopod 设置。 |
| users.manage | 可以管理 Castopod 用户。 |
| persons.manage | 可以管理人员。 |
| pages.manage | 可以管理页面。 |
| podcasts.view | 可以查看所有播客。 |
| podcasts.create | 可以创建新播客。 |
| podcasts.import | 可以导入播客。 |
| fediverse.manage-blocks | 可以阻止联邦宇宙参与者/域与 Castopod 交互。 |
<!-- AUTH-INSTANCE-PERMISSIONS-LIST:END -->
## 2. 每个播客角色与权限
### 每个播客角色
<!-- AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section -->
| 角色 | 描述 | 权限 |
| ------ | ----------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 管理员 | 完全控制播客 #{id}。 | \* |
| 编辑 | 管理播客 #{id} 的内容和出版物。 | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments, episodes.manage-notifications |
| 作者 | 管理播客 #{id} 的内容,但不能发布。 | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips |
| 访客 | 播客 #{id} 的普通贡献者。 | view, episodes.view |
<!-- AUTH-PODCAST-ROLES-LIST:END -->
### 每个播客权限
<!-- AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section -->
| 权限 | 描述 |
| ---------------------------- | --------------------------------------------------- |
| view | 可以查看播客 #{id} 的仪表板和分析。 |
| edit | 可以编辑播客 #{id}。 |
| 删除 | 可以删除播客 #{id}。 |
| manage-import | 可以同步导入的播客 #{id}。 |
| manage-persons | 可以管理播客 #{id} 的订阅。 |
| manage-subscriptions | 可以管理播客 #{id} 的订阅。 |
| manage-contributors | 可以管理播客 #{id} 的贡献者。 |
| manage-platforms | 可以设置/删除播客 #{id} 的平台链接。 |
| manage-publications | 可以发布播客 #{id}。 |
| manage-notifications | 可以查看播客 #{id} 的通知并将其标记为已读。 |
| interact-as | 可以在播客 #{id} 进行互动,以收藏、分享或回复帖子。 |
| episodes.view | 可以查看播客 #{id} 的仪表板和分析。 |
| episodes.create | 可以为播客 #{id} 创建剧集。 |
| episodes.edit | 可以编辑播客 #{id}。 |
| episodes.delete | 可以删除播客 #{id}。 |
| episodes.manage-persons | 可以管理播客 #{id} 的订阅。 |
| episodes.manage-clips | 可以管理播客 #{id} 的视频剪辑或声音片段。 |
| episodes.manage-publications | 可以发布播客 #{id}。 |
| episodes.manage-comments | 可以创建/删除播客 #{id} 的剧集评论。 |
<!-- AUTH-PODCAST-PERMISSIONS-LIST:END -->

View File

@ -5,12 +5,14 @@ sidebarDepth: 3
# 官方 Docker 镜像 # 官方 Docker 镜像
Castopod 在 Docker Hub 自动构建 程序中将 Docker 镜像推送至 Docker Hub Castopod 在其自动构建期间会将 3 个 Docker 映像推送到 Docker Hub
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app):应用程序包,包含 - [**`castopod/app`**](https://hub.docker.com/r/castopod/app):应用程序包,包含
所有 Castopod 依赖关系 所有 Castopod 依赖关系
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server)Castopod - [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server)Castopod
的 Nginx 配置 的 Nginx 配置
- [**`castopod/video-clipper`** ](https://hub.docker.com/r/castopod/video-clipper)
感谢 ffmpeg 提供可选图像构建视频剪辑
此外Castopod 需要一个与 MySQL 兼容的数据库。 Redis 数据库 可以添加为缓存处理器 此外Castopod 需要一个与 MySQL 兼容的数据库。 Redis 数据库 可以添加为缓存处理器
@ -20,6 +22,8 @@ Castopod 在 Docker Hub 自动构建 程序中将 Docker 镜像推送至 Docker
- `develop` [unstable], 最新开发分支版本 - `develop` [unstable], 最新开发分支版本
- `beta` [stable],最新的 beta 版本构建 - `beta` [stable],最新的 beta 版本构建
- `1.0.0-beta.x` [stable],特定 beta 版本构建 (自 `1.0.0-beta.22` 起) - `1.0.0-beta.x` [stable],特定 beta 版本构建 (自 `1.0.0-beta.22` 起)
- `latest` [stable],最新版本构建
- `1.x.x` [stable],特定版本构建(自 `1.0.0` 起)
## 用法示例: ## 用法示例:
@ -32,7 +36,7 @@ Castopod 在 Docker Hub 自动构建 程序中将 Docker 镜像推送至 Docker
services: services:
app: app:
image: castopod/app:beta image: castopod/app:latest
container_name: "castopod-app" container_name: "castopod-app"
volumes: volumes:
- castopod-media:/opt/castopod/public/media - castopod-media:/opt/castopod/public/media
@ -50,7 +54,7 @@ Castopod 在 Docker Hub 自动构建 程序中将 Docker 镜像推送至 Docker
restart: unless-stopped restart: unless-stopped
web-server: web-server:
image: castopod/web-server:beta image: castopod/web-server:latest
container_name: "castopod-web-server" container_name: "castopod-web-server"
volumes: volumes:
- castopod-media:/var/www/html/media - castopod-media:/var/www/html/media
@ -82,6 +86,21 @@ Castopod 在 Docker Hub 自动构建 程序中将 Docker 镜像推送至 Docker
networks: networks:
- castopod-app - castopod-app
# this container is optional
# add this if you want to use the videoclips feature
ffmpeg:
image: castopod/video-clipper:latest
container_name: "castopod-video-clipper"
volumes:
- castopod-media:/opt/castopod/public/media
environment:
MYSQL_DATABASE: castopod
MYSQL_USER: castopod
MYSQL_PASSWORD: changeme
networks:
- castopod-db
restart: unless-stopped
volumes: volumes:
castopod-media: castopod-media:
castopod-db: castopod-db:
@ -92,7 +111,7 @@ Castopod 在 Docker Hub 自动构建 程序中将 Docker 镜像推送至 Docker
castopod-db: castopod-db:
``` ```
你还需要调整一些变量。(例如:`CP_BASEURL` `MYSQL_ROOT_PASSWORD` 你还需要调整一些变量。 (例如:`CP_BASEURL` `MYSQL_ROOT_PASSWORD`
`MYSQL_PASSSWORD``CP_ANALYTICS_SALT` `MYSQL_PASSSWORD``CP_ANALYTICS_SALT`
3. 设置 TLS 反向代理 (SSL/HTTPS) 3. 设置 TLS 反向代理 (SSL/HTTPS)
@ -114,9 +133,19 @@ Castopod 在 Docker Hub 自动构建 程序中将 Docker 镜像推送至 Docker
## 环境变量 ## 环境变量
- **castopod/video-clipper**
| 变量名称 | 类型 (`默认值`) | Default |
| -------------------------- | --------------- | ---------------- |
| **`CP_DATABASE_HOSTNAME`** | ?string | `"mariadb"` |
| **`CP_DATABASE_NAME`** | ?string | `MYSQL_DATABASE` |
| **`CP_DATABASE_USERNAME`** | ?string | `MYSQL_USER` |
| **`CP_DATABASE_PASSWORD`** | ?string | `MYSQL_PASSWORD` |
| **`CP_DATABASE_PREFIX`** | ?string | `"cp_"` |
- **castopod/app** - **castopod/app**
| 变量名称 | 类型 (`默认值`) | Default | | 变量名称 | 类型 (`default`) | Default |
| ---------------------------- | ----------------------- | ---------------- | | ---------------------------- | ----------------------- | ---------------- |
| **`CP_BASEURL`** | string | `undefined` | | **`CP_BASEURL`** | string | `undefined` |
| **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` |
@ -142,6 +171,6 @@ Castopod 在 Docker Hub 自动构建 程序中将 Docker 镜像推送至 Docker
- **castopod/web-server** - **castopod/web-server**
| 变量名称 | Type | Default | | 变量名称 | Type | 默认 |
| --------------------- | ------- | ------- | | --------------------- | ------- | ------- |
| **`CP_APP_HOSTNAME`** | ?string | `"app"` | | **`CP_APP_HOSTNAME`** | ?string | `"app"` |

View File

@ -132,6 +132,8 @@ Castopod 仅适用于受支持的 MySQL 5.7 或更高版本的兼容数据库。
```ini ```ini
# […] # […]
# […]
email.fromEmail="你的邮件地址" email.fromEmail="你的邮件地址"
email.SMTPHost="你的邮件主机" email.SMTPHost="你的邮件主机"
email.SMTPUser="你的邮件用户名" email.SMTPUser="你的邮件用户名"

View File

@ -8,62 +8,57 @@ sidebarDepth: 3
安装 Castopod 后,你可能希望将实例更新到最新版本 版本以享受最新功能 ✨, 修复错误 安装 Castopod 后,你可能希望将实例更新到最新版本 版本以享受最新功能 ✨, 修复错误
🐛 和性能提升 ⚡。 🐛 和性能提升 ⚡。
## Update instructions ## 更新说明
0. ⚠️ Before any update, we highly recommend you backup your Castopod files and 0. ⚠️ 在更新之前,我们强烈建议你备份 Castopod 文件和数据库。
database.
- cf. - 参看. [我应该在更新前进行备份吗?](#should-i-make-a-backup-before-updating)
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
1. Go to the 1. 前往 [发布页面](https://code.castopod.org/adaures/castopod/-/releases) 和 查
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and 看您的实例是否是最新的 Castopod 版本
see if your instance is up to date with the latest Castopod version
- cf. - 参看
[Where can I find my Castopod version?](#where-can-i-find-my-castopod-version) [我在哪里可以找到我的 Castopod 版本?](#where-can-i-find-my-castopod-version)
2. Download the latest release package named `Castopod Package`, you may choose 2. 下载名为`Castopod Package`的最新发布包,你可以在 `zip``tar.gz` 压缩包之间
between the `zip` or `tar.gz` archives 选择
- ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code - ⚠️ 请确保你下载的是 Castopod 软件包而 **不是** 源代码
- Note that you can also download the latest package from - 请注意,你还可以从 [castopod.org](https://castopod.org/)
[castopod.org](https://castopod.org/)
3. On your server: 3. 在你的服务器上:
- Remove all files except `.env` and `public/media` - 删除除 `.env` 文件和 `public/media` 目录之外的所有文件
- Copy the new files from the downloaded package into your server - 将下载软件包中的新文件复制到你的服务器中
::: info Note ::: 注意
You may need to reset files permissions as during the install process. You may need to reset files permissions as during the install process.
Check [Security Concerns](./security.md). Check [Security Concerns](./security.md). 检查 [安全问题](./security.md)。
::: :::
4. Update your database schema from your `Castopod Admin` > `About` page or by 4. 从你的 `后台管理` > 更新你的数据库架构 `关于` 页或开始:
running:
```bash ```bash
php spark castopod:database-update php spark castopod:database-update
``` ```
5. Clear your cache from your `Castopod Admin` > `Settings` > `general` > 5. 从 `Castopod 管理页面` > `设置` > `通常` > `维护` 清理你的缓存
`Housekeeping` 6. ✨ 享受你的新实例, 你已经更新完毕!
6. ✨ Enjoy your fresh instance, you're all done!
::: info Note ::: 注意
Releases may come with additional update instructions (see 新版本可能有额外的更新说明(请参阅
[releases page](https://code.castopod.org/adaures/castopod/-/releases)). [发布页面](https://code.castopod.org/adaures/castopod/-/releases))。
- cf. - cf.
[I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) [I haven't updated my instance in a long time… What should I do?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do)
我该怎么办?</a>
::: :::
## Fully Automated updates ## 全自动更新
> 即将到来... 👀 > 即将到来... 👀
@ -71,22 +66,19 @@ Releases may come with additional update instructions (see
### 在哪里可以找到我的 Castopod 版本号? ### 在哪里可以找到我的 Castopod 版本号?
Go to your Castopod admin panel, the version is displayed on the bottom left 跳转到你的 Castopod 管理面板,版本号显示在左下角。
corner.
Alternatively, you can find the version in the `app > Config > Constants.php` 或者,你可以在 `应用程序 > 配置 > Constants.php` 文件中找到版本号。
file.
### 我很长时间没有更新我的实例… 我该怎么办? ### 我很长时间没有更新我的实例… 我该怎么办? 我该怎么办?
No problem! Just get the latest release as described above. Only, when going 没问题! 只需如上所述获取最新版本。 No problem! Just get the latest release as
through the release instructions (4), perform them sequentially, from the oldest described above. Only, when going through the release instructions (4), perform
to the newest. them sequentially, from the oldest to the newest.
> 你可能想要备份你的实例,这取决于您多久没有更新过 Castopod 。 > 你可能想要备份你的实例,这取决于您多久没有更新过 Castopod 。
For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to 例如,如果你在 `v1.0.0-alpha.42` 并想要升级到 `v1.0.0-beta.1`
`v1.0.0-beta.1`:
0. (强烈推荐) 备份你的文件和数据库。 0. (强烈推荐) 备份你的文件和数据库。
@ -99,7 +91,6 @@ For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to
### 我是否应该在更新前备份? ### 我是否应该在更新前备份?
We advise you do, so you don't lose everything if anything goes wrong! 我们建议你这样做,这样就不会在出现任何问题时丢失数据!
More generally, we advise you make regular backups of your Castopod files and 更笼统地说,我们建议你定期备份您的 Castopod 文件和数据库,防止丢失所有内容……
database to prevent you from losing it all…

View File

@ -133,7 +133,8 @@ Funkwhale 最初是围绕音乐制作的。 后来,随着项目的发展,引
## 贡献 ## 贡献
喜欢 Castopod 并且想帮忙吗? 请查看以下文档以帮助你入门。 喜欢 Castopod 并且想帮忙吗? 请查看以下文档以帮助你入门。 请查看以下文档以帮助你
入门。
### 行为准则 ### 行为准则
@ -143,8 +144,8 @@ Castopod 已经通过了一项行为准则,并希望所有的参与者都能
### 贡献指南 ### 贡献指南
阅读我们的 [贡献指南](./contributing/guidelines.md) ,了解我们的开发过程。提出 阅读我们的 [贡献指南](./contributing/guidelines.md) ,了解我们的开发过程。 提出
误修正和改进想法,以及如何构建和测试 Castopod 。 误修正和改进想法,以及如何构建和测试 Castopod 。
## 贡献者 ✨ ## 贡献者 ✨
@ -251,7 +252,8 @@ Castopod 的发展离不开赞助商的支持。 如果你想要帮助我们,
[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) [GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/)
Copyright © 2020-present, [Ad Aures](https://adaures.com/). Copyright © 2020-present, [Ad Aures](https://adaures.com/). Copyright ©
2020-present, [Ad Aures](https://adaures.com/).
https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release
https://img.shields.io/github/license/ad-aures/castopod?color=blue https://img.shields.io/github/license/ad-aures/castopod?color=blue
https://img.shields.io/badge/contributions-welcome-brightgreen.svg https://img.shields.io/badge/contributions-welcome-brightgreen.svg

View File

@ -9,14 +9,14 @@ declare(strict_types=1);
*/ */
return [ return [
'title' => 'About Castopod', 'title' => 'Über Castopod',
'host_name' => 'Host name', 'host_name' => 'Hostname',
'version' => 'Castopod version', 'version' => 'Castopod Version',
'php_version' => 'PHP version', 'php_version' => 'PHP Version',
'os' => 'Operating System', 'os' => 'Betriebssystem',
'languages' => 'Languages', 'languages' => 'Sprachen',
'update_database' => 'Update database', 'update_database' => 'Datenbank aktualisieren',
'messages' => [ 'messages' => [
'databaseUpdateSuccess' => 'Database is up to date!', 'databaseUpdateSuccess' => 'Die Datenbank ist aktuell!',
], ],
]; ];

View File

@ -14,22 +14,22 @@ return [
->gateway => 'Startseite', ->gateway => 'Startseite',
'podcasts' => 'Podcasts', 'podcasts' => 'Podcasts',
'episodes' => 'Folgen', 'episodes' => 'Folgen',
'subscriptions' => 'subscriptions', 'subscriptions' => 'Abonnements',
'contributors' => 'Administratoren', 'contributors' => 'Administratoren',
'pages' => 'Seiten', 'pages' => 'Seiten',
'settings' => 'Einstellungen', 'settings' => 'Einstellungen',
'theme' => 'Erscheinungsbild', 'theme' => 'Erscheinungsbild',
'about' => 'about', 'about' => 'Über',
'add' => 'hinzufügen', 'add' => 'hinzufügen',
'new' => 'neu', 'new' => 'neu',
'edit' => 'bearbeiten', 'edit' => 'bearbeiten',
'persons' => 'Mitwirkende', 'persons' => 'Mitwirkende',
'publish' => 'veröffentlichen', 'publish' => 'veröffentlichen',
'publish-edit' => 'Veröffentlichung bearbeiten', 'publish-edit' => 'Veröffentlichung bearbeiten',
'publish-date-edit' => 'edit publication date', 'publish-date-edit' => 'Veröffentlichungsdatum bearbeiten',
'unpublish' => 'Veröffentlichung aufheben', 'unpublish' => 'Veröffentlichung aufheben',
'delete' => 'löschen', 'delete' => 'löschen',
'remove' => 'remove', 'remove' => 'Entfernen',
'fediverse' => 'Fediversum', 'fediverse' => 'Fediversum',
'block-lists' => 'Sperrlisten', 'block-lists' => 'Sperrlisten',
'users' => 'Benutzer', 'users' => 'Benutzer',
@ -49,6 +49,6 @@ return [
'soundbites' => 'Tonschnipsel', 'soundbites' => 'Tonschnipsel',
'video-clips' => 'Videoclips', 'video-clips' => 'Videoclips',
'embed' => 'einbettbarer Spieler', 'embed' => 'einbettbarer Spieler',
'notifications' => 'notifications', 'notifications' => 'Benachrichtigungen',
'suspend' => 'suspend', 'suspend' => 'Unterbrechen',
]; ];

View File

@ -35,6 +35,6 @@ return [
'by_weekday' => 'Nach Wochentag (für die letzten 60 Tage)', 'by_weekday' => 'Nach Wochentag (für die letzten 60 Tage)',
'by_hour' => 'Nach Tageszeit (für die letzten 60 Tage)', 'by_hour' => 'Nach Tageszeit (für die letzten 60 Tage)',
'podcast_by_bandwidth' => 'Täglich genutzte Bandbreite (in MB)', 'podcast_by_bandwidth' => 'Täglich genutzte Bandbreite (in MB)',
'total_storage_by_month' => 'Monthly storage (in MB)', 'total_storage_by_month' => 'Monatlicher Speicher (in MB)',
'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)', 'total_bandwidth_by_month' => 'Monatlich genutzte Bandbreite (in MB)',
]; ];

View File

@ -9,20 +9,20 @@ declare(strict_types=1);
*/ */
return [ return [
'home' => 'Admin dashboard', 'home' => 'Admin-Dashboard',
'welcome_message' => 'Welcome to the admin area!', 'welcome_message' => 'Willkommen im Administrationsbereich!',
'podcasts' => [ 'podcasts' => [
'title' => 'Podcasts', 'title' => 'Podcasts',
'not_found' => 'No published podcast', 'not_found' => 'Kein veröffentlichter Podcast',
'last_published' => 'Last published on {lastPublicationDate}', 'last_published' => 'Zuletzt veröffentlicht am {lastPublicationDate}',
], ],
'episodes' => [ 'episodes' => [
'title' => 'Episodes', 'title' => 'Episoden',
'not_found' => 'No published episode', 'not_found' => 'Keine veröffentlichte Episode',
'last_published' => 'Last published on {lastPublicationDate}', 'last_published' => 'Zuletzt veröffentlicht am {lastPublicationDate}',
], ],
'storage' => [ 'storage' => [
'title' => 'Storage', 'title' => 'Speicher',
'subtitle' => '{totalUploaded} out of {totalStorage}', 'subtitle' => '{totalUploaded} von {totalStorage}',
], ],
]; ];

View File

@ -24,25 +24,25 @@ return [
'edit' => 'Bearbeiten', 'edit' => 'Bearbeiten',
'publish' => 'Veröffentllichen', 'publish' => 'Veröffentllichen',
'publish_edit' => 'Veröffentlichung bearbeiten', 'publish_edit' => 'Veröffentlichung bearbeiten',
'publish_date_edit' => 'Edit publication date', 'publish_date_edit' => 'Veröffentlichungsdatum bearbeiten',
'unpublish' => 'Veröffentlichung zurücknehmen', 'unpublish' => 'Veröffentlichung zurücknehmen',
'publish_error' => 'Folge ist bereits veröffentlicht.', 'publish_error' => 'Folge ist bereits veröffentlicht.',
'publish_edit_error' => 'Folge ist bereits veröffentlicht.', 'publish_edit_error' => 'Folge ist bereits veröffentlicht.',
'publish_cancel_error' => 'Folge ist bereits veröffentlicht.', 'publish_cancel_error' => 'Folge ist bereits veröffentlicht.',
'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.', 'publish_date_edit_error' => 'Die Folge wurde noch nicht veröffentlicht, Sie können das Veröffentlichungsdatum nicht bearbeiten.',
'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.', 'publish_date_edit_future_error' => 'Das Veröffentlichungsdatum der Folge kann nur auf ein vergangenes Datum gesetzt werden! Wenn Sie es neu planen möchten, heben Sie die Veröffentlichung zuerst auf.',
'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!', 'publish_date_edit_success' => 'Das Veröffentlichungsdatum der Folge wurde erfolgreich aktualisiert!',
'unpublish_error' => 'Folge ist nicht veröffentlicht.', 'unpublish_error' => 'Folge ist nicht veröffentlicht.',
'delete' => 'Löschen', 'delete' => 'Löschen',
'go_to_page' => 'Gehe zu Seite', 'go_to_page' => 'Gehe zu Seite',
'create' => 'Folge hinzufügen', 'create' => 'Folge hinzufügen',
'publication_status' => [ 'publication_status' => [
'published' => 'Veröffentlicht', 'published' => 'Veröffentlicht',
'with_podcast' => 'Published', 'with_podcast' => 'Veröffentlicht',
'scheduled' => 'Geplant', 'scheduled' => 'Geplant',
'not_published' => 'Nicht veröffentlicht', 'not_published' => 'Nicht veröffentlicht',
], ],
'with_podcast_hint' => 'To be published at the same time as the podcast', 'with_podcast_hint' => 'Wird zeitgleich mit dem Podcast veröffentlicht',
'list' => [ 'list' => [
'search' => [ 'search' => [
'placeholder' => 'Suche nach einer Episode', 'placeholder' => 'Suche nach einer Episode',
@ -50,8 +50,8 @@ return [
'submit' => 'Suche', 'submit' => 'Suche',
], ],
'number_of_episodes' => '{numberOfEpisodes, plural, 'number_of_episodes' => '{numberOfEpisodes, plural,
one {# episode} one {# Folge}
other {# episodes} other {# Folgen}
}', }',
'episode' => 'Folge', 'episode' => 'Folge',
'visibility' => 'Sichtweite', 'visibility' => 'Sichtweite',
@ -62,14 +62,14 @@ return [
'createSuccess' => 'Folge wurde erfolgreich erstellt!', 'createSuccess' => 'Folge wurde erfolgreich erstellt!',
'editSuccess' => 'Folge wurde erfolgreich aktualisiert!', 'editSuccess' => 'Folge wurde erfolgreich aktualisiert!',
'publishSuccess' => '{publication_status, select, 'publishSuccess' => '{publication_status, select,
published {Episode successfully published!} published {Folge erfolgreich veröffentlicht!}
scheduled {Episode publication successfully scheduled!} scheduled {Veröffentlichung der Folge erfolgreich geplant!}
with_podcast {This episode will be published at the same time as the podcast.} with_podcast {Diese Folge wird zeitgleich mit dem Podcast veröffentlicht.}
other {This episode is not published.} other {Diese Folge ist nicht veröffentlicht.}
}', }',
'publishCancelSuccess' => 'Veröffentlichung der Episode erfolgreich abgebrochen!', 'publishCancelSuccess' => 'Veröffentlichung der Episode erfolgreich abgebrochen!',
'unpublishBeforeDeleteTip' => 'Du musst die Episode zurückziehen, bevor du sie löschst.', 'unpublishBeforeDeleteTip' => 'Du musst die Episode zurückziehen, bevor du sie löschst.',
'scheduleDateError' => 'Schedule date must be set!', 'scheduleDateError' => 'Veröffentlichungsdatum muss gesetzt sein!',
'deletePublishedEpisodeError' => 'Bitte ziehe die Episode zurück, bevor du sie löschst.', 'deletePublishedEpisodeError' => 'Bitte ziehe die Episode zurück, bevor du sie löschst.',
'deleteSuccess' => 'Folge erfolgreich gelöscht!', 'deleteSuccess' => 'Folge erfolgreich gelöscht!',
'deleteError' => 'Failed to delete episode {type, select, 'deleteError' => 'Failed to delete episode {type, select,
@ -79,13 +79,13 @@ return [
audio {audio} audio {audio}
other {media} other {media}
}.', }.',
'deleteFileError' => 'Failed to delete {type, select, 'deleteFileError' => 'Fehler beim Löschen der {type, select,
transcript {transcript} transcript {Abschrift}
chapters {chapters} chapters {Kapitel}
image {cover} image {Cover}
audio {audio} audio {Audio}
other {media} other {Medien}
} file {file_path}. You may manually remove it from your disk.', }-Datei {file_path}. Sie können es manuell von der Festplatte entfernen.',
'sameSlugError' => 'Eine Folge mit dem ausgewählten Slug existiert bereits.', 'sameSlugError' => 'Eine Folge mit dem ausgewählten Slug existiert bereits.',
], ],
'form' => [ 'form' => [
@ -97,7 +97,7 @@ return [
'cover' => 'Episoden-Cover', 'cover' => 'Episoden-Cover',
'cover_hint' => 'cover_hint' =>
'Wenn Du kein Cover festlegst, wird stattdessen das Podcast-Cover verwendet.', 'Wenn Du kein Cover festlegst, wird stattdessen das Podcast-Cover verwendet.',
'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', 'cover_size_hint' => 'Das Cover muss quadratisch und mindestens 1400px breit und hoch sein.',
'title' => 'Titel', 'title' => 'Titel',
'title_hint' => 'title_hint' =>
'Nutze einen klaren und einprägsamen Episodennamen. Gib hier nicht die Episoden- oder Staffelnummern an.', 'Nutze einen klaren und einprägsamen Episodennamen. Gib hier nicht die Episoden- oder Staffelnummern an.',
@ -169,7 +169,7 @@ return [
'publication_method' => [ 'publication_method' => [
'now' => 'Jetzt', 'now' => 'Jetzt',
'schedule' => 'Zeitplan', 'schedule' => 'Zeitplan',
'with_podcast' => 'Publish alongside podcast', 'with_podcast' => 'Zusammen mit dem Podcast veröffentlichen',
], ],
'scheduled_publication_date' => 'Geplantes Veröffentlichungsdatum', 'scheduled_publication_date' => 'Geplantes Veröffentlichungsdatum',
'scheduled_publication_date_clear' => 'Veröffentlichungsdatum löschen', 'scheduled_publication_date_clear' => 'Veröffentlichungsdatum löschen',
@ -183,9 +183,9 @@ return [
'message_warning_submit' => 'Trotzdem veröffentlichen', 'message_warning_submit' => 'Trotzdem veröffentlichen',
], ],
'publish_date_edit_form' => [ 'publish_date_edit_form' => [
'new_publication_date' => 'New publication date', 'new_publication_date' => 'Neues Veröffentlichungsdatum',
'new_publication_date_hint' => 'Must be set to a past date.', 'new_publication_date_hint' => 'Muss auf ein vergangenes Datum gesetzt werden.',
'submit' => 'Edit publication date', 'submit' => 'Veröffentlichungsdatum bearbeiten',
], ],
'unpublish_form' => [ 'unpublish_form' => [
'disclaimer' => 'disclaimer' =>
@ -197,7 +197,7 @@ return [
'disclaimer' => 'disclaimer' =>
"Deleting the episode will delete all media files, comments, video clips and soundbites associated with it.", "Deleting the episode will delete all media files, comments, video clips and soundbites associated with it.",
'understand' => 'Ich verstehe, ich möchte die Folge löschen', 'understand' => 'Ich verstehe, ich möchte die Folge löschen',
'submit' => 'Delete', 'submit' => 'Löschen',
], ],
'embed' => [ 'embed' => [
'title' => 'Einbettbarer Spieler', 'title' => 'Einbettbarer Spieler',

View File

@ -33,7 +33,7 @@ return [
'settings' => 'Einstellungen', 'settings' => 'Einstellungen',
'settings-general' => 'Allgemein', 'settings-general' => 'Allgemein',
'settings-theme' => 'Erscheinungsbild', 'settings-theme' => 'Erscheinungsbild',
'about' => 'About', 'about' => 'Über',
'account' => [ 'account' => [
'my-account' => 'Mein Konto', 'my-account' => 'Mein Konto',
'change-password' => 'Passwort ändern', 'change-password' => 'Passwort ändern',

View File

@ -9,11 +9,11 @@ declare(strict_types=1);
*/ */
return [ return [
'title' => 'Notifications', 'title' => 'Benachrichtigungen',
'reply' => '{actor_username} replied to your post', 'reply' => '{actor_username} hat auf Ihren Beitrag geantwortet',
'favourite' => '{actor_username} favourited your post', 'favourite' => '{actor_username} hat Ihren Beitrag favorisiert',
'reblog' => '{actor_username} shared your post', 'reblog' => '{actor_username} hat Ihren Beitrag geteilt',
'follow' => '{actor_username} started following you', 'follow' => '{actor_username} folgt Ihnen jetzt',
'no_notifications' => 'No notifications', 'no_notifications' => 'Keine Benachrichtigungen',
'mark_all_as_read' => 'Mark all as read', 'mark_all_as_read' => 'Alle als gelesen markieren',
]; ];

View File

@ -24,7 +24,7 @@ return [
'form' => [ 'form' => [
'avatar' => 'Profilbild', 'avatar' => 'Profilbild',
'avatar_size_hint' => 'avatar_size_hint' =>
'Avatar must be squared and at least 400px wide and tall.', 'Das Profilbild muss quadratisch und mindestens 400px breit und hoch sein.',
'full_name' => 'Vollständiger Name', 'full_name' => 'Vollständiger Name',
'full_name_hint' => 'Dies ist der vollständige Name oder der Alias der Person.', 'full_name_hint' => 'Dies ist der vollständige Name oder der Alias der Person.',
'unique_name' => 'Eindeutiger Name', 'unique_name' => 'Eindeutiger Name',

View File

@ -16,7 +16,7 @@ return [
'new_episode' => 'Neue Folge', 'new_episode' => 'Neue Folge',
'view' => 'Podcast ansehen', 'view' => 'Podcast ansehen',
'edit' => 'Podcast bearbeiten', 'edit' => 'Podcast bearbeiten',
'publish' => 'Publish podcast', 'publish' => 'Podcast veröffentlichen',
'publish_edit' => 'Edit publication', 'publish_edit' => 'Edit publication',
'delete' => 'Podcast löschen', 'delete' => 'Podcast löschen',
'see_episodes' => 'Episoden ansehen', 'see_episodes' => 'Episoden ansehen',
@ -24,12 +24,12 @@ return [
'go_to_page' => 'Gehe zur Seite', 'go_to_page' => 'Gehe zur Seite',
'latest_episodes' => 'Neueste Folgen', 'latest_episodes' => 'Neueste Folgen',
'see_all_episodes' => 'Alle Folgen anzeigen', 'see_all_episodes' => 'Alle Folgen anzeigen',
'draft' => 'Draft', 'draft' => 'Entwurf',
'messages' => [ 'messages' => [
'createSuccess' => 'Podcast successfully created!', 'createSuccess' => 'Podcast erfolgreich erstellt!',
'editSuccess' => 'Der Podcast wurde erfolgreich aktualisiert!', 'editSuccess' => 'Der Podcast wurde erfolgreich aktualisiert!',
'importSuccess' => 'Der Podcast wurde erfolgreich importiert!', 'importSuccess' => 'Der Podcast wurde erfolgreich importiert!',
'deleteSuccess' => 'Podcast @{podcast_handle} successfully deleted!', 'deleteSuccess' => 'Podcast @{podcast_handle} erfolgreich gelöscht!',
'deletePodcastMediaError' => 'Failed to delete podcast {type, select, 'deletePodcastMediaError' => 'Failed to delete podcast {type, select,
cover {cover} cover {cover}
banner {banner} banner {banner}
@ -47,18 +47,18 @@ return [
one {# episode was} one {# episode was}
other {# episodes were} other {# episodes were}
} added to the podcast!', } added to the podcast!',
'podcastFeedUpToDate' => 'Podcast is already up to date.', 'podcastFeedUpToDate' => 'Der Podcast ist bereits auf dem neuesten Stand.',
'podcastNotImported' => 'Podcast could not be updated as it was not imported.', 'podcastNotImported' => 'Podcast could not be updated as it was not imported.',
'publishError' => 'This podcast is either already published or scheduled for publication.', 'publishError' => 'This podcast is either already published or scheduled for publication.',
'publishEditError' => 'This podcast is not scheduled for publication.', 'publishEditError' => 'This podcast is not scheduled for publication.',
'publishCancelSuccess' => 'Podcast publication successfully cancelled!', 'publishCancelSuccess' => 'Podcast publication successfully cancelled!',
'scheduleDateError' => 'Schedule date must be set!', 'scheduleDateError' => 'Veröffentlichungsdatum muss gesetzt sein!',
], ],
'form' => [ 'form' => [
'identity_section_title' => 'Podcast-Identität', 'identity_section_title' => 'Podcast-Identität',
'identity_section_subtitle' => 'Diese Felder erlauben es dir, Aufmerksamkeit zu bekommen.', 'identity_section_subtitle' => 'Diese Felder erlauben es dir, Aufmerksamkeit zu bekommen.',
'cover' => 'Podcast-Cover', 'cover' => 'Podcast-Cover',
'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', 'cover_size_hint' => 'Das Cover muss quadratisch und mindestens 1400px breit und hoch sein.',
'banner' => 'Podcast-Banner', 'banner' => 'Podcast-Banner',
'banner_size_hint' => 'Banner must have a 3:1 ratio and be at least 1500px wide.', 'banner_size_hint' => 'Banner must have a 3:1 ratio and be at least 1500px wide.',
'banner_delete' => 'Podcast-Banner löschen', 'banner_delete' => 'Podcast-Banner löschen',
@ -120,8 +120,8 @@ return [
'custom_rss_hint' => 'Dies wird innerhalb des ❬channel❭ Tags eingefügt.', 'custom_rss_hint' => 'Dies wird innerhalb des ❬channel❭ Tags eingefügt.',
'new_feed_url' => 'Neue Feed-URL', 'new_feed_url' => 'Neue Feed-URL',
'new_feed_url_hint' => 'Benutzen Sie dieses Feld, wenn Sie zu einer anderen Domain oder Podcast-Plattform wechseln. Standardmäßig wird der Wert auf die aktuelle RSS URL gesetzt, wenn der Podcast importiert wird.', 'new_feed_url_hint' => 'Benutzen Sie dieses Feld, wenn Sie zu einer anderen Domain oder Podcast-Plattform wechseln. Standardmäßig wird der Wert auf die aktuelle RSS URL gesetzt, wenn der Podcast importiert wird.',
'old_feed_url' => 'Old feed URL', 'old_feed_url' => 'Alte Feed-URL',
'update_feed' => 'Update feed', 'update_feed' => 'Feed aktualisieren',
'update_feed_tip' => 'Import this podcast\'s latest episodes', 'update_feed_tip' => 'Import this podcast\'s latest episodes',
'partnership' => 'Partnerschaft:en', 'partnership' => 'Partnerschaft:en',
'partner_id' => 'ID', 'partner_id' => 'ID',
@ -259,12 +259,12 @@ return [
'post' => 'Your announcement post', 'post' => 'Your announcement post',
'post_hint' => 'post_hint' =>
"Write a message to announce the publication of your podcast. The message will be featured in your podcast's homepage.", "Write a message to announce the publication of your podcast. The message will be featured in your podcast's homepage.",
'message_placeholder' => 'Write your message…', 'message_placeholder' => 'Schreiben Sie Ihre Nachricht…',
'submit' => 'Publish', 'submit' => 'Veröffentlichen',
'publication_date' => 'Publication date', 'publication_date' => 'Publication date',
'publication_method' => [ 'publication_method' => [
'now' => 'Now', 'now' => 'Jetzt',
'schedule' => 'Schedule', 'schedule' => 'Planen',
], ],
'scheduled_publication_date' => 'Scheduled publication date', 'scheduled_publication_date' => 'Scheduled publication date',
'scheduled_publication_date_hint' => 'scheduled_publication_date_hint' =>
@ -273,18 +273,18 @@ return [
'cancel_publication' => 'Cancel publication', 'cancel_publication' => 'Cancel publication',
'message_warning' => 'You did not write a message for your announcement post!', 'message_warning' => 'You did not write a message for your announcement post!',
'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your podcast.', 'message_warning_hint' => 'Having a message increases social engagement, resulting in a better visibility for your podcast.',
'message_warning_submit' => 'Publish anyway', 'message_warning_submit' => 'Dennoch veröffentlichen',
], ],
'publication_status_banner' => [ 'publication_status_banner' => [
'draft_mode' => 'draft mode', 'draft_mode' => 'Entwurfsmodus',
'not_published' => 'This podcast is not yet published.', 'not_published' => 'Dieser Podcast ist noch nicht veröffentlicht.',
'scheduled' => 'This podcast is scheduled for publication on {publication_date}.', 'scheduled' => 'This podcast is scheduled for publication on {publication_date}.',
], ],
'delete_form' => [ 'delete_form' => [
'disclaimer' => 'disclaimer' =>
"Deleting the podcast will delete all episodes, media files, posts and analytics associated with it. This action is irreversible, you will not be able to retrieve them afterwards.", "Deleting the podcast will delete all episodes, media files, posts and analytics associated with it. This action is irreversible, you will not be able to retrieve them afterwards.",
'understand' => 'I understand, I want the podcast to be permanently deleted', 'understand' => 'Ich verstehe, ich möchte, dass der Podcast dauerhaft gelöscht wird',
'submit' => 'Delete', 'submit' => 'Löschen',
], ],
'by' => 'Von {publisher}', 'by' => 'Von {publisher}',
'season' => 'Staffel {seasonNumber}', 'season' => 'Staffel {seasonNumber}',
@ -294,12 +294,12 @@ return [
'no_episode' => 'Keine Folge gefunden!', 'no_episode' => 'Keine Folge gefunden!',
'follow' => 'Folgen', 'follow' => 'Folgen',
'followers' => '{numberOfFollowers, plural, 'followers' => '{numberOfFollowers, plural,
one {# follower} one {# Follower}
other {# followers} other {# Follower}
}', }',
'posts' => '{numberOfPosts, plural, 'posts' => '{numberOfPosts, plural,
one {# post} one {# Beitrag}
other {# posts} other {# Beiträge}
}', }',
'activity' => 'Aktivitäten', 'activity' => 'Aktivitäten',
'episodes' => 'Folgen', 'episodes' => 'Folgen',

View File

@ -10,7 +10,7 @@ declare(strict_types=1);
return [ return [
'warning' => 'warning' =>
'This procedure may take a long time. As the current version does not show any progress while it runs, you will not see anything updated until it is done. In case of timeout error, increase `max_execution_time` value.', 'Der Import kann lange dauern. Da die aktuelle Version keinen Fortschritt anzeigt, werden Sie bis zur Beendigung keine Veränderung sehen. Im Falle eines Timeouts, erhöhen Sie den `max_execution_time` Wert.',
'old_podcast_section_title' => 'Der zu importierende Podcast', 'old_podcast_section_title' => 'Der zu importierende Podcast',
'old_podcast_section_subtitle' => 'old_podcast_section_subtitle' =>
'Stellen Sie sicher, dass Sie die Rechte für diesen Podcast besitzen, bevor Sie ihn importieren. Vervielfältigung und Ausstrahlung eines Podcasts ohne die entsprechenden Rechte sind Piraterie und strafbar.', 'Stellen Sie sicher, dass Sie die Rechte für diesen Podcast besitzen, bevor Sie ihn importieren. Vervielfältigung und Ausstrahlung eines Podcasts ohne die entsprechenden Rechte sind Piraterie und strafbar.',

View File

@ -26,8 +26,8 @@ return [
'podcast-analytics-listening-time' => 'Hörzeit', 'podcast-analytics-listening-time' => 'Hörzeit',
'podcast-analytics-time-periods' => 'Zeiträume', 'podcast-analytics-time-periods' => 'Zeiträume',
'premium' => 'Premium', 'premium' => 'Premium',
'subscription-list' => 'All subscriptions', 'subscription-list' => 'Alle Abonnements',
'subscription-add' => 'Add subscription', 'subscription-add' => 'Abonnement hinzufügen',
'contributors' => 'Administratoren', 'contributors' => 'Administratoren',
'contributor-list' => 'Alle Unterstützer', 'contributor-list' => 'Alle Unterstützer',
'contributor-add' => 'Administrator hinzufügen', 'contributor-add' => 'Administrator hinzufügen',

View File

@ -15,7 +15,7 @@ return [
'site_icon' => 'Webseiten-Icon', 'site_icon' => 'Webseiten-Icon',
'site_icon_delete' => 'Lösche Webseiten-Icon', 'site_icon_delete' => 'Lösche Webseiten-Icon',
'site_icon_hint' => 'Webseiten-Icons sind das, was Sie auf Ihrem Browser Tabs, Lesezeichenleiste und wenn Sie eine Website als Verknüpfung auf mobilen Geräten hinzufügen, sehen.', 'site_icon_hint' => 'Webseiten-Icons sind das, was Sie auf Ihrem Browser Tabs, Lesezeichenleiste und wenn Sie eine Website als Verknüpfung auf mobilen Geräten hinzufügen, sehen.',
'site_icon_helper' => 'Icon must be squared and at least 512px wide and tall.', 'site_icon_helper' => 'Das Icon muss quadratisch und mindestens 512px breit und hoch sein.',
'site_name' => 'Seitenname', 'site_name' => 'Seitenname',
'site_description' => 'Seitenbeschreibung', 'site_description' => 'Seitenbeschreibung',
'submit' => 'Speichern', 'submit' => 'Speichern',
@ -35,8 +35,8 @@ return [
'reset_counts_helper' => 'Diese Option wird alle Datenzähler neu berechnen und zurücksetzen (Anzahl der Follower, Beiträge, Kommentare, …).', 'reset_counts_helper' => 'Diese Option wird alle Datenzähler neu berechnen und zurücksetzen (Anzahl der Follower, Beiträge, Kommentare, …).',
'rewrite_media' => 'Medien-Metadaten neu schreiben', 'rewrite_media' => 'Medien-Metadaten neu schreiben',
'rewrite_media_helper' => 'Diese Option wird alle überflüssigen Mediendateien löschen und neu erstellen (Bilder, Audiodateien, Transkripte, Kapitel …)', 'rewrite_media_helper' => 'Diese Option wird alle überflüssigen Mediendateien löschen und neu erstellen (Bilder, Audiodateien, Transkripte, Kapitel …)',
'rename_episodes_files' => 'Rename episode audio files', 'rename_episodes_files' => 'Audiodateien der Episode umbenennen',
'rename_episodes_files_hint' => 'This option will rename all episodes audio files to a random string of characters. Use this if one of your private episodes link was leaked as this will effectively hide it.', 'rename_episodes_files_hint' => 'Diese Option wird alle Audiodateien der Episode mit einer zufälligen Zeichenkette umbenennen. Benutzen Sie diese Option, wenn einer Ihrer privaten Episoden-Links durchsickert, da diese dadurch versteckt werden.',
'clear_cache' => 'Alle Caches löschen', 'clear_cache' => 'Alle Caches löschen',
'clear_cache_helper' => 'Diese Option leert den redis-Cache oder beschreibbare/cache-Dateien.', 'clear_cache_helper' => 'Diese Option leert den redis-Cache oder beschreibbare/cache-Dateien.',
'run' => 'Systempflege starten', 'run' => 'Systempflege starten',

View File

@ -9,14 +9,14 @@ declare(strict_types=1);
*/ */
return [ return [
'title' => 'About Castopod', 'title' => 'Acerca de Castopod',
'host_name' => 'Host name', 'host_name' => 'Nome do servidor',
'version' => 'Castopod version', 'version' => 'Versión de Castopod',
'php_version' => 'PHP version', 'php_version' => 'Versión de PHP',
'os' => 'Operating System', 'os' => 'Sistema Operativo',
'languages' => 'Languages', 'languages' => 'Idiomas',
'update_database' => 'Update database', 'update_database' => 'Anovar base de datos',
'messages' => [ 'messages' => [
'databaseUpdateSuccess' => 'Database is up to date!', 'databaseUpdateSuccess' => 'A base de datos está ao día!',
], ],
]; ];

View File

@ -14,22 +14,22 @@ return [
->gateway => 'Inicio', ->gateway => 'Inicio',
'podcasts' => 'podcasts', 'podcasts' => 'podcasts',
'episodes' => 'episodios', 'episodes' => 'episodios',
'subscriptions' => 'subscriptions', 'subscriptions' => 'subscricións',
'contributors' => 'contribúen', 'contributors' => 'contribúen',
'pages' => 'páxinas', 'pages' => 'páxinas',
'settings' => 'axustes', 'settings' => 'axustes',
'theme' => 'decorado', 'theme' => 'decorado',
'about' => 'about', 'about' => 'acerca de',
'add' => 'engadir', 'add' => 'engadir',
'new' => 'novo', 'new' => 'novo',
'edit' => 'editar', 'edit' => 'editar',
'persons' => 'persoas', 'persons' => 'persoas',
'publish' => 'publicar', 'publish' => 'publicar',
'publish-edit' => 'editar publicación', 'publish-edit' => 'editar publicación',
'publish-date-edit' => 'edit publication date', 'publish-date-edit' => 'editar data de publicación',
'unpublish' => 'retirar publicación', 'unpublish' => 'retirar publicación',
'delete' => 'eliminar', 'delete' => 'eliminar',
'remove' => 'remove', 'remove' => 'eliminar',
'fediverse' => 'fediverso', 'fediverse' => 'fediverso',
'block-lists' => 'listas de bloqueo', 'block-lists' => 'listas de bloqueo',
'users' => 'usuarias', 'users' => 'usuarias',
@ -50,5 +50,5 @@ return [
'video-clips' => 'clips de vídeo', 'video-clips' => 'clips de vídeo',
'embed' => 'reprodutor para incluír', 'embed' => 'reprodutor para incluír',
'notifications' => 'notificacións', 'notifications' => 'notificacións',
'suspend' => 'suspend', 'suspend' => 'suspender',
]; ];

View File

@ -24,14 +24,14 @@ return [
'edit' => 'Editar', 'edit' => 'Editar',
'publish' => 'Publicar', 'publish' => 'Publicar',
'publish_edit' => 'Editar publicación', 'publish_edit' => 'Editar publicación',
'publish_date_edit' => 'Edit publication date', 'publish_date_edit' => 'Editar data de publicación',
'unpublish' => 'Retirar publicación', 'unpublish' => 'Retirar publicación',
'publish_error' => 'O episodio xa está publicado.', 'publish_error' => 'O episodio xa está publicado.',
'publish_edit_error' => 'O episodio xa está publicado.', 'publish_edit_error' => 'O episodio xa está publicado.',
'publish_cancel_error' => 'O episodio xa está publicado.', 'publish_cancel_error' => 'O episodio xa está publicado.',
'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.', 'publish_date_edit_error' => 'O episodio aínda non se publicou, non podes editar a súa data de publicación.',
'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.', 'publish_date_edit_future_error' => 'A data de publicación do episodio só pode establecerse nun momento do pasado! Se queres reprogramalo, primeiro retira a súa publicación.',
'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!', 'publish_date_edit_success' => 'Actualizada correctamente a data de publicación do episodio!',
'unpublish_error' => 'O episodio non foi publicado.', 'unpublish_error' => 'O episodio non foi publicado.',
'delete' => 'Eliminar', 'delete' => 'Eliminar',
'go_to_page' => 'Ir á páxina', 'go_to_page' => 'Ir á páxina',
@ -114,7 +114,7 @@ return [
'bonus_hint' => 'Contido extra para o programa (por exemplo, info sobre a elaboración ou conversa casual cos participantes) ou contido promocional de outras creadoras', 'bonus_hint' => 'Contido extra para o programa (por exemplo, info sobre a elaboración ou conversa casual cos participantes) ou contido promocional de outras creadoras',
], ],
'premium_title' => 'Premium', 'premium_title' => 'Premium',
'premium' => 'Episode must be accessible to premium subscribers only', 'premium' => 'Episodio dispoñible só para subscricións premium',
'parental_advisory' => [ 'parental_advisory' => [
'label' => 'Aviso sobre o contido', 'label' => 'Aviso sobre o contido',
'hint' => 'Contén o episodio elementos explícitos?', 'hint' => 'Contén o episodio elementos explícitos?',
@ -183,9 +183,9 @@ return [
'message_warning_submit' => 'Publicar igualmente', 'message_warning_submit' => 'Publicar igualmente',
], ],
'publish_date_edit_form' => [ 'publish_date_edit_form' => [
'new_publication_date' => 'New publication date', 'new_publication_date' => 'Nova data de publicación',
'new_publication_date_hint' => 'Must be set to a past date.', 'new_publication_date_hint' => 'Ten que ser unha data do pasado.',
'submit' => 'Edit publication date', 'submit' => 'Editar data de publicación',
], ],
'unpublish_form' => [ 'unpublish_form' => [
'disclaimer' => 'disclaimer' =>

View File

@ -14,22 +14,22 @@ return [
->gateway => 'Úvod', ->gateway => 'Úvod',
'podcasts' => 'podcasty', 'podcasts' => 'podcasty',
'episodes' => 'časti', 'episodes' => 'časti',
'subscriptions' => 'subscriptions', 'subscriptions' => 'odbery',
'contributors' => 'prispievatelia', 'contributors' => 'prispievatelia',
'pages' => 'stránky', 'pages' => 'stránky',
'settings' => 'nastavenia', 'settings' => 'nastavenia',
'theme' => 'vzhľad', 'theme' => 'vzhľad',
'about' => 'about', 'about' => 'informácie',
'add' => 'pridať', 'add' => 'pridať',
'new' => 'pridať', 'new' => 'pridať',
'edit' => 'upraviť', 'edit' => 'upraviť',
'persons' => 'osobnosti', 'persons' => 'osobnosti',
'publish' => 'zverejniť', 'publish' => 'zverejniť',
'publish-edit' => 'upraviť zverejnené', 'publish-edit' => 'upraviť zverejnené',
'publish-date-edit' => 'edit publication date', 'publish-date-edit' => 'upraviť dátum publikovania',
'unpublish' => 'zrušiť zverejnenie', 'unpublish' => 'zrušiť zverejnenie',
'delete' => 'vymazať', 'delete' => 'vymazať',
'remove' => 'remove', 'remove' => 'odstrániť',
'fediverse' => 'fediverse', 'fediverse' => 'fediverse',
'block-lists' => 'zoznamy blokovaných', 'block-lists' => 'zoznamy blokovaných',
'users' => 'používatelia', 'users' => 'používatelia',
@ -50,5 +50,5 @@ return [
'video-clips' => 'video klipy', 'video-clips' => 'video klipy',
'embed' => 'vnorený', 'embed' => 'vnorený',
'notifications' => 'oboznámenia', 'notifications' => 'oboznámenia',
'suspend' => 'suspend', 'suspend' => 'pozastaviť',
]; ];

View File

@ -13,7 +13,7 @@ declare(strict_types=1);
return [ return [
'AD' => 'Andorra', 'AD' => 'Andorra',
'AE' => 'Spojené Arabské Emiráty', 'AE' => 'Spojené Arabské Emiráty',
'AF' => 'Afghanistan', 'AF' => 'Afganistan',
'AG' => 'Antigua a Barbuda', 'AG' => 'Antigua a Barbuda',
'AI' => 'Anguilla', 'AI' => 'Anguilla',
'AL' => 'Albánsko', 'AL' => 'Albánsko',
@ -25,7 +25,7 @@ return [
'AT' => 'Rakúsko', 'AT' => 'Rakúsko',
'AU' => 'Austrália', 'AU' => 'Austrália',
'AW' => 'Aruba', 'AW' => 'Aruba',
'AX' => 'Åland Islands', 'AX' => 'Ålandy',
'AZ' => 'Azerbajdžan', 'AZ' => 'Azerbajdžan',
'BA' => 'Bosna a Hercegovina', 'BA' => 'Bosna a Hercegovina',
'BB' => 'Barbados', 'BB' => 'Barbados',
@ -33,36 +33,41 @@ return [
'BE' => 'Belgicko', 'BE' => 'Belgicko',
'BF' => 'Burkina Faso', 'BF' => 'Burkina Faso',
'BG' => 'Bulharsko', 'BG' => 'Bulharsko',
'BH' => 'Bahrain', 'BH' => 'Bahrajn',
'BI' => 'Burundi', 'BI' => 'Burundi',
'BJ' => 'Benin', 'BJ' => 'Benin',
'BL' => 'Saint Barthélemy', 'BL' => 'Svätý Bartolomej',
'BM' => 'Bermuda', 'BM' => 'Bermudy',
'BN' => 'Brunei Darussalam', 'BN' => 'Brunejsko-Darussalamsky Štát',
'BO' => 'Bolivia, Plurinational State of', 'BO' => 'Bolívia, plurinský štát',
'BQ' => 'Bonaire, Sint Eustatius and Saba', 'BQ' => 'Bonaire, Sint Eustatius a Sabaj',
'BR' => 'Brazil', 'BR' => 'Brazília',
'BS' => 'Bahamas', 'BS' => 'Bahamy',
'BT' => 'Bhutan', 'BT' => 'Bhután',
'BV' => 'Bouvet Island', 'BV' => 'Bouvetov ostrov',
'BW' => 'Botswana', 'BW' => 'Botswana',
'BY' => 'Belarus', 'BY' => 'Bielorusko',
'BZ' => 'Belize', 'BZ' => 'Belize',
'CA' => 'Canada', 'CA' => 'Kanada',
'CC' => 'Cocos (Keeling) Islands', 'CC' => 'Kokosové ostrovy',
'CD' => 'Congo, the Democratic Republic of the', 'CD' => '
'CF' => 'Central African Republic', Bhután
'CG' => 'Congo', Bouvetov ostrov
'CH' => 'Switzerland', Bielorusko
'CI' => "Côte d'Ivoire", Kokosové ostrovy
'CK' => 'Cook Islands', Konžská demokratická republika',
'CL' => 'Chile', 'CF' => 'Stredoafrická republika',
'CM' => 'Cameroon', 'CG' => 'Kongo',
'CH' => 'Švajčiarsko',
'CI' => "Pobrežie slonoviny",
'CK' => 'Cookove ostrovy',
'CL' => 'Čile',
'CM' => 'Kamerun',
'CN' => 'Čína', 'CN' => 'Čína',
'CO' => 'Kolumbia', 'CO' => 'Kolumbia',
'CR' => 'Kostarika', 'CR' => 'Kostarika',
'CU' => 'Kuba', 'CU' => 'Kuba',
'CV' => 'Cape Verde', 'CV' => 'Kapverdy',
'CW' => 'Curaçao', 'CW' => 'Curaçao',
'CX' => 'Vianočný Ostrov', 'CX' => 'Vianočný Ostrov',
'CY' => 'Cyprus', 'CY' => 'Cyprus',
@ -70,7 +75,7 @@ return [
'DE' => 'Nemecko', 'DE' => 'Nemecko',
'DJ' => 'Džibutsko', 'DJ' => 'Džibutsko',
'DK' => 'Dánsko', 'DK' => 'Dánsko',
'DM' => 'Dominica', 'DM' => 'Dominika',
'DO' => 'Dominikánska republika', 'DO' => 'Dominikánska republika',
'DZ' => 'Alžírsko', 'DZ' => 'Alžírsko',
'EC' => 'Ekvádor', 'EC' => 'Ekvádor',
@ -83,22 +88,22 @@ return [
'FI' => 'Fínsko', 'FI' => 'Fínsko',
'FJ' => 'Fidži', 'FJ' => 'Fidži',
'FK' => 'Falklandské ostrovy (Malvíny)', 'FK' => 'Falklandské ostrovy (Malvíny)',
'FM' => 'Micronesia, Federated States of', 'FM' => 'Mikronézia, federatívne štáty',
'FO' => 'Faerské Ostrovy', 'FO' => 'Faerské Ostrovy',
'FR' => 'Francúzsko', 'FR' => 'Francúzsko',
'GA' => 'Gabon', 'GA' => 'Gabon',
'GB' => 'Spojené Kráľovstvo', 'GB' => 'Spojené Kráľovstvo',
'GD' => 'Grenada', 'GD' => 'Grenada',
'GE' => 'Gruzínsko', 'GE' => 'Gruzínsko',
'GF' => 'French Guiana', 'GF' => 'Francúzska Guayana',
'GG' => 'Guernsey', 'GG' => 'Guernsey',
'GH' => 'Ghana', 'GH' => 'Ghana',
'GI' => 'Gibraltar', 'GI' => 'Gibraltár',
'GL' => 'Grónsko', 'GL' => 'Grónsko',
'GM' => 'Gambia', 'GM' => 'Gambia',
'GN' => 'Guinea', 'GN' => 'Guinea',
'GP' => 'Guadeloupe', 'GP' => 'Guadeloupe',
'GQ' => 'Equatorial Guinea', 'GQ' => 'Rovníková Guinea',
'GR' => 'Grécko', 'GR' => 'Grécko',
'GS' => 'Južná Georgia a Južné Sandwichove ostrovy', 'GS' => 'Južná Georgia a Južné Sandwichove ostrovy',
'GT' => 'Guatemala', 'GT' => 'Guatemala',
@ -113,7 +118,7 @@ return [
'HU' => 'Maďarsko', 'HU' => 'Maďarsko',
'ID' => 'Indonézia', 'ID' => 'Indonézia',
'IE' => 'Írsko', 'IE' => 'Írsko',
'IL' => 'Israel', 'IL' => 'Izrael',
'IM' => 'Ostrov Man', 'IM' => 'Ostrov Man',
'IN' => 'India', 'IN' => 'India',
'IO' => 'Britské indickooceánske územie', 'IO' => 'Britské indickooceánske územie',
@ -129,18 +134,31 @@ return [
'KG' => 'Kirgizsko', 'KG' => 'Kirgizsko',
'KH' => 'Kambodža', 'KH' => 'Kambodža',
'KI' => 'Kiribati', 'KI' => 'Kiribati',
'KM' => 'Comoros', 'KM' => 'Komory',
'KN' => 'Saint Kitts and Nevis', 'KN' => 'Svätý Krištof a Nevis',
'KP' => "Korea, Democratic People's Republic of", 'KP' => "Kórea, Demokratická ľudová republika",
'KR' => 'Korea, Republic of', 'KR' => 'Kórejská Republika',
'KW' => 'Kuwait', 'KW' => 'Kuvajt',
'KY' => 'Cayman Islands', 'KY' => 'Kajmanské ostrovy',
'KZ' => 'Kazakhstan', 'KZ' => 'Kazachstan',
'LA' => "Lao People's Democratic Republic", 'LA' => "_03 slovutny poprad. mp3
Kapverdy
Dominika
Mikronézia, federatívne štáty
Francúzska Guayana
Rovníková Guinea
Komory
Svätý Krištof a Nevis
Kórea, Demokratická ľudová republika
Kórejská Republika
Kuvajt
Kajmanské ostrovy
Kazachstan
Laoská ľudovodemokratická Republika",
'LB' => 'Libanon', 'LB' => 'Libanon',
'LC' => 'Svätá Lucia', 'LC' => 'Svätá Lucia',
'LI' => 'Lichtenštajnsko', 'LI' => 'Lichtenštajnsko',
'LK' => 'Sri Lanka', 'LK' => 'Srí Lanka',
'LR' => 'Libéria', 'LR' => 'Libéria',
'LS' => 'Lesotho', 'LS' => 'Lesotho',
'LT' => 'Litva', 'LT' => 'Litva',
@ -151,21 +169,21 @@ return [
'MC' => 'Monako', 'MC' => 'Monako',
'MD' => 'Moldavská Republika', 'MD' => 'Moldavská Republika',
'ME' => 'Čierna Hora', 'ME' => 'Čierna Hora',
'MF' => 'Saint Martin (French part)', 'MF' => 'Svätý Martin (Francúzska časť)',
'MG' => 'Madagaskar', 'MG' => 'Madagaskar',
'MH' => 'Marshall Islands', 'MH' => 'Marshallove ostrovy',
'MK' => 'Macedónsko-Bývalá Juhoslovanská Republika', 'MK' => 'Macedónsko-Bývalá Juhoslovanská Republika',
'ML' => 'Mali', 'ML' => 'Mali',
'MM' => 'Mjanmarsko', 'MM' => 'Mjanmarsko',
'MN' => 'Mongolsko', 'MN' => 'Mongolsko',
'MO' => 'Macao', 'MO' => 'Macao',
'MP' => 'Northern Mariana Islands', 'MP' => 'Severné Mariány',
'MQ' => 'Martinique', 'MQ' => 'Martinik',
'MR' => 'Mauritania', 'MR' => 'Mauritánia',
'MS' => 'Montserrat', 'MS' => 'Montserrat',
'MT' => 'Malta', 'MT' => 'Malta',
'MU' => 'Mauritius', 'MU' => 'Maurícius',
'MV' => 'Maldives', 'MV' => 'Maledivy',
'MW' => 'Malawi', 'MW' => 'Malawi',
'MX' => 'Mexiko', 'MX' => 'Mexiko',
'MY' => 'Malajzia', 'MY' => 'Malajzia',
@ -254,7 +272,7 @@ return [
'VI' => 'Americké Panenské ostrovy', 'VI' => 'Americké Panenské ostrovy',
'VN' => 'Vietnam', 'VN' => 'Vietnam',
'VU' => 'Vanuatu', 'VU' => 'Vanuatu',
'WF' => 'Wallis and Futuna', 'WF' => 'Wallis a Futuna',
'WS' => 'Samoa', 'WS' => 'Samoa',
'YE' => 'Jemen', 'YE' => 'Jemen',
'YT' => 'Mayotte', 'YT' => 'Mayotte',

View File

@ -26,14 +26,14 @@ return [
'edit' => 'Upraviť', 'edit' => 'Upraviť',
'publish' => 'Zverejniť', 'publish' => 'Zverejniť',
'publish_edit' => 'Upraviť zverejnenie', 'publish_edit' => 'Upraviť zverejnenie',
'publish_date_edit' => 'Edit publication date', 'publish_date_edit' => 'Upraviť dátum zverejnenia',
'unpublish' => 'Zrušiť zverejnenie', 'unpublish' => 'Zrušiť zverejnenie',
'publish_error' => 'Epizóda je už zverejnená.', 'publish_error' => 'Epizóda je už zverejnená.',
'publish_edit_error' => 'Epizóda je už zverejnená.', 'publish_edit_error' => 'Epizóda je už zverejnená.',
'publish_cancel_error' => 'Epizóda je už zverejnená.', 'publish_cancel_error' => 'Epizóda je už zverejnená.',
'publish_date_edit_error' => 'Episode has not been published yet, you cannot edit its publication date.', 'publish_date_edit_error' => 'Epizóda zatiaľ nie je zverejnená, nie je možné upraviť dátum zverejnenia.',
'publish_date_edit_future_error' => 'Episode\'s publication date can only be set to a past date! If you would like to reschedule it, unpublish it first.', 'publish_date_edit_future_error' => 'Dátum zverejnenia musí byť v minulosti! Ak si zverejnenie želáte naplánovať v budúcnosti, musíte ho najskôr zrušiť.',
'publish_date_edit_success' => 'Episode\'s publication date has been updated successfully!', 'publish_date_edit_success' => 'Dátum zverejnenia epizódy bol úspešne aktualizovaný!',
'unpublish_error' => 'Epizóda nie je zverejnená.', 'unpublish_error' => 'Epizóda nie je zverejnená.',
'delete' => 'Vymazať', 'delete' => 'Vymazať',
'go_to_page' => 'Prejsť na stránku', 'go_to_page' => 'Prejsť na stránku',
@ -94,45 +94,45 @@ return [
], ],
'form' => [ 'form' => [
'file_size_error' => 'file_size_error' =>
'Your file size is too big! Max size is {0}. Increase the `memory_limit`, `upload_max_filesize` and `post_max_size` values in your php configuration file then restart your web server to upload your file.', 'Súbor je príliš veľký! Maximálna povolená veľkosť je {0}. V konfigurácii Php zvýšte hodnoty nastavení `memory_limit`, `upload_max_filesize` a `post_max_size` a následne reštartujte web server, aby ste súbor mohli nahrať znovu.',
'audio_file' => 'Zvukový súbor', 'audio_file' => 'Zvukový súbor',
'audio_file_hint' => 'Vyberte zvukový súbor .mp3, alebo .m4a.', 'audio_file_hint' => 'Vyberte zvukový súbor .mp3, alebo .m4a.',
'info_section_title' => 'Informácie o časti', 'info_section_title' => 'Informácie o časti',
'cover' => 'Obal k časti', 'cover' => 'Obal k časti',
'cover_hint' => 'cover_hint' =>
'If you do not set a cover, the podcast cover will be used instead.', 'Ak obrázok nepridáte, použije sa obrázok podcastu.',
'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', 'cover_size_hint' => 'Obrázok musí byť štvorcový minimálny rozmer 1400px.',
'title' => 'Názov', 'title' => 'Názov',
'title_hint' => 'title_hint' =>
'Should contain a clear and concise episode name. Do not specify the episode or season numbers here.', 'Má obsahovať jasný a výstižný názov. Nepridávajte čísla sérií a epizód.',
'permalink' => 'Trvalý odkaz', 'permalink' => 'Trvalý odkaz',
'season_number' => 'Season', 'season_number' => 'Séria',
'episode_number' => 'Epizóda', 'episode_number' => 'Epizóda',
'type' => [ 'type' => [
'label' => 'Type', 'label' => 'Typ',
'full' => 'Full', 'full' => 'Celá epizóda',
'full_hint' => 'Complete content (the episode)', 'full_hint' => '´Uplný obsah',
'trailer' => 'Trailer', 'trailer' => 'Upútavka',
'trailer_hint' => 'Short, promotional piece of content that represents a preview of the current show', 'trailer_hint' => 'Krátky promočný úryvok obsahu, ktorý slúži ako ukážka podcastu',
'bonus' => 'Bonus', 'bonus' => 'Bonus',
'bonus_hint' => 'Extra content for the show (for example, behind the scenes info or interviews with the cast) or cross-promotional content for another show', 'bonus_hint' => 'Doplnkový obsah podcastu (Informácie zo zákulisia alebo rozhovor s účinkujúcimi) alebo upútavka iného podcastu',
], ],
'premium_title' => 'Premium', 'premium_title' => 'Prémiový obsah',
'premium' => 'Episode must be accessible to premium subscribers only', 'premium' => 'Epizóda je prístupná len pre predplatiteľov prémiového obsahu',
'parental_advisory' => [ 'parental_advisory' => [
'label' => 'Parental advisory', 'label' => 'Rodičovská kontrola',
'hint' => 'Does the episode contain explicit content?', 'hint' => 'Obsahuje epizóda explicitný obsah?',
'undefined' => 'undefined', 'undefined' => 'neuvedené',
'clean' => 'Clean', 'clean' => 'Čisté',
'explicit' => 'Chúlostivé', 'explicit' => 'Chúlostivé',
], ],
'show_notes_section_title' => 'Show notes', 'show_notes_section_title' => 'Poznámky epizódy',
'show_notes_section_subtitle' => 'show_notes_section_subtitle' =>
'Up to 4000 characters, be clear and concise. Show notes help potential listeners in finding the episode.', 'Maximálne 4000 znakov, buďte jasní a výstižní.',
'description' => 'Popis', 'description' => 'Popis',
'description_footer' => 'Description footer', 'description_footer' => 'Päta popisu',
'description_footer_hint' => 'description_footer_hint' =>
'This text is added at the end of each episode description, it is a good place to input your social links for example.', 'Tento text je pridaný na koniec popisu každej epizódy, je vhodný napríklad na zverejnenie odkazov na sociálne siete.',
'additional_files_section_title' => 'Dodatočné súbory', 'additional_files_section_title' => 'Dodatočné súbory',
'additional_files_section_subtitle' => 'additional_files_section_subtitle' =>
'Tieto súbory sú určené na použitie s inými platformami s cieľom poslucháčom poskytovať bohačšiu skúsenosť. Pre viac informácií si pozrite {podcastNamespaceLink}.', 'Tieto súbory sú určené na použitie s inými platformami s cieľom poslucháčom poskytovať bohačšiu skúsenosť. Pre viac informácií si pozrite {podcastNamespaceLink}.',
@ -187,13 +187,13 @@ return [
'message_warning_submit' => 'Napriek tomu zverejniť', 'message_warning_submit' => 'Napriek tomu zverejniť',
], ],
'publish_date_edit_form' => [ 'publish_date_edit_form' => [
'new_publication_date' => 'New publication date', 'new_publication_date' => 'Nový dátum zverejnenia',
'new_publication_date_hint' => 'Must be set to a past date.', 'new_publication_date_hint' => 'Musí byť dátum v minulosti.',
'submit' => 'Edit publication date', 'submit' => 'Upraviť dátum zverejnenia',
], ],
'unpublish_form' => [ 'unpublish_form' => [
'disclaimer' => 'disclaimer' =>
"Unpublishing the episode will delete all the comments and posts associated with it and remove it from the podcast's RSS feed.", "Zrušenie zverejnenia odstráni všetky pridružené príspevky a komentáre a odstráni epizódu z kanála RSS.",
'understand' => 'Rozumiem, chcem zrušiť zverejnenie epizódy', 'understand' => 'Rozumiem, chcem zrušiť zverejnenie epizódy',
'submit' => 'Zrušiť zverejnenie', 'submit' => 'Zrušiť zverejnenie',
], ],
@ -210,8 +210,8 @@ return [
'clipboard_iframe' => 'Skopírovať kód prehrávača do schránky', 'clipboard_iframe' => 'Skopírovať kód prehrávača do schránky',
'clipboard_url' => 'Skopírovať adresu do schránky', 'clipboard_url' => 'Skopírovať adresu do schránky',
'dark' => 'Tmavý', 'dark' => 'Tmavý',
'dark-transparent' => 'Dark transparent', 'dark-transparent' => 'Tmavý priehľadný',
'light' => 'Light', 'light' => 'Svetlý',
'light-transparent' => 'Light transparent', 'light-transparent' => 'Svetlý priehľadný',
], ],
]; ];

View File

@ -10,7 +10,7 @@ declare(strict_types=1);
return [ return [
'go_to_page' => 'Zobraziť stránku časti', 'go_to_page' => 'Zobraziť stránku časti',
'dashboard' => 'Episode dashboard', 'dashboard' => 'Nástenka epizódy',
'episode-view' => 'Domov', 'episode-view' => 'Domov',
'episode-edit' => 'Upraviť časť', 'episode-edit' => 'Upraviť časť',
'episode-persons-manage' => 'Manage persons', 'episode-persons-manage' => 'Manage persons',

View File

@ -9,14 +9,14 @@ declare(strict_types=1);
*/ */
return [ return [
'title' => 'About Castopod', 'title' => 'Om Castopod',
'host_name' => 'Host name', 'host_name' => 'Värdnamn',
'version' => 'Castopod version', 'version' => 'Castopod version',
'php_version' => 'PHP version', 'php_version' => 'PHP version',
'os' => 'Operating System', 'os' => 'Operativsystem',
'languages' => 'Languages', 'languages' => 'Språk',
'update_database' => 'Update database', 'update_database' => 'Uppdatera databas',
'messages' => [ 'messages' => [
'databaseUpdateSuccess' => 'Database is up to date!', 'databaseUpdateSuccess' => 'Databasen är uppdaterad!',
], ],
]; ];

View File

@ -11,44 +11,44 @@ declare(strict_types=1);
return [ return [
'label' => 'breadcrumb', 'label' => 'breadcrumb',
config('Admin') config('Admin')
->gateway => 'Home', ->gateway => 'Hem',
'podcasts' => 'podcasts', 'podcasts' => 'podcasts',
'episodes' => 'episodes', 'episodes' => 'avsnitt',
'subscriptions' => 'subscriptions', 'subscriptions' => 'prenumerationer',
'contributors' => 'contributors', 'contributors' => 'bidragsgivare',
'pages' => 'pages', 'pages' => 'sidor',
'settings' => 'settings', 'settings' => 'inställningar',
'theme' => 'theme', 'theme' => 'tema',
'about' => 'about', 'about' => 'om',
'add' => 'add', 'add' => 'lägg till',
'new' => 'new', 'new' => 'ny',
'edit' => 'edit', 'edit' => 'redigera',
'persons' => 'persons', 'persons' => 'personer',
'publish' => 'publish', 'publish' => 'publicera',
'publish-edit' => 'edit publication', 'publish-edit' => 'redigera publikation',
'publish-date-edit' => 'edit publication date', 'publish-date-edit' => 'redigera publiceringsdatum',
'unpublish' => 'unpublish', 'unpublish' => 'avpublicera',
'delete' => 'delete', 'delete' => 'radera',
'remove' => 'remove', 'remove' => 'ta bort',
'fediverse' => 'fediverse', 'fediverse' => 'fediverse',
'block-lists' => 'block lists', 'block-lists' => 'block listor',
'users' => 'users', 'users' => 'användare',
'my-account' => 'my account', 'my-account' => 'mitt konto',
'change-password' => 'change password', 'change-password' => 'ändra lösenord',
'import' => 'feed import', 'import' => 'import av flöde',
'platforms' => 'platforms', 'platforms' => 'plattformar',
'social' => 'social networks', 'social' => 'sociala nätverk',
'funding' => 'funding', 'funding' => 'finansiering',
'analytics' => 'analytics', 'analytics' => 'analys',
'locations' => 'locations', 'locations' => 'platser',
'webpages' => 'web pages', 'webpages' => 'webbplatser',
'unique-listeners' => 'unique listeners', 'unique-listeners' => 'unika lyssnare',
'players' => 'players', 'players' => 'spelare',
'listening-time' => 'listening time', 'listening-time' => 'lyssningstid',
'time-periods' => 'time periods', 'time-periods' => 'tidsperiod',
'soundbites' => 'soundbites', 'soundbites' => 'ljudklipp',
'video-clips' => 'video clips', 'video-clips' => 'videoklipp',
'embed' => 'embeddable player', 'embed' => 'inbäddad spelare',
'notifications' => 'notifications', 'notifications' => 'aviseringar',
'suspend' => 'suspend', 'suspend' => 'suspendera',
]; ];

View File

@ -9,32 +9,32 @@ declare(strict_types=1);
*/ */
return [ return [
'by_service_weekly' => 'Episode downloads by service (for the past week)', 'by_service_weekly' => 'Avsnitt nedladdningar via tjänst (under den senaste veckan)',
'by_player_weekly' => 'Episode downloads by player (for the past week)', 'by_player_weekly' => 'Nedladdningar av avsnitt via spelare (under den senaste veckan)',
'by_player_yearly' => 'Episode downloads by player (for the past year)', 'by_player_yearly' => 'Nedladdningar av avsnitt via spelare (under det gångna året)',
'by_device_weekly' => 'Episode downloads by device (for the past week)', 'by_device_weekly' => 'Avsnitt nedladdningar per enhet (föregående veckan)',
'by_os_weekly' => 'Episode downloads by O.S. (for the past week)', 'by_os_weekly' => 'Avsnitt nedladdningar av O.S. (för den föregående veckan)',
'podcast_by_region' => 'Episode downloads by region (for the past week)', 'podcast_by_region' => 'Nedladdningar av avsnitt efter region (under den föregående veckan)',
'unique_daily_listeners' => 'Daily unique listeners', 'unique_daily_listeners' => 'Dagliga unika lyssnare',
'unique_monthly_listeners' => 'Monthly unique listeners', 'unique_monthly_listeners' => 'Unika lyssnare varje månad',
'by_browser' => 'Web pages usage by browser (for the past week)', 'by_browser' => 'Webbsidor användning av webbläsare (under den föregående veckan)',
'podcast_by_day' => 'Episode daily downloads', 'podcast_by_day' => 'Avsnitt dagliga nedladdningar',
'podcast_by_month' => 'Episode monthly downloads', 'podcast_by_month' => 'Månatliga nedladdningar av avsnitt',
'episode_by_day' => 'Episode daily downloads (first 60 days)', 'episode_by_day' => 'Avsnitt dagliga nedladdningar (första 60 dagar)',
'episode_by_month' => 'Episode monthly downloads', 'episode_by_month' => 'Månatliga nedladdningar av avsnitt',
'episodes_by_day' => 'episodes_by_day' =>
'5 latest episodes downloads (during their first 60 days)', '5 senaste avsnitt nedladdningar (under sina första 60 dagar)',
'by_country_weekly' => 'Episode downloads by country (for the past week)', 'by_country_weekly' => 'Nedladdningar av avsnitt per land (under den föregående veckan)',
'by_country_yearly' => 'Episode downloads by country (for the past year)', 'by_country_yearly' => 'Nedladdningar av avsnitt per land (för föregående året)',
'by_domain_weekly' => 'Web pages visits by source (for the past week)', 'by_domain_weekly' => 'Webbsidor besök per källa (under föregående veckan)',
'by_domain_yearly' => 'Web pages visits by source (for the past year)', 'by_domain_yearly' => 'Webbsidor besök per källa (för det gångna året)',
'by_entry_page' => 'Web pages visits by landing page (for the past week)', 'by_entry_page' => 'Webbsidor besök via startsida (under den föregående veckan)',
'podcast_bots' => 'Bots (crawlers)', 'podcast_bots' => 'Bots (crawlers)',
'daily_listening_time' => 'Daily cumulative listening time', 'daily_listening_time' => 'Daglig kumulativ lyssningstid',
'monthly_listening_time' => 'Monthly cumulative listening time', 'monthly_listening_time' => 'Månatlig kumulativ lyssningstid',
'by_weekday' => 'By week day (for the past 60 days)', 'by_weekday' => 'Efter veckodag (för de senaste 60 dagarna)',
'by_hour' => 'By time of day (for the past 60 days)', 'by_hour' => 'Via tiden på dagen (de senaste 60 dagarna)',
'podcast_by_bandwidth' => 'Daily used bandwidth (in MB)', 'podcast_by_bandwidth' => 'Dagligen använd bandbredd (i MB)',
'total_storage_by_month' => 'Monthly storage (in MB)', 'total_storage_by_month' => 'Månadslagring (i MB)',
'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)', 'total_bandwidth_by_month' => 'Månatlig använd bandbredd (i MB)',
]; ];

View File

@ -9,43 +9,43 @@ declare(strict_types=1);
*/ */
return [ return [
'yes' => 'Yes', 'yes' => 'Ja',
'no' => 'No', 'no' => 'Nej',
'cancel' => 'Cancel', 'cancel' => 'Avbryt',
'optional' => 'Optional', 'optional' => 'Valfritt',
'more' => 'More', 'more' => 'Mer',
'no_data' => 'No data found!', 'no_data' => 'Ingen data hittades!',
'close' => 'Close', 'close' => 'Stäng',
'edit' => 'Edit', 'edit' => 'Redigera',
'copy' => 'Copy', 'copy' => 'Kopiera',
'copied' => 'Copied!', 'copied' => 'Kopierad!',
'home' => 'Home', 'home' => 'Hem',
'explicit' => 'Explicit', 'explicit' => 'Uteslutande',
'powered_by' => 'Powered by {castopod}', 'powered_by' => 'Drivs av {castopod}',
'actions' => 'Actions', 'actions' => 'Åtgärder',
'pageInfo' => 'Page {currentPage} out of {pageCount}', 'pageInfo' => 'Sida {currentPage} av {pageCount}',
'go_back' => 'Go back', 'go_back' => 'Gå tillbaka',
'forms' => [ 'forms' => [
'editor' => [ 'editor' => [
'write' => 'Write', 'write' => 'Skriv',
'preview' => 'Preview', 'preview' => 'Förhandsgranska',
'help' => 'Powered by markdown', 'help' => 'Drivs av markdown',
], ],
'multiSelect' => [ 'multiSelect' => [
'selectText' => 'Press to select', 'selectText' => 'Tryck för att välja',
'loadingText' => 'Loading…', 'loadingText' => 'Laddar…',
'noResultsText' => 'No results found', 'noResultsText' => 'Hittade inga resultat',
'noChoicesText' => 'No choices to choose from', 'noChoicesText' => 'Inga val att välja mellan',
'maxItemText' => 'Cannot add more items', 'maxItemText' => 'Kan inte lägga till fler objekt',
], ],
'upload_file' => 'Upload a file', 'upload_file' => 'Ladda upp en fil',
'remote_url' => 'Remote URL', 'remote_url' => 'Fjärr URL',
], ],
'play_episode_button' => [ 'play_episode_button' => [
'play' => 'Play', 'play' => 'Spela',
'playing' => 'Playing', 'playing' => 'Spelar',
], ],
'size_limit' => 'Size limit: {0}.', 'size_limit' => 'Storleksgräns: {0}.',
'choose_interact' => 'Choose how to interact', 'choose_interact' => 'Välj hur du vill interagera',
'view' => 'View', 'view' => 'Visa',
]; ];

View File

@ -12,253 +12,253 @@ declare(strict_types=1);
return [ return [
'AD' => 'Andorra', 'AD' => 'Andorra',
'AE' => 'United Arab Emirates', 'AE' => 'Förenade Arabemiraten',
'AF' => 'Afghanistan', 'AF' => 'Afghanistan',
'AG' => 'Antigua and Barbuda', 'AG' => 'Antigua och Barbuda',
'AI' => 'Anguilla', 'AI' => 'Anguilla',
'AL' => 'Albania', 'AL' => 'Albanien',
'AM' => 'Armenia', 'AM' => 'Armenien',
'AO' => 'Angola', 'AO' => 'Angola',
'AQ' => 'Antarctica', 'AQ' => 'Antarktis',
'AR' => 'Argentina', 'AR' => 'Argentina',
'AS' => 'American Samoa', 'AS' => 'Amerikanska Samoaöarna',
'AT' => 'Austria', 'AT' => 'Österrike',
'AU' => 'Australia', 'AU' => 'Australien',
'AW' => 'Aruba', 'AW' => 'Aruba',
'AX' => 'Åland Islands', 'AX' => 'Åland',
'AZ' => 'Azerbaijan', 'AZ' => 'Azerbajdzjan',
'BA' => 'Bosnia and Herzegovina', 'BA' => 'Bosnien och Hercegovina',
'BB' => 'Barbados', 'BB' => 'Barbados',
'BD' => 'Bangladesh', 'BD' => 'Bangladesh',
'BE' => 'Belgium', 'BE' => 'Belgien',
'BF' => 'Burkina Faso', 'BF' => 'Burkina Faso',
'BG' => 'Bulgaria', 'BG' => 'Bulgarien',
'BH' => 'Bahrain', 'BH' => 'Bahrain',
'BI' => 'Burundi', 'BI' => 'Burundi',
'BJ' => 'Benin', 'BJ' => 'Benin',
'BL' => 'Saint Barthélemy', 'BL' => 'Saint Barthélemy',
'BM' => 'Bermuda', 'BM' => 'Bermuda',
'BN' => 'Brunei Darussalam', 'BN' => 'Brunei Darussalam',
'BO' => 'Bolivia, Plurinational State of', 'BO' => 'Bolivia',
'BQ' => 'Bonaire, Sint Eustatius and Saba', 'BQ' => 'Bonaire',
'BR' => 'Brazil', 'BR' => 'Brasilien',
'BS' => 'Bahamas', 'BS' => 'Bahamas',
'BT' => 'Bhutan', 'BT' => 'Bhutan',
'BV' => 'Bouvet Island', 'BV' => 'Bouvetön',
'BW' => 'Botswana', 'BW' => 'Botswana',
'BY' => 'Belarus', 'BY' => 'Vitryssland',
'BZ' => 'Belize', 'BZ' => 'Belize',
'CA' => 'Canada', 'CA' => 'Kanada',
'CC' => 'Cocos (Keeling) Islands', 'CC' => 'Kokosöarna',
'CD' => 'Congo, the Democratic Republic of the', 'CD' => 'Kongo, Demokratiska republiken Kongo',
'CF' => 'Central African Republic', 'CF' => 'Centralafrikanska republiken',
'CG' => 'Congo', 'CG' => 'Kongo',
'CH' => 'Switzerland', 'CH' => 'Schweiz',
'CI' => "Côte d'Ivoire", 'CI' => "Elfenbenskusten",
'CK' => 'Cook Islands', 'CK' => 'Cooköarna',
'CL' => 'Chile', 'CL' => 'Chile',
'CM' => 'Cameroon', 'CM' => 'Kamerun',
'CN' => 'China', 'CN' => 'Kina',
'CO' => 'Colombia', 'CO' => 'Colombia',
'CR' => 'Costa Rica', 'CR' => 'Costa Rica',
'CU' => 'Cuba', 'CU' => 'Kuba',
'CV' => 'Cape Verde', 'CV' => 'Kap Verde',
'CW' => 'Curaçao', 'CW' => 'Curacao',
'CX' => 'Christmas Island', 'CX' => 'Julön',
'CY' => 'Cyprus', 'CY' => 'Cypern',
'CZ' => 'Czech Republic', 'CZ' => 'Tjeckien',
'DE' => 'Germany', 'DE' => 'Tyskland',
'DJ' => 'Djibouti', 'DJ' => 'Djibouti',
'DK' => 'Denmark', 'DK' => 'Danmark',
'DM' => 'Dominica', 'DM' => 'Dominica',
'DO' => 'Dominican Republic', 'DO' => 'Dominikanska republiken',
'DZ' => 'Algeria', 'DZ' => 'Algeriet',
'EC' => 'Ecuador', 'EC' => 'Ecuador',
'EE' => 'Estonia', 'EE' => 'Estland',
'EG' => 'Egypt', 'EG' => 'Egypten',
'EH' => 'Western Sahara', 'EH' => 'Västsahara',
'ER' => 'Eritrea', 'ER' => 'Eritrea',
'ES' => 'Spain', 'ES' => 'Spanien',
'ET' => 'Ethiopia', 'ET' => 'Etiopien',
'FI' => 'Finland', 'FI' => 'Finland',
'FJ' => 'Fiji', 'FJ' => 'Fiji',
'FK' => 'Falkland Islands (Malvinas)', 'FK' => 'Falklandsöarna (Malvinas)',
'FM' => 'Micronesia, Federated States of', 'FM' => 'Mikronesien, Federerade Stater',
'FO' => 'Faroe Islands', 'FO' => 'Färöarna',
'FR' => 'France', 'FR' => 'Frankrike',
'GA' => 'Gabon', 'GA' => 'Gabon',
'GB' => 'United Kingdom', 'GB' => 'Storbritannien',
'GD' => 'Grenada', 'GD' => 'Grenada',
'GE' => 'Georgia', 'GE' => 'Georgien',
'GF' => 'French Guiana', 'GF' => 'Franska Guyana',
'GG' => 'Guernsey', 'GG' => 'Guernsey',
'GH' => 'Ghana', 'GH' => 'Ghana',
'GI' => 'Gibraltar', 'GI' => 'Gibraltar',
'GL' => 'Greenland', 'GL' => 'Grönland',
'GM' => 'Gambia', 'GM' => 'Gambia',
'GN' => 'Guinea', 'GN' => 'Guinea',
'GP' => 'Guadeloupe', 'GP' => 'Guadeloupe',
'GQ' => 'Equatorial Guinea', 'GQ' => 'Equatorial Guinea',
'GR' => 'Greece', 'GR' => 'Grekland',
'GS' => 'South Georgia and the South Sandwich Islands', 'GS' => 'Sydgeorgien och Sydsandwichöarna',
'GT' => 'Guatemala', 'GT' => 'Guatemala',
'GU' => 'Guam', 'GU' => 'Guam',
'GW' => 'Guinea-Bissau', 'GW' => 'Guinea-Bissau',
'GY' => 'Guyana', 'GY' => 'Guyana',
'HK' => 'Hong Kong', 'HK' => 'Hongkong',
'HM' => 'Heard Island and McDonald Islands', 'HM' => 'Heard Island och McDonaldsöarna',
'HN' => 'Honduras', 'HN' => 'Honduras',
'HR' => 'Croatia', 'HR' => 'Kroatien',
'HT' => 'Haiti', 'HT' => 'Haiti',
'HU' => 'Hungary', 'HU' => 'Ungern',
'ID' => 'Indonesia', 'ID' => 'Indonesien',
'IE' => 'Ireland', 'IE' => 'Irland',
'IL' => 'Israel', 'IL' => 'Israel',
'IM' => 'Isle of Man', 'IM' => 'Isle of Man',
'IN' => 'India', 'IN' => 'Indien',
'IO' => 'British Indian Ocean Territory', 'IO' => 'Brittiska territoriet i Indiska oceanen',
'IQ' => 'Iraq', 'IQ' => 'Irak',
'IR' => 'Iran, Islamic Republic of', 'IR' => 'Iran, Islamiska republiken av',
'IS' => 'Iceland', 'IS' => 'Island',
'IT' => 'Italy', 'IT' => 'Italien',
'JE' => 'Jersey', 'JE' => 'Jersey',
'JM' => 'Jamaica', 'JM' => 'Jamaica',
'JO' => 'Jordan', 'JO' => 'Jordanien',
'JP' => 'Japan', 'JP' => 'Japan',
'KE' => 'Kenya', 'KE' => 'Kenya',
'KG' => 'Kyrgyzstan', 'KG' => 'Kyrgyzstan',
'KH' => 'Cambodia', 'KH' => 'Kambodja',
'KI' => 'Kiribati', 'KI' => 'Kiribati',
'KM' => 'Comoros', 'KM' => 'Komorerna',
'KN' => 'Saint Kitts and Nevis', 'KN' => 'Saint Kitts och Nevis',
'KP' => "Korea, Democratic People's Republic of", 'KP' => "Nordkorea",
'KR' => 'Korea, Republic of', 'KR' => 'Sydkorea',
'KW' => 'Kuwait', 'KW' => 'Kuwait',
'KY' => 'Cayman Islands', 'KY' => 'Caymanöarna',
'KZ' => 'Kazakhstan', 'KZ' => 'Kazakstan',
'LA' => "Lao People's Democratic Republic", 'LA' => "Laos",
'LB' => 'Lebanon', 'LB' => 'Libanon',
'LC' => 'Saint Lucia', 'LC' => 'Sankt Lucia',
'LI' => 'Liechtenstein', 'LI' => 'Liechtenstein',
'LK' => 'Sri Lanka', 'LK' => 'Sri Lanka',
'LR' => 'Liberia', 'LR' => 'Liberien',
'LS' => 'Lesotho', 'LS' => 'Lesotho',
'LT' => 'Lithuania', 'LT' => 'Litauen',
'LU' => 'Luxembourg', 'LU' => 'Luxembourg',
'LV' => 'Latvia', 'LV' => 'Lettland',
'LY' => 'Libya', 'LY' => 'Libyen',
'MA' => 'Morocco', 'MA' => 'Marocko',
'MC' => 'Monaco', 'MC' => 'Monaco',
'MD' => 'Moldova, Republic of', 'MD' => 'Moldavien',
'ME' => 'Montenegro', 'ME' => 'Montenegro',
'MF' => 'Saint Martin (French part)', 'MF' => 'Saint Martin',
'MG' => 'Madagascar', 'MG' => 'Madagaskar',
'MH' => 'Marshall Islands', 'MH' => 'Marshallöarna',
'MK' => 'Macedonia, the Former Yugoslav Republic of', 'MK' => 'Makedonien',
'ML' => 'Mali', 'ML' => 'Mali',
'MM' => 'Myanmar', 'MM' => 'Myanmar',
'MN' => 'Mongolia', 'MN' => 'Mongoliet',
'MO' => 'Macao', 'MO' => 'Macao',
'MP' => 'Northern Mariana Islands', 'MP' => 'Nordmarianerna',
'MQ' => 'Martinique', 'MQ' => 'Martinique',
'MR' => 'Mauritania', 'MR' => 'Mauritania',
'MS' => 'Montserrat', 'MS' => 'Montserrat',
'MT' => 'Malta', 'MT' => 'Malta',
'MU' => 'Mauritius', 'MU' => 'Mauritius',
'MV' => 'Maldives', 'MV' => 'Maldiverna',
'MW' => 'Malawi', 'MW' => 'Malawi',
'MX' => 'Mexico', 'MX' => 'Mexiko',
'MY' => 'Malaysia', 'MY' => 'Malaysia',
'MZ' => 'Mozambique', 'MZ' => 'Moçambique',
'N/A' => 'Not Applicable (local IP…)', 'N/A' => 'Ej tillämplig (lokal IP…)',
'NA' => 'Namibia', 'NA' => 'Namibia',
'NC' => 'New Caledonia', 'NC' => 'Nya Kaledonien',
'NE' => 'Niger', 'NE' => 'Niger',
'NF' => 'Norfolk Island', 'NF' => 'Norfolkön',
'NG' => 'Nigeria', 'NG' => 'Nigeria',
'NI' => 'Nicaragua', 'NI' => 'Nicaragua',
'NL' => 'Netherlands', 'NL' => 'Nederländerna',
'NO' => 'Norway', 'NO' => 'Norge',
'NP' => 'Nepal', 'NP' => 'Nepal',
'NR' => 'Nauru', 'NR' => 'Nauru',
'NU' => 'Niue', 'NU' => 'Niue',
'NZ' => 'New Zealand', 'NZ' => 'Nya Zeeland',
'OM' => 'Oman', 'OM' => 'Oman',
'PA' => 'Panama', 'PA' => 'Panama',
'PE' => 'Peru', 'PE' => 'Peru',
'PF' => 'French Polynesia', 'PF' => 'Franska Polynesien',
'PG' => 'Papua New Guinea', 'PG' => 'Papua Nya Guinea',
'PH' => 'Philippines', 'PH' => 'Filippinerna',
'PK' => 'Pakistan', 'PK' => 'Pakistan',
'PL' => 'Poland', 'PL' => 'Polen',
'PM' => 'Saint Pierre and Miquelon', 'PM' => 'Saint Pierre och Miquelon',
'PN' => 'Pitcairn', 'PN' => 'Pitcairn',
'PR' => 'Puerto Rico', 'PR' => 'Puerto Rico',
'PS' => 'Palestine, State of', 'PS' => 'Palestina',
'PT' => 'Portugal', 'PT' => 'Portugal',
'PW' => 'Palau', 'PW' => 'Palau',
'PY' => 'Paraguay', 'PY' => 'Paraguay',
'QA' => 'Qatar', 'QA' => 'Qatar',
'RE' => 'Réunion', 'RE' => 'Réunion',
'RO' => 'Romania', 'RO' => 'Rumänien',
'RS' => 'Serbia', 'RS' => 'Serbien',
'RU' => 'Russian Federation', 'RU' => 'Ryssland',
'RW' => 'Rwanda', 'RW' => 'Rwanda',
'SA' => 'Saudi Arabia', 'SA' => 'Saudiarabien',
'SB' => 'Solomon Islands', 'SB' => 'Salomonöarna',
'SC' => 'Seychelles', 'SC' => 'Seychellerna',
'SD' => 'Sudan', 'SD' => 'Sudan',
'SE' => 'Sweden', 'SE' => 'Sverige',
'SG' => 'Singapore', 'SG' => 'Singapore',
'SH' => 'Saint Helena, Ascension and Tristan da Cunha', 'SH' => 'Sankta Helena, Ascension och Tristan da Cunha',
'SI' => 'Slovenia', 'SI' => 'Slovenien',
'SJ' => 'Svalbard and Jan Mayen', 'SJ' => 'Svalbard',
'SK' => 'Slovakia', 'SK' => 'Slovakien',
'SL' => 'Sierra Leone', 'SL' => 'Sierra Leone',
'SM' => 'San Marino', 'SM' => 'San Marino',
'SN' => 'Senegal', 'SN' => 'Senegal',
'SO' => 'Somalia', 'SO' => 'Somalia',
'SR' => 'Suriname', 'SR' => 'Surinam',
'SS' => 'South Sudan', 'SS' => 'Sydsudan',
'ST' => 'Sao Tome and Principe', 'ST' => 'Sao Tome och Principe',
'SV' => 'El Salvador', 'SV' => 'El Salvador',
'SX' => 'Sint Maarten (Dutch part)', 'SX' => 'Sint Maarten (nederländska delen)',
'SY' => 'Syrian Arab Republic', 'SY' => 'Syrien',
'SZ' => 'Swaziland', 'SZ' => 'Swaziland',
'TC' => 'Turks and Caicos Islands', 'TC' => 'Turks- och Caicosöarna',
'TD' => 'Chad', 'TD' => 'Tchad',
'TF' => 'French Southern Territories', 'TF' => 'Franska sydterritorierna',
'TG' => 'Togo', 'TG' => 'Togo',
'TH' => 'Thailand', 'TH' => 'Thailand',
'TJ' => 'Tajikistan', 'TJ' => 'Tajikistan',
'TK' => 'Tokelau', 'TK' => 'Tokelauöarna',
'TL' => 'Timor-Leste', 'TL' => 'Östtimor',
'TM' => 'Turkmenistan', 'TM' => 'Turkmenistan',
'TN' => 'Tunisia', 'TN' => 'Tunisien',
'TO' => 'Tonga', 'TO' => 'Tonga',
'TR' => 'Turkey', 'TR' => 'Turkiet',
'TT' => 'Trinidad and Tobago', 'TT' => 'Trinidad och Tobago',
'TV' => 'Tuvalu', 'TV' => 'Tuvalu',
'TW' => 'Taiwan, Province of China', 'TW' => 'Taiwan',
'TZ' => 'Tanzania, United Republic of', 'TZ' => 'Tanzania',
'UA' => 'Ukraine', 'UA' => 'Ukraina',
'UG' => 'Uganda', 'UG' => 'Uganda',
'UM' => 'United States Minor Outlying Islands', 'UM' => 'Förenta staternas mindre öar i Oceanien och Västindien',
'US' => 'United States', 'US' => 'USA',
'UY' => 'Uruguay', 'UY' => 'Uruguay',
'UZ' => 'Uzbekistan', 'UZ' => 'Uzbekistan',
'VA' => 'Holy See (Vatican City State)', 'VA' => 'Vatikanstaten',
'VC' => 'Saint Vincent and the Grenadines', 'VC' => 'Saint Vincent och Grenadinerna',
'VE' => 'Venezuela, Bolivarian Republic of', 'VE' => 'Venezuela',
'VG' => 'Virgin Islands, British', 'VG' => 'Brittiska Jungfruöarna',
'VI' => 'Virgin Islands, U.S.', 'VI' => 'Amerikanska Jungfruöarna.',
'VN' => 'Viet Nam', 'VN' => 'Vietnam',
'VU' => 'Vanuatu', 'VU' => 'Vanuatu',
'WF' => 'Wallis and Futuna', 'WF' => 'Wallis- och Futunaöarna',
'WS' => 'Samoa', 'WS' => 'Samoa',
'YE' => 'Yemen', 'YE' => 'Jemen',
'YT' => 'Mayotte', 'YT' => 'Mayotte',
'ZA' => 'South Africa', 'ZA' => 'Sydafrika',
'ZM' => 'Zambia', 'ZM' => 'Zambia',
'ZW' => 'Zimbabwe', 'ZW' => 'Zimbabwe',
]; ];

View File

@ -9,20 +9,20 @@ declare(strict_types=1);
*/ */
return [ return [
'home' => 'Admin dashboard', 'home' => 'Admin kontrollpanel',
'welcome_message' => 'Welcome to the admin area!', 'welcome_message' => 'Välkommen till adminområdet!',
'podcasts' => [ 'podcasts' => [
'title' => 'Podcasts', 'title' => 'Podcasts',
'not_found' => 'No published podcast', 'not_found' => 'Ingen publicerad podcast',
'last_published' => 'Last published on {lastPublicationDate}', 'last_published' => 'Senast publicerad den {lastPublicationDate}',
], ],
'episodes' => [ 'episodes' => [
'title' => 'Episodes', 'title' => 'Avsnitt',
'not_found' => 'No published episode', 'not_found' => 'Inga publicerade avsnitt',
'last_published' => 'Last published on {lastPublicationDate}', 'last_published' => 'Senast publicerad den {lastPublicationDate}',
], ],
'storage' => [ 'storage' => [
'title' => 'Storage', 'title' => 'Lagring',
'subtitle' => '{totalUploaded} out of {totalStorage}', 'subtitle' => '{totalUploaded} av {totalStorage}',
], ],
]; ];

Some files were not shown because too many files have changed in this diff Show More