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

View File

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

View File

@ -18,12 +18,12 @@ return [
'follow' => 'Fylg',
'followTitle' => 'Fylg {actorDisplayName} på fødiverset!',
'followers' => '{numberOfFollowers, plural,
one {# follower}
other {# followers}
one {# fylgjar}
other {# fylgjarar}
}',
'posts' => '{numberOfPosts, plural,
one {# post}
other {# posts}
one {# innlegg}
other {# innlegg}
}',
'activity' => 'Aktivitet',
'episodes' => 'Episodar',
@ -32,14 +32,14 @@ return [
'stats' => [
'title' => 'Statistikk',
'number_of_seasons' => '{0, plural,
one {# season}
other {# seasons}
one {# sesong}
other {# sesongar}
}',
'number_of_episodes' => '{0, plural,
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',
'funding_links' => 'Finansieringslenker for {podcastTitle}',

View File

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

View File

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

View File

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

View File

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

View File

@ -9,12 +9,12 @@ declare(strict_types=1);
*/
return [
'all_podcasts' => 'All podcasts',
'sort_by' => 'Sort by',
'all_podcasts' => 'Alla podcasts',
'sort_by' => 'Sortera efter',
'sort_options' => [
'activity' => 'Recent activity',
'created_desc' => 'Newest first',
'created_asc' => 'Oldest first',
'activity' => 'Senaste aktivitet',
'created_desc' => 'Nyaste först',
'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 [
'back_to_home' => 'Back to home',
'back_to_home' => 'Tillbaka till startsidan',
'map' => [
'title' => 'Map',
'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.',
'title' => 'Karta',
'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 [
'feed' => 'RSS Podcast feed',
'season' => 'Season {seasonNumber}',
'list_of_episodes_year' => '{year} episodes ({episodeCount})',
'feed' => 'RSS Podcast flöde',
'season' => 'Säsong {seasonNumber}',
'list_of_episodes_year' => '{year} avsnitt ({episodeCount})',
'list_of_episodes_season' =>
'Season {seasonNumber} episodes ({episodeCount})',
'no_episode' => 'No episode found!',
'follow' => 'Follow',
'followTitle' => 'Follow {actorDisplayName} on the fediverse!',
'Säsong {seasonNumber} avsnitt ({episodeCount})',
'no_episode' => 'Inga avsnitt hittades!',
'follow' => 'Följ',
'followTitle' => 'Följ {actorDisplayName} på fediverse!',
'followers' => '{numberOfFollowers, plural,
one {# follower}
other {# followers}
one {# följare}
other {# följare}
}',
'posts' => '{numberOfPosts, plural,
one {# post}
other {# posts}
one {# inlägg}
other {# inlägg}
}',
'activity' => 'Activity',
'episodes' => 'Episodes',
'episodes_title' => 'Episodes of {podcastTitle}',
'about' => 'About',
'activity' => 'Aktivitet',
'episodes' => 'Avsnitt',
'episodes_title' => 'Avsnitt av {podcastTitle}',
'about' => 'Om',
'stats' => [
'title' => 'Stats',
'title' => 'Statistik',
'number_of_seasons' => '{0, plural,
one {# season}
other {# seasons}
one {# säsong}
other {# säsonger}
}',
'number_of_episodes' => '{0, plural,
one {# episode}
other {# episodes}
one {# avsnitt}
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',
'funding_links' => 'Funding links for {podcastTitle}',
'find_on' => 'Find {podcastTitle} on',
'listen_on' => 'Listen on',
'funding_links' => 'Finansiera länkar för {podcastTitle}',
'find_on' => 'Hitta {podcastTitle} på',
'listen_on' => 'Lyssna på',
'persons' => '{personsCount, plural,
one {# person}
other {# persons}
other {# personer}
}',
'persons_list' => 'Persons',
'persons_list' => 'Personer',
];

View File

@ -9,32 +9,32 @@ declare(strict_types=1);
*/
return [
'title' => "{actorDisplayName}'s post",
'back_to_actor_posts' => 'Back to {actor} posts',
'actor_shared' => '{actor} shared',
'reply_to' => 'Reply to @{actorUsername}',
'title' => "{actorDisplayName}s inlägg",
'back_to_actor_posts' => 'Tillbaka till {actor} inlägg',
'actor_shared' => '{actor} delades',
'reply_to' => 'Svara på @{actorUsername}',
'form' => [
'message_placeholder' => 'Write a message…',
'episode_message_placeholder' => 'Write a message for the episode…',
'episode_url_placeholder' => 'Episode URL',
'reply_to_placeholder' => 'Reply to @{actorUsername}',
'submit' => 'Send',
'submit_reply' => 'Reply',
'message_placeholder' => 'Skriv ett meddelande…',
'episode_message_placeholder' => 'Skriv ett meddelande för avsnittet…',
'episode_url_placeholder' => 'Avsnitt URL',
'reply_to_placeholder' => 'Svara på @{actorUsername}',
'submit' => 'Skicka',
'submit_reply' => 'Svara',
],
'favourites' => '{numberOfFavourites, plural,
one {# favourite}
other {# favourites}
one {# favorit}
other {# favoriter}
}',
'reblogs' => '{numberOfReblogs, plural,
one {# share}
other {# shares}
one {# delning}
other {# delningar}
}',
'replies' => '{numberOfReplies, plural,
one {# reply}
other {# replies}
one {# svar}
other {# svar}
}',
'expand' => 'Expand post',
'block_actor' => 'Block user @{actorUsername}',
'block_domain' => 'Block domain @{actorDomain}',
'delete' => 'Delete post',
'expand' => 'Expandera inlägg',
'block_actor' => 'Blockera användare @{actorUsername}',
'block_domain' => 'Blockera domän @{actorDomain}',
'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
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:
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
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
can be added as a cache handler.
@ -21,6 +23,8 @@ can be added as a cache handler.
- `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build
- `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
@ -33,7 +37,7 @@ can be added as a cache handler.
services:
app:
image: castopod/app:beta
image: castopod/app:latest
container_name: "castopod-app"
volumes:
- castopod-media:/opt/castopod/public/media
@ -51,7 +55,7 @@ can be added as a cache handler.
restart: unless-stopped
web-server:
image: castopod/web-server:beta
image: castopod/web-server:latest
container_name: "castopod-web-server"
volumes:
- castopod-media:/var/www/html/media
@ -83,6 +87,21 @@ can be added as a cache handler.
networks:
- 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:
castopod-media:
castopod-db:
@ -115,6 +134,16 @@ can be added as a cache handler.
## 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**
| 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
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:
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
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
can be added as a cache handler.
@ -21,6 +23,8 @@ can be added as a cache handler.
- `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build
- `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
@ -33,7 +37,7 @@ can be added as a cache handler.
services:
app:
image: castopod/app:beta
image: castopod/app:latest
container_name: "castopod-app"
volumes:
- castopod-media:/opt/castopod/public/media
@ -51,7 +55,7 @@ can be added as a cache handler.
restart: unless-stopped
web-server:
image: castopod/web-server:beta
image: castopod/web-server:latest
container_name: "castopod-web-server"
volumes:
- castopod-media:/var/www/html/media
@ -83,6 +87,21 @@ can be added as a cache handler.
networks:
- 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:
castopod-media:
castopod-db:
@ -115,6 +134,16 @@ can be added as a cache handler.
## 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**
| 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
Castopod envia 2 imatges de Docker al Docker Hub durant el seu procés de creació
automatitzada:
Castopod pushes 3 Docker images to the Docker Hub during its automated build
process:
- [** code>castopod/app</code>**](https://hub.docker.com/r/castopod/app): el
paquet incloent Castopod i totes les dependències
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): una
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
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
- `beta` [stable], latest beta version build
- `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
@ -33,7 +37,7 @@ una base de dades Redis com a gestor de memòria cau.
services:
app:
image: castopod/app:beta
image: castopod/app:latest
container_name: "castopod-app"
volumes:
- 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
web-server:
image: castopod/web-server:beta
image: castopod/web-server:latest
container_name: "castopod-web-server"
volumes:
- castopod-media:/var/www/html/media
@ -83,6 +87,21 @@ una base de dades Redis com a gestor de memòria cau.
networks:
- 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:
castopod-media:
castopod-db:
@ -117,9 +136,19 @@ una base de dades Redis com a gestor de memòria cau.
## 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**
| Nom de la variable | Tipus (`default`) | Default |
| Nom de la variable | Type (`default`) | Default |
| ---------------------------- | ----------------------- | ---------------- |
| **`CP_BASEURL`** | string | `undefined` |
| **`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**
| Nom de la variable | Type | Default |
| Variable name | Type | Default |
| --------------------- | ------- | ------- |
| **`CP_APP_HOSTNAME`** | ?string | `"app"` |

View File

@ -87,8 +87,8 @@ descentralització i així garantir que la creativitat dels podcasters pugui
expressar-se.
Aquest projecte és impulsat per la comunitat de codi obert, i concretament pels
moviments [Fediverse](https://fediverse.party/en/fediverse/) i [Podcasting
2.0](https://podcastindex .org/).
moviments [Fediverse](https://fediverse.party/en/fediverse/) i \[Podcasting
2.0\](https://podcastindex .org/).
## 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
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:
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
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
can be added as a cache handler.
@ -21,6 +23,8 @@ can be added as a cache handler.
- `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build
- `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
@ -33,7 +37,7 @@ can be added as a cache handler.
services:
app:
image: castopod/app:beta
image: castopod/app:latest
container_name: "castopod-app"
volumes:
- castopod-media:/opt/castopod/public/media
@ -51,7 +55,7 @@ can be added as a cache handler.
restart: unless-stopped
web-server:
image: castopod/web-server:beta
image: castopod/web-server:latest
container_name: "castopod-web-server"
volumes:
- castopod-media:/var/www/html/media
@ -83,6 +87,21 @@ can be added as a cache handler.
networks:
- 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:
castopod-media:
castopod-db:
@ -115,6 +134,16 @@ can be added as a cache handler.
## 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**
| 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
# […]
# […]
email.fromEmail="your_email_address"
email.SMTPHost="your_smtp_host"
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
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:
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
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
can be added as a cache handler.
@ -21,6 +23,8 @@ can be added as a cache handler.
- `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build
- `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
@ -33,7 +37,7 @@ can be added as a cache handler.
services:
app:
image: castopod/app:beta
image: castopod/app:latest
container_name: "castopod-app"
volumes:
- castopod-media:/opt/castopod/public/media
@ -51,7 +55,7 @@ can be added as a cache handler.
restart: unless-stopped
web-server:
image: castopod/web-server:beta
image: castopod/web-server:latest
container_name: "castopod-web-server"
volumes:
- castopod-media:/var/www/html/media
@ -83,6 +87,21 @@ can be added as a cache handler.
networks:
- 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:
castopod-media:
castopod-db:
@ -115,6 +134,16 @@ can be added as a cache handler.
## 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**
| 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
Castopod lanza 2 imágenes Docker al Docker Hub durante su proceso de
construcción automatizada:
Castopod pushes 3 Docker images to the Docker Hub during its automated build
process:
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): el paquete
completo de Castopod con todas las dependencias.
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): una
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.
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
- `beta` [stable], latest beta version build
- `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
@ -33,7 +37,7 @@ También se puede añadir una base de datos Redis como gestor de caché.
services:
app:
image: castopod/app:beta
image: castopod/app:latest
container_name: "castopod-app"
volumes:
- 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
web-server:
image: castopod/web-server:beta
image: castopod/web-server:latest
container_name: "castopod-web-server"
volumes:
- 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:
- 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:
castopod-media:
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
Castopod!
5. Todo listo, empieza a hacer podcasting! 🎙️🚀
5. Todo listo, empieza a hacer podcasting! 🎙️🚀 🎙️🚀
## 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**
| Nombre de la Variable | Tipo (`predeterminado`) | Default |
| Nombre de la variable | Type (`default`) | Default |
| ---------------------------- | ----------------------- | ---------------- |
| **`CP_URLBASE`** | string | `undefined` |
| **`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**
| Nombre de la variable | Type | Default |
| Variable name | Type | Default |
| --------------------- | ------- | ------- |
| **`CP_APP_HOSTNAME`** | ?string | `"app"` |

View File

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

View File

@ -66,7 +66,7 @@ Releases may come with additional update instructions (see
## Fully Automated updates
> Próximamente... 👀
> Próximamente...
## Preguntas Frecuentes (FAQ)
@ -80,9 +80,9 @@ file.
### No he actualizado mi instancia en mucho tiempo… ¿Qué debo hacer?
No problem! Just get the latest release as described above. Only, when going
through the release instructions (4), perform them sequentially, from the oldest
to the newest.
No problem! No problem! Just get the latest release as described above. Only,
when going through the release instructions (4), perform them sequentially, from
the oldest to the newest.
> Puede que quieras hacer una copia de seguridad de tu instancia dependiendo del
> 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
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!
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
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:
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
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
can be added as a cache handler.
@ -21,6 +23,8 @@ can be added as a cache handler.
- `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build
- `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
@ -33,7 +37,7 @@ can be added as a cache handler.
services:
app:
image: castopod/app:beta
image: castopod/app:latest
container_name: "castopod-app"
volumes:
- castopod-media:/opt/castopod/public/media
@ -51,7 +55,7 @@ can be added as a cache handler.
restart: unless-stopped
web-server:
image: castopod/web-server:beta
image: castopod/web-server:latest
container_name: "castopod-web-server"
volumes:
- castopod-media:/var/www/html/media
@ -83,6 +87,21 @@ can be added as a cache handler.
networks:
- 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:
castopod-media:
castopod-db:
@ -115,6 +134,16 @@ can be added as a cache handler.
## 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**
| 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
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:
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
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
can be added as a cache handler.
@ -21,6 +23,8 @@ can be added as a cache handler.
- `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build
- `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
@ -33,7 +37,7 @@ can be added as a cache handler.
services:
app:
image: castopod/app:beta
image: castopod/app:latest
container_name: "castopod-app"
volumes:
- castopod-media:/opt/castopod/public/media
@ -51,7 +55,7 @@ can be added as a cache handler.
restart: unless-stopped
web-server:
image: castopod/web-server:beta
image: castopod/web-server:latest
container_name: "castopod-web-server"
volumes:
- castopod-media:/var/www/html/media
@ -83,6 +87,21 @@ can be added as a cache handler.
networks:
- 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:
castopod-media:
castopod-db:
@ -115,6 +134,16 @@ can be added as a cache handler.
## 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**
| 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
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:
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
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
can be added as a cache handler.
@ -21,6 +23,8 @@ can be added as a cache handler.
- `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build
- `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
@ -33,7 +37,7 @@ can be added as a cache handler.
services:
app:
image: castopod/app:beta
image: castopod/app:latest
container_name: "castopod-app"
volumes:
- castopod-media:/opt/castopod/public/media
@ -51,7 +55,7 @@ can be added as a cache handler.
restart: unless-stopped
web-server:
image: castopod/web-server:beta
image: castopod/web-server:latest
container_name: "castopod-web-server"
volumes:
- castopod-media:/var/www/html/media
@ -83,6 +87,21 @@ can be added as a cache handler.
networks:
- 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:
castopod-media:
castopod-db:
@ -115,6 +134,16 @@ can be added as a cache handler.
## 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**
| 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/%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/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
[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
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:
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
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
can be added as a cache handler.
@ -21,6 +23,8 @@ can be added as a cache handler.
- `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build
- `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
@ -33,7 +37,7 @@ can be added as a cache handler.
services:
app:
image: castopod/app:beta
image: castopod/app:latest
container_name: "castopod-app"
volumes:
- castopod-media:/opt/castopod/public/media
@ -51,7 +55,7 @@ can be added as a cache handler.
restart: unless-stopped
web-server:
image: castopod/web-server:beta
image: castopod/web-server:latest
container_name: "castopod-web-server"
volumes:
- castopod-media:/var/www/html/media
@ -83,6 +87,21 @@ can be added as a cache handler.
networks:
- 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:
castopod-media:
castopod-db:
@ -115,6 +134,16 @@ can be added as a cache handler.
## 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**
| 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
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:
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
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
can be added as a cache handler.
@ -21,6 +23,8 @@ can be added as a cache handler.
- `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build
- `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
@ -33,7 +37,7 @@ can be added as a cache handler.
services:
app:
image: castopod/app:beta
image: castopod/app:latest
container_name: "castopod-app"
volumes:
- castopod-media:/opt/castopod/public/media
@ -51,7 +55,7 @@ can be added as a cache handler.
restart: unless-stopped
web-server:
image: castopod/web-server:beta
image: castopod/web-server:latest
container_name: "castopod-web-server"
volumes:
- castopod-media:/var/www/html/media
@ -83,6 +87,21 @@ can be added as a cache handler.
networks:
- 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:
castopod-media:
castopod-db:
@ -115,6 +134,16 @@ can be added as a cache handler.
## 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**
| 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
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:
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
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
can be added as a cache handler.
@ -21,6 +23,8 @@ can be added as a cache handler.
- `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build
- `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
@ -33,7 +37,7 @@ can be added as a cache handler.
services:
app:
image: castopod/app:beta
image: castopod/app:latest
container_name: "castopod-app"
volumes:
- castopod-media:/opt/castopod/public/media
@ -51,7 +55,7 @@ can be added as a cache handler.
restart: unless-stopped
web-server:
image: castopod/web-server:beta
image: castopod/web-server:latest
container_name: "castopod-web-server"
volumes:
- castopod-media:/var/www/html/media
@ -83,6 +87,21 @@ can be added as a cache handler.
networks:
- 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:
castopod-media:
castopod-db:
@ -115,6 +134,16 @@ can be added as a cache handler.
## 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**
| 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
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:
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
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
can be added as a cache handler.
@ -21,6 +23,8 @@ can be added as a cache handler.
- `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build
- `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
@ -33,7 +37,7 @@ can be added as a cache handler.
services:
app:
image: castopod/app:beta
image: castopod/app:latest
container_name: "castopod-app"
volumes:
- castopod-media:/opt/castopod/public/media
@ -51,7 +55,7 @@ can be added as a cache handler.
restart: unless-stopped
web-server:
image: castopod/web-server:beta
image: castopod/web-server:latest
container_name: "castopod-web-server"
volumes:
- castopod-media:/var/www/html/media
@ -83,6 +87,21 @@ can be added as a cache handler.
networks:
- 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:
castopod-media:
castopod-db:
@ -115,6 +134,16 @@ can be added as a cache handler.
## 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**
| 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
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:
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
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
can be added as a cache handler.
@ -21,6 +23,8 @@ can be added as a cache handler.
- `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build
- `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
@ -33,7 +37,7 @@ can be added as a cache handler.
services:
app:
image: castopod/app:beta
image: castopod/app:latest
container_name: "castopod-app"
volumes:
- castopod-media:/opt/castopod/public/media
@ -51,7 +55,7 @@ can be added as a cache handler.
restart: unless-stopped
web-server:
image: castopod/web-server:beta
image: castopod/web-server:latest
container_name: "castopod-web-server"
volumes:
- castopod-media:/var/www/html/media
@ -83,6 +87,21 @@ can be added as a cache handler.
networks:
- 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:
castopod-media:
castopod-db:
@ -115,6 +134,16 @@ can be added as a cache handler.
## 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**
| 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
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:
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
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
can be added as a cache handler.
@ -21,6 +23,8 @@ can be added as a cache handler.
- `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build
- `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
@ -33,7 +37,7 @@ can be added as a cache handler.
services:
app:
image: castopod/app:beta
image: castopod/app:latest
container_name: "castopod-app"
volumes:
- castopod-media:/opt/castopod/public/media
@ -51,7 +55,7 @@ can be added as a cache handler.
restart: unless-stopped
web-server:
image: castopod/web-server:beta
image: castopod/web-server:latest
container_name: "castopod-web-server"
volumes:
- castopod-media:/var/www/html/media
@ -83,6 +87,21 @@ can be added as a cache handler.
networks:
- 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:
castopod-media:
castopod-db:
@ -115,6 +134,16 @@ can be added as a cache handler.
## 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**
| 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/%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/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
[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
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:
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
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
can be added as a cache handler.
@ -21,6 +23,8 @@ can be added as a cache handler.
- `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build
- `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
@ -33,7 +37,7 @@ can be added as a cache handler.
services:
app:
image: castopod/app:beta
image: castopod/app:latest
container_name: "castopod-app"
volumes:
- castopod-media:/opt/castopod/public/media
@ -51,7 +55,7 @@ can be added as a cache handler.
restart: unless-stopped
web-server:
image: castopod/web-server:beta
image: castopod/web-server:latest
container_name: "castopod-web-server"
volumes:
- castopod-media:/var/www/html/media
@ -83,6 +87,21 @@ can be added as a cache handler.
networks:
- 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:
castopod-media:
castopod-db:
@ -115,6 +134,16 @@ can be added as a cache handler.
## 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**
| 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/%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/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
[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
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:
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
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
can be added as a cache handler.
@ -21,6 +23,8 @@ can be added as a cache handler.
- `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build
- `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
@ -33,7 +37,7 @@ can be added as a cache handler.
services:
app:
image: castopod/app:beta
image: castopod/app:latest
container_name: "castopod-app"
volumes:
- castopod-media:/opt/castopod/public/media
@ -51,7 +55,7 @@ can be added as a cache handler.
restart: unless-stopped
web-server:
image: castopod/web-server:beta
image: castopod/web-server:latest
container_name: "castopod-web-server"
volumes:
- castopod-media:/var/www/html/media
@ -83,6 +87,21 @@ can be added as a cache handler.
networks:
- 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:
castopod-media:
castopod-db:
@ -115,6 +134,16 @@ can be added as a cache handler.
## 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**
| 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
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:
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
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
can be added as a cache handler.
@ -21,6 +23,8 @@ can be added as a cache handler.
- `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build
- `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
@ -33,7 +37,7 @@ can be added as a cache handler.
services:
app:
image: castopod/app:beta
image: castopod/app:latest
container_name: "castopod-app"
volumes:
- castopod-media:/opt/castopod/public/media
@ -51,7 +55,7 @@ can be added as a cache handler.
restart: unless-stopped
web-server:
image: castopod/web-server:beta
image: castopod/web-server:latest
container_name: "castopod-web-server"
volumes:
- castopod-media:/var/www/html/media
@ -83,6 +87,21 @@ can be added as a cache handler.
networks:
- 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:
castopod-media:
castopod-db:
@ -115,6 +134,16 @@ can be added as a cache handler.
## 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**
| 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
# […]
# […]
email.fromEmail="your_email_address"
email.SMTPHost="your_smtp_host"
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
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:
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
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
can be added as a cache handler.
@ -21,6 +23,8 @@ can be added as a cache handler.
- `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build
- `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
@ -33,7 +37,7 @@ can be added as a cache handler.
services:
app:
image: castopod/app:beta
image: castopod/app:latest
container_name: "castopod-app"
volumes:
- castopod-media:/opt/castopod/public/media
@ -51,7 +55,7 @@ can be added as a cache handler.
restart: unless-stopped
web-server:
image: castopod/web-server:beta
image: castopod/web-server:latest
container_name: "castopod-web-server"
volumes:
- castopod-media:/var/www/html/media
@ -83,6 +87,21 @@ can be added as a cache handler.
networks:
- 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:
castopod-media:
castopod-db:
@ -115,6 +134,16 @@ can be added as a cache handler.
## 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**
| 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
# […]
# […]
email.fromEmail="your_email_address"
email.SMTPHost="your_smtp_host"
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
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:
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
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
can be added as a cache handler.
@ -21,6 +23,8 @@ can be added as a cache handler.
- `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build
- `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
@ -33,7 +37,7 @@ can be added as a cache handler.
services:
app:
image: castopod/app:beta
image: castopod/app:latest
container_name: "castopod-app"
volumes:
- castopod-media:/opt/castopod/public/media
@ -51,7 +55,7 @@ can be added as a cache handler.
restart: unless-stopped
web-server:
image: castopod/web-server:beta
image: castopod/web-server:latest
container_name: "castopod-web-server"
volumes:
- castopod-media:/var/www/html/media
@ -83,6 +87,21 @@ can be added as a cache handler.
networks:
- 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:
castopod-media:
castopod-db:
@ -115,6 +134,16 @@ can be added as a cache handler.
## 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**
| 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
# […]
# […]
email.fromEmail="your_email_address"
email.SMTPHost="your_smtp_host"
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
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:
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
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
can be added as a cache handler.
@ -21,6 +23,8 @@ can be added as a cache handler.
- `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build
- `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
@ -33,7 +37,7 @@ can be added as a cache handler.
services:
app:
image: castopod/app:beta
image: castopod/app:latest
container_name: "castopod-app"
volumes:
- castopod-media:/opt/castopod/public/media
@ -51,7 +55,7 @@ can be added as a cache handler.
restart: unless-stopped
web-server:
image: castopod/web-server:beta
image: castopod/web-server:latest
container_name: "castopod-web-server"
volumes:
- castopod-media:/var/www/html/media
@ -83,6 +87,21 @@ can be added as a cache handler.
networks:
- 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:
castopod-media:
castopod-db:
@ -115,6 +134,16 @@ can be added as a cache handler.
## 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**
| 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
---
# 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:
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): the app bundle
with all of Castopod dependencies
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): an
Nginx configuration for Castopod
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): apppaketet med
alla Castopod-beroenden
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): en
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
can be added as a cache handler.
Dessutom kräver Castopod en MySQL-kompatibel databas. En Redis databas kan
läggas till som cachehanterare.
## Supported tags
## Taggar som stöds
- `develop` [unstable], latest development branch build
- `beta` [stable], latest beta version build
- `1.0.0-beta.x` [stable], specific beta version build (since `1.0.0-beta.22`)
- `utveckla` [unstable], senaste utvecklingsgrenen
- `beta` [stable], senaste betaversionen bygger
- `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
[docker-compose](https://docs.docker.com/compose/install/)
2. Create a `docker-compose.yml` file with the following:
1. Installera [docker](https://docs.docker.com/get-docker/) och
[docker-komponera](https://docs.docker.com/compose/install/)
2. Skapa en `docker-compose.yml` fil med följande:
```yml
version: "3.7"
services:
app:
image: castopod/app:beta
image: castopod/app:latest
container_name: "castopod-app"
volumes:
- castopod-media:/opt/castopod/public/media
@ -51,7 +55,7 @@ can be added as a cache handler.
restart: unless-stopped
web-server:
image: castopod/web-server:beta
image: castopod/web-server:latest
container_name: "castopod-web-server"
volumes:
- castopod-media:/var/www/html/media
@ -83,6 +87,21 @@ can be added as a cache handler.
networks:
- 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:
castopod-media:
castopod-db:
@ -93,13 +112,14 @@ can be added as a cache handler.
castopod-db:
```
You have to adapt some variables to your needs (e.g. `CP_BASEURL`,
`MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`).
Du måste anpassa vissa variabler efter dina behov (t.ex. `CP_BASEURL`,
`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
a reverse proxy, for example with [Caddy](https://caddyserver.com/):
TLS är obligatoriskt för ActivityPub att arbeta. Detta jobb kan enkelt
hanteras av en omvänd proxy, till exempel med
[Caddy](https://caddyserver.com/):
```
#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
`https://castopod.example.com/cp-install` to finish setting up Castopod!
4. Kör `docker-komponera upp -d`, vänta på att den initieras och gå vidare till
`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**
| 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_ADMIN_GATEWAY`** | ?string | `"cp-admin"` |
| **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` |
| **`CP_ANALYTICS_SALT`** | string | `undefined` |
| **`CP_ANALYTICS_SALT`** | string | `odefinierad` |
| **`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_"` |
| **`CP_CACHE_HANDLER`** | [`"file"` or `"redis"`] | `"file"` |
| **`CP_CACHE_HANDLER`** | [`"file"` `"redis"`] | `"file"` |
| **`CP_REDIS_HOST`** | ?string | `"localhost"` |
| **`CP_REDIS_PASSWORD`** | ?string | `null` |
| **`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_PASSWORD`** | ?string | `null` |
| **`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**
| Variable name | Type | Default |
| Variable name | Typ | Default |
| --------------------- | ------- | ------- |
| **`CP_APP_HOSTNAME`** | ?string | `"app"` |

View File

@ -3,25 +3,26 @@ title: Installation
sidebarDepth: 3
---
# How to install Castopod?
# Hur man installerar Castopod?
Castopod was thought-out to be easy to install. Whether using dedicated or
shared hosting, you can install it on most PHP-MySQL compatible web servers.
Castopod var tänkt att vara lätt att installera. Oavsett om du använder
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
[docker documentation](./docker.md) for Castopod.
Om du föredrar att använda Docker, kan du hoppa över detta och gå direkt till
[dockerdokumentationen](./docker.md) för Castopod.
:::
## Requirements
## Krav
- PHP v8.1 or higher
- MySQL version 5.7 or higher or MariaDB version 10.2 or higher
- HTTPS support
- MySQL version 5.7 eller högre eller MariaDB version 10.2 eller högre
- Stöd för HTTPS
### 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)
- [libcurl](https://php.net/manual/en/curl.requirements.php)
- [mbstring](https://php.net/manual/en/mbstring.installation.php)
- [gd](https://www.php.net/manual/en/image.installation.php) with **JPEG**,
**PNG** and **WEBP** libraries.
- [gd](https://www.php.net/manual/en/image.installation.php) med **JPEG**,
**PNG** och **WEBP** bibliotek.
- [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)
- xml (enabled by default - don't turn it off)
- json (aktiverad som standard - stäng inte av)
- xml (aktiverat som standard - stäng inte av)
- [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
will break with the previous MySQL v5.6 for example as its end of life was on
February 5, 2021.
Castopod fungerar endast med stödda MySQL 5.7 eller högre kompatibla databaser.
Den kommer att bryta med den tidigare MySQL v5.6 till exempel eftersom dess slut
var den 5 februari 2021.
:::
You will need the server hostname, database name, username and password to
complete the installation process. If you do not have these, please contact your
server administrator.
Du behöver serverns värdnamn, databasnamn, användarnamn och lösenord för att
slutföra installationen. Om du inte har dessa kontaktar du din
serveradministratör.
#### Privileges
#### Privilegier
User must have at least these privileges on the database for Castopod to work:
`CREATE`, `ALTER`, `DELETE`, `EXECUTE`, `INDEX`, `INSERT`, `SELECT`, `UPDATE`,
`REFERENCES`, `CREATE VIEW`.
Användare måste ha minst dessa rättigheter i databasen för att Castopod ska
fungera: `CREATE`, `ALTER`, `DELETE`, `EXECUTE`, `INDEX`, `INSERT`, `SELECT`,
`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
want to generate Video Clips. The following extensions must be installed:
[FFmpeg](https://www.ffmpeg.org/) version 4.1.8 eller högre krävs om du vill
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).
### (Optional) Other recommendations
### (Valfritt) Andra rekommendationer
- Redis for better cache performances.
- CDN for static files caching and better performances.
- e-mail gateway for lost passwords.
- Redis för bättre cache-prestanda.
- CDN för statiska filer caching och bättre prestanda.
- 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
1. Create a MySQL database for Castopod with a user having access and
modification privileges (for more info, see
[MySQL compatible database](#mysql-compatible-database)).
2. Activate HTTPS on your domain with an _SSL certificate_.
3. Download and unzip the latest [Castopod Package](https://castopod.org/) onto
the web server if you havent already.
- ⚠️ Set the web server document root to the `public/` sub-folder within the
`castopod` folder.
4. Add **cron tasks** on your web server for various background processes
(replace the paths accordingly):
0. Skaffa en webbserver med [krav](#requirements) installerat
1. Skapa en MySQL-databas för Castopod med en användare som har åtkomst till och
modifieringsrättigheter (för mer info, se
[MySQL-kompatibel databas](#mysql-compatible-database)).
2. Aktivera HTTPS på din domän med ett _SSL-certifikat_.
3. Ladda ner och packa upp det senaste [Castopod Package](https://castopod.org/)
på webbservern om du inte redan har det.
- ⚠️ Sätt webbserverdokumentroten till `public/` undermappen i mappen
`castopod`.
4. Lägg till **cron-uppgifter** på din webbserver för olika bakgrundsprocesser
(byt ut sökvägarna därefter):
- For social features to work properly, this task is used to broadcast social
activities to your followers on the fediverse:
- För att sociala funktioner ska fungera korrekt, används denna uppgift för
att sända sociala aktiviteter till dina anhängare på fediverse:
```bash
* * * * * /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):
```bash
* * * * * /usr/local/bin/php /castopod/public/index.php scheduled-websub-publish
```
- For Video Clips to be created (see
[FFmpeg requirements](#ffmpeg-v418-or-higher-for-video-clips)):
- För att videoklipp ska skapas (se
[FFmpeg krav](#ffmpeg-v418-or-higher-for-video-clips)):
```bash
* * * * * /path/to/php /path/to/castopod/public/index.php scheduled-video-clips
```
> These tasks run **every minute**. You may set the frequency depending on
> your needs: every 5, 10 minutes or more.
> Dessa uppgifter körs **varje minut**. Du kan ställa in frekvensen beroende
> 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
(`https://your_domain_name.com/cp-install`) in your favorite web browser.
2. Follow the instructions on your screen.
3. Start podcasting!
1. Kör Castopod install script genom att gå till installationsguiden sidan
(`https://your_domain_name.com/cp-install`) i din favorit webbläsare.
2. Följ instruktionerna på din enhet.
3. Börja podcasting!
::: info Note
::: info Notering
The install script writes a `.env` file in the package root. If you cannot go
through the install wizard, you can create and edit the `.env` file manually
based on the `.env.example` file.
Installationsskriptet skriver en `.env` -fil i paketroten. Om du inte kan gå via
installationsguiden kan du skapa och redigera `. nv` filen manuellt baserat på
`.env.example` filen.
:::
### Email/SMTP setup
Email configuration is required for some features to work properly (eg.
retrieving your forgotten password, sending instructions to premium subscribers,
E-postkonfiguration krävs för att vissa funktioner ska fungera korrekt (t.ex.
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
# […]
@ -148,33 +149,33 @@ email.SMTPUser="your_smtp_user"
email.SMTPPass="your_smtp_password"
```
#### Email config options
#### Alternativ för e-postkonfiguration
| Variable name | Type | Default |
| ---------------- | -------------------- | ------------ |
| **`fromEmail`** | string | `undefined` |
| **`fromName`** | string | `"Castopod"` |
| **`SMTPHost`** | string | `undefined` |
| **`SMTPUser`** | string | `undefined` |
| **`SMTPPass`** | string | `undefined` |
| **`SMTPPort`** | number | `25` |
| **`SMTPCrypto`** | [`"tls"` or `"ssl"`] | `"tls"` |
| Variabelt namn | Typ | Standard |
| ---------------- | ----------------------- | ------------- |
| **`fromEmail`** | sträng | `odefinierad` |
| **`fromName`** | sträng | `"Castopod"` |
| **`SMTPHost`** | sträng | `odefinierad` |
| **`SMTPUser`** | sträng | `odefinierad` |
| **`SMTPPass`** | sträng | `odefinierad` |
| **`SMTPPort`** | nummer | `25` |
| **`SMTPCrypto`** | [`"tls"` eller `"ssl"`] | `"tls"` |
## Community packages
## Gemenskapspaket
If you don't want to bother with installing Castopod manually, you may use one
of the packages created and maintained by the open-source community.
Om du inte vill bry dig om att installera Castopod manuellt, kan du använda ett
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
made up of free and open-source software packages. It manages the hardships of
self-hosting for you.
[YunoHost](https://yunohost.org/) är en distribution baserad på Debian GNU/Linux
som består av mjukvarupaket med fri och öppen källkod. Det hanterar
svårigheterna med self-hosting för dig.
<div class="flex flex-wrap items-center gap-4">
<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 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
framework that encourages
[good security practices](https://codeigniter.com/user_guide/concepts/security.html).
Castopod är byggt ovanpå [CodeIgniter4](https://codeigniter.com/), ett PHP
ramverk som uppmuntrar
[goda säkerhetsmetoder](https://codeigniter.com/user_guide/concepts/security.html).
To maximize your instance's safety and prevent any malicious attack, we
recommend you update all your Castopod files permissions after installation or
updates (to avoid any prior permission error):
För att maximera din instans säkerhet och förhindra alla skadliga attacker, vi
rekommenderar att du uppdaterar alla dina Castopod-filer behörigheter efter
installation eller uppdateringar (för att undvika eventuella föregående
tillståndsfel):
- `writable/` folder must be **readable** and **writable**.
- `public/media/` folder must be **readable** and **writable**.
- any other file must be set to **readonly**.
- `writable/` mapp måste vara **läsbar** och **skrivbar**.
- `public/media/` mapp måste vara **läsbar** och **skrivbar**.
- 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
following:
Till exempel, om du använder Apache eller NGINX med Ubuntu kan du göra följande:
```bash
sudo chown -R root:root /path/to/castopod

View File

@ -1,109 +1,106 @@
---
title: Update
title: Uppdatera
sidebarDepth: 3
---
# How to update Castopod?
# Hur uppdaterar man Castopod?
After installing Castopod, you may want to update your instance to the latest
version in order to enjoy the latest features ✨, bug fixes 🐛 and performance
improvements ⚡.
Efter att du installerat Castopod, kanske du vill uppdatera din instans till den
senaste -versionen för att njuta av de senaste funktionerna ✨, buggfixar 🐛 och
prestanda förbättringar ⚡.
## Update instructions
## Uppdatera instruktioner
0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
database.
0. ⚠️ Innan någon uppdatering rekommenderar vi starkt att du säkerhetskopierar
dina Castopod-filer och databas.
- 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
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and
see if your instance is up to date with the latest Castopod version
1. Gå till
[releaser sidan](https://code.castopod.org/adaures/castopod/-/releases) och
se om din instans är uppdaterad med den senaste Castopod versionen
- 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
between the `zip` or `tar.gz` archives
2. Ladda ner det senaste utgivningspaketet som heter `Castopod Package`, du kan
välja mellan `zip` eller `tar.gz` arkiv
- ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
- Note that you can also download the latest package from
- ⚠️ Kontrollera att du laddar ner Castopod-paketet och **INTE** källkoden
- Observera att du även kan ladda ner det senaste paketet från
[castopod.org](https://castopod.org/)
3. On your server:
3. På din server:
- Remove all files except `.env` and `public/media`
- Copy the new files from the downloaded package into your server
- Ta bort alla filer utom `.env` och `publik/media`
- 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.
Check [Security Concerns](./security.md).
Du kan behöva återställa filrättigheter som under installationsprocessen.
Kontrollera [säkerhetsbekymmer](./security.md).
:::
4. Update your database schema from your `Castopod Admin` > `About` page or by
running:
4. Uppdatera ditt databasschema från din `Castopod Admin` > `Om` sida eller kör:
```bash
php spark castopod:database-update
```
5. Clear your cache from your `Castopod Admin` > `Settings` > `general` >
`Housekeeping`
6. ✨ Enjoy your fresh instance, you're all done!
5. Rensa din cache från `Castopod Admin` > `Inställningar` > `allmän` >
`Hushållning`
6. ✨ Njut av din färska instans, du är alla klara!
::: info Note
::: info Notering
Releases may come with additional update instructions (see
[releases page](https://code.castopod.org/adaures/castopod/-/releases)).
Utgåvor kan komma med ytterligare uppdateringsinstruktioner (se
[utgåvor sidan](https://code.castopod.org/adaures/castopod/-/releases)).
- 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
corner.
Gå till din Castopod admin-panel, versionen visas längst ner till vänster hörn.
Alternatively, you can find the version in the `app > Config > Constants.php`
file.
Alternativt kan du hitta versionen i `appen > Config > Constants.php` filen.
### 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
through the release instructions (4), perform them sequentially, from the oldest
to the newest.
Inga problem! Bara få den senaste versionen som beskrivs ovan. Endast när du går
genom utgivningsinstruktionerna (4), utför dem sekventiellt, från de äldsta till
de nyaste.
> You may want to backup your instance depending on how long you haven't updated
> Castopod.
> Du kanske vill säkerhetskopiera din instans beroende på hur länge du inte har
> 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`:
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
`public/media`.
1. Ladda ner den senaste utgåvan, skriv över dina filer samtidigt som du
behåller `.env` och `public/media`.
2. Go through each release update instructions sequentially (from oldest to
newest) starting with `v1.0.0-alpha.43`, `v1.0.0-alpha.44`,
2. Gå igenom varje utgåva uppdateringsinstruktioner sekventiellt (från äldsta
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`.
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
database to prevent you from losing it all
Mer generellt, rekommenderar vi att du gör regelbundna säkerhetskopior av dina
Castopod filer och databas för att hindra dig från att förlora allt

View File

@ -2,239 +2,244 @@
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]
Castopod is a free & open-source hosting platform made for podcasters who want
engage and interact with their audience.
Castopod är en gratis hostingplattform med öppen källkod gjord för podcastare
som vill engagera och interagera med sin publik.
Castopod is easy to install and was built on top of
[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very
small footprint.
Castopod är lätt att installera och byggdes ovanpå
[CodeIgniter4](https://codeigniter.com/), ett kraftfullt PHP-ramverk med ett
mycket litet fotavtryck.
::: info Status
Castopod is currently in **beta** but already quite stable and used by
podcasters around&nbsp;the&nbsp;world!
Castopod är för närvarande i **beta** men redan ganska stabil och används av
podcastare runt&nbsp;den&nbsp;världen!
:::
<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>
## Features
## Funktioner
- 🌱 &nbsp;Free & open-source (AGPL v3 License)
- 🔐 &nbsp;Focused on data sovereignty: your content, audience, and analytics
belong to you, and&nbsp;you&nbsp;only
- 🪄 &nbsp;Podcasting 2.0 features: GUID, locked, transcripts, funding,
chapters, location, persons, soundbites, …
- 💬 &nbsp;Built-in social network:
- 🚀 &nbsp;Castopod is part of the Fediverse, a decentralized social network
- ❤️ &nbsp;Create posts, share, favourite, and comment on episodes
- 📈 &nbsp;Built-in analytics:
- ⚖️ &nbsp;GDPR / CCPA / LGPD compliant
- 🪙 &nbsp;Standard IABv2 audience measurement
- 🏡 &nbsp;On-premises analytics, no third party involved
- 📢 &nbsp;Built-in marketing tools:
- 🌱 &nbsp;Gratis & öppen källkod (AGPL v3-licens)
- 🔐 &nbsp;Fokuserad på datasuveränitet: ditt innehåll, målgrupp och analys
tillhör dig, och&nbsp;du&nbsp;bara
- <unk> &nbsp;Podcasting 2.0 funktioner: GUID, låst, avskrifter, finansiering,
kapitel, plats, personer, ljud, …
- 💬 &nbsp;Inbyggt socialt nätverk:
- 🚀 &nbsp;Castopod är en del av Fediverse, ett decentraliserat socialt
nätverk
- ❤️ &nbsp;Skapa inlägg, dela, favorit och kommentera avsnitt
- 📈 &nbsp;Inbyggd analys:
- ⚖️ &nbsp;GDPR / CCPA / LGPD kompatibel
- <unk> &nbsp;Standard IABv2 målgruppsmätning
- 🏡 &nbsp;Lokalanalys, ingen tredje part involverad
- 📢 &nbsp;Inbyggda marknadsföringsverktyg:
- ✅ &nbsp;SEO ready (open-graph meta-tags, JSON-LD, …)
- 📱 &nbsp;PWA: install as a standalone app
- 🎨 &nbsp;Customizable theme colors
- 🎬 &nbsp;Generate ready-to-share Video clips from episodes
- 🔉 &nbsp;Generate soundbites
- ▶️ &nbsp;Embeddable player, embed your episodes on any website
- 📱 &nbsp;PWA: installera som en fristående app
- 🎨 &nbsp;Anpassningsbara temafärger
- 🎬 &nbsp;Generera att dela videoklipp från avsnitt
- 🔉 &nbsp;Generera ljudbitar
- <unk> \_button_selector: &nbsp;Inbäddbar spelare, bädda in dina avsnitt på
valfri webbplats
- 💸 &nbsp;Monetization:
- 🔗 &nbsp;Funding links
- 📲 &nbsp;listen-to-click ads
- 🔗 &nbsp;Finansierar länkar
- 📲 &nbsp;lista-att-klicka annonser
- 🤝 &nbsp;value4value / WebMonetization
- 💎 &nbsp;Premium podcasts
- 📡 &nbsp;Publish your episodes everywhere with RSS:
- 📱 &nbsp;On all indexes and apps: Podcast Index, Apple Podcasts, Spotify,
- 📡 &nbsp;Publicera dina avsnitt överallt med RSS:
- 📱 &nbsp;På alla index och appar: Podcast Index, Apple Podcasts, Spotify,
Google Podcasts, Deezer, Podcast Addict, Podfriend, …
- ⚡ &nbsp;Broadcast your episodes instantly with WebSub
- 📥 &nbsp;Podcast import: move your existing podcast into Castopod
- 📤 &nbsp;Move your podcast out of Castopod
- 🔀 &nbsp;Multi-tenant: host as many podcasts as you want
- 👥 &nbsp;Multi-user: add contributors and set roles
- 🌎 &nbsp;i18n support: translated in English, French, Polish, German,
Brazilian Portuguese & Spanish… with
[more to come](https://translate.castopod.org)!
- ⚡ &nbsp;Sänd dina avsnitt direkt med WebSub
- 📥 &nbsp;Podcast import: flytta din befintliga podcast till Castopod
- 📤 &nbsp;Flytta ut din podcast från Castopod
- :shuffle_tracks<unk> &nbsp;Flera hyresgäst: värd så många podcasts du vill
- 👥 &nbsp;Flera användare: lägg till bidragslämnare och ange roller
- 🌎 &nbsp;i18n support: översatt till engelska, franska, polska, tyska,
brasilianska portugisiska & spanska… med
[mer att komma](https://translate.castopod.org)!
## Motivation
The podcasting ecosystem is decentralized by nature: you can create your podcast
as an RSS file, publish it on the web and have it shared everywhere online.
Den podcasting ekosystem är decentraliserad av naturen: du kan skapa din podcast
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
it is creators finding new ways to share their ideas, or listeners in the search
for better content.
I takt med att användningsområden utvecklas kommer fler och fler människor in i
podcasts: om det är skapare att hitta nya sätt att dela sina idéer, eller
lyssnare i sökningen för bättre innehåll.
With podcasting becoming more widely used, some companies are trying to shift it
towards a more controlled and centralized medium.
När podcasting blir mer allmänt använd försöker vissa företag flytta den till
ett mer kontrollerat och centraliserat medium.
Castopod was created in an effort to provide an open and sustainable alternative
to hosting your podcasts, promoting decentralization to ensure that podcasters
creativity can express itself.
Castopod skapades i ett försök att ge ett öppet och hållbart alternativ för att
vara värd för dina podcasts, främja decentralisering för att säkerställa att
podcastare kreativitet kan uttrycka sig.
This project is pushed by the open-source community, and specifically by the
[Fediverse](https://fediverse.party/en/fediverse/) and
[Podcasting 2.0](https://podcastindex.org/) movements.
Detta projekt drivs av open source-communityn och specifikt av
[Fediverse](https://fediverse.party/en/fediverse/) och
[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
depends on your needs. So, here are comparisons with other tools to help you to
gauge whether Castopod is the right fit for&nbsp;you.
Vi tror att en lösning inte nödvändigtvis är rätt för alla, det mycket beror på
dina behov. Så, här är jämförelser med andra verktyg för att hjälpa dig att mäta
om Castopod är rätt passform för&nbsp;du.
### Castopod vs Wordpress
Castopod is often referred to as "the Wordpress for podcasts" because of the
similarities between the two. In some ways this is true. And actually, Castopod
was greatly inspired by the Wordpress ecosystem, seeing the ease of adoption
from the community and the number of websites running&nbsp;it.
Castopod kallas ofta för "Wordpress för podcasts" på grund av de likheter mellan
de två. På vissa sätt är detta sant. Och faktiskt, Castopod var mycket
inspirerad av Wordpress ekosystem, se lätthet att adoptera från gemenskapen och
antalet webbplatser som kör&nbsp;den.
Just like Wordpress, Castopod is free & open source, built using PHP with a
MySQL database and is packaged in a way that you can easily install on most web
servers.
Precis som Wordpress är Castopod gratis & öppen källkod, byggd med PHP med en
MySQL-databas och är paketerad på ett sätt som du enkelt kan installera på de
flesta webb -servrar.
Wordpress is a great way to create your website and extend it with plugins to
get what you want. It is a full fledged CMS that helps you get any type of
website online.
Wordpress är ett bra sätt att skapa din webbplats och utöka den med plugins för
att få vad du vill. Det är en fullfjädrad CMS som hjälper dig att få någon typ
av webbplats online.
On the other hand, Castopod is meant to address the podcasters needs
specifically, focusing on podcasting, and nothing else. You don't need any
plugin to get you started on your podcasting&nbsp;journey.
Å andra sidan, Castopod är tänkt att ta itu med podcasters behöver specifikt,
med fokus på podcasting, och inget annat. Du behöver inte någon plugin för att
komma igång med din podcasting&nbsp;resa.
This allows optimizing the processes specific to podcasting: ranging from the
creation of your podcasts and the publication of new episodes all the way to
broadcasting, marketing and analytics.
Detta gör det möjligt att optimera de processer som är specifika för podcasting:
allt från skapandet av dina podcasts och publiceringen av nya avsnitt hela vägen
till sändning, marknadsföring och analys.
Finally, depending on your needs, Wordpress and Castopod can even live side by
side as they share the same requirements!
Slutligen, beroende på dina behov, Wordpress och Castopod kan även leva sida vid
sida eftersom de delar samma krav!
### Castopod vs Funkwhale
Funkwhale is a self-hosted, modern free and open-source music server. Just as
Castopod, Funkwhale is on the fediverse, a decentralized social network allowing
interoperability between the two.
Funkwhale är en självvärd, modern gratis och öppen källkod musikserver. Precis
som Castopod, Funkwhale är på fediverse, ett decentraliserat socialt nätverk som
möjliggör interoperabilitet mellan de två.
Funkwhale was initially built around music. And later on, as the project
evolved, the ability to host podcasts was introduced.
Funkwhale byggdes ursprungligen runt musik. Och senare när projektet utvecklades
introducerades förmågan att vara värd för podcasts.
Unlike Funkwhale, Castopod has been designed and built around podcasting
exclusively. This allows easier implementation for features related to the
podcasting ecosystem, such as the podcasting 2.0 features (transcripts,
chapters, locations, persons, …).
Till skillnad från Funkwhale har Castopod designats och byggts kring podcasting
exklusivt. Detta möjliggör enklare implementering av funktioner relaterade till
podcasting ekosystem, såsom podcasting 2.0 funktioner (transkript, kapitel,
platser, personer, …).
So, you should probably use Funkwhale if you want to host your music, and use
Castopod if you want to host your podcasts.
Så, du bör förmodligen använda Funkwhale om du vill vara värd för din musik, och
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
great and [a lot of them](https://podcastindex.org/apps) are jumping into the
Podcasting 2.0 wagon just like Castopod!
Det finns många lösningar för dig att vara värd för dina podcasts, några av dem
är verkligen bra och [en hel del av dem](https://podcastindex.org/apps) hoppar
in i Podcasting 2. vagn precis som Castopod!
Each of these solutions differ from one another, you may compare with the
[list of features](#features).
Var och en av dessa lösningar skiljer sig från varandra, kan du jämföra med
[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
full control over what you produce. Also, as it is open-source, you can even
customize it as you wish.
- Castopod kan vara själv värd och är den enda lösningen som gör att du kan
hålla full kontroll över vad du producerar. Dessutom, eftersom det är öppen
källkod, kan du även anpassa det som du vill.
- Castopod is the only solution that currently integrates both a decentralized
social network with ActivityPub as well as many of the podcasting 2.0
features, hoping to bridge the gap between the two.
- Castopod är den enda lösningen som för närvarande integrerar både ett
decentraliserat socialt nätverk med ActivityPub samt många av podcasting 2.
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
to get you&nbsp;started.
Älskar du Castopod och vill hjälpa till? Ta en titt på följande dokumentation
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
adhere to. Please read the
[CODE_OF_CONDUCT manual](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.
Castopod har antagit en uppförandekod som vi förväntar oss projektdeltagare att
hålla sig till. Läs
[CODE_OF_CONDUCT manualen](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md)
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
development process, how to propose bugfixes and improvements, and how to build
and test your changes to Castopod.
Läs vår [bidragande guide](./contributing/guidelines.md) för att lära dig om vår
utvecklingsprocess, hur du föreslår buggfixar och förbättringar, och hur du
bygger och testar dina ändringar till Castopod.
## Contributors
## Alla bidragsgivare
Thanks goes to these wonderful people
([emoji key](https://allcontributors.org/docs/en/emoji-key)):
Tack går till dessa underbara människor
([emoji nyckel](https://allcontributors.org/docs/en/emoji-key)):
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
<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://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/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://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://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://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>
<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>
<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://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/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/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/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://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/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>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 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>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>
<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/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/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/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/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/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/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/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>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>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>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>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>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>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>
<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/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://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://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://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.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://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://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>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>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>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>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>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>Patryk Miś</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
</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://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://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://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/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/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/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/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>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>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>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>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>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>Patryk Miś</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
</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/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/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/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://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://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://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://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>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>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>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>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>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>Patryk Miś</b></sub></a><br /><a href="https://translate.castopod.org" title="Translation">🌍</a></td>
</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>
</table>
@ -243,48 +248,47 @@ Thanks goes to these wonderful people
<!-- ALL-CONTRIBUTORS-LIST:END -->
This project follows the
[all-contributors](https://github.com/all-contributors/all-contributors)
specification. Contributions of any kind welcome!
Detta projekt följer specifikationen
[för alla bidragsgivare](https://github.com/all-contributors/all-contributors) .
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
developers and the community)
- [Issue tracker](https://code.castopod.org/adaures/castopod/-/issues) (for
feature requests & bug reports)
- [Discord](https://castopod.org/discord) (för direkt interaktion med
-utvecklare och gemenskapen)
- [Ärendespårare](https://code.castopod.org/adaures/castopod/-/issues) (för
funktionsförfrågningar & felrapporter)
Alternatively, you can follow us on social media platforms to get news about
Castopod:
Alternativt kan du följa oss på sociala medier för att få nyheter om Castopod:
- [podlibre.social](https://podlibre.social/@Castopod) (Mastodon instance)
- [Twitter](https://twitter.com/castopod)
- [LinkedIn](https://linkedin.com/company/castopod)
- [Facebook](https://www.facebook.com/castopod)
## Sponsors
## Sponsorer
The ongoing development of Castopod is made possible with the support of its
backers. If you'd like to help, please consider
[sponsoring Castopod's development](https://opencollective.com/castopod/contribute).
Den pågående utvecklingen av Castopod möjliggörs med stöd av sina backers. Om du
vill hjälpa till, överväg
[sponsra Castopods utveckling](https://opencollective.com/castopod/contribute).
<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://nlnet.nl/project/Castopod/" target="_blank" rel="noopener noreferrer"><img src="/images/sponsors/nlnet.svg" alt="NLnet Logo" class="h-16" /></a>
</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/).
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
https://img.shields.io/github/license/ad-aures/castopod?color=blå
https://img.shields. o/badge/contributions-welcome-brightgreen.svg
https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantik--release-e10079.
vg https://img.shields.io/github/stars/ad-aures/castopod?style=sociala
[release]: https://code.castopod.org/adaures/castopod/-/releases
[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 镜像
Castopod 在 Docker Hub 自动构建 程序中将 Docker 镜像推送至 Docker Hub
Castopod 在其自动构建期间会将 3 个 Docker 映像推送到 Docker Hub
- [**`castopod/app`**](https://hub.docker.com/r/castopod/app):应用程序包,包含
所有 Castopod 依赖关系
- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server)Castopod
的 Nginx 配置
- [**`castopod/video-clipper`** ](https://hub.docker.com/r/castopod/video-clipper)
感谢 ffmpeg 提供可选图像构建视频剪辑
此外Castopod 需要一个与 MySQL 兼容的数据库。 Redis 数据库 可以添加为缓存处理器
@ -20,6 +22,8 @@ Castopod 在 Docker Hub 自动构建 程序中将 Docker 镜像推送至 Docker
- `develop` [unstable], 最新开发分支版本
- `beta` [stable],最新的 beta 版本构建
- `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:
app:
image: castopod/app:beta
image: castopod/app:latest
container_name: "castopod-app"
volumes:
- castopod-media:/opt/castopod/public/media
@ -50,7 +54,7 @@ Castopod 在 Docker Hub 自动构建 程序中将 Docker 镜像推送至 Docker
restart: unless-stopped
web-server:
image: castopod/web-server:beta
image: castopod/web-server:latest
container_name: "castopod-web-server"
volumes:
- castopod-media:/var/www/html/media
@ -82,6 +86,21 @@ Castopod 在 Docker Hub 自动构建 程序中将 Docker 镜像推送至 Docker
networks:
- 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:
castopod-media:
castopod-db:
@ -92,7 +111,7 @@ Castopod 在 Docker Hub 自动构建 程序中将 Docker 镜像推送至 Docker
castopod-db:
```
你还需要调整一些变量。(例如:`CP_BASEURL` `MYSQL_ROOT_PASSWORD`
你还需要调整一些变量。 (例如:`CP_BASEURL` `MYSQL_ROOT_PASSWORD`
`MYSQL_PASSSWORD``CP_ANALYTICS_SALT`
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**
| 变量名称 | 类型 (`默认值`) | Default |
| 变量名称 | 类型 (`default`) | Default |
| ---------------------------- | ----------------------- | ---------------- |
| **`CP_BASEURL`** | string | `undefined` |
| **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` |
@ -142,6 +171,6 @@ Castopod 在 Docker Hub 自动构建 程序中将 Docker 镜像推送至 Docker
- **castopod/web-server**
| 变量名称 | Type | Default |
| 变量名称 | Type | 默认 |
| --------------------- | ------- | ------- |
| **`CP_APP_HOSTNAME`** | ?string | `"app"` |

View File

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

View File

@ -8,62 +8,57 @@ sidebarDepth: 3
安装 Castopod 后,你可能希望将实例更新到最新版本 版本以享受最新功能 ✨, 修复错误
🐛 和性能提升 ⚡。
## Update instructions
## 更新说明
0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
database.
0. ⚠️ 在更新之前,我们强烈建议你备份 Castopod 文件和数据库。
- 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
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and
see if your instance is up to date with the latest Castopod version
1. 前往 [发布页面](https://code.castopod.org/adaures/castopod/-/releases) 和 查
看您的实例是否是最新的 Castopod 版本
- 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
between the `zip` or `tar.gz` archives
2. 下载名为`Castopod Package`的最新发布包,你可以在 `zip``tar.gz` 压缩包之间
选择
- ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
- Note that you can also download the latest package from
[castopod.org](https://castopod.org/)
- ⚠️ 请确保你下载的是 Castopod 软件包而 **不是** 源代码
- 请注意,你还可以从 [castopod.org](https://castopod.org/)
3. On your server:
3. 在你的服务器上:
- Remove all files except `.env` and `public/media`
- Copy the new files from the downloaded package into your server
- 删除除 `.env` 文件和 `public/media` 目录之外的所有文件
- 将下载软件包中的新文件复制到你的服务器中
::: info Note
::: 注意
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
running:
4. 从你的 `后台管理` > 更新你的数据库架构 `关于` 页或开始:
```bash
php spark castopod:database-update
```
5. Clear your cache from your `Castopod Admin` > `Settings` > `general` >
`Housekeeping`
6. ✨ Enjoy your fresh instance, you're all done!
5. 从 `Castopod 管理页面` > `设置` > `通常` > `维护` 清理你的缓存
6. ✨ 享受你的新实例, 你已经更新完毕!
::: 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.
[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 版本号?
Go to your Castopod admin panel, the version is displayed on the bottom left
corner.
跳转到你的 Castopod 管理面板,版本号显示在左下角。
Alternatively, you can find the version in the `app > Config > Constants.php`
file.
或者,你可以在 `应用程序 > 配置 > Constants.php` 文件中找到版本号。
### 我很长时间没有更新我的实例… 我该怎么办?
### 我很长时间没有更新我的实例… 我该怎么办? 我该怎么办?
No problem! Just get the latest release as described above. Only, when going
through the release instructions (4), perform them sequentially, from the oldest
to the newest.
没问题! 只需如上所述获取最新版本。 No problem! Just get the latest release as
described above. Only, when going through the release instructions (4), perform
them sequentially, from the oldest to the newest.
> 你可能想要备份你的实例,这取决于您多久没有更新过 Castopod 。
For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to
`v1.0.0-beta.1`:
例如,如果你在 `v1.0.0-alpha.42` 并想要升级到 `v1.0.0-beta.1`
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
database to prevent you from losing it all…
更笼统地说,我们建议你定期备份您的 Castopod 文件和数据库,防止丢失所有内容……

View File

@ -133,7 +133,8 @@ Funkwhale 最初是围绕音乐制作的。 后来,随着项目的发展,引
## 贡献
喜欢 Castopod 并且想帮忙吗? 请查看以下文档以帮助你入门。
喜欢 Castopod 并且想帮忙吗? 请查看以下文档以帮助你入门。 请查看以下文档以帮助你
入门。
### 行为准则
@ -143,8 +144,8 @@ Castopod 已经通过了一项行为准则,并希望所有的参与者都能
### 贡献指南
阅读我们的 [贡献指南](./contributing/guidelines.md) ,了解我们的开发过程。提出
误修正和改进想法,以及如何构建和测试 Castopod 。
阅读我们的 [贡献指南](./contributing/guidelines.md) ,了解我们的开发过程。 提出
误修正和改进想法,以及如何构建和测试 Castopod 。
## 贡献者 ✨
@ -251,7 +252,8 @@ Castopod 的发展离不开赞助商的支持。 如果你想要帮助我们,
[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/github/license/ad-aures/castopod?color=blue
https://img.shields.io/badge/contributions-welcome-brightgreen.svg

View File

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

View File

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

View File

@ -35,6 +35,6 @@ return [
'by_weekday' => 'Nach Wochentag (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)',
'total_storage_by_month' => 'Monthly storage (in MB)',
'total_bandwidth_by_month' => 'Monthly used bandwidth (in MB)',
'total_storage_by_month' => 'Monatlicher Speicher (in MB)',
'total_bandwidth_by_month' => 'Monatlich genutzte Bandbreite (in MB)',
];

View File

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

View File

@ -24,25 +24,25 @@ return [
'edit' => 'Bearbeiten',
'publish' => 'Veröffentllichen',
'publish_edit' => 'Veröffentlichung bearbeiten',
'publish_date_edit' => 'Edit publication date',
'publish_date_edit' => 'Veröffentlichungsdatum bearbeiten',
'unpublish' => 'Veröffentlichung zurücknehmen',
'publish_error' => 'Folge ist bereits veröffentlicht.',
'publish_edit_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_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_success' => 'Episode\'s publication date has been updated successfully!',
'publish_date_edit_error' => 'Die Folge wurde noch nicht veröffentlicht, Sie können das Veröffentlichungsdatum nicht bearbeiten.',
'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' => 'Das Veröffentlichungsdatum der Folge wurde erfolgreich aktualisiert!',
'unpublish_error' => 'Folge ist nicht veröffentlicht.',
'delete' => 'Löschen',
'go_to_page' => 'Gehe zu Seite',
'create' => 'Folge hinzufügen',
'publication_status' => [
'published' => 'Veröffentlicht',
'with_podcast' => 'Published',
'with_podcast' => 'Veröffentlicht',
'scheduled' => 'Geplant',
'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' => [
'search' => [
'placeholder' => 'Suche nach einer Episode',
@ -50,8 +50,8 @@ return [
'submit' => 'Suche',
],
'number_of_episodes' => '{numberOfEpisodes, plural,
one {# episode}
other {# episodes}
one {# Folge}
other {# Folgen}
}',
'episode' => 'Folge',
'visibility' => 'Sichtweite',
@ -62,14 +62,14 @@ return [
'createSuccess' => 'Folge wurde erfolgreich erstellt!',
'editSuccess' => 'Folge wurde erfolgreich aktualisiert!',
'publishSuccess' => '{publication_status, select,
published {Episode successfully published!}
scheduled {Episode publication successfully scheduled!}
with_podcast {This episode will be published at the same time as the podcast.}
other {This episode is not published.}
published {Folge erfolgreich veröffentlicht!}
scheduled {Veröffentlichung der Folge erfolgreich geplant!}
with_podcast {Diese Folge wird zeitgleich mit dem Podcast veröffentlicht.}
other {Diese Folge ist nicht veröffentlicht.}
}',
'publishCancelSuccess' => 'Veröffentlichung der Episode erfolgreich abgebrochen!',
'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.',
'deleteSuccess' => 'Folge erfolgreich gelöscht!',
'deleteError' => 'Failed to delete episode {type, select,
@ -79,13 +79,13 @@ return [
audio {audio}
other {media}
}.',
'deleteFileError' => 'Failed to delete {type, select,
transcript {transcript}
chapters {chapters}
image {cover}
audio {audio}
other {media}
} file {file_path}. You may manually remove it from your disk.',
'deleteFileError' => 'Fehler beim Löschen der {type, select,
transcript {Abschrift}
chapters {Kapitel}
image {Cover}
audio {Audio}
other {Medien}
}-Datei {file_path}. Sie können es manuell von der Festplatte entfernen.',
'sameSlugError' => 'Eine Folge mit dem ausgewählten Slug existiert bereits.',
],
'form' => [
@ -97,7 +97,7 @@ return [
'cover' => 'Episoden-Cover',
'cover_hint' =>
'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_hint' =>
'Nutze einen klaren und einprägsamen Episodennamen. Gib hier nicht die Episoden- oder Staffelnummern an.',
@ -169,7 +169,7 @@ return [
'publication_method' => [
'now' => 'Jetzt',
'schedule' => 'Zeitplan',
'with_podcast' => 'Publish alongside podcast',
'with_podcast' => 'Zusammen mit dem Podcast veröffentlichen',
],
'scheduled_publication_date' => 'Geplantes Veröffentlichungsdatum',
'scheduled_publication_date_clear' => 'Veröffentlichungsdatum löschen',
@ -183,9 +183,9 @@ return [
'message_warning_submit' => 'Trotzdem veröffentlichen',
],
'publish_date_edit_form' => [
'new_publication_date' => 'New publication date',
'new_publication_date_hint' => 'Must be set to a past date.',
'submit' => 'Edit publication date',
'new_publication_date' => 'Neues Veröffentlichungsdatum',
'new_publication_date_hint' => 'Muss auf ein vergangenes Datum gesetzt werden.',
'submit' => 'Veröffentlichungsdatum bearbeiten',
],
'unpublish_form' => [
'disclaimer' =>
@ -197,7 +197,7 @@ return [
'disclaimer' =>
"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',
'submit' => 'Delete',
'submit' => 'Löschen',
],
'embed' => [
'title' => 'Einbettbarer Spieler',

View File

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

View File

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

View File

@ -24,7 +24,7 @@ return [
'form' => [
'avatar' => 'Profilbild',
'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_hint' => 'Dies ist der vollständige Name oder der Alias der Person.',
'unique_name' => 'Eindeutiger Name',

View File

@ -16,7 +16,7 @@ return [
'new_episode' => 'Neue Folge',
'view' => 'Podcast ansehen',
'edit' => 'Podcast bearbeiten',
'publish' => 'Publish podcast',
'publish' => 'Podcast veröffentlichen',
'publish_edit' => 'Edit publication',
'delete' => 'Podcast löschen',
'see_episodes' => 'Episoden ansehen',
@ -24,12 +24,12 @@ return [
'go_to_page' => 'Gehe zur Seite',
'latest_episodes' => 'Neueste Folgen',
'see_all_episodes' => 'Alle Folgen anzeigen',
'draft' => 'Draft',
'draft' => 'Entwurf',
'messages' => [
'createSuccess' => 'Podcast successfully created!',
'createSuccess' => 'Podcast erfolgreich erstellt!',
'editSuccess' => 'Der Podcast wurde erfolgreich aktualisiert!',
'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,
cover {cover}
banner {banner}
@ -47,18 +47,18 @@ return [
one {# episode was}
other {# episodes were}
} 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.',
'publishError' => 'This podcast is either already published or scheduled for publication.',
'publishEditError' => 'This podcast is not scheduled for publication.',
'publishCancelSuccess' => 'Podcast publication successfully cancelled!',
'scheduleDateError' => 'Schedule date must be set!',
'scheduleDateError' => 'Veröffentlichungsdatum muss gesetzt sein!',
],
'form' => [
'identity_section_title' => 'Podcast-Identität',
'identity_section_subtitle' => 'Diese Felder erlauben es dir, Aufmerksamkeit zu bekommen.',
'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_size_hint' => 'Banner must have a 3:1 ratio and be at least 1500px wide.',
'banner_delete' => 'Podcast-Banner löschen',
@ -120,8 +120,8 @@ return [
'custom_rss_hint' => 'Dies wird innerhalb des ❬channel❭ Tags eingefügt.',
'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.',
'old_feed_url' => 'Old feed URL',
'update_feed' => 'Update feed',
'old_feed_url' => 'Alte Feed-URL',
'update_feed' => 'Feed aktualisieren',
'update_feed_tip' => 'Import this podcast\'s latest episodes',
'partnership' => 'Partnerschaft:en',
'partner_id' => 'ID',
@ -259,12 +259,12 @@ return [
'post' => 'Your announcement post',
'post_hint' =>
"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…',
'submit' => 'Publish',
'message_placeholder' => 'Schreiben Sie Ihre Nachricht…',
'submit' => 'Veröffentlichen',
'publication_date' => 'Publication date',
'publication_method' => [
'now' => 'Now',
'schedule' => 'Schedule',
'now' => 'Jetzt',
'schedule' => 'Planen',
],
'scheduled_publication_date' => 'Scheduled publication date',
'scheduled_publication_date_hint' =>
@ -273,18 +273,18 @@ return [
'cancel_publication' => 'Cancel publication',
'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_submit' => 'Publish anyway',
'message_warning_submit' => 'Dennoch veröffentlichen',
],
'publication_status_banner' => [
'draft_mode' => 'draft mode',
'not_published' => 'This podcast is not yet published.',
'draft_mode' => 'Entwurfsmodus',
'not_published' => 'Dieser Podcast ist noch nicht veröffentlicht.',
'scheduled' => 'This podcast is scheduled for publication on {publication_date}.',
],
'delete_form' => [
'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.",
'understand' => 'I understand, I want the podcast to be permanently deleted',
'submit' => 'Delete',
'understand' => 'Ich verstehe, ich möchte, dass der Podcast dauerhaft gelöscht wird',
'submit' => 'Löschen',
],
'by' => 'Von {publisher}',
'season' => 'Staffel {seasonNumber}',
@ -294,12 +294,12 @@ return [
'no_episode' => 'Keine Folge gefunden!',
'follow' => 'Folgen',
'followers' => '{numberOfFollowers, plural,
one {# follower}
other {# followers}
one {# Follower}
other {# Follower}
}',
'posts' => '{numberOfPosts, plural,
one {# post}
other {# posts}
one {# Beitrag}
other {# Beiträge}
}',
'activity' => 'Aktivitäten',
'episodes' => 'Folgen',

View File

@ -10,7 +10,7 @@ declare(strict_types=1);
return [
'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_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.',

View File

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

View File

@ -15,7 +15,7 @@ return [
'site_icon' => '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_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_description' => 'Seitenbeschreibung',
'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, …).',
'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 …)',
'rename_episodes_files' => 'Rename episode audio files',
'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' => 'Audiodateien der Episode umbenennen',
'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_helper' => 'Diese Option leert den redis-Cache oder beschreibbare/cache-Dateien.',
'run' => 'Systempflege starten',

View File

@ -9,14 +9,14 @@ declare(strict_types=1);
*/
return [
'title' => 'About Castopod',
'host_name' => 'Host name',
'version' => 'Castopod version',
'php_version' => 'PHP version',
'os' => 'Operating System',
'languages' => 'Languages',
'update_database' => 'Update database',
'title' => 'Acerca de Castopod',
'host_name' => 'Nome do servidor',
'version' => 'Versión de Castopod',
'php_version' => 'Versión de PHP',
'os' => 'Sistema Operativo',
'languages' => 'Idiomas',
'update_database' => 'Anovar base de datos',
'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',
'podcasts' => 'podcasts',
'episodes' => 'episodios',
'subscriptions' => 'subscriptions',
'subscriptions' => 'subscricións',
'contributors' => 'contribúen',
'pages' => 'páxinas',
'settings' => 'axustes',
'theme' => 'decorado',
'about' => 'about',
'about' => 'acerca de',
'add' => 'engadir',
'new' => 'novo',
'edit' => 'editar',
'persons' => 'persoas',
'publish' => 'publicar',
'publish-edit' => 'editar publicación',
'publish-date-edit' => 'edit publication date',
'publish-date-edit' => 'editar data de publicación',
'unpublish' => 'retirar publicación',
'delete' => 'eliminar',
'remove' => 'remove',
'remove' => 'eliminar',
'fediverse' => 'fediverso',
'block-lists' => 'listas de bloqueo',
'users' => 'usuarias',
@ -50,5 +50,5 @@ return [
'video-clips' => 'clips de vídeo',
'embed' => 'reprodutor para incluír',
'notifications' => 'notificacións',
'suspend' => 'suspend',
'suspend' => 'suspender',
];

View File

@ -24,14 +24,14 @@ return [
'edit' => 'Editar',
'publish' => 'Publicar',
'publish_edit' => 'Editar publicación',
'publish_date_edit' => 'Edit publication date',
'publish_date_edit' => 'Editar data de publicación',
'unpublish' => 'Retirar publicación',
'publish_error' => 'O episodio xa está publicado.',
'publish_edit_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_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_success' => 'Episode\'s publication date has been updated successfully!',
'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' => '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' => 'Actualizada correctamente a data de publicación do episodio!',
'unpublish_error' => 'O episodio non foi publicado.',
'delete' => 'Eliminar',
'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',
],
'premium_title' => 'Premium',
'premium' => 'Episode must be accessible to premium subscribers only',
'premium' => 'Episodio dispoñible só para subscricións premium',
'parental_advisory' => [
'label' => 'Aviso sobre o contido',
'hint' => 'Contén o episodio elementos explícitos?',
@ -183,9 +183,9 @@ return [
'message_warning_submit' => 'Publicar igualmente',
],
'publish_date_edit_form' => [
'new_publication_date' => 'New publication date',
'new_publication_date_hint' => 'Must be set to a past date.',
'submit' => 'Edit publication date',
'new_publication_date' => 'Nova data de publicación',
'new_publication_date_hint' => 'Ten que ser unha data do pasado.',
'submit' => 'Editar data de publicación',
],
'unpublish_form' => [
'disclaimer' =>

View File

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

View File

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

View File

@ -26,14 +26,14 @@ return [
'edit' => 'Upraviť',
'publish' => 'Zverejniť',
'publish_edit' => 'Upraviť zverejnenie',
'publish_date_edit' => 'Edit publication date',
'publish_date_edit' => 'Upraviť dátum zverejnenia',
'unpublish' => 'Zrušiť zverejnenie',
'publish_error' => 'Epizóda je už zverejnená.',
'publish_edit_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_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_success' => 'Episode\'s publication date has been updated successfully!',
'publish_date_edit_error' => 'Epizóda zatiaľ nie je zverejnená, nie je možné upraviť dátum zverejnenia.',
'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' => 'Dátum zverejnenia epizódy bol úspešne aktualizovaný!',
'unpublish_error' => 'Epizóda nie je zverejnená.',
'delete' => 'Vymazať',
'go_to_page' => 'Prejsť na stránku',
@ -94,45 +94,45 @@ return [
],
'form' => [
'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_hint' => 'Vyberte zvukový súbor .mp3, alebo .m4a.',
'info_section_title' => 'Informácie o časti',
'cover' => 'Obal k časti',
'cover_hint' =>
'If you do not set a cover, the podcast cover will be used instead.',
'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.',
'Ak obrázok nepridáte, použije sa obrázok podcastu.',
'cover_size_hint' => 'Obrázok musí byť štvorcový minimálny rozmer 1400px.',
'title' => 'Názov',
'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',
'season_number' => 'Season',
'season_number' => 'Séria',
'episode_number' => 'Epizóda',
'type' => [
'label' => 'Type',
'full' => 'Full',
'full_hint' => 'Complete content (the episode)',
'trailer' => 'Trailer',
'trailer_hint' => 'Short, promotional piece of content that represents a preview of the current show',
'label' => 'Typ',
'full' => 'Celá epizóda',
'full_hint' => '´Uplný obsah',
'trailer' => 'Upútavka',
'trailer_hint' => 'Krátky promočný úryvok obsahu, ktorý slúži ako ukážka podcastu',
'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' => 'Episode must be accessible to premium subscribers only',
'premium_title' => 'Prémiový obsah',
'premium' => 'Epizóda je prístupná len pre predplatiteľov prémiového obsahu',
'parental_advisory' => [
'label' => 'Parental advisory',
'hint' => 'Does the episode contain explicit content?',
'undefined' => 'undefined',
'clean' => 'Clean',
'label' => 'Rodičovská kontrola',
'hint' => 'Obsahuje epizóda explicitný obsah?',
'undefined' => 'neuvedené',
'clean' => 'Čisté',
'explicit' => 'Chúlostivé',
],
'show_notes_section_title' => 'Show notes',
'show_notes_section_title' => 'Poznámky epizódy',
'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_footer' => 'Description footer',
'description_footer' => 'Päta popisu',
'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_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}.',
@ -187,13 +187,13 @@ return [
'message_warning_submit' => 'Napriek tomu zverejniť',
],
'publish_date_edit_form' => [
'new_publication_date' => 'New publication date',
'new_publication_date_hint' => 'Must be set to a past date.',
'submit' => 'Edit publication date',
'new_publication_date' => 'Nový dátum zverejnenia',
'new_publication_date_hint' => 'Musí byť dátum v minulosti.',
'submit' => 'Upraviť dátum zverejnenia',
],
'unpublish_form' => [
'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',
'submit' => 'Zrušiť zverejnenie',
],
@ -210,8 +210,8 @@ return [
'clipboard_iframe' => 'Skopírovať kód prehrávača do schránky',
'clipboard_url' => 'Skopírovať adresu do schránky',
'dark' => 'Tmavý',
'dark-transparent' => 'Dark transparent',
'light' => 'Light',
'light-transparent' => 'Light transparent',
'dark-transparent' => 'Tmavý priehľadný',
'light' => 'Svetlý',
'light-transparent' => 'Svetlý priehľadný',
],
];

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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