diff --git a/.all-contributorsrc b/.all-contributorsrc index f3735269..710b62c7 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -3,10 +3,11 @@ "projectOwner": "adaures", "repoType": "gitlab", "repoHost": "https://code.castopod.org", - "files": ["README.md", "docs/src/index.md"], + "files": ["README.md", "docs/src/content/docs/en/index.mdx"], "imageSize": 100, "commit": false, "contributorsPerLine": 7, + "wrapperTemplate": "\n\n <%= bodyContent %> \n<%= tableFooterContent %>
\n\n", "contributors": [ { "login": "yassinedoghri", diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 70877355..3673a17b 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -33,6 +33,7 @@ } }, "extensions": [ + "astro-build.astro-vscode", "bmewburn.vscode-intelephense-client", "bradlc.vscode-tailwindcss", "breezelin.phpstan", @@ -49,6 +50,7 @@ "runem.lit-plugin", "streetsidesoftware.code-spell-checker", "stylelint.vscode-stylelint", + "unifiedjs.vscode-mdx", "wayou.vscode-todo-highlight", "yzhang.markdown-all-in-one" ] diff --git a/docs/src/contributing/setup-development.md b/CONTRIBUTING-DEV.md similarity index 83% rename from docs/src/contributing/setup-development.md rename to CONTRIBUTING-DEV.md index f4deae3c..df75bf50 100644 --- a/docs/src/contributing/setup-development.md +++ b/CONTRIBUTING-DEV.md @@ -1,8 +1,3 @@ ---- -title: Development setup -sidebarDepth: 3 ---- - # Setup your development environment ## Introduction @@ -56,7 +51,7 @@ to help you kickstart your contribution. analytics.salt="DEV_ANALYTICS_SALT" cache.handler="redis" - cache.redis.host = "redis" + cache.redis.host="redis" # You may not want to use redis as your cache handler # Comment/remove the two lines above and uncomment @@ -78,15 +73,16 @@ to help you kickstart your contribution. #media.s3.pathStyleEndpoint=true ``` - > _NB._ You can tweak your environment by setting more environment variables - > in your custom `.env` file. See the `env` for examples or the + > [!NOTE] + > You can tweak your environment by setting more environment variables in + > your custom `.env` file. See the `env` for examples or the > [CodeIgniter4 User Guide](https://codeigniter.com/user_guide/index.html) > for more info. 3. (for docker desktop) Add the repository you've cloned to docker desktop's `Settings` > `Resources` > `File Sharing` -### 2. (recommended) Develop inside the app Container with VSCode +### 2. (recommended) Develop inside the app container with VSCode If you're working in VSCode, you can take advantage of the `.devcontainer/` folder. It defines a development environment (dev container) with preinstalled @@ -137,7 +133,7 @@ required services will be loaded automagically! 🪄 ``` For more info, see -[VSCode Remote Containers](https://code.visualstudio.com/docs/remote/containers) +[Developing inside a Container](https://code.visualstudio.com/docs/devcontainers/containers) ### 3. Start hacking @@ -180,7 +176,7 @@ You do not wish to use the VSCode devcontainer? No problem! ``` - > The `docker-compose up -d` command will boot 4 containers in the + > The `docker-compose up -d` command will boot 5 containers in the > background: > > - `castopod_app`: a php based container with Castopod requirements @@ -191,6 +187,7 @@ You do not wish to use the VSCode devcontainer? No problem! > persistent data > - `castopod_phpmyadmin`: a phpmyadmin server to visualize the mariadb > database. + > - `castopod_s3`: a mock s3 server to work on the s3 fileManager 2. Run any command inside the containers by prefixing them with `docker-compose run --rm app`: @@ -221,15 +218,12 @@ You do not wish to use the VSCode devcontainer? No problem! composer install ``` - ::: info Note - - The php dependencies aren't included in the repository. Composer will check - the `composer.json` and `composer.lock` files to download the packages with - the right versions. The dependencies will live under the `vendor/` folder. - For more info, check out the - [Composer documentation](https://getcomposer.org/doc/). - - ::: + > [!NOTE] + > The php dependencies aren't included in the repository. Composer will check + > the `composer.json` and `composer.lock` files to download the packages with + > the right versions. The dependencies will live under the `vendor/` folder. + > For more info, check out the + > [Composer documentation](https://getcomposer.org/doc/). 2. Install javascript dependencies with [pnpm](https://pnpm.io/) @@ -237,14 +231,12 @@ You do not wish to use the VSCode devcontainer? No problem! pnpm install ``` - ::: info Note - - The javascript dependencies aren't included in the repository. Pnpm will - check the `package.json` and `pnpm-lock.yaml` files to download the packages - with the right versions. The dependencies will live under the `node_module` - folder. For more info, check out the [PNPM documentation](https://pnpm.io/). - - ::: + > [!NOTE] + > The javascript dependencies aren't included in the repository. Pnpm will + > check the `package.json` and `pnpm-lock.yaml` files to download the + > packages with the right versions. The dependencies will live under the + > `node_module` folder. For more info, check out the + > [PNPM documentation](https://pnpm.io/motivation). 3. Generate static assets: @@ -257,21 +249,15 @@ You do not wish to use the VSCode devcontainer? No problem! pnpm run build:svg ``` - ::: info Note - - The static assets generated live under the `public/assets` folder, it - includes javascript, styles, images, fonts, icons and svg files. - - ::: + > [!NOTE] + > The static assets generated live under the `public/assets` folder, it + > includes javascript, styles, images, fonts, icons and svg files. ### Initialize and populate database -::: tip Tip - -You may skip this section if you go through the install wizard (go to -`/cp-install`). - -::: +> [!TIP] +> You may skip this section if you go through the install wizard (go to +> `/cp-install`). 1. Build the database with the migrate command: @@ -377,15 +363,19 @@ more insights. ## Known issues +### Allocation failed - JavaScript heap out of memory + +This happens when running `pnpm install`. + +👉 By default, docker might not have access to enough RAM. Allocate more memory +and run `pnpm install` again. + ### (Linux) Files created inside container are attributed to root locally You may use Linux user namespaces to fix this on your machine: -::: info Note - -Replace "username" with your local username - -::: +> [!NOTE] +> Replace "username" with your local username 1. Go to `/etc/docker/daemon.json` and add: diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 21c69f78..6557e02b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,4 +1,167 @@ -# Contributing guidelines +# Contributing to Castopod -You may find the contributing guidelines in the -[Castopod documentation website](https://docs.castopod.org/contributing/guidelines.html). +Love Castopod and want to help? Thanks so much, there's something to do for +everybody! + +> [!NOTE] +> Castopod follows the [all contributors](https://allcontributors.org/) +> specification in an effort to **recognize any kind of contribution**, not just +> code! +> If you've made a contribution and do not appear in the +> [contributors](../index.md#contributors-✨) list, please +> [let us know](../index.md#contact) so we can correct our mistake! 🙂 + +Please take a moment to review this document in order to make the contribution +process easy and effective for everyone involved. + +Following these guidelines helps to communicate that you respect the time of the +developers managing and developing this open source project. In return, they +should reciprocate that respect in addressing your issue or assessing patches +and features. + +## Translating Castopod + +We use [Crowdin](https://translate.castopod.org/) to manage translation files +for [Castopod](https://code.castopod.org/), the +[documentation](https://docs.castopod.org/) and the +[landing](https://castopod.org/) websites. + +Whether you'd like to correct a translation error, validate new translations or +include your language to Castopod, head into the +[crowdin project](https://translate.castopod.org/) to get started. + +> [!NOTE] +> To prevent degrading user experience, new languages are included to Castopod +> when they reach a certain threshold (~90%). + +## Using the issue tracker + +The [issue tracker](https://code.castopod.org/adaures/castopod/-/issues) is the +preferred channel for [bug reports](#bug-reports), +[features requests](#feature-requests) and +[submitting pull requests](#pull-requests). + +## ⚠️ Security issues and vulnerabilities + +If you encounter any security issue or vulnerability in the Castopod source, +please contact us directly by email at +[security@castopod.org](mailto:security@castopod.org) + +## Bug reports + +A bug is a _demonstrable problem_ that is caused by the code in the repository. +Good bug reports are extremely helpful - thank you! + +Guidelines for bug reports: + +1. **Use the issue search** — check if the issue has already been + reported. + +2. **Check if the issue has been fixed** — try to reproduce it using the + latest `main` branch in the repository. + +3. **Isolate the problem** — ideally create a + [reduced test case](https://css-tricks.com/reduced-test-cases/) and a live + example. + +A good bug report shouldn't leave others needing to chase you up for more +information. Please try to be as detailed as possible in your report. What is +your environment? What steps will reproduce the issue? What browser(s) and OS +experience the problem? What would you expect to be the outcome? All these +details will help people to fix any potential bugs. + +> [!NOTE] +> [Issue templates](https://docs.gitlab.com/ee/user/project/description_templates.html#using-the-templates) +> have been created for this project. You may use them to help you follow those +> guidelines. + +## Feature requests + +Feature requests are welcome. But take a moment to find out whether your idea +fits with the scope and aims of the project. It's up to _you_ to make a strong +case to convince the project's developers of the merits of this feature. Please +provide as much detail and context as possible. + +## Pull requests + +Good pull requests - patches, improvements, new features - are a fantastic help. +They should remain focused in scope and avoid containing unrelated commits. + +**Please ask first** before embarking on any significant pull request (e.g. +implementing features, refactoring code, porting to a different language), +otherwise you risk spending a lot of time working on something that the +project's developers might not want to merge into the project. + +Please adhere to the coding conventions used throughout a project (indentation, +accurate comments, etc.) and any other requirements (such as test coverage). + +Adhering to the following process is the best way to get your work included in +the project: + +1. [Fork](https://docs.gitlab.com/ee/gitlab-basics/fork-project.html) the + project, clone your fork, and configure the remotes: + + ```bash + # Clone your fork of the repo into the current directory + git clone https://code.castopod.org//castopod.git + + # Navigate to the newly cloned directory + cd castopod + + # Assign the original repo to a remote called "upstream" + git remote add upstream https://code.castopod.org/adaures/castopod.git + ``` + +2. If you cloned a while ago, get the latest changes from upstream: + + ```bash + git checkout main + git pull upstream main + ``` + +3. Create a new topic branch (off the `main` branch) to contain your feature, + change, or fix: + + ```bash + git checkout -b + ``` + +4. Commit your changes in logical chunks. Please adhere to these + [git commit message guidelines](https://conventionalcommits.org/) or your + code is unlikely be merged into the main project. Use Git's + [interactive rebase](https://help.github.com/articles/about-git-rebase/) + feature to tidy up your commits before making them public. + +5. Locally merge (or rebase) the upstream dev branch into your topic branch: + + ```bash + git pull [--rebase] upstream main + ``` + +6. Push your topic branch up to your fork: + + ```bash + git push origin + ``` + +7. [Open a Pull Request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html#new-merge-request-from-a-fork) + with a clear title and description. + +> [!IMPORTANT] +> By submitting a patch, you agree to allow the project owners to license your +> work under the terms of the +> [GNU AGPLv3](https://code.castopod.org/adaures/castopod/-/blob/develop/LICENSE.md). + +## Collaborating guidelines + +There are few basic rules to ensure high quality of the project: + +- Before merging, a PR requires at least two approvals from the collaborators + unless it's an architectural change, a large feature, etc. If it is, then at + least 50% of the core team have to agree to merge it, with every team member + having a full veto right. (i.e. every single one can block any PR) +- A PR should remain open for at least two days before merging (does not apply + for trivial contributions like fixing a typo). This way everyone has enough + time to look into it. + +You are always welcome to discuss and propose improvements to this guideline. diff --git a/README.md b/README.md index 140ba069..49143e74 100644 --- a/README.md +++ b/README.md @@ -31,12 +31,9 @@ please contact us directly by email at Contributions are always welcome! -See the -[contribution guidelines](https://docs.castopod.org/contributing/guidelines) for -ways to get started. +See the [contribution guidelines](./CONTRIBUTING.md) for ways to get started. -> **Note** -> +> [!Important] > **Any** contribution made on a repository other than > [the original repository](https://code.castopod.org/adaures/castopod) will not > be accepted. @@ -49,7 +46,8 @@ Thanks goes to these wonderful people - + +
@@ -59,7 +57,7 @@ Thanks goes to these wonderful people - +
@@ -68,7 +66,7 @@ Thanks goes to these wonderful people - +
@@ -77,7 +75,7 @@ Thanks goes to these wonderful people - +
@@ -86,7 +84,7 @@ Thanks goes to these wonderful people - +
@@ -95,7 +93,7 @@ Thanks goes to these wonderful people - +
@@ -104,7 +102,7 @@ Thanks goes to these wonderful people - +
@@ -113,7 +111,7 @@ Thanks goes to these wonderful people - +
@@ -121,6 +119,8 @@ Thanks goes to these wonderful people
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Ewen
Ewen

🌍 🤔 💻
Bastien Luneteau
Bastien Luneteau

💻 🐛
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
KrzysztofDomanczyk
KrzysztofDomanczyk

💻
Guy Martin
Guy Martin

🐛 💻
+ + diff --git a/app/Config/App.php b/app/Config/App.php index 3b603d80..9dd39d53 100644 --- a/app/Config/App.php +++ b/app/Config/App.php @@ -127,13 +127,13 @@ class App extends BaseConfig 'fr', 'pl', 'de', - 'pt-BR', - 'nn-NO', + 'pt-br', + 'nn-no', 'es', - 'zh-Hans', + 'zh-hans', 'ca', 'br', - 'sr-Latn', + 'sr-latn', ]; /** diff --git a/app/Language/.rsync-filter b/app/Language/.rsync-filter index c6a78436..b802a93d 100644 --- a/app/Language/.rsync-filter +++ b/app/Language/.rsync-filter @@ -2,11 +2,11 @@ + fr/*** + pl/*** + de/*** -+ pt-BR/*** -+ nn-NO/*** ++ pt-br/*** ++ nn-no/*** + es/*** -+ zh-Hans/*** ++ zh-hans/*** + ca/*** + br/*** -+ sr-Latn/*** ++ sr-latn/*** - ** diff --git a/app/Language/fr_CA/Comment.php b/app/Language/fr-ca/Comment.php similarity index 100% rename from app/Language/fr_CA/Comment.php rename to app/Language/fr-ca/Comment.php diff --git a/app/Language/fr_CA/Common.php b/app/Language/fr-ca/Common.php similarity index 100% rename from app/Language/fr_CA/Common.php rename to app/Language/fr-ca/Common.php diff --git a/app/Language/fr_CA/Episode.php b/app/Language/fr-ca/Episode.php similarity index 100% rename from app/Language/fr_CA/Episode.php rename to app/Language/fr-ca/Episode.php diff --git a/app/Language/fr_CA/Fediverse.php b/app/Language/fr-ca/Fediverse.php similarity index 100% rename from app/Language/fr_CA/Fediverse.php rename to app/Language/fr-ca/Fediverse.php diff --git a/app/Language/fr_CA/Home.php b/app/Language/fr-ca/Home.php similarity index 100% rename from app/Language/fr_CA/Home.php rename to app/Language/fr-ca/Home.php diff --git a/app/Language/fr_CA/Page.php b/app/Language/fr-ca/Page.php similarity index 100% rename from app/Language/fr_CA/Page.php rename to app/Language/fr-ca/Page.php diff --git a/app/Language/fr_CA/Podcast.php b/app/Language/fr-ca/Podcast.php similarity index 100% rename from app/Language/fr_CA/Podcast.php rename to app/Language/fr-ca/Podcast.php diff --git a/app/Language/fr_CA/Post.php b/app/Language/fr-ca/Post.php similarity index 100% rename from app/Language/fr_CA/Post.php rename to app/Language/fr-ca/Post.php diff --git a/app/Language/fr_trad/Comment.php b/app/Language/fr_trad/Comment.php deleted file mode 100644 index 1dd8f5ea..00000000 --- a/app/Language/fr_trad/Comment.php +++ /dev/null @@ -1,34 +0,0 @@ - "{actorDisplayName}'s comment for {episodeTitle}", - 'back_to_comments' => 'Back to comments', - 'form' => [ - 'episode_message_placeholder' => 'Write a comment…', - 'reply_to_placeholder' => 'Reply to @{actorUsername}', - 'submit' => 'Send', - 'submit_reply' => 'Reply', - ], - 'likes' => '{numberOfLikes, plural, - one {# like} - other {# likes} - }', - 'replies' => '{numberOfReplies, plural, - one {# reply} - other {# replies} - }', - 'like' => 'Like', - 'reply' => 'Reply', - 'view_replies' => 'View replies ({numberOfReplies})', - 'block_actor' => 'Block user @{actorUsername}', - 'block_domain' => 'Block domain @{actorDomain}', - 'delete' => 'Delete comment', -]; diff --git a/app/Language/fr_trad/Common.php b/app/Language/fr_trad/Common.php deleted file mode 100644 index 1258afcc..00000000 --- a/app/Language/fr_trad/Common.php +++ /dev/null @@ -1,30 +0,0 @@ - 'Yes', - 'no' => 'No', - 'cancel' => 'Cancel', - 'optional' => 'Optional', - 'close' => 'Close', - 'home' => 'Home', - 'explicit' => 'Explicit', - 'powered_by' => 'Powered by {castopod}', - 'go_back' => 'Go back', - 'play_episode_button' => [ - 'play' => 'Play', - 'playing' => 'Playing', - ], - 'read_more' => 'Read more', - 'read_less' => 'Read less', - 'see_more' => 'See more', - 'see_less' => 'See less', - 'legal_notice' => 'Legal notice', -]; diff --git a/app/Language/fr_trad/Episode.php b/app/Language/fr_trad/Episode.php deleted file mode 100644 index ebe39336..00000000 --- a/app/Language/fr_trad/Episode.php +++ /dev/null @@ -1,33 +0,0 @@ - 'Season {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}', - 'persons' => '{personsCount, plural, - one {# person} - other {# persons} - }', - 'persons_list' => 'Persons', - 'back_to_episodes' => 'Back to episodes of {podcast}', - 'comments' => 'Comments', - 'activity' => 'Activity', - 'description' => 'Episode description', - 'number_of_comments' => '{numberOfComments, plural, - one {# comment} - other {# comments} - }', - 'all_podcast_episodes' => 'All podcast episodes', - 'back_to_podcast' => 'Go back to podcast', -]; diff --git a/app/Language/fr_trad/Fediverse.php b/app/Language/fr_trad/Fediverse.php deleted file mode 100644 index 32f54c07..00000000 --- a/app/Language/fr_trad/Fediverse.php +++ /dev/null @@ -1,37 +0,0 @@ - 'Your handle', - 'your_handle_hint' => 'Enter the @username@domain you want to act from.', - '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', - ], - 'favourite' => [ - 'title' => "Favourite {actorDisplayName}'s post", - 'subtitle' => 'You are going to favourite:', - 'submit' => 'Proceed to favourite', - ], - 'reblog' => [ - 'title' => "Share {actorDisplayName}'s post", - 'subtitle' => 'You are going to share:', - 'submit' => 'Proceed to share', - ], - 'reply' => [ - 'title' => "Reply to {actorDisplayName}'s post", - 'subtitle' => 'You are going to reply to:', - 'submit' => 'Proceed to reply', - ], -]; diff --git a/app/Language/fr_trad/Home.php b/app/Language/fr_trad/Home.php deleted file mode 100644 index 1518239b..00000000 --- a/app/Language/fr_trad/Home.php +++ /dev/null @@ -1,20 +0,0 @@ - 'All podcasts', - 'sort_by' => 'Sort by', - 'sort_options' => [ - 'activity' => 'Recent activity', - 'created_desc' => 'Newest first', - 'created_asc' => 'Oldest first', - ], - 'no_podcast' => 'No podcast found', -]; diff --git a/app/Language/fr_trad/Page.php b/app/Language/fr_trad/Page.php deleted file mode 100644 index 7cd60669..00000000 --- a/app/Language/fr_trad/Page.php +++ /dev/null @@ -1,17 +0,0 @@ - 'Back to home', - '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.', - ], -]; diff --git a/app/Language/fr_trad/Podcast.php b/app/Language/fr_trad/Podcast.php deleted file mode 100644 index 9b1e749a..00000000 --- a/app/Language/fr_trad/Podcast.php +++ /dev/null @@ -1,53 +0,0 @@ - 'RSS Podcast feed', - 'season' => 'Season {seasonNumber}', - 'list_of_episodes_year' => '{year} episodes ({episodeCount})', - 'list_of_episodes_season' => - 'Season {seasonNumber} episodes ({episodeCount})', - 'no_episode' => 'No episode found!', - 'follow' => 'Follow', - 'followTitle' => 'Follow {actorDisplayName} on the fediverse!', - 'followers' => '{numberOfFollowers, plural, - one {# follower} - other {# followers} - }', - 'posts' => '{numberOfPosts, plural, - one {# post} - other {# posts} - }', - 'activity' => 'Activity', - 'episodes' => 'Episodes', - 'episodes_title' => 'Episodes of {podcastTitle}', - 'about' => 'About', - 'stats' => [ - 'title' => 'Stats', - 'number_of_seasons' => '{0, plural, - one {# season} - other {# seasons} - }', - 'number_of_episodes' => '{0, plural, - one {# episode} - other {# episodes} - }', - 'first_published_at' => 'First episode published on {0, date, medium}', - ], - 'sponsor' => 'Sponsor', - 'funding_links' => 'Funding links for {podcastTitle}', - 'find_on' => 'Find {podcastTitle} on', - 'listen_on' => 'Listen on', - 'persons' => '{personsCount, plural, - one {# person} - other {# persons} - }', - 'persons_list' => 'Persons', -]; diff --git a/app/Language/fr_trad/Post.php b/app/Language/fr_trad/Post.php deleted file mode 100644 index 58d1cf80..00000000 --- a/app/Language/fr_trad/Post.php +++ /dev/null @@ -1,40 +0,0 @@ - "{actorDisplayName}'s post", - 'back_to_actor_posts' => 'Back to {actor} posts', - 'actor_shared' => '{actor} shared', - 'reply_to' => 'Reply to @{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', - ], - 'favourites' => '{numberOfFavourites, plural, - one {# favourite} - other {# favourites} - }', - 'reblogs' => '{numberOfReblogs, plural, - one {# share} - other {# shares} - }', - 'replies' => '{numberOfReplies, plural, - one {# reply} - other {# replies} - }', - 'expand' => 'Expand post', - 'block_actor' => 'Block user @{actorUsername}', - 'block_domain' => 'Block domain @{actorDomain}', - 'delete' => 'Delete post', -]; diff --git a/app/Language/nn-NO/Comment.php b/app/Language/nn-no/Comment.php similarity index 100% rename from app/Language/nn-NO/Comment.php rename to app/Language/nn-no/Comment.php diff --git a/app/Language/nn-NO/Common.php b/app/Language/nn-no/Common.php similarity index 100% rename from app/Language/nn-NO/Common.php rename to app/Language/nn-no/Common.php diff --git a/app/Language/nn-NO/Episode.php b/app/Language/nn-no/Episode.php similarity index 100% rename from app/Language/nn-NO/Episode.php rename to app/Language/nn-no/Episode.php diff --git a/app/Language/nn-NO/Fediverse.php b/app/Language/nn-no/Fediverse.php similarity index 100% rename from app/Language/nn-NO/Fediverse.php rename to app/Language/nn-no/Fediverse.php diff --git a/app/Language/nn-NO/Home.php b/app/Language/nn-no/Home.php similarity index 100% rename from app/Language/nn-NO/Home.php rename to app/Language/nn-no/Home.php diff --git a/app/Language/nn-NO/Page.php b/app/Language/nn-no/Page.php similarity index 100% rename from app/Language/nn-NO/Page.php rename to app/Language/nn-no/Page.php diff --git a/app/Language/nn-NO/Podcast.php b/app/Language/nn-no/Podcast.php similarity index 100% rename from app/Language/nn-NO/Podcast.php rename to app/Language/nn-no/Podcast.php diff --git a/app/Language/nn-NO/Post.php b/app/Language/nn-no/Post.php similarity index 100% rename from app/Language/nn-NO/Post.php rename to app/Language/nn-no/Post.php diff --git a/app/Language/pt-BR/Comment.php b/app/Language/pt-br/Comment.php similarity index 100% rename from app/Language/pt-BR/Comment.php rename to app/Language/pt-br/Comment.php diff --git a/app/Language/pt-BR/Common.php b/app/Language/pt-br/Common.php similarity index 100% rename from app/Language/pt-BR/Common.php rename to app/Language/pt-br/Common.php diff --git a/app/Language/pt-BR/Episode.php b/app/Language/pt-br/Episode.php similarity index 100% rename from app/Language/pt-BR/Episode.php rename to app/Language/pt-br/Episode.php diff --git a/app/Language/pt-BR/Fediverse.php b/app/Language/pt-br/Fediverse.php similarity index 100% rename from app/Language/pt-BR/Fediverse.php rename to app/Language/pt-br/Fediverse.php diff --git a/app/Language/pt-BR/Home.php b/app/Language/pt-br/Home.php similarity index 100% rename from app/Language/pt-BR/Home.php rename to app/Language/pt-br/Home.php diff --git a/app/Language/pt-BR/Page.php b/app/Language/pt-br/Page.php similarity index 100% rename from app/Language/pt-BR/Page.php rename to app/Language/pt-br/Page.php diff --git a/app/Language/pt-BR/Podcast.php b/app/Language/pt-br/Podcast.php similarity index 100% rename from app/Language/pt-BR/Podcast.php rename to app/Language/pt-br/Podcast.php diff --git a/app/Language/pt-BR/Post.php b/app/Language/pt-br/Post.php similarity index 100% rename from app/Language/pt-BR/Post.php rename to app/Language/pt-br/Post.php diff --git a/app/Language/sr-Latn/Comment.php b/app/Language/sr-latn/Comment.php similarity index 100% rename from app/Language/sr-Latn/Comment.php rename to app/Language/sr-latn/Comment.php diff --git a/app/Language/sr-Latn/Common.php b/app/Language/sr-latn/Common.php similarity index 100% rename from app/Language/sr-Latn/Common.php rename to app/Language/sr-latn/Common.php diff --git a/app/Language/sr-Latn/Episode.php b/app/Language/sr-latn/Episode.php similarity index 100% rename from app/Language/sr-Latn/Episode.php rename to app/Language/sr-latn/Episode.php diff --git a/app/Language/sr-Latn/Fediverse.php b/app/Language/sr-latn/Fediverse.php similarity index 100% rename from app/Language/sr-Latn/Fediverse.php rename to app/Language/sr-latn/Fediverse.php diff --git a/app/Language/sr-Latn/Home.php b/app/Language/sr-latn/Home.php similarity index 100% rename from app/Language/sr-Latn/Home.php rename to app/Language/sr-latn/Home.php diff --git a/app/Language/sr-Latn/Page.php b/app/Language/sr-latn/Page.php similarity index 100% rename from app/Language/sr-Latn/Page.php rename to app/Language/sr-latn/Page.php diff --git a/app/Language/sr-Latn/Podcast.php b/app/Language/sr-latn/Podcast.php similarity index 100% rename from app/Language/sr-Latn/Podcast.php rename to app/Language/sr-latn/Podcast.php diff --git a/app/Language/sr-Latn/Post.php b/app/Language/sr-latn/Post.php similarity index 100% rename from app/Language/sr-Latn/Post.php rename to app/Language/sr-latn/Post.php diff --git a/app/Language/zh-Hans/Comment.php b/app/Language/zh-hans/Comment.php similarity index 100% rename from app/Language/zh-Hans/Comment.php rename to app/Language/zh-hans/Comment.php diff --git a/app/Language/zh-Hans/Common.php b/app/Language/zh-hans/Common.php similarity index 100% rename from app/Language/zh-Hans/Common.php rename to app/Language/zh-hans/Common.php diff --git a/app/Language/zh-Hans/Episode.php b/app/Language/zh-hans/Episode.php similarity index 100% rename from app/Language/zh-Hans/Episode.php rename to app/Language/zh-hans/Episode.php diff --git a/app/Language/zh-Hans/Fediverse.php b/app/Language/zh-hans/Fediverse.php similarity index 100% rename from app/Language/zh-Hans/Fediverse.php rename to app/Language/zh-hans/Fediverse.php diff --git a/app/Language/zh-Hans/Home.php b/app/Language/zh-hans/Home.php similarity index 100% rename from app/Language/zh-Hans/Home.php rename to app/Language/zh-hans/Home.php diff --git a/app/Language/zh-Hans/Page.php b/app/Language/zh-hans/Page.php similarity index 100% rename from app/Language/zh-Hans/Page.php rename to app/Language/zh-hans/Page.php diff --git a/app/Language/zh-Hans/Podcast.php b/app/Language/zh-hans/Podcast.php similarity index 100% rename from app/Language/zh-Hans/Podcast.php rename to app/Language/zh-hans/Podcast.php diff --git a/app/Language/zh-Hans/Post.php b/app/Language/zh-hans/Post.php similarity index 100% rename from app/Language/zh-Hans/Post.php rename to app/Language/zh-hans/Post.php diff --git a/app/Language/zh-Hant/Comment.php b/app/Language/zh-hant/Comment.php similarity index 100% rename from app/Language/zh-Hant/Comment.php rename to app/Language/zh-hant/Comment.php diff --git a/app/Language/zh-Hant/Common.php b/app/Language/zh-hant/Common.php similarity index 100% rename from app/Language/zh-Hant/Common.php rename to app/Language/zh-hant/Common.php diff --git a/app/Language/zh-Hant/Episode.php b/app/Language/zh-hant/Episode.php similarity index 100% rename from app/Language/zh-Hant/Episode.php rename to app/Language/zh-hant/Episode.php diff --git a/app/Language/zh-Hant/Fediverse.php b/app/Language/zh-hant/Fediverse.php similarity index 100% rename from app/Language/zh-Hant/Fediverse.php rename to app/Language/zh-hant/Fediverse.php diff --git a/app/Language/zh-Hant/Home.php b/app/Language/zh-hant/Home.php similarity index 100% rename from app/Language/zh-Hant/Home.php rename to app/Language/zh-hant/Home.php diff --git a/app/Language/zh-Hant/Page.php b/app/Language/zh-hant/Page.php similarity index 100% rename from app/Language/zh-Hant/Page.php rename to app/Language/zh-hant/Page.php diff --git a/app/Language/zh-Hant/Podcast.php b/app/Language/zh-hant/Podcast.php similarity index 100% rename from app/Language/zh-Hant/Podcast.php rename to app/Language/zh-hant/Podcast.php diff --git a/app/Language/zh-Hant/Post.php b/app/Language/zh-hant/Post.php similarity index 100% rename from app/Language/zh-Hant/Post.php rename to app/Language/zh-hant/Post.php diff --git a/app/Resources/icons/funding/donorbox.svg b/app/Resources/icons/funding/donorbox.svg index 502860a2..a9102a6f 100644 --- a/app/Resources/icons/funding/donorbox.svg +++ b/app/Resources/icons/funding/donorbox.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/app/Resources/icons/social/telegram.svg b/app/Resources/icons/social/telegram.svg index 127b316f..8c1bb674 100644 --- a/app/Resources/icons/social/telegram.svg +++ b/app/Resources/icons/social/telegram.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/app/Resources/styles/choices.css b/app/Resources/styles/choices.css index 4171ea8b..84423cb8 100644 --- a/app/Resources/styles/choices.css +++ b/app/Resources/styles/choices.css @@ -83,8 +83,7 @@ height: 0; width: 0; border-style: solid; - border-color: hsl(var(--color-text-muted)) transparent transparent - transparent; + border-color: hsl(var(--color-text-muted)) transparent transparent; border-width: 5px; position: absolute; right: 11.5px; @@ -94,8 +93,7 @@ } .choices[data-type*="select-one"].is-open::after { - border-color: transparent transparent hsl(var(--color-text-muted)) - transparent; + border-color: transparent transparent hsl(var(--color-text-muted)); margin-top: -7.5px; } diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 00000000..6240da8b --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,21 @@ +# build output +dist/ +# generated types +.astro/ + +# dependencies +node_modules/ + +# logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + + +# environment variables +.env +.env.production + +# macOS-specific files +.DS_Store diff --git a/docs/.gitlab-ci.yml b/docs/.gitlab-ci.yml index 72621c2c..b49a9f31 100644 --- a/docs/.gitlab-ci.yml +++ b/docs/.gitlab-ci.yml @@ -1,4 +1,4 @@ -image: node:16 +image: node:20 stages: - build @@ -6,25 +6,29 @@ stages: .documentation-setup: before_script: + - corepack enable + - corepack prepare pnpm@latest-9 --activate + - pnpm config set store-dir .pnpm-store - cd docs - chmod +x ./scripts/i18n-filter.sh - ./scripts/i18n-filter.sh src - - npm install + - pnpm install cache: key: files: - - docs/package-lock.json + - docs/pnpm-lock.yaml paths: - - docs/node_modules + - .pnpm-store # This job only serves for validating that the docs builds correctly on all non deployment branches build: extends: .documentation-setup stage: build script: - - npm run build + - pnpm run build except: + - develop - main - beta - alpha @@ -36,12 +40,13 @@ build-production: name: production url: https://docs.castopod.org/ script: - - npm run build + - pnpm run build --outDir=docs/.dist/$CI_COMMIT_REF_SLUG --base=$CI_COMMIT_REF_SLUG artifacts: paths: - - docs/.vitepress/dist + - docs/dist/$CI_COMMIT_REF_SLUG expire_in: 30 mins only: + - develop - main - beta - alpha @@ -54,10 +59,10 @@ deploy: variables: HOST: $DOCS_HOST USER: $DOCS_USER - TEMP_DIRECTORY: $DOCS_TEMP_DIRECTORY - DIRECTORY: $DOCS_DIRECTORY + TEMP_DIRECTORY: $DOCS_TEMP_DIRECTORY/$CI_COMMIT_REF_SLUG/ + DIRECTORY: $DOCS_DIRECTORY/$CI_COMMIT_REF_SLUG/ SSH_PORT: 3242 - SOURCE_FOLDER: "docs/.vitepress/dist/" + SOURCE_FOLDER: "docs/dist/$CI_COMMIT_REF_SLUG/" before_script: # install rsync for file transfers - apt-get update && apt-get install rsync -y @@ -71,6 +76,7 @@ deploy: - rsync -avzuh -e "ssh -p $SSH_PORT" $SOURCE_FOLDER $USER@$HOST:$TEMP_DIRECTORY --progress - ssh $USER@$HOST -p $SSH_PORT "rsync -rtv $TEMP_DIRECTORY $DIRECTORY" only: + - develop - main - beta - alpha diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts deleted file mode 100644 index f74cf504..00000000 --- a/docs/.vitepress/config.ts +++ /dev/null @@ -1,280 +0,0 @@ -import { defineConfig } from "vitepress"; - -export default defineConfig({ - srcDir: "src", - - head: [ - ["link", { rel: "icon", type: "image/x-icon", href: "/favicon.ico" }], - ["link", { rel: "canonical", href: "https://docs.castopod.org/" }], - ["meta", { name: "robots", content: "index, follow" }], - ["meta", { property: "og:type", content: "website" }], - [ - "meta", - { - property: "og:image", - content: "https://docs.castopod.org/images/open-graph.jpg", - }, - ], - ["meta", { property: "og:image:type", content: "image/jpeg" }], - ["meta", { property: "og:image:width", content: "1200" }], - ["meta", { property: "og:image:height", content: "630" }], - [ - "meta", - { - property: "og:image:alt", - content: - "Castopod mascot waving hello and holding a browser showcasing the Castopod documentation.", - }, - ], - ["meta", { property: "og:url", content: "https://docs.castopod.org/" }], - ["meta", { name: "twitter:site", content: "@castopod" }], - ["meta", { name: "twitter:card", content: "summary_large_image" }], - ["meta", { name: "twitter:creator", content: "@ad_aures" }], - [ - "script", - { - defer: "defer", - "data-domain": "docs.castopod.org", - src: "https://analytics.castopod.org/js/plausible.js", - }, - ], - ], - - locales: { - "/": { - lang: "en", - title: "Castopod documentation", - description: - "Check out the Castopod documentation! Install your own free & open-source podcast host, help make it better by contributing, or simply learn more about Castopod!", - }, - "/fr/": { - lang: "fr", - title: "Documentation Castopod", - description: - "Castopod est une plateforme d’hébergement gratuite & open-source conçue pour les podcasteurs qui veulent échanger et interagir avec leur public.", - }, - "/pt-BR/": { - lang: "pt-BR", - title: "Documentação Castopod", - description: - "Castopod é uma plataforma de hospedagem de código livre & aberto feita para podcasters que querem se envolver e interagir com seu público.", - }, - "/nn-NO/": { - lang: "nn-NO", - title: "Castopod dokumentasjon", - description: - "Castopod er ei open og gratis løysing for dei som vil køyra si eiga podkasting-plattform, og for podkastarar som vil engasjera og samhandla med publikum.", - }, - }, - - themeConfig: { - logo: "/images/castopod-icon.svg", - lastUpdated: "Last Updated", - repo: "https://code.castopod.org/adaures/castopod", - docsDir: "docs/src", - docsBranch: "develop", - editLinks: true, - locales: { - "/": { - label: "English", - selectText: "Languages", - repoLabel: "Source code", - nav: [ - { - text: "Home", - link: "https://castopod.org/", - }, - { - text: "Blog", - link: "https://blog.castopod.org/", - }, - { - text: "Github", - link: "https://github.com/ad-aures/castopod", - }, - ], - sidebar: { - "/": getGuideSidebarEn(), - }, - }, - "/fr/": { - label: "Français", - selectText: "Langues", - repoLabel: "Code source", - nav: [ - { - text: "Accueil", - link: "https://castopod.org/", - }, - { - text: "Blog", - link: "https://blog.castopod.org/", - }, - { - text: "Github", - link: "https://github.com/ad-aures/castopod", - }, - ], - sidebar: { - "/": getGuideSidebarFr(), - }, - }, - "/pt-BR/": { - label: "Português do Brasil", - selectText: "Línguas", - repoLabel: "Código fonte", - nav: [ - { - text: "Início", - link: "https://castopod.org/", - }, - { - text: "Blogue", - link: "https://blog.castopod.org/", - }, - { - text: "Github", - link: "https://github.com/ad-aures/castopod", - }, - ], - sidebar: { "/pt-BR/": getGuideSidebarPtBR() }, - }, - "/nn-NO/": { - label: "Norsk nynorsk", - selectText: "Språk", - repoLabel: "Kildekode", - nav: [ - { - text: "Heim", - link: "https://castopod.org/", - }, - { - text: "Blogg", - link: "https://blog.castopod.org/", - }, - { - text: "Github", - link: "https://github.com/ad-aures/castopod", - }, - ], - sidebar: { "/nn-NO/": getGuideSidebarNnNO() }, - }, - }, - }, -}); - -function getGuideSidebarEn() { - return [ - { - text: "Introduction", - link: "/", - }, - { - text: "Getting started", - children: [ - { text: "Install", link: "/getting-started/install" }, - { - text: "Docker", - link: "/getting-started/docker", - }, - { text: "Security", link: "/getting-started/security" }, - { text: "Update", link: "/getting-started/update" }, - { text: "Auth", link: "/getting-started/auth" }, - ], - }, - { - text: "Contributing", - children: [ - { text: "Guide", link: "/contributing/guidelines" }, - { text: "Dev Setup", link: "/contributing/setup-development" }, - ], - }, - ]; -} - -function getGuideSidebarFr() { - return [ - { - text: "Introduction", - link: "/fr/", - }, - { - text: "Commencer", - children: [ - { text: "Installer", link: "/fr/getting-started/install" }, - { - text: "Docker", - link: "/fr/getting-started/docker", - }, - { text: "Sécurité", link: "/fr/getting-started/security" }, - { text: "Mise à jour", link: "/fr/getting-started/update" }, - { text: "Authentification", link: "/fr/getting-started/auth" }, - ], - }, - { - text: "Contributing", - children: [ - { text: "Guide", link: "/fr/contributing/guidelines" }, - { text: "Dev Setup", link: "/fr/contributing/setup-development" }, - ], - }, - ]; -} - -function getGuideSidebarPtBR() { - return [ - { - text: "Introdução", - link: "/pt-BR/", - }, - { - text: "Começando", - children: [ - { text: "Instalar", link: "/pt-BR/getting-started/install" }, - { - text: "Docker", - link: "/pt-BR/getting-started/docker", - }, - { text: "Segurança", link: "/pt-BR/getting-started/security" }, - { text: "Atualizar", link: "/pt-BR/getting-started/update" }, - { text: "Autenticação", link: "/pt-BR/getting-started/auth" }, - ], - }, - { - text: "Contributing", - children: [ - { text: "Guide", link: "/pt-BR/contributing/guidelines" }, - { text: "Dev Setup", link: "/pt-BR/contributing/setup-development" }, - ], - }, - ]; -} - -function getGuideSidebarNnNO() { - return [ - { - text: "Introduksjon", - link: "/nn-NO/", - }, - { - text: "Starter", - children: [ - { text: "Installer", link: "/nn-NO/getting-started/install" }, - { - text: "Docker", - link: "/nn-NO/getting-started/docker", - }, - { text: "Sikkerhet", link: "/nn-NO/getting-started/security" }, - { text: "Oppdaterer", link: "/nn-NO/getting-started/update" }, - { text: "Autentisering", link: "/pt-BR/getting-started/auth" }, - ], - }, - { - text: "Contributing", - children: [ - { text: "Guide", link: "/nn-NO/contributing/guidelines" }, - { text: "Dev Setup", link: "/nn-NO/contributing/setup-development" }, - ], - }, - ]; -} diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts deleted file mode 100644 index a60960f7..00000000 --- a/docs/.vitepress/theme/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -import Theme from "vitepress/theme"; -import "./tailwind.css"; - -export default { - ...Theme, -}; diff --git a/docs/.vitepress/theme/tailwind.css b/docs/.vitepress/theme/tailwind.css deleted file mode 100644 index 7c05d4dd..00000000 --- a/docs/.vitepress/theme/tailwind.css +++ /dev/null @@ -1,2 +0,0 @@ -@tailwind components; -@tailwind utilities; diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 00000000..1b015bf2 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,58 @@ +# Castopod Docs + +[![Built with Starlight](https://astro.badg.es/v2/built-with-starlight/tiny.svg)](https://starlight.astro.build) + +```sh +pnpm create astro@latest -- --template starlight +``` + +[![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/withastro/starlight/tree/main/examples/basics) +[![Open with CodeSandbox](https://assets.codesandbox.io/github/button-edit-lime.svg)](https://codesandbox.io/p/sandbox/github/withastro/starlight/tree/main/examples/basics) + +> 🧑‍🚀 **Seasoned astronaut?** Delete this file. Have fun! + +## 🚀 Project Structure + +Inside of your Astro + Starlight project, you'll see the following folders and +files: + +``` +. +├── public/ +├── src/ +│ ├── assets/ +│ ├── content/ +│ │ ├── docs/ +│ │ └── config.ts +│ └── env.d.ts +├── astro.config.mjs +├── package.json +└── tsconfig.json +``` + +Starlight looks for `.md` or `.mdx` files in the `src/content/docs/` directory. +Each file is exposed as a route based on its file name. + +Images can be added to `src/assets/` and embedded in Markdown with a relative +link. + +Static assets, like favicons, can be placed in the `public/` directory. + +## 🧞 Commands + +All commands are run from the root of the project, from a terminal: + +| Command | Action | +| :------------------------ | :----------------------------------------------- | +| `npm install` | Installs dependencies | +| `npm run dev` | Starts local dev server at `localhost:4321` | +| `npm run build` | Build your production site to `./dist/` | +| `npm run preview` | Preview your build locally, before deploying | +| `npm run astro ...` | Run CLI commands like `astro add`, `astro check` | +| `npm run astro -- --help` | Get help using the Astro CLI | + +## 👀 Want to learn more? + +Check out [Starlight’s docs](https://starlight.astro.build/), read +[the Astro documentation](https://docs.astro.build), or jump into the +[Astro Discord server](https://astro.build/chat). diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs new file mode 100644 index 00000000..2440a5b9 --- /dev/null +++ b/docs/astro.config.mjs @@ -0,0 +1,191 @@ +import { defineConfig } from "astro/config"; +import starlight from "@astrojs/starlight"; + +import tailwind from "@astrojs/tailwind"; + +const site = "https://docs.castopod.org/"; + +// https://astro.build/config +export default defineConfig({ + site, + base: "/docs", + integrations: [ + starlight({ + title: "Castopod Docs", + description: + "Check out the Castopod documentation! Install your own free & open-source podcast host, help make it better by contributing, or simply learn more about Castopod!", + logo: { + src: "./src/assets/castopod-logo-inline.svg", + replacesTitle: true, + }, + favicon: "/favicon.ico", + customCss: [ + "@fontsource/inter/400.css", + "@fontsource/inter/600.css", + "@fontsource/rubik/700.css", + "./src/styles/tailwind.css", + ], + head: [ + { + tag: "meta", + attrs: { + property: "og:type", + content: "website", + }, + }, + { + tag: "meta", + attrs: { + property: "og:image", + content: site + "open-graph.jpg?v=1", + }, + }, + { + tag: "meta", + attrs: { property: "og:image:type", content: "image/jpeg" }, + }, + { tag: "meta", attrs: { property: "og:image:width", content: "1200" } }, + { tag: "meta", attrs: { property: "og:image:height", content: "630" } }, + { + tag: "meta", + attrs: { + property: "og:image:alt", + content: + "Castopod mascot waving hello and holding a browser showcasing the Castopod documentation.", + }, + }, + { + tag: "meta", + attrs: { property: "og:url", content: "https://docs.castopod.org/" }, + }, + { tag: "meta", attrs: { name: "twitter:site", content: "@castopod" } }, + { + tag: "meta", + attrs: { name: "twitter:card", content: "summary_large_image" }, + }, + { + tag: "meta", + attrs: { name: "twitter:creator", content: "@ad_aures" }, + }, + { + tag: "script", + attrs: { + src: "https://analytics.castopod.org/js/plausible.js", + "data-domain": "docs.castopod.org", + defer: true, + }, + }, + ], + defaultLocale: "en", + locales: { + en: { + label: "English", + }, + ca: { + label: "Català", + }, + de: { + label: "Deutsch", + }, + es: { + label: "Español", + }, + fr: { + label: "Français", + }, + "nn-no": { + label: "Norsk nynorsk", + lang: "nn-NO", + }, + "pt-br": { + label: "Português do Brasil", + lang: "pt-BR", + }, + "sr-latn": { + label: "Srpski", + lang: "sr-Latn", + }, + "zh-hans": { + label: "中文", + lang: "zh-Hans", + }, + }, + social: { + discord: "https://castopod.org/chat", + "x.com": "https://twitter.com/castopod", + mastodon: "https://podlibre.social/@Castopod", + gitlab: "https://code.castopod.org/adaures/castopod", + github: "https://github.com/ad-aures/castopod", + }, + sidebar: [ + { + label: "Instroduction", + link: "/", + translations: { + fr: "Installer", + "pt-br": "Instalar", + "nn-no": "Installer", + }, + }, + { + label: "Getting started", + translations: { + fr: "Commencer", + "pt-br": "Começando", + "nn-no": "Starter", + }, + items: [ + // Each item here is one entry in the navigation menu. + { + label: "Install", + link: "/getting-started/install/", + translations: { + fr: "Installer", + "pt-br": "Instalar", + "nn-no": "Installer", + }, + }, + { + label: "Docker", + link: "/getting-started/docker/", + }, + { + label: "Security", + link: "/getting-started/security/", + translations: { + fr: "Sécurité", + "pt-br": "Segurança", + "nn-no": "Sikkerhet", + }, + }, + { + label: "Update", + link: "/getting-started/update/", + translations: { + fr: "Mise à jour", + "pt-br": "Atualizar", + "nn-no": "Oppdaterer", + }, + }, + { + label: "Auth", + link: "/getting-started/auth/", + translations: { + fr: "Authentification", + "pt-br": "Autenticação", + "nn-no": "Autentisering", + }, + }, + ], + }, + ], + editLink: { + baseUrl: + "https://code.castopod.org/adaures/castopod/-/edit/develop/docs/", + }, + }), + tailwind({ + applyBaseStyles: false, + }), + ], +}); diff --git a/docs/package-lock.json b/docs/package-lock.json deleted file mode 100644 index 493eb496..00000000 --- a/docs/package-lock.json +++ /dev/null @@ -1,2804 +0,0 @@ -{ - "name": "castopod-docs", - "version": "0.0.0-development", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "castopod-docs", - "version": "0.0.0-development", - "license": "AGPL-3.0-or-later", - "devDependencies": { - "tailwindcss": "^3.2.7", - "vitepress": "^0.22.4" - } - }, - "node_modules/@algolia/autocomplete-core": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.7.4.tgz", - "integrity": "sha512-daoLpQ3ps/VTMRZDEBfU8ixXd+amZcNJ4QSP3IERGyzqnL5Ch8uSRFt/4G8pUvW9c3o6GA4vtVv4I4lmnkdXyg==", - "dev": true, - "dependencies": { - "@algolia/autocomplete-shared": "1.7.4" - } - }, - "node_modules/@algolia/autocomplete-preset-algolia": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.4.tgz", - "integrity": "sha512-s37hrvLEIfcmKY8VU9LsAXgm2yfmkdHT3DnA3SgHaY93yjZ2qL57wzb5QweVkYuEBZkT2PIREvRoLXC2sxTbpQ==", - "dev": true, - "dependencies": { - "@algolia/autocomplete-shared": "1.7.4" - }, - "peerDependencies": { - "@algolia/client-search": ">= 4.9.1 < 6", - "algoliasearch": ">= 4.9.1 < 6" - } - }, - "node_modules/@algolia/autocomplete-shared": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.4.tgz", - "integrity": "sha512-2VGCk7I9tA9Ge73Km99+Qg87w0wzW4tgUruvWAn/gfey1ZXgmxZtyIRBebk35R1O8TbK77wujVtCnpsGpRy1kg==", - "dev": true - }, - "node_modules/@algolia/cache-browser-local-storage": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.15.0.tgz", - "integrity": "sha512-uxxFhTWh4JJDb2+FFSmNMfEQ8p9o2vjSpU7iW007QX3OvqljPPN68lk3bpZVaG8pwr5MU1DqpkZ71FcQdVTjgQ==", - "dev": true, - "dependencies": { - "@algolia/cache-common": "4.15.0" - } - }, - "node_modules/@algolia/cache-common": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.15.0.tgz", - "integrity": "sha512-Me3PbI4QurAM+3D+htIE0l1xt6+bl/18SG6Wc7bPQEZAtN7DTGz22HqhKNyLF2lR/cOfpaH7umXZlZEhIHf7gQ==", - "dev": true - }, - "node_modules/@algolia/cache-in-memory": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.15.0.tgz", - "integrity": "sha512-B9mg1wd7CKMfpkbiTQ8KlcKkH6ut/goVaI6XmDCUczOOqeuZlV34tuEi7o3Xo1j66KWr/d9pMjjGYcoVPCVeOA==", - "dev": true, - "dependencies": { - "@algolia/cache-common": "4.15.0" - } - }, - "node_modules/@algolia/client-account": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.15.0.tgz", - "integrity": "sha512-8wqI33HRZy5ydfFt6F5vMhtkOiAUhVfSCYXx4U3Go5RALqWLgVUp6wzOo0mr1z08POCkHDpbQMQvyayb1CZ/kw==", - "dev": true, - "dependencies": { - "@algolia/client-common": "4.15.0", - "@algolia/client-search": "4.15.0", - "@algolia/transporter": "4.15.0" - } - }, - "node_modules/@algolia/client-analytics": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.15.0.tgz", - "integrity": "sha512-jrPjEeNEIIQKeA1XCZXx3f3aybtwF7wjYlnfHbLARuZ9AuHzimOKjX0ZwqvMmvTsHivpcZ2rqY+j1E8HoH1ELA==", - "dev": true, - "dependencies": { - "@algolia/client-common": "4.15.0", - "@algolia/client-search": "4.15.0", - "@algolia/requester-common": "4.15.0", - "@algolia/transporter": "4.15.0" - } - }, - "node_modules/@algolia/client-common": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.15.0.tgz", - "integrity": "sha512-PlsJMObZuYw4JlG5EhYv1PHDOv7n5mD5PzqFyoNfSOYaEPRZepa3W579ya29yOu3FZ0VGMNJmB7Q5v/+/fwvIw==", - "dev": true, - "dependencies": { - "@algolia/requester-common": "4.15.0", - "@algolia/transporter": "4.15.0" - } - }, - "node_modules/@algolia/client-personalization": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.15.0.tgz", - "integrity": "sha512-Bf0bhRAiNL9LWurzyHRH8UBi4fDt3VbCNkInxVngKQT1uCZWXecwoPWGhcSSpdanBqFJA/1WBt+BWx7a50Bhlg==", - "dev": true, - "dependencies": { - "@algolia/client-common": "4.15.0", - "@algolia/requester-common": "4.15.0", - "@algolia/transporter": "4.15.0" - } - }, - "node_modules/@algolia/client-search": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.15.0.tgz", - "integrity": "sha512-dTwZD4u53WdmexnMcoO2Qd/+YCP3ESXKOtD2MryQ1a9dHwB2Y3Qob0kyS1PG82idwM3enbznvscI9Sf4o9PUWQ==", - "dev": true, - "dependencies": { - "@algolia/client-common": "4.15.0", - "@algolia/requester-common": "4.15.0", - "@algolia/transporter": "4.15.0" - } - }, - "node_modules/@algolia/logger-common": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.15.0.tgz", - "integrity": "sha512-D8OFwn/HpvQz66goIcjxOKsYBMuxiruxJ3cA/bnc0EiDvSA2P2z6bNQWgS5gbstuTZIJmbhr+53NyOxFkmMNAA==", - "dev": true - }, - "node_modules/@algolia/logger-console": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.15.0.tgz", - "integrity": "sha512-pQOvVaRSEJQJRXKTnxEA6nN1hipSQadJJ4einw0nIlfMOGZh/kps1ybh8vRUlUGyfEuN/3dyFs0W3Ac7hIItlg==", - "dev": true, - "dependencies": { - "@algolia/logger-common": "4.15.0" - } - }, - "node_modules/@algolia/requester-browser-xhr": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.15.0.tgz", - "integrity": "sha512-va186EfALF+6msYZXaoBSxcnFCg3SoWJ+uv1yMyhQRJRe7cZSHWSVT3s40vmar90gxlBu80KMVwVlsvJhJv6ew==", - "dev": true, - "dependencies": { - "@algolia/requester-common": "4.15.0" - } - }, - "node_modules/@algolia/requester-common": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.15.0.tgz", - "integrity": "sha512-w0UUzxElbo4hrKg4QP/jiXDNbIJuAthxdlkos9nS8KAPK2XI3R9BlUjLz/ZVs4F9TDGI0mhjrNHhZ12KXcoyhg==", - "dev": true - }, - "node_modules/@algolia/requester-node-http": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.15.0.tgz", - "integrity": "sha512-eeEOhFtgwKcgAlKAZpgBRZJ0ILSEBCXxZ9uwfVWPD24W1b6z08gVoTJ6J7lCeCnJmudg+tMElDnGzHkjup9CJA==", - "dev": true, - "dependencies": { - "@algolia/requester-common": "4.15.0" - } - }, - "node_modules/@algolia/transporter": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.15.0.tgz", - "integrity": "sha512-JoWR+ixG3EmA0UPntQFN/FV5TasYcYu93d5+oKzHFeZ6Z7rtW5Im9iy/Oh/ggk1AAN5fTdqKewtbBpdaYDbKsQ==", - "dev": true, - "dependencies": { - "@algolia/cache-common": "4.15.0", - "@algolia/logger-common": "4.15.0", - "@algolia/requester-common": "4.15.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz", - "integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@docsearch/css": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.3.3.tgz", - "integrity": "sha512-6SCwI7P8ao+se1TUsdZ7B4XzL+gqeQZnBc+2EONZlcVa0dVrk0NjETxozFKgMv0eEGH8QzP1fkN+A1rH61l4eg==", - "dev": true - }, - "node_modules/@docsearch/js": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.3.3.tgz", - "integrity": "sha512-2xAv2GFuHzzmG0SSZgf8wHX0qZX8n9Y1ZirKUk5Wrdc+vH9CL837x2hZIUdwcPZI9caBA+/CzxsS68O4waYjUQ==", - "dev": true, - "dependencies": { - "@docsearch/react": "3.3.3", - "preact": "^10.0.0" - } - }, - "node_modules/@docsearch/react": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.3.3.tgz", - "integrity": "sha512-pLa0cxnl+G0FuIDuYlW+EBK6Rw2jwLw9B1RHIeS4N4s2VhsfJ/wzeCi3CWcs5yVfxLd5ZK50t//TMA5e79YT7Q==", - "dev": true, - "dependencies": { - "@algolia/autocomplete-core": "1.7.4", - "@algolia/autocomplete-preset-algolia": "1.7.4", - "@docsearch/css": "3.3.3", - "algoliasearch": "^4.0.0" - }, - "peerDependencies": { - "@types/react": ">= 16.8.0 < 19.0.0", - "react": ">= 16.8.0 < 19.0.0", - "react-dom": ">= 16.8.0 < 19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz", - "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@vitejs/plugin-vue": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-2.3.4.tgz", - "integrity": "sha512-IfFNbtkbIm36O9KB8QodlwwYvTEsJb4Lll4c2IwB3VHc2gie2mSPtSzL0eYay7X2jd/2WX02FjSGTWR6OPr/zg==", - "dev": true, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "vite": "^2.5.10", - "vue": "^3.2.25" - } - }, - "node_modules/@vue/compiler-core": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.47.tgz", - "integrity": "sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.16.4", - "@vue/shared": "3.2.47", - "estree-walker": "^2.0.2", - "source-map": "^0.6.1" - } - }, - "node_modules/@vue/compiler-dom": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz", - "integrity": "sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==", - "dev": true, - "dependencies": { - "@vue/compiler-core": "3.2.47", - "@vue/shared": "3.2.47" - } - }, - "node_modules/@vue/compiler-sfc": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz", - "integrity": "sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.47", - "@vue/compiler-dom": "3.2.47", - "@vue/compiler-ssr": "3.2.47", - "@vue/reactivity-transform": "3.2.47", - "@vue/shared": "3.2.47", - "estree-walker": "^2.0.2", - "magic-string": "^0.25.7", - "postcss": "^8.1.10", - "source-map": "^0.6.1" - } - }, - "node_modules/@vue/compiler-ssr": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz", - "integrity": "sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==", - "dev": true, - "dependencies": { - "@vue/compiler-dom": "3.2.47", - "@vue/shared": "3.2.47" - } - }, - "node_modules/@vue/reactivity": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.47.tgz", - "integrity": "sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==", - "dev": true, - "dependencies": { - "@vue/shared": "3.2.47" - } - }, - "node_modules/@vue/reactivity-transform": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz", - "integrity": "sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.47", - "@vue/shared": "3.2.47", - "estree-walker": "^2.0.2", - "magic-string": "^0.25.7" - } - }, - "node_modules/@vue/runtime-core": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.47.tgz", - "integrity": "sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==", - "dev": true, - "dependencies": { - "@vue/reactivity": "3.2.47", - "@vue/shared": "3.2.47" - } - }, - "node_modules/@vue/runtime-dom": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.47.tgz", - "integrity": "sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==", - "dev": true, - "dependencies": { - "@vue/runtime-core": "3.2.47", - "@vue/shared": "3.2.47", - "csstype": "^2.6.8" - } - }, - "node_modules/@vue/server-renderer": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.47.tgz", - "integrity": "sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==", - "dev": true, - "dependencies": { - "@vue/compiler-ssr": "3.2.47", - "@vue/shared": "3.2.47" - }, - "peerDependencies": { - "vue": "3.2.47" - } - }, - "node_modules/@vue/shared": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.47.tgz", - "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==", - "dev": true - }, - "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-node": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", - "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", - "dev": true, - "dependencies": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" - } - }, - "node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/algoliasearch": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.15.0.tgz", - "integrity": "sha512-+vgKQF5944dYsz9zhKk07JbOYeNdKisoD5GeG0woBL3nLzbn2a+nGwki60DXg7CXvaFXBcTXyJG4C+VaBVd44g==", - "dev": true, - "dependencies": { - "@algolia/cache-browser-local-storage": "4.15.0", - "@algolia/cache-common": "4.15.0", - "@algolia/cache-in-memory": "4.15.0", - "@algolia/client-account": "4.15.0", - "@algolia/client-analytics": "4.15.0", - "@algolia/client-common": "4.15.0", - "@algolia/client-personalization": "4.15.0", - "@algolia/client-search": "4.15.0", - "@algolia/logger-common": "4.15.0", - "@algolia/logger-console": "4.15.0", - "@algolia/requester-browser-xhr": "4.15.0", - "@algolia/requester-common": "4.15.0", - "@algolia/requester-node-http": "4.15.0", - "@algolia/transporter": "4.15.0" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "2.6.21", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", - "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==", - "dev": true - }, - "node_modules/defined": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", - "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/detective": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", - "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", - "dev": true, - "dependencies": { - "acorn-node": "^1.8.2", - "defined": "^1.0.0", - "minimist": "^1.2.6" - }, - "bin": { - "detective": "bin/detective.js" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true - }, - "node_modules/esbuild": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz", - "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/linux-loong64": "0.14.54", - "esbuild-android-64": "0.14.54", - "esbuild-android-arm64": "0.14.54", - "esbuild-darwin-64": "0.14.54", - "esbuild-darwin-arm64": "0.14.54", - "esbuild-freebsd-64": "0.14.54", - "esbuild-freebsd-arm64": "0.14.54", - "esbuild-linux-32": "0.14.54", - "esbuild-linux-64": "0.14.54", - "esbuild-linux-arm": "0.14.54", - "esbuild-linux-arm64": "0.14.54", - "esbuild-linux-mips64le": "0.14.54", - "esbuild-linux-ppc64le": "0.14.54", - "esbuild-linux-riscv64": "0.14.54", - "esbuild-linux-s390x": "0.14.54", - "esbuild-netbsd-64": "0.14.54", - "esbuild-openbsd-64": "0.14.54", - "esbuild-sunos-64": "0.14.54", - "esbuild-windows-32": "0.14.54", - "esbuild-windows-64": "0.14.54", - "esbuild-windows-arm64": "0.14.54" - } - }, - "node_modules/esbuild-android-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz", - "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-android-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz", - "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz", - "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz", - "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz", - "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz", - "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-32": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz", - "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz", - "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz", - "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz", - "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-mips64le": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz", - "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-ppc64le": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz", - "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-riscv64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz", - "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-s390x": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz", - "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-netbsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz", - "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-openbsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz", - "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sunos-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz", - "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-32": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz", - "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz", - "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz", - "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dev": true, - "dependencies": { - "sourcemap-codec": "^1.4.8" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss": { - "version": "8.4.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", - "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - } - ], - "dependencies": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", - "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", - "dev": true, - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" - }, - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-nested": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz", - "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", - "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/preact": { - "version": "10.13.1", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.13.1.tgz", - "integrity": "sha512-KyoXVDU5OqTpG9LXlB3+y639JAGzl8JSBXLn1J9HTSB3gbKcuInga7bZnXLlxmK94ntTs1EFeZp0lrja2AuBYQ==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" - } - }, - "node_modules/prismjs": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", - "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rollup": { - "version": "2.77.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.77.3.tgz", - "integrity": "sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "deprecated": "Please use @jridgewell/sourcemap-codec instead", - "dev": true - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tailwindcss": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.7.tgz", - "integrity": "sha512-B6DLqJzc21x7wntlH/GsZwEXTBttVSl1FtCzC8WP4oBc/NKef7kaax5jeihkkCEWc831/5NDJ9gRNDK6NEioQQ==", - "dev": true, - "dependencies": { - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "color-name": "^1.1.4", - "detective": "^5.2.1", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.12", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "lilconfig": "^2.0.6", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.0.9", - "postcss-import": "^14.1.0", - "postcss-js": "^4.0.0", - "postcss-load-config": "^3.1.4", - "postcss-nested": "6.0.0", - "postcss-selector-parser": "^6.0.11", - "postcss-value-parser": "^4.2.0", - "quick-lru": "^5.1.1", - "resolve": "^1.22.1" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/vite": { - "version": "2.9.15", - "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.15.tgz", - "integrity": "sha512-fzMt2jK4vQ3yK56te3Kqpkaeq9DkcZfBbzHwYpobasvgYmP2SoAr6Aic05CsB4CzCZbsDv4sujX3pkEGhLabVQ==", - "dev": true, - "dependencies": { - "esbuild": "^0.14.27", - "postcss": "^8.4.13", - "resolve": "^1.22.0", - "rollup": ">=2.59.0 <2.78.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": ">=12.2.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "less": "*", - "sass": "*", - "stylus": "*" - }, - "peerDependenciesMeta": { - "less": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - } - } - }, - "node_modules/vitepress": { - "version": "0.22.4", - "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-0.22.4.tgz", - "integrity": "sha512-oZUnLO/SpYdThaBKefDeOiVlr0Rie4Ppx3FzMnMyLtJnI5GlBMNjqYqMy/4+umm/iC+ZDJfI+IlDKxv5fZnYzA==", - "dev": true, - "dependencies": { - "@docsearch/css": "^3.0.0", - "@docsearch/js": "^3.0.0", - "@vitejs/plugin-vue": "^2.3.2", - "prismjs": "^1.25.0", - "vite": "^2.9.7", - "vue": "^3.2.33" - }, - "bin": { - "vitepress": "bin/vitepress.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/vue": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.47.tgz", - "integrity": "sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==", - "dev": true, - "dependencies": { - "@vue/compiler-dom": "3.2.47", - "@vue/compiler-sfc": "3.2.47", - "@vue/runtime-dom": "3.2.47", - "@vue/server-renderer": "3.2.47", - "@vue/shared": "3.2.47" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "engines": { - "node": ">= 6" - } - } - }, - "dependencies": { - "@algolia/autocomplete-core": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.7.4.tgz", - "integrity": "sha512-daoLpQ3ps/VTMRZDEBfU8ixXd+amZcNJ4QSP3IERGyzqnL5Ch8uSRFt/4G8pUvW9c3o6GA4vtVv4I4lmnkdXyg==", - "dev": true, - "requires": { - "@algolia/autocomplete-shared": "1.7.4" - } - }, - "@algolia/autocomplete-preset-algolia": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.4.tgz", - "integrity": "sha512-s37hrvLEIfcmKY8VU9LsAXgm2yfmkdHT3DnA3SgHaY93yjZ2qL57wzb5QweVkYuEBZkT2PIREvRoLXC2sxTbpQ==", - "dev": true, - "requires": { - "@algolia/autocomplete-shared": "1.7.4" - } - }, - "@algolia/autocomplete-shared": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.4.tgz", - "integrity": "sha512-2VGCk7I9tA9Ge73Km99+Qg87w0wzW4tgUruvWAn/gfey1ZXgmxZtyIRBebk35R1O8TbK77wujVtCnpsGpRy1kg==", - "dev": true - }, - "@algolia/cache-browser-local-storage": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.15.0.tgz", - "integrity": "sha512-uxxFhTWh4JJDb2+FFSmNMfEQ8p9o2vjSpU7iW007QX3OvqljPPN68lk3bpZVaG8pwr5MU1DqpkZ71FcQdVTjgQ==", - "dev": true, - "requires": { - "@algolia/cache-common": "4.15.0" - } - }, - "@algolia/cache-common": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.15.0.tgz", - "integrity": "sha512-Me3PbI4QurAM+3D+htIE0l1xt6+bl/18SG6Wc7bPQEZAtN7DTGz22HqhKNyLF2lR/cOfpaH7umXZlZEhIHf7gQ==", - "dev": true - }, - "@algolia/cache-in-memory": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.15.0.tgz", - "integrity": "sha512-B9mg1wd7CKMfpkbiTQ8KlcKkH6ut/goVaI6XmDCUczOOqeuZlV34tuEi7o3Xo1j66KWr/d9pMjjGYcoVPCVeOA==", - "dev": true, - "requires": { - "@algolia/cache-common": "4.15.0" - } - }, - "@algolia/client-account": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.15.0.tgz", - "integrity": "sha512-8wqI33HRZy5ydfFt6F5vMhtkOiAUhVfSCYXx4U3Go5RALqWLgVUp6wzOo0mr1z08POCkHDpbQMQvyayb1CZ/kw==", - "dev": true, - "requires": { - "@algolia/client-common": "4.15.0", - "@algolia/client-search": "4.15.0", - "@algolia/transporter": "4.15.0" - } - }, - "@algolia/client-analytics": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.15.0.tgz", - "integrity": "sha512-jrPjEeNEIIQKeA1XCZXx3f3aybtwF7wjYlnfHbLARuZ9AuHzimOKjX0ZwqvMmvTsHivpcZ2rqY+j1E8HoH1ELA==", - "dev": true, - "requires": { - "@algolia/client-common": "4.15.0", - "@algolia/client-search": "4.15.0", - "@algolia/requester-common": "4.15.0", - "@algolia/transporter": "4.15.0" - } - }, - "@algolia/client-common": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.15.0.tgz", - "integrity": "sha512-PlsJMObZuYw4JlG5EhYv1PHDOv7n5mD5PzqFyoNfSOYaEPRZepa3W579ya29yOu3FZ0VGMNJmB7Q5v/+/fwvIw==", - "dev": true, - "requires": { - "@algolia/requester-common": "4.15.0", - "@algolia/transporter": "4.15.0" - } - }, - "@algolia/client-personalization": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.15.0.tgz", - "integrity": "sha512-Bf0bhRAiNL9LWurzyHRH8UBi4fDt3VbCNkInxVngKQT1uCZWXecwoPWGhcSSpdanBqFJA/1WBt+BWx7a50Bhlg==", - "dev": true, - "requires": { - "@algolia/client-common": "4.15.0", - "@algolia/requester-common": "4.15.0", - "@algolia/transporter": "4.15.0" - } - }, - "@algolia/client-search": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.15.0.tgz", - "integrity": "sha512-dTwZD4u53WdmexnMcoO2Qd/+YCP3ESXKOtD2MryQ1a9dHwB2Y3Qob0kyS1PG82idwM3enbznvscI9Sf4o9PUWQ==", - "dev": true, - "requires": { - "@algolia/client-common": "4.15.0", - "@algolia/requester-common": "4.15.0", - "@algolia/transporter": "4.15.0" - } - }, - "@algolia/logger-common": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.15.0.tgz", - "integrity": "sha512-D8OFwn/HpvQz66goIcjxOKsYBMuxiruxJ3cA/bnc0EiDvSA2P2z6bNQWgS5gbstuTZIJmbhr+53NyOxFkmMNAA==", - "dev": true - }, - "@algolia/logger-console": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.15.0.tgz", - "integrity": "sha512-pQOvVaRSEJQJRXKTnxEA6nN1hipSQadJJ4einw0nIlfMOGZh/kps1ybh8vRUlUGyfEuN/3dyFs0W3Ac7hIItlg==", - "dev": true, - "requires": { - "@algolia/logger-common": "4.15.0" - } - }, - "@algolia/requester-browser-xhr": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.15.0.tgz", - "integrity": "sha512-va186EfALF+6msYZXaoBSxcnFCg3SoWJ+uv1yMyhQRJRe7cZSHWSVT3s40vmar90gxlBu80KMVwVlsvJhJv6ew==", - "dev": true, - "requires": { - "@algolia/requester-common": "4.15.0" - } - }, - "@algolia/requester-common": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.15.0.tgz", - "integrity": "sha512-w0UUzxElbo4hrKg4QP/jiXDNbIJuAthxdlkos9nS8KAPK2XI3R9BlUjLz/ZVs4F9TDGI0mhjrNHhZ12KXcoyhg==", - "dev": true - }, - "@algolia/requester-node-http": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.15.0.tgz", - "integrity": "sha512-eeEOhFtgwKcgAlKAZpgBRZJ0ILSEBCXxZ9uwfVWPD24W1b6z08gVoTJ6J7lCeCnJmudg+tMElDnGzHkjup9CJA==", - "dev": true, - "requires": { - "@algolia/requester-common": "4.15.0" - } - }, - "@algolia/transporter": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.15.0.tgz", - "integrity": "sha512-JoWR+ixG3EmA0UPntQFN/FV5TasYcYu93d5+oKzHFeZ6Z7rtW5Im9iy/Oh/ggk1AAN5fTdqKewtbBpdaYDbKsQ==", - "dev": true, - "requires": { - "@algolia/cache-common": "4.15.0", - "@algolia/logger-common": "4.15.0", - "@algolia/requester-common": "4.15.0" - } - }, - "@babel/parser": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz", - "integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==", - "dev": true - }, - "@docsearch/css": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.3.3.tgz", - "integrity": "sha512-6SCwI7P8ao+se1TUsdZ7B4XzL+gqeQZnBc+2EONZlcVa0dVrk0NjETxozFKgMv0eEGH8QzP1fkN+A1rH61l4eg==", - "dev": true - }, - "@docsearch/js": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.3.3.tgz", - "integrity": "sha512-2xAv2GFuHzzmG0SSZgf8wHX0qZX8n9Y1ZirKUk5Wrdc+vH9CL837x2hZIUdwcPZI9caBA+/CzxsS68O4waYjUQ==", - "dev": true, - "requires": { - "@docsearch/react": "3.3.3", - "preact": "^10.0.0" - } - }, - "@docsearch/react": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.3.3.tgz", - "integrity": "sha512-pLa0cxnl+G0FuIDuYlW+EBK6Rw2jwLw9B1RHIeS4N4s2VhsfJ/wzeCi3CWcs5yVfxLd5ZK50t//TMA5e79YT7Q==", - "dev": true, - "requires": { - "@algolia/autocomplete-core": "1.7.4", - "@algolia/autocomplete-preset-algolia": "1.7.4", - "@docsearch/css": "3.3.3", - "algoliasearch": "^4.0.0" - } - }, - "@esbuild/linux-loong64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz", - "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==", - "dev": true, - "optional": true - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@vitejs/plugin-vue": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-2.3.4.tgz", - "integrity": "sha512-IfFNbtkbIm36O9KB8QodlwwYvTEsJb4Lll4c2IwB3VHc2gie2mSPtSzL0eYay7X2jd/2WX02FjSGTWR6OPr/zg==", - "dev": true, - "requires": {} - }, - "@vue/compiler-core": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.47.tgz", - "integrity": "sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==", - "dev": true, - "requires": { - "@babel/parser": "^7.16.4", - "@vue/shared": "3.2.47", - "estree-walker": "^2.0.2", - "source-map": "^0.6.1" - } - }, - "@vue/compiler-dom": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz", - "integrity": "sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==", - "dev": true, - "requires": { - "@vue/compiler-core": "3.2.47", - "@vue/shared": "3.2.47" - } - }, - "@vue/compiler-sfc": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz", - "integrity": "sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==", - "dev": true, - "requires": { - "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.47", - "@vue/compiler-dom": "3.2.47", - "@vue/compiler-ssr": "3.2.47", - "@vue/reactivity-transform": "3.2.47", - "@vue/shared": "3.2.47", - "estree-walker": "^2.0.2", - "magic-string": "^0.25.7", - "postcss": "^8.1.10", - "source-map": "^0.6.1" - } - }, - "@vue/compiler-ssr": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz", - "integrity": "sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==", - "dev": true, - "requires": { - "@vue/compiler-dom": "3.2.47", - "@vue/shared": "3.2.47" - } - }, - "@vue/reactivity": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.47.tgz", - "integrity": "sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==", - "dev": true, - "requires": { - "@vue/shared": "3.2.47" - } - }, - "@vue/reactivity-transform": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz", - "integrity": "sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==", - "dev": true, - "requires": { - "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.47", - "@vue/shared": "3.2.47", - "estree-walker": "^2.0.2", - "magic-string": "^0.25.7" - } - }, - "@vue/runtime-core": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.47.tgz", - "integrity": "sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==", - "dev": true, - "requires": { - "@vue/reactivity": "3.2.47", - "@vue/shared": "3.2.47" - } - }, - "@vue/runtime-dom": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.47.tgz", - "integrity": "sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==", - "dev": true, - "requires": { - "@vue/runtime-core": "3.2.47", - "@vue/shared": "3.2.47", - "csstype": "^2.6.8" - } - }, - "@vue/server-renderer": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.47.tgz", - "integrity": "sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==", - "dev": true, - "requires": { - "@vue/compiler-ssr": "3.2.47", - "@vue/shared": "3.2.47" - } - }, - "@vue/shared": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.47.tgz", - "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==", - "dev": true - }, - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "acorn-node": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", - "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", - "dev": true, - "requires": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" - } - }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true - }, - "algoliasearch": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.15.0.tgz", - "integrity": "sha512-+vgKQF5944dYsz9zhKk07JbOYeNdKisoD5GeG0woBL3nLzbn2a+nGwki60DXg7CXvaFXBcTXyJG4C+VaBVd44g==", - "dev": true, - "requires": { - "@algolia/cache-browser-local-storage": "4.15.0", - "@algolia/cache-common": "4.15.0", - "@algolia/cache-in-memory": "4.15.0", - "@algolia/client-account": "4.15.0", - "@algolia/client-analytics": "4.15.0", - "@algolia/client-common": "4.15.0", - "@algolia/client-personalization": "4.15.0", - "@algolia/client-search": "4.15.0", - "@algolia/logger-common": "4.15.0", - "@algolia/logger-console": "4.15.0", - "@algolia/requester-browser-xhr": "4.15.0", - "@algolia/requester-common": "4.15.0", - "@algolia/requester-node-http": "4.15.0", - "@algolia/transporter": "4.15.0" - } - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "csstype": { - "version": "2.6.21", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", - "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==", - "dev": true - }, - "defined": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", - "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", - "dev": true - }, - "detective": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", - "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", - "dev": true, - "requires": { - "acorn-node": "^1.8.2", - "defined": "^1.0.0", - "minimist": "^1.2.6" - } - }, - "didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true - }, - "dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true - }, - "esbuild": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz", - "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==", - "dev": true, - "requires": { - "@esbuild/linux-loong64": "0.14.54", - "esbuild-android-64": "0.14.54", - "esbuild-android-arm64": "0.14.54", - "esbuild-darwin-64": "0.14.54", - "esbuild-darwin-arm64": "0.14.54", - "esbuild-freebsd-64": "0.14.54", - "esbuild-freebsd-arm64": "0.14.54", - "esbuild-linux-32": "0.14.54", - "esbuild-linux-64": "0.14.54", - "esbuild-linux-arm": "0.14.54", - "esbuild-linux-arm64": "0.14.54", - "esbuild-linux-mips64le": "0.14.54", - "esbuild-linux-ppc64le": "0.14.54", - "esbuild-linux-riscv64": "0.14.54", - "esbuild-linux-s390x": "0.14.54", - "esbuild-netbsd-64": "0.14.54", - "esbuild-openbsd-64": "0.14.54", - "esbuild-sunos-64": "0.14.54", - "esbuild-windows-32": "0.14.54", - "esbuild-windows-64": "0.14.54", - "esbuild-windows-arm64": "0.14.54" - } - }, - "esbuild-android-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz", - "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==", - "dev": true, - "optional": true - }, - "esbuild-android-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz", - "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==", - "dev": true, - "optional": true - }, - "esbuild-darwin-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz", - "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==", - "dev": true, - "optional": true - }, - "esbuild-darwin-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz", - "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz", - "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz", - "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==", - "dev": true, - "optional": true - }, - "esbuild-linux-32": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz", - "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==", - "dev": true, - "optional": true - }, - "esbuild-linux-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz", - "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz", - "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz", - "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==", - "dev": true, - "optional": true - }, - "esbuild-linux-mips64le": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz", - "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==", - "dev": true, - "optional": true - }, - "esbuild-linux-ppc64le": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz", - "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==", - "dev": true, - "optional": true - }, - "esbuild-linux-riscv64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz", - "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==", - "dev": true, - "optional": true - }, - "esbuild-linux-s390x": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz", - "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==", - "dev": true, - "optional": true - }, - "esbuild-netbsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz", - "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==", - "dev": true, - "optional": true - }, - "esbuild-openbsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz", - "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==", - "dev": true, - "optional": true - }, - "esbuild-sunos-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz", - "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==", - "dev": true, - "optional": true - }, - "esbuild-windows-32": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz", - "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==", - "dev": true, - "optional": true - }, - "esbuild-windows-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz", - "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==", - "dev": true, - "optional": true - }, - "esbuild-windows-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz", - "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==", - "dev": true, - "optional": true - }, - "estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, - "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true - }, - "magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.8" - } - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true - }, - "nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "dev": true - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true - }, - "postcss": { - "version": "8.4.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", - "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", - "dev": true, - "requires": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "postcss-import": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", - "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - } - }, - "postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, - "requires": { - "camelcase-css": "^2.0.1" - } - }, - "postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", - "dev": true, - "requires": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" - } - }, - "postcss-nested": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz", - "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-selector-parser": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", - "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "preact": { - "version": "10.13.1", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.13.1.tgz", - "integrity": "sha512-KyoXVDU5OqTpG9LXlB3+y639JAGzl8JSBXLn1J9HTSB3gbKcuInga7bZnXLlxmK94ntTs1EFeZp0lrja2AuBYQ==", - "dev": true - }, - "prismjs": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", - "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true - }, - "read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "requires": { - "pify": "^2.3.0" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rollup": { - "version": "2.77.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.77.3.tgz", - "integrity": "sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g==", - "dev": true, - "requires": { - "fsevents": "~2.3.2" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true - }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "tailwindcss": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.7.tgz", - "integrity": "sha512-B6DLqJzc21x7wntlH/GsZwEXTBttVSl1FtCzC8WP4oBc/NKef7kaax5jeihkkCEWc831/5NDJ9gRNDK6NEioQQ==", - "dev": true, - "requires": { - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "color-name": "^1.1.4", - "detective": "^5.2.1", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.12", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "lilconfig": "^2.0.6", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.0.9", - "postcss-import": "^14.1.0", - "postcss-js": "^4.0.0", - "postcss-load-config": "^3.1.4", - "postcss-nested": "6.0.0", - "postcss-selector-parser": "^6.0.11", - "postcss-value-parser": "^4.2.0", - "quick-lru": "^5.1.1", - "resolve": "^1.22.1" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "vite": { - "version": "2.9.15", - "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.15.tgz", - "integrity": "sha512-fzMt2jK4vQ3yK56te3Kqpkaeq9DkcZfBbzHwYpobasvgYmP2SoAr6Aic05CsB4CzCZbsDv4sujX3pkEGhLabVQ==", - "dev": true, - "requires": { - "esbuild": "^0.14.27", - "fsevents": "~2.3.2", - "postcss": "^8.4.13", - "resolve": "^1.22.0", - "rollup": ">=2.59.0 <2.78.0" - } - }, - "vitepress": { - "version": "0.22.4", - "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-0.22.4.tgz", - "integrity": "sha512-oZUnLO/SpYdThaBKefDeOiVlr0Rie4Ppx3FzMnMyLtJnI5GlBMNjqYqMy/4+umm/iC+ZDJfI+IlDKxv5fZnYzA==", - "dev": true, - "requires": { - "@docsearch/css": "^3.0.0", - "@docsearch/js": "^3.0.0", - "@vitejs/plugin-vue": "^2.3.2", - "prismjs": "^1.25.0", - "vite": "^2.9.7", - "vue": "^3.2.33" - } - }, - "vue": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.47.tgz", - "integrity": "sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==", - "dev": true, - "requires": { - "@vue/compiler-dom": "3.2.47", - "@vue/compiler-sfc": "3.2.47", - "@vue/runtime-dom": "3.2.47", - "@vue/server-renderer": "3.2.47", - "@vue/shared": "3.2.47" - } - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true - } - } -} diff --git a/docs/package.json b/docs/package.json index 06cafed3..c995429a 100644 --- a/docs/package.json +++ b/docs/package.json @@ -1,21 +1,28 @@ { - "name": "castopod-docs", - "version": "0.0.0-development", - "description": "Castopod documentation using vitepress", - "main": "index.js", + "name": "civil-chasm", + "type": "module", + "version": "0.0.1", "scripts": { - "dev": "vitepress --port=3050", - "build": "vitepress build", - "serve": "vitepress serve" + "dev": "astro dev", + "start": "astro dev", + "build": "astro check && astro build", + "preview": "astro preview", + "astro": "astro", + "prepare": "astro telemetry disable" }, - "author": { - "name": "Yassine Doghri", - "email": "yassine@doghri.fr", - "url": "https://code.castopod.org/yassine" - }, - "license": "AGPL-3.0-or-later", - "devDependencies": { - "tailwindcss": "^3.2.7", - "vitepress": "^0.22.4" + "dependencies": { + "@astrojs/check": "^0.7.0", + "@astrojs/starlight": "^0.22.4", + "@astrojs/starlight-tailwind": "^2.0.2", + "@astrojs/tailwind": "^5.1.0", + "@fontsource/inter": "^5.0.18", + "@fontsource/rubik": "^5.0.20", + "astro": "^4.8.6", + "autoprefixer": "^10.4.19", + "cssnano": "^7.0.1", + "postcss-preset-env": "^9.5.13", + "sharp": "^0.33.4", + "tailwindcss": "^3.4.3", + "typescript": "^5.4.5" } } diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml new file mode 100644 index 00000000..2f88765a --- /dev/null +++ b/docs/pnpm-lock.yaml @@ -0,0 +1,9544 @@ +lockfileVersion: "9.0" + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + .: + dependencies: + "@astrojs/check": + specifier: ^0.7.0 + version: 0.7.0(typescript@5.4.5) + "@astrojs/starlight": + specifier: ^0.22.4 + version: 0.22.4(astro@4.8.6(typescript@5.4.5)) + "@astrojs/starlight-tailwind": + specifier: ^2.0.2 + version: 2.0.2(@astrojs/starlight@0.22.4(astro@4.8.6(typescript@5.4.5)))(@astrojs/tailwind@5.1.0(astro@4.8.6(typescript@5.4.5))(tailwindcss@3.4.3))(tailwindcss@3.4.3) + "@astrojs/tailwind": + specifier: ^5.1.0 + version: 5.1.0(astro@4.8.6(typescript@5.4.5))(tailwindcss@3.4.3) + "@fontsource/inter": + specifier: ^5.0.18 + version: 5.0.18 + "@fontsource/rubik": + specifier: ^5.0.20 + version: 5.0.20 + astro: + specifier: ^4.8.6 + version: 4.8.6(typescript@5.4.5) + autoprefixer: + specifier: ^10.4.19 + version: 10.4.19(postcss@8.4.33) + cssnano: + specifier: ^7.0.1 + version: 7.0.1(postcss@8.4.33) + postcss-preset-env: + specifier: ^9.5.13 + version: 9.5.13(postcss@8.4.33) + sharp: + specifier: ^0.33.4 + version: 0.33.4 + tailwindcss: + specifier: ^3.4.3 + version: 3.4.3 + typescript: + specifier: ^5.4.5 + version: 5.4.5 + +packages: + "@alloc/quick-lru@5.2.0": + resolution: + { + integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==, + } + engines: { node: ">=10" } + + "@ampproject/remapping@2.2.1": + resolution: + { + integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==, + } + engines: { node: ">=6.0.0" } + + "@astrojs/check@0.7.0": + resolution: + { + integrity: sha512-UTqwOeKNu9IYZmJXEeWnQuTdSd/pX58Hl4TUARsMlT97SVDL//kLBE4T/ctxRz6J573N87oE5ddtW/uOOnQTug==, + } + hasBin: true + peerDependencies: + typescript: ^5.0.0 + + "@astrojs/compiler@2.8.0": + resolution: + { + integrity: sha512-yrpD1WRGqsJwANaDIdtHo+YVjvIOFAjC83lu5qENIgrafwZcJgSXDuwVMXOgok4tFzpeKLsFQ6c3FoUdloLWBQ==, + } + + "@astrojs/internal-helpers@0.4.0": + resolution: + { + integrity: sha512-6B13lz5n6BrbTqCTwhXjJXuR1sqiX/H6rTxzlXx+lN1NnV4jgnq/KJldCQaUWJzPL5SiWahQyinxAbxQtwgPHA==, + } + + "@astrojs/language-server@2.10.0": + resolution: + { + integrity: sha512-crHXpqYfA5qWioiuZnZFpTsNItgBlF1f0S9MzDYS7/pfCALkHNJ7K3w9U/j0uMKymsT4hC7BfMaX0DYlfdSzHg==, + } + hasBin: true + peerDependencies: + prettier: ^3.0.0 + prettier-plugin-astro: ">=0.11.0" + peerDependenciesMeta: + prettier: + optional: true + prettier-plugin-astro: + optional: true + + "@astrojs/markdown-remark@5.1.0": + resolution: + { + integrity: sha512-S6Z3K2hOB7MfjeDoHsotnP/q2UsnEDB8NlNAaCjMDsGBZfTUbWxyLW3CaphEWw08f6KLZi2ibK9yC3BaMhh2NQ==, + } + + "@astrojs/mdx@2.3.1": + resolution: + { + integrity: sha512-BOQFKD2Pi9cRntNQJlpF2fh4xV8doNpmVy9NKI95r4jsitrY4X5aTOhAowi+fkQgP/zW1A4HwCyQ6Pdam6z8zQ==, + } + engines: { node: ^18.17.1 || ^20.3.0 || >=21.0.0 } + peerDependencies: + astro: ^4.0.0 + + "@astrojs/prism@3.1.0": + resolution: + { + integrity: sha512-Z9IYjuXSArkAUx3N6xj6+Bnvx8OdUSHA8YoOgyepp3+zJmtVYJIl/I18GozdJVW1p5u/CNpl3Km7/gwTJK85cw==, + } + engines: { node: ^18.17.1 || ^20.3.0 || >=21.0.0 } + + "@astrojs/sitemap@3.0.5": + resolution: + { + integrity: sha512-60eLzNjMza3ABypiQPUC6ElOSZNZeY5CwSwgJ03hfeonl+Db9x12CCzBFdTw7A5Mq+O54xEZVUrR0tB+yWgX8w==, + } + + "@astrojs/starlight-tailwind@2.0.2": + resolution: + { + integrity: sha512-XJccwk6VLeQZuGQwoiLZLNAPCn2fQobtl10Ra2c2yDLjdYEActcqy0eidZbouAwGlbS9I0iJogeGjHQJ2Casjg==, + } + peerDependencies: + "@astrojs/starlight": ">=0.9.0" + "@astrojs/tailwind": ^5.0.0 + tailwindcss: ^3.3.3 + + "@astrojs/starlight@0.22.4": + resolution: + { + integrity: sha512-AgiVEVv2ZkGHkoJcjY0azXG2K7892i+z4FpKtasnESTciomO91I/X9vAfKfHxmTxdVP5BGPxBFVi0Bp2X4Lxvg==, + } + peerDependencies: + astro: ^4.2.7 + + "@astrojs/tailwind@5.1.0": + resolution: + { + integrity: sha512-BJoCDKuWhU9FT2qYg+fr6Nfb3qP4ShtyjXGHKA/4mHN94z7BGcmauQK23iy+YH5qWvTnhqkd6mQPQ1yTZTe9Ig==, + } + peerDependencies: + astro: ^3.0.0 || ^4.0.0 + tailwindcss: ^3.0.24 + + "@astrojs/telemetry@3.1.0": + resolution: + { + integrity: sha512-/ca/+D8MIKEC8/A9cSaPUqQNZm+Es/ZinRv0ZAzvu2ios7POQSsVD+VOj7/hypWNsNM3T7RpfgNq7H2TU1KEHA==, + } + engines: { node: ^18.17.1 || ^20.3.0 || >=21.0.0 } + + "@babel/code-frame@7.24.2": + resolution: + { + integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==, + } + engines: { node: ">=6.9.0" } + + "@babel/compat-data@7.24.4": + resolution: + { + integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==, + } + engines: { node: ">=6.9.0" } + + "@babel/core@7.24.5": + resolution: + { + integrity: sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==, + } + engines: { node: ">=6.9.0" } + + "@babel/generator@7.24.5": + resolution: + { + integrity: sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-annotate-as-pure@7.22.5": + resolution: + { + integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-compilation-targets@7.23.6": + resolution: + { + integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-environment-visitor@7.22.20": + resolution: + { + integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-function-name@7.23.0": + resolution: + { + integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-hoist-variables@7.22.5": + resolution: + { + integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-module-imports@7.22.15": + resolution: + { + integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-module-imports@7.24.3": + resolution: + { + integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-module-transforms@7.24.5": + resolution: + { + integrity: sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0 + + "@babel/helper-plugin-utils@7.22.5": + resolution: + { + integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-simple-access@7.24.5": + resolution: + { + integrity: sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-split-export-declaration@7.24.5": + resolution: + { + integrity: sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-string-parser@7.24.1": + resolution: + { + integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-validator-identifier@7.24.5": + resolution: + { + integrity: sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-validator-option@7.23.5": + resolution: + { + integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==, + } + engines: { node: ">=6.9.0" } + + "@babel/helpers@7.24.5": + resolution: + { + integrity: sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==, + } + engines: { node: ">=6.9.0" } + + "@babel/highlight@7.24.5": + resolution: + { + integrity: sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==, + } + engines: { node: ">=6.9.0" } + + "@babel/parser@7.24.5": + resolution: + { + integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==, + } + engines: { node: ">=6.0.0" } + hasBin: true + + "@babel/plugin-syntax-jsx@7.23.3": + resolution: + { + integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-react-jsx@7.23.4": + resolution: + { + integrity: sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/template@7.22.15": + resolution: + { + integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==, + } + engines: { node: ">=6.9.0" } + + "@babel/template@7.24.0": + resolution: + { + integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==, + } + engines: { node: ">=6.9.0" } + + "@babel/traverse@7.24.5": + resolution: + { + integrity: sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==, + } + engines: { node: ">=6.9.0" } + + "@babel/types@7.24.5": + resolution: + { + integrity: sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==, + } + engines: { node: ">=6.9.0" } + + "@csstools/cascade-layer-name-parser@1.0.11": + resolution: + { + integrity: sha512-yhsonEAhaWRQvHFYhSzOUobH2Ev++fMci+ppFRagw0qVSPlcPV4FnNmlwpM/b2BM10ZeMRkVV4So6YRswD0O0w==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + "@csstools/css-parser-algorithms": ^2.6.3 + "@csstools/css-tokenizer": ^2.3.1 + + "@csstools/color-helpers@4.2.0": + resolution: + { + integrity: sha512-hJJrSBzbfGxUsaR6X4Bzd/FLx0F1ulKnR5ljY9AiXCtsR+H+zSWQDFWlKES1BRaVZTDHLpIIHS9K2o0h+JLlrg==, + } + engines: { node: ^14 || ^16 || >=18 } + + "@csstools/css-calc@1.2.2": + resolution: + { + integrity: sha512-0owrl7AruDRKAxoSIW8XzJdz7GnuW3AOj4rYLfmXsoKIX2ZZzttzGXoiC8n8V08X7wIBlEWWVB4C8fAN18+I6Q==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + "@csstools/css-parser-algorithms": ^2.6.3 + "@csstools/css-tokenizer": ^2.3.1 + + "@csstools/css-color-parser@2.0.2": + resolution: + { + integrity: sha512-Agx2YmxTcZ7TfB7KNZQ+iekaxbWSdblvtA35aTwE3KfuYyjOlCg3P4KGGdQF/cjm1pHWVSBo5duF/BRfZ8s07A==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + "@csstools/css-parser-algorithms": ^2.6.3 + "@csstools/css-tokenizer": ^2.3.1 + + "@csstools/css-parser-algorithms@2.6.3": + resolution: + { + integrity: sha512-xI/tL2zxzEbESvnSxwFgwvy5HS00oCXxL4MLs6HUiDcYfwowsoQaABKxUElp1ARITrINzBnsECOc1q0eg2GOrA==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + "@csstools/css-tokenizer": ^2.3.1 + + "@csstools/css-tokenizer@2.3.1": + resolution: + { + integrity: sha512-iMNHTyxLbBlWIfGtabT157LH9DUx9X8+Y3oymFEuMj8HNc+rpE3dPFGFgHjpKfjeFDjLjYIAIhXPGvS2lKxL9g==, + } + engines: { node: ^14 || ^16 || >=18 } + + "@csstools/media-query-list-parser@2.1.11": + resolution: + { + integrity: sha512-uox5MVhvNHqitPP+SynrB1o8oPxPMt2JLgp5ghJOWf54WGQ5OKu47efne49r1SWqs3wRP8xSWjnO9MBKxhB1dA==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + "@csstools/css-parser-algorithms": ^2.6.3 + "@csstools/css-tokenizer": ^2.3.1 + + "@csstools/postcss-cascade-layers@4.0.6": + resolution: + { + integrity: sha512-Xt00qGAQyqAODFiFEJNkTpSUz5VfYqnDLECdlA/Vv17nl/OIV5QfTRHGAXrBGG5YcJyHpJ+GF9gF/RZvOQz4oA==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-color-function@3.0.16": + resolution: + { + integrity: sha512-KtmXfckANSKsLBoTQCzggvKft1cmmmDKYjFO4yVlB23nWUgGInVBTE9T5JLmH29NNdTWSEPLWPUxoQ6XiIEn2Q==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-color-mix-function@2.0.16": + resolution: + { + integrity: sha512-BJnD1M5Pdypl1cJuwGuzVC52PqgzaObsDLu34jgf+QU7daVFqz432PvpqvXTmfTSNt4OckOT1QIzWexEFlDNXw==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-exponential-functions@1.0.7": + resolution: + { + integrity: sha512-9usBPQX74OhiF/VuaVrp44UAPzqbKNyoaxEa6tbEXiFp+OAm3yB/TLRKyPUWg5tvvHGCduGJVdJJB3w8c8NBtA==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-font-format-keywords@3.0.2": + resolution: + { + integrity: sha512-E0xz2sjm4AMCkXLCFvI/lyl4XO6aN1NCSMMVEOngFDJ+k2rDwfr6NDjWljk1li42jiLNChVX+YFnmfGCigZKXw==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-gamut-mapping@1.0.9": + resolution: + { + integrity: sha512-JmOeiBJj1RJriAkr+aLBaiYUpEqdNOIo3ERQ5a4uNzy18upzrQ6tz7m2Vt1GQpJ62zQj7rC5PjAhCoZCoyE31g==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-gradients-interpolation-method@4.0.17": + resolution: + { + integrity: sha512-qSNIqzLPKd2SadfWwHZv42lDRyYlLaM+Vx5rRIsnYCZbQxzFfe1XAwssrcCsHgba5bA6bi5oDoFCx0W+PRCpfw==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-hwb-function@3.0.15": + resolution: + { + integrity: sha512-l34fRiZ7o5+pULv7OplXniBTU4TuKYNNOv0abuvUanddWGSy3+YHlMKUSgcVFo0d1DorxPAhJSTCrugl+4OmMQ==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-ic-unit@3.0.6": + resolution: + { + integrity: sha512-fHaU9C/sZPauXMrzPitZ/xbACbvxbkPpHoUgB9Kw5evtsBWdVkVrajOyiT9qX7/c+G1yjApoQjP1fQatldsy9w==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-initial@1.0.1": + resolution: + { + integrity: sha512-wtb+IbUIrIf8CrN6MLQuFR7nlU5C7PwuebfeEXfjthUha1+XZj2RVi+5k/lukToA24sZkYAiSJfHM8uG/UZIdg==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-is-pseudo-class@4.0.8": + resolution: + { + integrity: sha512-0aj591yGlq5Qac+plaWCbn5cpjs5Sh0daovYUKJUOMjIp70prGH/XPLp7QjxtbFXz3CTvb0H9a35dpEuIuUi3Q==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-light-dark-function@1.0.5": + resolution: + { + integrity: sha512-kKM9dtEaVmSTb3scL2pgef62KyWv6SK19JiAnCCuiDhlRE6PADKzaPPBXmP3qj4IEgIH+cQhdEosB0eroU6Fnw==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-logical-float-and-clear@2.0.1": + resolution: + { + integrity: sha512-SsrWUNaXKr+e/Uo4R/uIsqJYt3DaggIh/jyZdhy/q8fECoJSKsSMr7nObSLdvoULB69Zb6Bs+sefEIoMG/YfOA==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-logical-overflow@1.0.1": + resolution: + { + integrity: sha512-Kl4lAbMg0iyztEzDhZuQw8Sj9r2uqFDcU1IPl+AAt2nue8K/f1i7ElvKtXkjhIAmKiy5h2EY8Gt/Cqg0pYFDCw==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-logical-overscroll-behavior@1.0.1": + resolution: + { + integrity: sha512-+kHamNxAnX8ojPCtV8WPcUP3XcqMFBSDuBuvT6MHgq7oX4IQxLIXKx64t7g9LiuJzE7vd06Q9qUYR6bh4YnGpQ==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-logical-resize@2.0.1": + resolution: + { + integrity: sha512-W5Gtwz7oIuFcKa5SmBjQ2uxr8ZoL7M2bkoIf0T1WeNqljMkBrfw1DDA8/J83k57NQ1kcweJEjkJ04pUkmyee3A==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-logical-viewport-units@2.0.9": + resolution: + { + integrity: sha512-iBBJuExgHwedFH9AqNOHWzZFgYnt17zhu1qWjmSihu1P5pw0lIG9q5t3uIgJJFDNmYoOGfBKan66z9u1QH8yBQ==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-media-minmax@1.1.6": + resolution: + { + integrity: sha512-bc0frf2Lod53j6wEHVsaVElfvCf6uhc96v99M/wUfer4MmNYfO3YLx1kFuB8xXvb0AXiWx4fohCJqemHV3bfRg==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-media-queries-aspect-ratio-number-values@2.0.9": + resolution: + { + integrity: sha512-PR0s3tFSxPoKoPLoKuiZuYhwQC5bQxq/gFfywX2u/kh8rMzesARPZYKxE71I3jHWi6KDHGZl9Xb5xcFPwtvLiQ==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-nested-calc@3.0.2": + resolution: + { + integrity: sha512-ySUmPyawiHSmBW/VI44+IObcKH0v88LqFe0d09Sb3w4B1qjkaROc6d5IA3ll9kjD46IIX/dbO5bwFN/swyoyZA==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-normalize-display-values@3.0.2": + resolution: + { + integrity: sha512-fCapyyT/dUdyPtrelQSIV+d5HqtTgnNP/BEG9IuhgXHt93Wc4CfC1bQ55GzKAjWrZbgakMQ7MLfCXEf3rlZJOw==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-oklab-function@3.0.16": + resolution: + { + integrity: sha512-zm8nND+EraZrmbO4mgcT8FrJrAQUfWNfMmbV5uTCpWtAcO5ycX3E3bO8T1TjczKYRxC5QMM/91n9YExYCF4Mvw==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-progressive-custom-properties@3.2.0": + resolution: + { + integrity: sha512-BZlirVxCRgKlE7yVme+Xvif72eTn1MYXj8oZ4Knb+jwaH4u3AN1DjbhM7j86RP5vvuAOexJ4JwfifYYKWMN/QQ==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-relative-color-syntax@2.0.16": + resolution: + { + integrity: sha512-TSM8fVqJkT8JZDranZPnkpxjU/Q1sNR192lXMND+EcKOUjYa6uYpGSfHgjnWjCRiBSciettS+sL7y9wmnas7qQ==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-scope-pseudo-class@3.0.1": + resolution: + { + integrity: sha512-3ZFonK2gfgqg29gUJ2w7xVw2wFJ1eNWVDONjbzGkm73gJHVCYK5fnCqlLr+N+KbEfv2XbWAO0AaOJCFB6Fer6A==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-stepped-value-functions@3.0.8": + resolution: + { + integrity: sha512-X76+thsvsmH/SkqVbN+vjeFKe1ABGLRx8/Wl68QTb/zvJWdzgx5S/nbszZP5O3nTRc5eI8NxIOrQUiy30fR+0g==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-text-decoration-shorthand@3.0.6": + resolution: + { + integrity: sha512-Q8HEu4AEiwNVZBD6+DpQ8M9SajpMow4+WtmndWIAv8qxDtDYL4JK1xXWkhOGk28PrcJawOvkrEZ8Ri59UN1TJw==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-trigonometric-functions@3.0.8": + resolution: + { + integrity: sha512-zEzyGriPqoIYFgHJqWNy8bmoxjM4+ONyTap1ZzQK/Lll/VsCYvx0IckB33W/u89uLSVeeB8xC7uTrkoQ7ogKyQ==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/postcss-unset-value@3.0.1": + resolution: + { + integrity: sha512-dbDnZ2ja2U8mbPP0Hvmt2RMEGBiF1H7oY6HYSpjteXJGihYwgxgTr6KRbbJ/V6c+4wd51M+9980qG4gKVn5ttg==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@csstools/selector-resolve-nested@1.1.0": + resolution: + { + integrity: sha512-uWvSaeRcHyeNenKg8tp17EVDRkpflmdyvbE0DHo6D/GdBb6PDnCYYU6gRpXhtICMGMcahQmj2zGxwFM/WC8hCg==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss-selector-parser: ^6.0.13 + + "@csstools/selector-specificity@3.1.1": + resolution: + { + integrity: sha512-a7cxGcJ2wIlMFLlh8z2ONm+715QkPHiyJcxwQlKOz/03GPw1COpfhcmC9wm4xlZfp//jWHNNMwzjtqHXVWU9KA==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss-selector-parser: ^6.0.13 + + "@csstools/utilities@1.0.0": + resolution: + { + integrity: sha512-tAgvZQe/t2mlvpNosA4+CkMiZ2azISW5WPAcdSalZlEjQvUfghHxfQcrCiK/7/CrfAWVxyM88kGFYO82heIGDg==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + "@ctrl/tinycolor@4.1.0": + resolution: + { + integrity: sha512-WyOx8cJQ+FQus4Mm4uPIZA64gbk3Wxh0so5Lcii0aJifqwoVOlfFtorjLE0Hen4OYyHZMXDWqMmaQemBhgxFRQ==, + } + engines: { node: ">=14" } + + "@emmetio/abbreviation@2.3.3": + resolution: + { + integrity: sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==, + } + + "@emmetio/css-abbreviation@2.1.8": + resolution: + { + integrity: sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==, + } + + "@emmetio/css-parser@0.4.0": + resolution: + { + integrity: sha512-z7wkxRSZgrQHXVzObGkXG+Vmj3uRlpM11oCZ9pbaz0nFejvCDmAiNDpY75+wgXOcffKpj4rzGtwGaZxfJKsJxw==, + } + + "@emmetio/html-matcher@1.3.0": + resolution: + { + integrity: sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ==, + } + + "@emmetio/scanner@1.0.4": + resolution: + { + integrity: sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==, + } + + "@emmetio/stream-reader-utils@0.1.0": + resolution: + { + integrity: sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A==, + } + + "@emmetio/stream-reader@2.2.0": + resolution: + { + integrity: sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==, + } + + "@emnapi/runtime@1.1.1": + resolution: + { + integrity: sha512-3bfqkzuR1KLx57nZfjr2NLnFOobvyS0aTszaEGCGqmYMVDRaGvgIZbjGSV/MHSSmLgQ/b9JFHQ5xm5WRZYd+XQ==, + } + + "@esbuild/aix-ppc64@0.20.2": + resolution: + { + integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==, + } + engines: { node: ">=12" } + cpu: [ppc64] + os: [aix] + + "@esbuild/aix-ppc64@0.21.3": + resolution: + { + integrity: sha512-yTgnwQpFVYfvvo4SvRFB0SwrW8YjOxEoT7wfMT7Ol5v7v5LDNvSGo67aExmxOb87nQNeWPVvaGBNfQ7BXcrZ9w==, + } + engines: { node: ">=12" } + cpu: [ppc64] + os: [aix] + + "@esbuild/android-arm64@0.20.2": + resolution: + { + integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [android] + + "@esbuild/android-arm64@0.21.3": + resolution: + { + integrity: sha512-c+ty9necz3zB1Y+d/N+mC6KVVkGUUOcm4ZmT5i/Fk5arOaY3i6CA3P5wo/7+XzV8cb4GrI/Zjp8NuOQ9Lfsosw==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [android] + + "@esbuild/android-arm@0.20.2": + resolution: + { + integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==, + } + engines: { node: ">=12" } + cpu: [arm] + os: [android] + + "@esbuild/android-arm@0.21.3": + resolution: + { + integrity: sha512-bviJOLMgurLJtF1/mAoJLxDZDL6oU5/ztMHnJQRejbJrSc9FFu0QoUoFhvi6qSKJEw9y5oGyvr9fuDtzJ30rNQ==, + } + engines: { node: ">=12" } + cpu: [arm] + os: [android] + + "@esbuild/android-x64@0.20.2": + resolution: + { + integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [android] + + "@esbuild/android-x64@0.21.3": + resolution: + { + integrity: sha512-JReHfYCRK3FVX4Ra+y5EBH1b9e16TV2OxrPAvzMsGeES0X2Ndm9ImQRI4Ket757vhc5XBOuGperw63upesclRw==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [android] + + "@esbuild/darwin-arm64@0.20.2": + resolution: + { + integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [darwin] + + "@esbuild/darwin-arm64@0.21.3": + resolution: + { + integrity: sha512-U3fuQ0xNiAkXOmQ6w5dKpEvXQRSpHOnbw7gEfHCRXPeTKW9sBzVck6C5Yneb8LfJm0l6le4NQfkNPnWMSlTFUQ==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [darwin] + + "@esbuild/darwin-x64@0.20.2": + resolution: + { + integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [darwin] + + "@esbuild/darwin-x64@0.21.3": + resolution: + { + integrity: sha512-3m1CEB7F07s19wmaMNI2KANLcnaqryJxO1fXHUV5j1rWn+wMxdUYoPyO2TnAbfRZdi7ADRwJClmOwgT13qlP3Q==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [darwin] + + "@esbuild/freebsd-arm64@0.20.2": + resolution: + { + integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [freebsd] + + "@esbuild/freebsd-arm64@0.21.3": + resolution: + { + integrity: sha512-fsNAAl5pU6wmKHq91cHWQT0Fz0vtyE1JauMzKotrwqIKAswwP5cpHUCxZNSTuA/JlqtScq20/5KZ+TxQdovU/g==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [freebsd] + + "@esbuild/freebsd-x64@0.20.2": + resolution: + { + integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [freebsd] + + "@esbuild/freebsd-x64@0.21.3": + resolution: + { + integrity: sha512-tci+UJ4zP5EGF4rp8XlZIdq1q1a/1h9XuronfxTMCNBslpCtmk97Q/5qqy1Mu4zIc0yswN/yP/BLX+NTUC1bXA==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [freebsd] + + "@esbuild/linux-arm64@0.20.2": + resolution: + { + integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [linux] + + "@esbuild/linux-arm64@0.21.3": + resolution: + { + integrity: sha512-vvG6R5g5ieB4eCJBQevyDMb31LMHthLpXTc2IGkFnPWS/GzIFDnaYFp558O+XybTmYrVjxnryru7QRleJvmZ6Q==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [linux] + + "@esbuild/linux-arm@0.20.2": + resolution: + { + integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==, + } + engines: { node: ">=12" } + cpu: [arm] + os: [linux] + + "@esbuild/linux-arm@0.21.3": + resolution: + { + integrity: sha512-f6kz2QpSuyHHg01cDawj0vkyMwuIvN62UAguQfnNVzbge2uWLhA7TCXOn83DT0ZvyJmBI943MItgTovUob36SQ==, + } + engines: { node: ">=12" } + cpu: [arm] + os: [linux] + + "@esbuild/linux-ia32@0.20.2": + resolution: + { + integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==, + } + engines: { node: ">=12" } + cpu: [ia32] + os: [linux] + + "@esbuild/linux-ia32@0.21.3": + resolution: + { + integrity: sha512-HjCWhH7K96Na+66TacDLJmOI9R8iDWDDiqe17C7znGvvE4sW1ECt9ly0AJ3dJH62jHyVqW9xpxZEU1jKdt+29A==, + } + engines: { node: ">=12" } + cpu: [ia32] + os: [linux] + + "@esbuild/linux-loong64@0.20.2": + resolution: + { + integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==, + } + engines: { node: ">=12" } + cpu: [loong64] + os: [linux] + + "@esbuild/linux-loong64@0.21.3": + resolution: + { + integrity: sha512-BGpimEccmHBZRcAhdlRIxMp7x9PyJxUtj7apL2IuoG9VxvU/l/v1z015nFs7Si7tXUwEsvjc1rOJdZCn4QTU+Q==, + } + engines: { node: ">=12" } + cpu: [loong64] + os: [linux] + + "@esbuild/linux-mips64el@0.20.2": + resolution: + { + integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==, + } + engines: { node: ">=12" } + cpu: [mips64el] + os: [linux] + + "@esbuild/linux-mips64el@0.21.3": + resolution: + { + integrity: sha512-5rMOWkp7FQGtAH3QJddP4w3s47iT20hwftqdm7b+loe95o8JU8ro3qZbhgMRy0VuFU0DizymF1pBKkn3YHWtsw==, + } + engines: { node: ">=12" } + cpu: [mips64el] + os: [linux] + + "@esbuild/linux-ppc64@0.20.2": + resolution: + { + integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==, + } + engines: { node: ">=12" } + cpu: [ppc64] + os: [linux] + + "@esbuild/linux-ppc64@0.21.3": + resolution: + { + integrity: sha512-h0zj1ldel89V5sjPLo5H1SyMzp4VrgN1tPkN29TmjvO1/r0MuMRwJxL8QY05SmfsZRs6TF0c/IDH3u7XYYmbAg==, + } + engines: { node: ">=12" } + cpu: [ppc64] + os: [linux] + + "@esbuild/linux-riscv64@0.20.2": + resolution: + { + integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==, + } + engines: { node: ">=12" } + cpu: [riscv64] + os: [linux] + + "@esbuild/linux-riscv64@0.21.3": + resolution: + { + integrity: sha512-dkAKcTsTJ+CRX6bnO17qDJbLoW37npd5gSNtSzjYQr0svghLJYGYB0NF1SNcU1vDcjXLYS5pO4qOW4YbFama4A==, + } + engines: { node: ">=12" } + cpu: [riscv64] + os: [linux] + + "@esbuild/linux-s390x@0.20.2": + resolution: + { + integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==, + } + engines: { node: ">=12" } + cpu: [s390x] + os: [linux] + + "@esbuild/linux-s390x@0.21.3": + resolution: + { + integrity: sha512-vnD1YUkovEdnZWEuMmy2X2JmzsHQqPpZElXx6dxENcIwTu+Cu5ERax6+Ke1QsE814Zf3c6rxCfwQdCTQ7tPuXA==, + } + engines: { node: ">=12" } + cpu: [s390x] + os: [linux] + + "@esbuild/linux-x64@0.20.2": + resolution: + { + integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [linux] + + "@esbuild/linux-x64@0.21.3": + resolution: + { + integrity: sha512-IOXOIm9WaK7plL2gMhsWJd+l2bfrhfilv0uPTptoRoSb2p09RghhQQp9YY6ZJhk/kqmeRt6siRdMSLLwzuT0KQ==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [linux] + + "@esbuild/netbsd-x64@0.20.2": + resolution: + { + integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [netbsd] + + "@esbuild/netbsd-x64@0.21.3": + resolution: + { + integrity: sha512-uTgCwsvQ5+vCQnqM//EfDSuomo2LhdWhFPS8VL8xKf+PKTCrcT/2kPPoWMTs22aB63MLdGMJiE3f1PHvCDmUOw==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [netbsd] + + "@esbuild/openbsd-x64@0.20.2": + resolution: + { + integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [openbsd] + + "@esbuild/openbsd-x64@0.21.3": + resolution: + { + integrity: sha512-vNAkR17Ub2MgEud2Wag/OE4HTSI6zlb291UYzHez/psiKarp0J8PKGDnAhMBcHFoOHMXHfExzmjMojJNbAStrQ==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [openbsd] + + "@esbuild/sunos-x64@0.20.2": + resolution: + { + integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [sunos] + + "@esbuild/sunos-x64@0.21.3": + resolution: + { + integrity: sha512-W8H9jlGiSBomkgmouaRoTXo49j4w4Kfbl6I1bIdO/vT0+0u4f20ko3ELzV3hPI6XV6JNBVX+8BC+ajHkvffIJA==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [sunos] + + "@esbuild/win32-arm64@0.20.2": + resolution: + { + integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [win32] + + "@esbuild/win32-arm64@0.21.3": + resolution: + { + integrity: sha512-EjEomwyLSCg8Ag3LDILIqYCZAq/y3diJ04PnqGRgq8/4O3VNlXyMd54j/saShaN4h5o5mivOjAzmU6C3X4v0xw==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [win32] + + "@esbuild/win32-ia32@0.20.2": + resolution: + { + integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==, + } + engines: { node: ">=12" } + cpu: [ia32] + os: [win32] + + "@esbuild/win32-ia32@0.21.3": + resolution: + { + integrity: sha512-WGiE/GgbsEwR33++5rzjiYsKyHywE8QSZPF7Rfx9EBfK3Qn3xyR6IjyCr5Uk38Kg8fG4/2phN7sXp4NPWd3fcw==, + } + engines: { node: ">=12" } + cpu: [ia32] + os: [win32] + + "@esbuild/win32-x64@0.20.2": + resolution: + { + integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [win32] + + "@esbuild/win32-x64@0.21.3": + resolution: + { + integrity: sha512-xRxC0jaJWDLYvcUvjQmHCJSfMrgmUuvsoXgDeU/wTorQ1ngDdUBuFtgY3W1Pc5sprGAvZBtWdJX7RPg/iZZUqA==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [win32] + + "@expressive-code/core@0.35.3": + resolution: + { + integrity: sha512-SYamcarAjufYhbuK/kfvJSvAXLsfnM7DKc78R7Dq4B73R5bKQK2m5zR0l57tXr4yp2C5Z8lu5xZncdwWxcmPdg==, + } + + "@expressive-code/plugin-frames@0.35.3": + resolution: + { + integrity: sha512-QYytMq6IsaHgTofQ5b6d+CnbxkqLdikSF2hC+IL/ZZwPYHYZoUlmjIwmJZhY4/hHqJGELrtZsyVdlt06RntgmA==, + } + + "@expressive-code/plugin-shiki@0.35.3": + resolution: + { + integrity: sha512-aFQBPepv0zhVXqJFAvfQ4vXYv/meJKiqmEEKSxdjAfwXllIV49PDlnGEXmbGYjR4hUQQjbfDgzAbrbfePc3YVQ==, + } + + "@expressive-code/plugin-text-markers@0.35.3": + resolution: + { + integrity: sha512-gDdnQrfDRXw5Y+PKHJDkpAUdf2pthYOthGcgy3JB8GOTQ3EL1h+755Ct/bGc4MR6jn+dgnQP47uHMWQaccvN6Q==, + } + + "@fontsource/inter@5.0.18": + resolution: + { + integrity: sha512-YCsoYPTcs713sI7tLtxaPrIhXAXvEetGg5Ry02ivA8qUOb3fQHojbK/X9HLD5OOKvFUNR2Ynkwb1kR1hVKQHpw==, + } + + "@fontsource/rubik@5.0.20": + resolution: + { + integrity: sha512-4iEk1Nnnz4kzrpfsjfHXOm7HDVtsDfs8uihhE4LaXqQuxnY8lERZWJhtGAKILDwbx3gsnVXI+0beUNLRmaHeCw==, + } + + "@img/sharp-darwin-arm64@0.33.4": + resolution: + { + integrity: sha512-p0suNqXufJs9t3RqLBO6vvrgr5OhgbWp76s5gTRvdmxmuv9E1rcaqGUsl3l4mKVmXPkTkTErXediAui4x+8PSA==, + } + engines: + { + glibc: ">=2.26", + node: ^18.17.0 || ^20.3.0 || >=21.0.0, + npm: ">=9.6.5", + pnpm: ">=7.1.0", + yarn: ">=3.2.0", + } + cpu: [arm64] + os: [darwin] + + "@img/sharp-darwin-x64@0.33.4": + resolution: + { + integrity: sha512-0l7yRObwtTi82Z6ebVI2PnHT8EB2NxBgpK2MiKJZJ7cz32R4lxd001ecMhzzsZig3Yv9oclvqqdV93jo9hy+Dw==, + } + engines: + { + glibc: ">=2.26", + node: ^18.17.0 || ^20.3.0 || >=21.0.0, + npm: ">=9.6.5", + pnpm: ">=7.1.0", + yarn: ">=3.2.0", + } + cpu: [x64] + os: [darwin] + + "@img/sharp-libvips-darwin-arm64@1.0.2": + resolution: + { + integrity: sha512-tcK/41Rq8IKlSaKRCCAuuY3lDJjQnYIW1UXU1kxcEKrfL8WR7N6+rzNoOxoQRJWTAECuKwgAHnPvqXGN8XfkHA==, + } + engines: { macos: ">=11", npm: ">=9.6.5", pnpm: ">=7.1.0", yarn: ">=3.2.0" } + cpu: [arm64] + os: [darwin] + + "@img/sharp-libvips-darwin-x64@1.0.2": + resolution: + { + integrity: sha512-Ofw+7oaWa0HiiMiKWqqaZbaYV3/UGL2wAPeLuJTx+9cXpCRdvQhCLG0IH8YGwM0yGWGLpsF4Su9vM1o6aer+Fw==, + } + engines: + { macos: ">=10.13", npm: ">=9.6.5", pnpm: ">=7.1.0", yarn: ">=3.2.0" } + cpu: [x64] + os: [darwin] + + "@img/sharp-libvips-linux-arm64@1.0.2": + resolution: + { + integrity: sha512-x7kCt3N00ofFmmkkdshwj3vGPCnmiDh7Gwnd4nUwZln2YjqPxV1NlTyZOvoDWdKQVDL911487HOueBvrpflagw==, + } + engines: + { glibc: ">=2.26", npm: ">=9.6.5", pnpm: ">=7.1.0", yarn: ">=3.2.0" } + cpu: [arm64] + os: [linux] + + "@img/sharp-libvips-linux-arm@1.0.2": + resolution: + { + integrity: sha512-iLWCvrKgeFoglQxdEwzu1eQV04o8YeYGFXtfWU26Zr2wWT3q3MTzC+QTCO3ZQfWd3doKHT4Pm2kRmLbupT+sZw==, + } + engines: + { glibc: ">=2.28", npm: ">=9.6.5", pnpm: ">=7.1.0", yarn: ">=3.2.0" } + cpu: [arm] + os: [linux] + + "@img/sharp-libvips-linux-s390x@1.0.2": + resolution: + { + integrity: sha512-cmhQ1J4qVhfmS6szYW7RT+gLJq9dH2i4maq+qyXayUSn9/3iY2ZeWpbAgSpSVbV2E1JUL2Gg7pwnYQ1h8rQIog==, + } + engines: + { glibc: ">=2.28", npm: ">=9.6.5", pnpm: ">=7.1.0", yarn: ">=3.2.0" } + cpu: [s390x] + os: [linux] + + "@img/sharp-libvips-linux-x64@1.0.2": + resolution: + { + integrity: sha512-E441q4Qdb+7yuyiADVi5J+44x8ctlrqn8XgkDTwr4qPJzWkaHwD489iZ4nGDgcuya4iMN3ULV6NwbhRZJ9Z7SQ==, + } + engines: + { glibc: ">=2.26", npm: ">=9.6.5", pnpm: ">=7.1.0", yarn: ">=3.2.0" } + cpu: [x64] + os: [linux] + + "@img/sharp-libvips-linuxmusl-arm64@1.0.2": + resolution: + { + integrity: sha512-3CAkndNpYUrlDqkCM5qhksfE+qSIREVpyoeHIU6jd48SJZViAmznoQQLAv4hVXF7xyUB9zf+G++e2v1ABjCbEQ==, + } + engines: + { musl: ">=1.2.2", npm: ">=9.6.5", pnpm: ">=7.1.0", yarn: ">=3.2.0" } + cpu: [arm64] + os: [linux] + + "@img/sharp-libvips-linuxmusl-x64@1.0.2": + resolution: + { + integrity: sha512-VI94Q6khIHqHWNOh6LLdm9s2Ry4zdjWJwH56WoiJU7NTeDwyApdZZ8c+SADC8OH98KWNQXnE01UdJ9CSfZvwZw==, + } + engines: + { musl: ">=1.2.2", npm: ">=9.6.5", pnpm: ">=7.1.0", yarn: ">=3.2.0" } + cpu: [x64] + os: [linux] + + "@img/sharp-linux-arm64@0.33.4": + resolution: + { + integrity: sha512-2800clwVg1ZQtxwSoTlHvtm9ObgAax7V6MTAB/hDT945Tfyy3hVkmiHpeLPCKYqYR1Gcmv1uDZ3a4OFwkdBL7Q==, + } + engines: + { + glibc: ">=2.26", + node: ^18.17.0 || ^20.3.0 || >=21.0.0, + npm: ">=9.6.5", + pnpm: ">=7.1.0", + yarn: ">=3.2.0", + } + cpu: [arm64] + os: [linux] + + "@img/sharp-linux-arm@0.33.4": + resolution: + { + integrity: sha512-RUgBD1c0+gCYZGCCe6mMdTiOFS0Zc/XrN0fYd6hISIKcDUbAW5NtSQW9g/powkrXYm6Vzwd6y+fqmExDuCdHNQ==, + } + engines: + { + glibc: ">=2.28", + node: ^18.17.0 || ^20.3.0 || >=21.0.0, + npm: ">=9.6.5", + pnpm: ">=7.1.0", + yarn: ">=3.2.0", + } + cpu: [arm] + os: [linux] + + "@img/sharp-linux-s390x@0.33.4": + resolution: + { + integrity: sha512-h3RAL3siQoyzSoH36tUeS0PDmb5wINKGYzcLB5C6DIiAn2F3udeFAum+gj8IbA/82+8RGCTn7XW8WTFnqag4tQ==, + } + engines: + { + glibc: ">=2.31", + node: ^18.17.0 || ^20.3.0 || >=21.0.0, + npm: ">=9.6.5", + pnpm: ">=7.1.0", + yarn: ">=3.2.0", + } + cpu: [s390x] + os: [linux] + + "@img/sharp-linux-x64@0.33.4": + resolution: + { + integrity: sha512-GoR++s0XW9DGVi8SUGQ/U4AeIzLdNjHka6jidVwapQ/JebGVQIpi52OdyxCNVRE++n1FCLzjDovJNozif7w/Aw==, + } + engines: + { + glibc: ">=2.26", + node: ^18.17.0 || ^20.3.0 || >=21.0.0, + npm: ">=9.6.5", + pnpm: ">=7.1.0", + yarn: ">=3.2.0", + } + cpu: [x64] + os: [linux] + + "@img/sharp-linuxmusl-arm64@0.33.4": + resolution: + { + integrity: sha512-nhr1yC3BlVrKDTl6cO12gTpXMl4ITBUZieehFvMntlCXFzH2bvKG76tBL2Y/OqhupZt81pR7R+Q5YhJxW0rGgQ==, + } + engines: + { + musl: ">=1.2.2", + node: ^18.17.0 || ^20.3.0 || >=21.0.0, + npm: ">=9.6.5", + pnpm: ">=7.1.0", + yarn: ">=3.2.0", + } + cpu: [arm64] + os: [linux] + + "@img/sharp-linuxmusl-x64@0.33.4": + resolution: + { + integrity: sha512-uCPTku0zwqDmZEOi4ILyGdmW76tH7dm8kKlOIV1XC5cLyJ71ENAAqarOHQh0RLfpIpbV5KOpXzdU6XkJtS0daw==, + } + engines: + { + musl: ">=1.2.2", + node: ^18.17.0 || ^20.3.0 || >=21.0.0, + npm: ">=9.6.5", + pnpm: ">=7.1.0", + yarn: ">=3.2.0", + } + cpu: [x64] + os: [linux] + + "@img/sharp-wasm32@0.33.4": + resolution: + { + integrity: sha512-Bmmauh4sXUsUqkleQahpdNXKvo+wa1V9KhT2pDA4VJGKwnKMJXiSTGphn0gnJrlooda0QxCtXc6RX1XAU6hMnQ==, + } + engines: + { + node: ^18.17.0 || ^20.3.0 || >=21.0.0, + npm: ">=9.6.5", + pnpm: ">=7.1.0", + yarn: ">=3.2.0", + } + cpu: [wasm32] + + "@img/sharp-win32-ia32@0.33.4": + resolution: + { + integrity: sha512-99SJ91XzUhYHbx7uhK3+9Lf7+LjwMGQZMDlO/E/YVJ7Nc3lyDFZPGhjwiYdctoH2BOzW9+TnfqcaMKt0jHLdqw==, + } + engines: + { + node: ^18.17.0 || ^20.3.0 || >=21.0.0, + npm: ">=9.6.5", + pnpm: ">=7.1.0", + yarn: ">=3.2.0", + } + cpu: [ia32] + os: [win32] + + "@img/sharp-win32-x64@0.33.4": + resolution: + { + integrity: sha512-3QLocdTRVIrFNye5YocZl+KKpYKP+fksi1QhmOArgx7GyhIbQp/WrJRu176jm8IxromS7RIkzMiMINVdBtC8Aw==, + } + engines: + { + node: ^18.17.0 || ^20.3.0 || >=21.0.0, + npm: ">=9.6.5", + pnpm: ">=7.1.0", + yarn: ">=3.2.0", + } + cpu: [x64] + os: [win32] + + "@johnsoncodehk/vscode-html-languageservice@5.2.0-34a5462": + resolution: + { + integrity: sha512-etqLfpSJ5zaw76KUNF603be6d6QsiQPmaHr9FKEp4zhLZJzWCCMH6Icak7MtLUFLZLMpL761mZNImi/joBo1ZA==, + } + + "@jridgewell/gen-mapping@0.3.3": + resolution: + { + integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==, + } + engines: { node: ">=6.0.0" } + + "@jridgewell/gen-mapping@0.3.5": + resolution: + { + integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==, + } + engines: { node: ">=6.0.0" } + + "@jridgewell/resolve-uri@3.1.1": + resolution: + { + integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==, + } + engines: { node: ">=6.0.0" } + + "@jridgewell/set-array@1.1.2": + resolution: + { + integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==, + } + engines: { node: ">=6.0.0" } + + "@jridgewell/set-array@1.2.1": + resolution: + { + integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==, + } + engines: { node: ">=6.0.0" } + + "@jridgewell/sourcemap-codec@1.4.15": + resolution: + { + integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==, + } + + "@jridgewell/trace-mapping@0.3.20": + resolution: + { + integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==, + } + + "@jridgewell/trace-mapping@0.3.25": + resolution: + { + integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==, + } + + "@mdx-js/mdx@3.0.0": + resolution: + { + integrity: sha512-Icm0TBKBLYqroYbNW3BPnzMGn+7mwpQOK310aZ7+fkCtiU3aqv2cdcX+nd0Ydo3wI5Rx8bX2Z2QmGb/XcAClCw==, + } + + "@nodelib/fs.scandir@2.1.5": + resolution: + { + integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, + } + engines: { node: ">= 8" } + + "@nodelib/fs.stat@2.0.5": + resolution: + { + integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, + } + engines: { node: ">= 8" } + + "@nodelib/fs.walk@1.2.8": + resolution: + { + integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, + } + engines: { node: ">= 8" } + + "@pagefind/darwin-arm64@1.0.4": + resolution: + { + integrity: sha512-2OcthvceX2xhm5XbgOmW+lT45oLuHqCmvFeFtxh1gsuP5cO8vcD8ZH8Laj4pXQFCcK6eAdSShx+Ztx/LsQWZFQ==, + } + cpu: [arm64] + os: [darwin] + + "@pagefind/darwin-x64@1.0.4": + resolution: + { + integrity: sha512-xkdvp0D9Ld/ZKsjo/y1bgfhTEU72ITimd2PMMQtts7jf6JPIOJbsiErCvm37m/qMFuPGEq/8d+fZ4pydOj08HQ==, + } + cpu: [x64] + os: [darwin] + + "@pagefind/default-ui@1.0.4": + resolution: + { + integrity: sha512-edkcaPSKq67C49Vehjo+LQCpT615v4d7JRhfGzFPccePvdklaL+VXrfghN/uIfsdoG+HoLI1PcYy2iFcB9CTkw==, + } + + "@pagefind/linux-arm64@1.0.4": + resolution: + { + integrity: sha512-jGBrcCzIrMnNxLKVtogaQyajVfTAXM59KlBEwg6vTn8NW4fQ6nuFbbhlG4dTIsaamjEM5e8ZBEAKZfTB/qd9xw==, + } + cpu: [arm64] + os: [linux] + + "@pagefind/linux-x64@1.0.4": + resolution: + { + integrity: sha512-LIn/QcvcEtLEBqKe5vpSbSC2O3fvqbRCWOTIklslqSORisCsvzsWbP6j+LYxE9q0oWIfkdMoWV1vrE/oCKRxHg==, + } + cpu: [x64] + os: [linux] + + "@pagefind/windows-x64@1.0.4": + resolution: + { + integrity: sha512-QlBCVeZfj9fc9sbUgdOz76ZDbeK4xZihOBAFqGuRJeChfM8pnVeH9iqSnXgO3+m9oITugTf7PicyRUFAG76xeQ==, + } + cpu: [x64] + os: [win32] + + "@rollup/rollup-android-arm-eabi@4.17.2": + resolution: + { + integrity: sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==, + } + cpu: [arm] + os: [android] + + "@rollup/rollup-android-arm64@4.17.2": + resolution: + { + integrity: sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==, + } + cpu: [arm64] + os: [android] + + "@rollup/rollup-darwin-arm64@4.17.2": + resolution: + { + integrity: sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==, + } + cpu: [arm64] + os: [darwin] + + "@rollup/rollup-darwin-x64@4.17.2": + resolution: + { + integrity: sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==, + } + cpu: [x64] + os: [darwin] + + "@rollup/rollup-linux-arm-gnueabihf@4.17.2": + resolution: + { + integrity: sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==, + } + cpu: [arm] + os: [linux] + + "@rollup/rollup-linux-arm-musleabihf@4.17.2": + resolution: + { + integrity: sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==, + } + cpu: [arm] + os: [linux] + + "@rollup/rollup-linux-arm64-gnu@4.17.2": + resolution: + { + integrity: sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==, + } + cpu: [arm64] + os: [linux] + + "@rollup/rollup-linux-arm64-musl@4.17.2": + resolution: + { + integrity: sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==, + } + cpu: [arm64] + os: [linux] + + "@rollup/rollup-linux-powerpc64le-gnu@4.17.2": + resolution: + { + integrity: sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==, + } + cpu: [ppc64] + os: [linux] + + "@rollup/rollup-linux-riscv64-gnu@4.17.2": + resolution: + { + integrity: sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==, + } + cpu: [riscv64] + os: [linux] + + "@rollup/rollup-linux-s390x-gnu@4.17.2": + resolution: + { + integrity: sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==, + } + cpu: [s390x] + os: [linux] + + "@rollup/rollup-linux-x64-gnu@4.17.2": + resolution: + { + integrity: sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==, + } + cpu: [x64] + os: [linux] + + "@rollup/rollup-linux-x64-musl@4.17.2": + resolution: + { + integrity: sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==, + } + cpu: [x64] + os: [linux] + + "@rollup/rollup-win32-arm64-msvc@4.17.2": + resolution: + { + integrity: sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==, + } + cpu: [arm64] + os: [win32] + + "@rollup/rollup-win32-ia32-msvc@4.17.2": + resolution: + { + integrity: sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==, + } + cpu: [ia32] + os: [win32] + + "@rollup/rollup-win32-x64-msvc@4.17.2": + resolution: + { + integrity: sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==, + } + cpu: [x64] + os: [win32] + + "@shikijs/core@1.5.2": + resolution: + { + integrity: sha512-wSAOgaz48GmhILFElMCeQypSZmj6Ru6DttOOtl3KNkdJ17ApQuGNCfzpk4cClasVrnIu45++2DBwG4LNMQAfaA==, + } + + "@trysound/sax@0.2.0": + resolution: + { + integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==, + } + engines: { node: ">=10.13.0" } + + "@types/acorn@4.0.6": + resolution: + { + integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==, + } + + "@types/babel__core@7.20.5": + resolution: + { + integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==, + } + + "@types/babel__generator@7.6.7": + resolution: + { + integrity: sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==, + } + + "@types/babel__template@7.4.4": + resolution: + { + integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==, + } + + "@types/babel__traverse@7.20.4": + resolution: + { + integrity: sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==, + } + + "@types/cookie@0.6.0": + resolution: + { + integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==, + } + + "@types/debug@4.1.12": + resolution: + { + integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==, + } + + "@types/estree-jsx@1.0.3": + resolution: + { + integrity: sha512-pvQ+TKeRHeiUGRhvYwRrQ/ISnohKkSJR14fT2yqyZ4e9K5vqc7hrtY2Y1Dw0ZwAzQ6DQsxsaCUuSIIi8v0Cq6w==, + } + + "@types/estree@1.0.5": + resolution: + { + integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==, + } + + "@types/hast@3.0.3": + resolution: + { + integrity: sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ==, + } + + "@types/mdast@4.0.3": + resolution: + { + integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==, + } + + "@types/mdx@2.0.10": + resolution: + { + integrity: sha512-Rllzc5KHk0Al5/WANwgSPl1/CwjqCy+AZrGd78zuK+jO9aDM6ffblZ+zIjgPNAaEBmlO0RYDvLNh7wD0zKVgEg==, + } + + "@types/ms@0.7.34": + resolution: + { + integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==, + } + + "@types/nlcst@1.0.4": + resolution: + { + integrity: sha512-ABoYdNQ/kBSsLvZAekMhIPMQ3YUZvavStpKYs7BjLLuKVmIMA0LUgZ7b54zzuWJRbHF80v1cNf4r90Vd6eMQDg==, + } + + "@types/node@17.0.45": + resolution: + { + integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==, + } + + "@types/sax@1.2.7": + resolution: + { + integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==, + } + + "@types/unist@2.0.10": + resolution: + { + integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==, + } + + "@types/unist@3.0.2": + resolution: + { + integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==, + } + + "@ungap/structured-clone@1.2.0": + resolution: + { + integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==, + } + + "@volar/kit@2.2.4": + resolution: + { + integrity: sha512-TyRYaj56NBwa+0DgYbIkNQm+pN5DaV1dvZ5PzoKGDk9oag/sCG+W6wVkyaqmYCNJkXpmRtM627RkeMRTBvnYzw==, + } + peerDependencies: + typescript: "*" + + "@volar/language-core@2.2.4": + resolution: + { + integrity: sha512-7As47GndxGxsqqYnbreLrfB5NDUeQioPM2LJKUuB4/34c0NpEJ2byVl3c9KYdjIdiEstWZ9JLtLKNTaPWb5jtA==, + } + + "@volar/language-server@2.2.4": + resolution: + { + integrity: sha512-wgRsKsqFMY7MRkmBfIX+GB0uzAv2Nks7YS3Ud6RWdHsjEu7tF+cXzBX/IRgW5HOayLLPC1xES2PYXk26hdOIoA==, + } + + "@volar/language-service@2.2.4": + resolution: + { + integrity: sha512-3OxJFADEsAZp1RoTS3SX2GY9SeVnB9mbd3N/Faz45IvnT2EFAyVJGPOyrz5bJDvKuCtjdoTNNWS1GX1bHGytrA==, + } + + "@volar/snapshot-document@2.2.4": + resolution: + { + integrity: sha512-XwL9Jo5+nn4WZystok1+kRXbmFuJXaCx0KfJYZizJQDd7kPDgBcyci/aKsBVNhIgiD9JT0KKycru0ndyHRadGQ==, + } + + "@volar/source-map@2.2.4": + resolution: + { + integrity: sha512-m92FLpR9vB1YEZfiZ+bfgpLrToL/DNkOrorWVep3pffHrwwI4Tx2oIQN+sqHJfKkiT5N3J1owC+8crhAEinfjg==, + } + + "@volar/typescript@2.2.4": + resolution: + { + integrity: sha512-uAQC53tgEbHO62G8NXMfmBrJAlP2QJ9WxVEEQqqK3I6VSy8frL5LbH3hAWODxiwMWixv74wJLWlKbWXOgdIoRQ==, + } + + "@vscode/emmet-helper@2.9.2": + resolution: + { + integrity: sha512-MaGuyW+fa13q3aYsluKqclmh62Hgp0BpKIqS66fCxfOaBcVQ1OnMQxRRgQUYnCkxFISAQlkJ0qWWPyXjro1Qrg==, + } + + "@vscode/l10n@0.0.16": + resolution: + { + integrity: sha512-JT5CvrIYYCrmB+dCana8sUqJEcGB1ZDXNLMQ2+42bW995WmNoenijWMUdZfwmuQUTQcEVVIa2OecZzTYWUW9Cg==, + } + + "@vscode/l10n@0.0.18": + resolution: + { + integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==, + } + + acorn-jsx@5.3.2: + resolution: + { + integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, + } + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.11.2: + resolution: + { + integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==, + } + engines: { node: ">=0.4.0" } + hasBin: true + + acorn@8.11.3: + resolution: + { + integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==, + } + engines: { node: ">=0.4.0" } + hasBin: true + + ansi-align@3.0.1: + resolution: + { + integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==, + } + + ansi-regex@5.0.1: + resolution: + { + integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, + } + engines: { node: ">=8" } + + ansi-regex@6.0.1: + resolution: + { + integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==, + } + engines: { node: ">=12" } + + ansi-styles@3.2.1: + resolution: + { + integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==, + } + engines: { node: ">=4" } + + ansi-styles@4.3.0: + resolution: + { + integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, + } + engines: { node: ">=8" } + + ansi-styles@6.2.1: + resolution: + { + integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==, + } + engines: { node: ">=12" } + + any-promise@1.3.0: + resolution: + { + integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==, + } + + anymatch@3.1.3: + resolution: + { + integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, + } + engines: { node: ">= 8" } + + arg@5.0.2: + resolution: + { + integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==, + } + + argparse@1.0.10: + resolution: + { + integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==, + } + + argparse@2.0.1: + resolution: + { + integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, + } + + aria-query@5.3.0: + resolution: + { + integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==, + } + + array-iterate@2.0.1: + resolution: + { + integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==, + } + + astring@1.8.6: + resolution: + { + integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==, + } + hasBin: true + + astro-expressive-code@0.35.3: + resolution: + { + integrity: sha512-f1L1m3J3EzZHDEox6TXmuKo5fTSbaNxE/HU0S0UQmvlCowtOKnU/LOsoDwsbQSYGKz+fdLRPsCjFMiKqEoyfcw==, + } + peerDependencies: + astro: ^4.0.0-beta || ^3.3.0 + + astro@4.8.6: + resolution: + { + integrity: sha512-psHIfK+e+bMPhRwghV9yCGH/uc1jvY4DHmDZdoEepax9yA7kzYH0wt3dpkqlcrO2zxl5jzSC3DmqZfkD6wnW9A==, + } + engines: + { node: ^18.17.1 || ^20.3.0 || >=21.0.0, npm: ">=9.6.5", pnpm: ">=7.1.0" } + hasBin: true + + autoprefixer@10.4.19: + resolution: + { + integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==, + } + engines: { node: ^10 || ^12 || >=14 } + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + axobject-query@4.0.0: + resolution: + { + integrity: sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==, + } + + bail@2.0.2: + resolution: + { + integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==, + } + + balanced-match@1.0.2: + resolution: + { + integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, + } + + base-64@1.0.0: + resolution: + { + integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==, + } + + bcp-47-match@2.0.3: + resolution: + { + integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==, + } + + bcp-47@2.1.0: + resolution: + { + integrity: sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==, + } + + binary-extensions@2.2.0: + resolution: + { + integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==, + } + engines: { node: ">=8" } + + boolbase@1.0.0: + resolution: + { + integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==, + } + + boxen@7.1.1: + resolution: + { + integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==, + } + engines: { node: ">=14.16" } + + brace-expansion@1.1.11: + resolution: + { + integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, + } + + braces@3.0.2: + resolution: + { + integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==, + } + engines: { node: ">=8" } + + browserslist@4.23.0: + resolution: + { + integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==, + } + engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } + hasBin: true + + camelcase-css@2.0.1: + resolution: + { + integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==, + } + engines: { node: ">= 6" } + + camelcase@7.0.1: + resolution: + { + integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==, + } + engines: { node: ">=14.16" } + + caniuse-api@3.0.0: + resolution: + { + integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==, + } + + caniuse-lite@1.0.30001620: + resolution: + { + integrity: sha512-WJvYsOjd1/BYUY6SNGUosK9DUidBPDTnOARHp3fSmFO1ekdxaY6nKRttEVrfMmYi80ctS0kz1wiWmm14fVc3ew==, + } + + ccount@2.0.1: + resolution: + { + integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==, + } + + chalk@2.4.2: + resolution: + { + integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==, + } + engines: { node: ">=4" } + + chalk@5.3.0: + resolution: + { + integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==, + } + engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } + + character-entities-html4@2.1.0: + resolution: + { + integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==, + } + + character-entities-legacy@3.0.0: + resolution: + { + integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==, + } + + character-entities@2.0.2: + resolution: + { + integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==, + } + + character-reference-invalid@2.0.1: + resolution: + { + integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==, + } + + chokidar@3.5.3: + resolution: + { + integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==, + } + engines: { node: ">= 8.10.0" } + + chokidar@3.6.0: + resolution: + { + integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==, + } + engines: { node: ">= 8.10.0" } + + ci-info@4.0.0: + resolution: + { + integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==, + } + engines: { node: ">=8" } + + cli-boxes@3.0.0: + resolution: + { + integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==, + } + engines: { node: ">=10" } + + cli-cursor@4.0.0: + resolution: + { + integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + cli-spinners@2.9.2: + resolution: + { + integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==, + } + engines: { node: ">=6" } + + cliui@8.0.1: + resolution: + { + integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==, + } + engines: { node: ">=12" } + + clsx@2.1.1: + resolution: + { + integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==, + } + engines: { node: ">=6" } + + collapse-white-space@2.1.0: + resolution: + { + integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==, + } + + color-convert@1.9.3: + resolution: + { + integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, + } + + color-convert@2.0.1: + resolution: + { + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, + } + engines: { node: ">=7.0.0" } + + color-name@1.1.3: + resolution: + { + integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==, + } + + color-name@1.1.4: + resolution: + { + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, + } + + color-string@1.9.1: + resolution: + { + integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==, + } + + color@4.2.3: + resolution: + { + integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==, + } + engines: { node: ">=12.5.0" } + + colord@2.9.3: + resolution: + { + integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==, + } + + comma-separated-tokens@2.0.3: + resolution: + { + integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==, + } + + commander@4.1.1: + resolution: + { + integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==, + } + engines: { node: ">= 6" } + + commander@7.2.0: + resolution: + { + integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==, + } + engines: { node: ">= 10" } + + common-ancestor-path@1.0.1: + resolution: + { + integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==, + } + + concat-map@0.0.1: + resolution: + { + integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, + } + + convert-source-map@2.0.0: + resolution: + { + integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, + } + + cookie@0.6.0: + resolution: + { + integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==, + } + engines: { node: ">= 0.6" } + + cross-spawn@7.0.3: + resolution: + { + integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, + } + engines: { node: ">= 8" } + + css-blank-pseudo@6.0.2: + resolution: + { + integrity: sha512-J/6m+lsqpKPqWHOifAFtKFeGLOzw3jR92rxQcwRUfA/eTuZzKfKlxOmYDx2+tqOPQAueNvBiY8WhAeHu5qNmTg==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + css-declaration-sorter@7.2.0: + resolution: + { + integrity: sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.0.9 + + css-has-pseudo@6.0.5: + resolution: + { + integrity: sha512-ZTv6RlvJJZKp32jPYnAJVhowDCrRrHUTAxsYSuUPBEDJjzws6neMnzkRblxtgmv1RgcV5dhH2gn7E3wA9Wt6lw==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + css-prefers-color-scheme@9.0.1: + resolution: + { + integrity: sha512-iFit06ochwCKPRiWagbTa1OAWCvWWVdEnIFd8BaRrgO8YrrNh4RAWUQTFcYX5tdFZgFl1DJ3iiULchZyEbnF4g==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + css-select@5.1.0: + resolution: + { + integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==, + } + + css-selector-parser@3.0.4: + resolution: + { + integrity: sha512-pnmS1dbKsz6KA4EW4BznyPL2xxkNDRg62hcD0v8g6DEw2W7hxOln5M953jsp9hmw5Dg57S6o/A8GOn37mbAgcQ==, + } + + css-tree@2.2.1: + resolution: + { + integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==, + } + engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: ">=7.0.0" } + + css-tree@2.3.1: + resolution: + { + integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==, + } + engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0 } + + css-what@6.1.0: + resolution: + { + integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==, + } + engines: { node: ">= 6" } + + cssdb@8.0.1: + resolution: + { + integrity: sha512-diegY/vnOYmPXY0bOBj5jeHaiK8MMpjgPuipirY8pF9AthtqEXgqVdKF5tnb6RTc/ZdhQqG0TBnInQ5CbbUW7Q==, + } + + cssesc@3.0.0: + resolution: + { + integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==, + } + engines: { node: ">=4" } + hasBin: true + + cssnano-preset-default@7.0.1: + resolution: + { + integrity: sha512-Fumyr+uZMcjYQeuHssAZxn0cKj3cdQc5GcxkBcmEzISGB+UW9CLNlU4tBOJbJGcPukFDlicG32eFbrc8K9V5pw==, + } + engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + peerDependencies: + postcss: ^8.4.31 + + cssnano-utils@5.0.0: + resolution: + { + integrity: sha512-Uij0Xdxc24L6SirFr25MlwC2rCFX6scyUmuKpzI+JQ7cyqDEwD42fJ0xfB3yLfOnRDU5LKGgjQ9FA6LYh76GWQ==, + } + engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + peerDependencies: + postcss: ^8.4.31 + + cssnano@7.0.1: + resolution: + { + integrity: sha512-917Mej/4SdI7b55atsli3sU4MOJ9XDoKgnlCtQtXYj8XUFcM3riTuYHyqBBnnskawW+zWwp0KxJzpEUodlpqUg==, + } + engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + peerDependencies: + postcss: ^8.4.31 + + csso@5.0.5: + resolution: + { + integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==, + } + engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: ">=7.0.0" } + + debug@4.3.4: + resolution: + { + integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, + } + engines: { node: ">=6.0" } + peerDependencies: + supports-color: "*" + peerDependenciesMeta: + supports-color: + optional: true + + decode-named-character-reference@1.0.2: + resolution: + { + integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==, + } + + dequal@2.0.3: + resolution: + { + integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==, + } + engines: { node: ">=6" } + + detect-libc@2.0.3: + resolution: + { + integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==, + } + engines: { node: ">=8" } + + deterministic-object-hash@2.0.2: + resolution: + { + integrity: sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==, + } + engines: { node: ">=18" } + + devalue@5.0.0: + resolution: + { + integrity: sha512-gO+/OMXF7488D+u3ue+G7Y4AA3ZmUnB3eHJXmBTgNHvr4ZNzl36A0ZtG+XCRNYCkYx/bFmw4qtkoFLa+wSrwAA==, + } + + devlop@1.1.0: + resolution: + { + integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==, + } + + didyoumean@1.2.2: + resolution: + { + integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==, + } + + diff@5.2.0: + resolution: + { + integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==, + } + engines: { node: ">=0.3.1" } + + direction@2.0.1: + resolution: + { + integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==, + } + hasBin: true + + dlv@1.1.3: + resolution: + { + integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==, + } + + dom-serializer@2.0.0: + resolution: + { + integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==, + } + + domelementtype@2.3.0: + resolution: + { + integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==, + } + + domhandler@5.0.3: + resolution: + { + integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==, + } + engines: { node: ">= 4" } + + domutils@3.1.0: + resolution: + { + integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==, + } + + dset@3.1.3: + resolution: + { + integrity: sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==, + } + engines: { node: ">=4" } + + eastasianwidth@0.2.0: + resolution: + { + integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, + } + + electron-to-chromium@1.4.773: + resolution: + { + integrity: sha512-87eHF+h3PlCRwbxVEAw9KtK3v7lWfc/sUDr0W76955AdYTG4bV/k0zrl585Qnj/skRMH2qOSiE+kqMeOQ+LOpw==, + } + + emmet@2.4.6: + resolution: + { + integrity: sha512-dJfbdY/hfeTyf/Ef7Y7ubLYzkBvPQ912wPaeVYpAxvFxkEBf/+hJu4H6vhAvFN6HlxqedlfVn2x1S44FfQ97pg==, + } + + emoji-regex@10.3.0: + resolution: + { + integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==, + } + + emoji-regex@8.0.0: + resolution: + { + integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, + } + + emoji-regex@9.2.2: + resolution: + { + integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, + } + + entities@4.5.0: + resolution: + { + integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==, + } + engines: { node: ">=0.12" } + + es-module-lexer@1.4.1: + resolution: + { + integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==, + } + + es-module-lexer@1.5.2: + resolution: + { + integrity: sha512-l60ETUTmLqbVbVHv1J4/qj+M8nq7AwMzEcg3kmJDt9dCNrTk+yHcYFf/Kw75pMDwd9mPcIGCG5LcS20SxYRzFA==, + } + + esbuild@0.20.2: + resolution: + { + integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==, + } + engines: { node: ">=12" } + hasBin: true + + esbuild@0.21.3: + resolution: + { + integrity: sha512-Kgq0/ZsAPzKrbOjCQcjoSmPoWhlcVnGAUo7jvaLHoxW1Drto0KGkR1xBNg2Cp43b9ImvxmPEJZ9xkfcnqPsfBw==, + } + engines: { node: ">=12" } + hasBin: true + + escalade@3.1.1: + resolution: + { + integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==, + } + engines: { node: ">=6" } + + escape-string-regexp@1.0.5: + resolution: + { + integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==, + } + engines: { node: ">=0.8.0" } + + escape-string-regexp@5.0.0: + resolution: + { + integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==, + } + engines: { node: ">=12" } + + esprima@4.0.1: + resolution: + { + integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==, + } + engines: { node: ">=4" } + hasBin: true + + estree-util-attach-comments@3.0.0: + resolution: + { + integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==, + } + + estree-util-build-jsx@3.0.1: + resolution: + { + integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==, + } + + estree-util-is-identifier-name@3.0.0: + resolution: + { + integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==, + } + + estree-util-to-js@2.0.0: + resolution: + { + integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==, + } + + estree-util-visit@2.0.0: + resolution: + { + integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==, + } + + estree-walker@3.0.3: + resolution: + { + integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==, + } + + eventemitter3@5.0.1: + resolution: + { + integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==, + } + + execa@8.0.1: + resolution: + { + integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==, + } + engines: { node: ">=16.17" } + + expressive-code@0.35.3: + resolution: + { + integrity: sha512-XjWWUCxS4uQjPoRM98R7SNWWIYlFEaOeHm1piWv+c7coHCekuWno81thsc3g/UJ+DajNtOEsIQIAAcsBQZ8LMg==, + } + + extend-shallow@2.0.1: + resolution: + { + integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==, + } + engines: { node: ">=0.10.0" } + + extend@3.0.2: + resolution: + { + integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==, + } + + fast-glob@3.3.2: + resolution: + { + integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==, + } + engines: { node: ">=8.6.0" } + + fastq@1.15.0: + resolution: + { + integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==, + } + + fill-range@7.0.1: + resolution: + { + integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==, + } + engines: { node: ">=8" } + + find-up@4.1.0: + resolution: + { + integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==, + } + engines: { node: ">=8" } + + find-up@5.0.0: + resolution: + { + integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, + } + engines: { node: ">=10" } + + find-yarn-workspace-root2@1.2.16: + resolution: + { + integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==, + } + + flattie@1.1.1: + resolution: + { + integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==, + } + engines: { node: ">=8" } + + fraction.js@4.3.7: + resolution: + { + integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==, + } + + fs.realpath@1.0.0: + resolution: + { + integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, + } + + fsevents@2.3.3: + resolution: + { + integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, + } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + os: [darwin] + + function-bind@1.1.2: + resolution: + { + integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, + } + + gensync@1.0.0-beta.2: + resolution: + { + integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, + } + engines: { node: ">=6.9.0" } + + get-caller-file@2.0.5: + resolution: + { + integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, + } + engines: { node: 6.* || 8.* || >= 10.* } + + get-east-asian-width@1.2.0: + resolution: + { + integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==, + } + engines: { node: ">=18" } + + get-stream@8.0.1: + resolution: + { + integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==, + } + engines: { node: ">=16" } + + github-slugger@2.0.0: + resolution: + { + integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==, + } + + glob-parent@5.1.2: + resolution: + { + integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, + } + engines: { node: ">= 6" } + + glob-parent@6.0.2: + resolution: + { + integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, + } + engines: { node: ">=10.13.0" } + + glob@7.1.6: + resolution: + { + integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==, + } + + globals@11.12.0: + resolution: + { + integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==, + } + engines: { node: ">=4" } + + graceful-fs@4.2.11: + resolution: + { + integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, + } + + gray-matter@4.0.3: + resolution: + { + integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==, + } + engines: { node: ">=6.0" } + + has-flag@3.0.0: + resolution: + { + integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==, + } + engines: { node: ">=4" } + + hasown@2.0.0: + resolution: + { + integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==, + } + engines: { node: ">= 0.4" } + + hast-util-embedded@3.0.0: + resolution: + { + integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==, + } + + hast-util-from-html@2.0.1: + resolution: + { + integrity: sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==, + } + + hast-util-from-parse5@8.0.1: + resolution: + { + integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==, + } + + hast-util-has-property@3.0.0: + resolution: + { + integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==, + } + + hast-util-is-body-ok-link@3.0.0: + resolution: + { + integrity: sha512-VFHY5bo2nY8HiV6nir2ynmEB1XkxzuUffhEGeVx7orbu/B1KaGyeGgMZldvMVx5xWrDlLLG/kQ6YkJAMkBEx0w==, + } + + hast-util-is-element@3.0.0: + resolution: + { + integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==, + } + + hast-util-parse-selector@4.0.0: + resolution: + { + integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==, + } + + hast-util-phrasing@3.0.1: + resolution: + { + integrity: sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==, + } + + hast-util-raw@9.0.1: + resolution: + { + integrity: sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA==, + } + + hast-util-select@6.0.2: + resolution: + { + integrity: sha512-hT/SD/d/Meu+iobvgkffo1QecV8WeKWxwsNMzcTJsKw1cKTQKSR/7ArJeURLNJF9HDjp9nVoORyNNJxrvBye8Q==, + } + + hast-util-to-estree@3.1.0: + resolution: + { + integrity: sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==, + } + + hast-util-to-html@9.0.0: + resolution: + { + integrity: sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw==, + } + + hast-util-to-html@9.0.1: + resolution: + { + integrity: sha512-hZOofyZANbyWo+9RP75xIDV/gq+OUKx+T46IlwERnKmfpwp81XBFbT9mi26ws+SJchA4RVUQwIBJpqEOBhMzEQ==, + } + + hast-util-to-jsx-runtime@2.3.0: + resolution: + { + integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==, + } + + hast-util-to-parse5@8.0.0: + resolution: + { + integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==, + } + + hast-util-to-string@3.0.0: + resolution: + { + integrity: sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA==, + } + + hast-util-to-text@4.0.2: + resolution: + { + integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==, + } + + hast-util-whitespace@3.0.0: + resolution: + { + integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==, + } + + hastscript@8.0.0: + resolution: + { + integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==, + } + + hastscript@9.0.0: + resolution: + { + integrity: sha512-jzaLBGavEDKHrc5EfFImKN7nZKKBdSLIdGvCwDZ9TfzbF2ffXiov8CKE445L2Z1Ek2t/m4SKQ2j6Ipv7NyUolw==, + } + + html-escaper@3.0.3: + resolution: + { + integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==, + } + + html-void-elements@3.0.0: + resolution: + { + integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==, + } + + html-whitespace-sensitive-tag-names@3.0.0: + resolution: + { + integrity: sha512-KlClZ3/Qy5UgvpvVvDomGhnQhNWH5INE8GwvSIQ9CWt1K0zbbXrl7eN5bWaafOZgtmO3jMPwUqmrmEwinhPq1w==, + } + + http-cache-semantics@4.1.1: + resolution: + { + integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==, + } + + human-signals@5.0.0: + resolution: + { + integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==, + } + engines: { node: ">=16.17.0" } + + import-meta-resolve@4.0.0: + resolution: + { + integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==, + } + + inflight@1.0.6: + resolution: + { + integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, + } + + inherits@2.0.4: + resolution: + { + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, + } + + inline-style-parser@0.1.1: + resolution: + { + integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==, + } + + inline-style-parser@0.2.2: + resolution: + { + integrity: sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ==, + } + + is-alphabetical@2.0.1: + resolution: + { + integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==, + } + + is-alphanumerical@2.0.1: + resolution: + { + integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==, + } + + is-arrayish@0.3.2: + resolution: + { + integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==, + } + + is-binary-path@2.1.0: + resolution: + { + integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, + } + engines: { node: ">=8" } + + is-buffer@2.0.5: + resolution: + { + integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==, + } + engines: { node: ">=4" } + + is-core-module@2.13.1: + resolution: + { + integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==, + } + + is-decimal@2.0.1: + resolution: + { + integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==, + } + + is-docker@3.0.0: + resolution: + { + integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + hasBin: true + + is-extendable@0.1.1: + resolution: + { + integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==, + } + engines: { node: ">=0.10.0" } + + is-extglob@2.1.1: + resolution: + { + integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, + } + engines: { node: ">=0.10.0" } + + is-fullwidth-code-point@3.0.0: + resolution: + { + integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, + } + engines: { node: ">=8" } + + is-glob@4.0.3: + resolution: + { + integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, + } + engines: { node: ">=0.10.0" } + + is-hexadecimal@2.0.1: + resolution: + { + integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==, + } + + is-inside-container@1.0.0: + resolution: + { + integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==, + } + engines: { node: ">=14.16" } + hasBin: true + + is-interactive@2.0.0: + resolution: + { + integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==, + } + engines: { node: ">=12" } + + is-number@7.0.0: + resolution: + { + integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, + } + engines: { node: ">=0.12.0" } + + is-plain-obj@4.1.0: + resolution: + { + integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==, + } + engines: { node: ">=12" } + + is-reference@3.0.2: + resolution: + { + integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==, + } + + is-stream@3.0.0: + resolution: + { + integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + is-unicode-supported@1.3.0: + resolution: + { + integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==, + } + engines: { node: ">=12" } + + is-unicode-supported@2.0.0: + resolution: + { + integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==, + } + engines: { node: ">=18" } + + is-wsl@3.1.0: + resolution: + { + integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==, + } + engines: { node: ">=16" } + + isexe@2.0.0: + resolution: + { + integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, + } + + jiti@1.21.0: + resolution: + { + integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==, + } + hasBin: true + + js-tokens@4.0.0: + resolution: + { + integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, + } + + js-yaml@3.14.1: + resolution: + { + integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==, + } + hasBin: true + + js-yaml@4.1.0: + resolution: + { + integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, + } + hasBin: true + + jsesc@2.5.2: + resolution: + { + integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==, + } + engines: { node: ">=4" } + hasBin: true + + json5@2.2.3: + resolution: + { + integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, + } + engines: { node: ">=6" } + hasBin: true + + jsonc-parser@2.3.1: + resolution: + { + integrity: sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==, + } + + kind-of@6.0.3: + resolution: + { + integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==, + } + engines: { node: ">=0.10.0" } + + kleur@3.0.3: + resolution: + { + integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==, + } + engines: { node: ">=6" } + + kleur@4.1.5: + resolution: + { + integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==, + } + engines: { node: ">=6" } + + lilconfig@2.1.0: + resolution: + { + integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==, + } + engines: { node: ">=10" } + + lilconfig@3.0.0: + resolution: + { + integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==, + } + engines: { node: ">=14" } + + lilconfig@3.1.1: + resolution: + { + integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==, + } + engines: { node: ">=14" } + + lines-and-columns@1.2.4: + resolution: + { + integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, + } + + load-yaml-file@0.2.0: + resolution: + { + integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==, + } + engines: { node: ">=6" } + + locate-path@5.0.0: + resolution: + { + integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==, + } + engines: { node: ">=8" } + + locate-path@6.0.0: + resolution: + { + integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, + } + engines: { node: ">=10" } + + lodash.memoize@4.1.2: + resolution: + { + integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==, + } + + lodash.uniq@4.5.0: + resolution: + { + integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==, + } + + log-symbols@6.0.0: + resolution: + { + integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==, + } + engines: { node: ">=18" } + + longest-streak@3.1.0: + resolution: + { + integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==, + } + + lru-cache@5.1.1: + resolution: + { + integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, + } + + lru-cache@6.0.0: + resolution: + { + integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, + } + engines: { node: ">=10" } + + magic-string@0.30.10: + resolution: + { + integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==, + } + + markdown-extensions@2.0.0: + resolution: + { + integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==, + } + engines: { node: ">=16" } + + markdown-table@3.0.3: + resolution: + { + integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==, + } + + mdast-util-definitions@6.0.0: + resolution: + { + integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==, + } + + mdast-util-directive@3.0.0: + resolution: + { + integrity: sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==, + } + + mdast-util-find-and-replace@3.0.1: + resolution: + { + integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==, + } + + mdast-util-from-markdown@2.0.0: + resolution: + { + integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==, + } + + mdast-util-gfm-autolink-literal@2.0.0: + resolution: + { + integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==, + } + + mdast-util-gfm-footnote@2.0.0: + resolution: + { + integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==, + } + + mdast-util-gfm-strikethrough@2.0.0: + resolution: + { + integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==, + } + + mdast-util-gfm-table@2.0.0: + resolution: + { + integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==, + } + + mdast-util-gfm-task-list-item@2.0.0: + resolution: + { + integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==, + } + + mdast-util-gfm@3.0.0: + resolution: + { + integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==, + } + + mdast-util-mdx-expression@2.0.0: + resolution: + { + integrity: sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==, + } + + mdast-util-mdx-jsx@3.0.0: + resolution: + { + integrity: sha512-XZuPPzQNBPAlaqsTTgRrcJnyFbSOBovSadFgbFu8SnuNgm+6Bdx1K+IWoitsmj6Lq6MNtI+ytOqwN70n//NaBA==, + } + + mdast-util-mdx@3.0.0: + resolution: + { + integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==, + } + + mdast-util-mdxjs-esm@2.0.1: + resolution: + { + integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==, + } + + mdast-util-phrasing@4.0.0: + resolution: + { + integrity: sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA==, + } + + mdast-util-to-hast@13.0.2: + resolution: + { + integrity: sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==, + } + + mdast-util-to-markdown@2.1.0: + resolution: + { + integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==, + } + + mdast-util-to-string@4.0.0: + resolution: + { + integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==, + } + + mdn-data@2.0.28: + resolution: + { + integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==, + } + + mdn-data@2.0.30: + resolution: + { + integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==, + } + + merge-stream@2.0.0: + resolution: + { + integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, + } + + merge2@1.4.1: + resolution: + { + integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, + } + engines: { node: ">= 8" } + + micromark-core-commonmark@2.0.0: + resolution: + { + integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==, + } + + micromark-extension-directive@3.0.0: + resolution: + { + integrity: sha512-61OI07qpQrERc+0wEysLHMvoiO3s2R56x5u7glHq2Yqq6EHbH4dW25G9GfDdGCDYqA21KE6DWgNSzxSwHc2hSg==, + } + + micromark-extension-gfm-autolink-literal@2.0.0: + resolution: + { + integrity: sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==, + } + + micromark-extension-gfm-footnote@2.0.0: + resolution: + { + integrity: sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==, + } + + micromark-extension-gfm-strikethrough@2.0.0: + resolution: + { + integrity: sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==, + } + + micromark-extension-gfm-table@2.0.0: + resolution: + { + integrity: sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==, + } + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: + { + integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==, + } + + micromark-extension-gfm-task-list-item@2.0.1: + resolution: + { + integrity: sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==, + } + + micromark-extension-gfm@3.0.0: + resolution: + { + integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==, + } + + micromark-extension-mdx-expression@3.0.0: + resolution: + { + integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==, + } + + micromark-extension-mdx-jsx@3.0.0: + resolution: + { + integrity: sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==, + } + + micromark-extension-mdx-md@2.0.0: + resolution: + { + integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==, + } + + micromark-extension-mdxjs-esm@3.0.0: + resolution: + { + integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==, + } + + micromark-extension-mdxjs@3.0.0: + resolution: + { + integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==, + } + + micromark-factory-destination@2.0.0: + resolution: + { + integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==, + } + + micromark-factory-label@2.0.0: + resolution: + { + integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==, + } + + micromark-factory-mdx-expression@2.0.1: + resolution: + { + integrity: sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==, + } + + micromark-factory-space@2.0.0: + resolution: + { + integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==, + } + + micromark-factory-title@2.0.0: + resolution: + { + integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==, + } + + micromark-factory-whitespace@2.0.0: + resolution: + { + integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==, + } + + micromark-util-character@2.0.1: + resolution: + { + integrity: sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==, + } + + micromark-util-chunked@2.0.0: + resolution: + { + integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==, + } + + micromark-util-classify-character@2.0.0: + resolution: + { + integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==, + } + + micromark-util-combine-extensions@2.0.0: + resolution: + { + integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==, + } + + micromark-util-decode-numeric-character-reference@2.0.1: + resolution: + { + integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==, + } + + micromark-util-decode-string@2.0.0: + resolution: + { + integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==, + } + + micromark-util-encode@2.0.0: + resolution: + { + integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==, + } + + micromark-util-events-to-acorn@2.0.2: + resolution: + { + integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==, + } + + micromark-util-html-tag-name@2.0.0: + resolution: + { + integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==, + } + + micromark-util-normalize-identifier@2.0.0: + resolution: + { + integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==, + } + + micromark-util-resolve-all@2.0.0: + resolution: + { + integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==, + } + + micromark-util-sanitize-uri@2.0.0: + resolution: + { + integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==, + } + + micromark-util-subtokenize@2.0.0: + resolution: + { + integrity: sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==, + } + + micromark-util-symbol@2.0.0: + resolution: + { + integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==, + } + + micromark-util-types@2.0.0: + resolution: + { + integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==, + } + + micromark@4.0.0: + resolution: + { + integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==, + } + + micromatch@4.0.5: + resolution: + { + integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, + } + engines: { node: ">=8.6" } + + mimic-fn@2.1.0: + resolution: + { + integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==, + } + engines: { node: ">=6" } + + mimic-fn@4.0.0: + resolution: + { + integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==, + } + engines: { node: ">=12" } + + minimatch@3.1.2: + resolution: + { + integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, + } + + mrmime@2.0.0: + resolution: + { + integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==, + } + engines: { node: ">=10" } + + ms@2.1.2: + resolution: + { + integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, + } + + muggle-string@0.4.1: + resolution: + { + integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==, + } + + mz@2.7.0: + resolution: + { + integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==, + } + + nanoid@3.3.7: + resolution: + { + integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==, + } + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } + hasBin: true + + nlcst-to-string@3.1.1: + resolution: + { + integrity: sha512-63mVyqaqt0cmn2VcI2aH6kxe1rLAmSROqHMA0i4qqg1tidkfExgpb0FGMikMCn86mw5dFtBtEANfmSSK7TjNHw==, + } + + node-releases@2.0.14: + resolution: + { + integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==, + } + + normalize-path@3.0.0: + resolution: + { + integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, + } + engines: { node: ">=0.10.0" } + + normalize-range@0.1.2: + resolution: + { + integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==, + } + engines: { node: ">=0.10.0" } + + not@0.1.0: + resolution: + { + integrity: sha512-5PDmaAsVfnWUgTUbJ3ERwn7u79Z0dYxN9ErxCpVJJqe2RK0PJ3z+iFUxuqjwtlDDegXvtWoxD/3Fzxox7tFGWA==, + } + + npm-run-path@5.1.0: + resolution: + { + integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + nth-check@2.1.1: + resolution: + { + integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==, + } + + object-assign@4.1.1: + resolution: + { + integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==, + } + engines: { node: ">=0.10.0" } + + object-hash@3.0.0: + resolution: + { + integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==, + } + engines: { node: ">= 6" } + + once@1.4.0: + resolution: + { + integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, + } + + onetime@5.1.2: + resolution: + { + integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, + } + engines: { node: ">=6" } + + onetime@6.0.0: + resolution: + { + integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==, + } + engines: { node: ">=12" } + + ora@8.0.1: + resolution: + { + integrity: sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ==, + } + engines: { node: ">=18" } + + p-limit@2.3.0: + resolution: + { + integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==, + } + engines: { node: ">=6" } + + p-limit@3.1.0: + resolution: + { + integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, + } + engines: { node: ">=10" } + + p-limit@5.0.0: + resolution: + { + integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==, + } + engines: { node: ">=18" } + + p-locate@4.1.0: + resolution: + { + integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==, + } + engines: { node: ">=8" } + + p-locate@5.0.0: + resolution: + { + integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, + } + engines: { node: ">=10" } + + p-queue@8.0.1: + resolution: + { + integrity: sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==, + } + engines: { node: ">=18" } + + p-timeout@6.1.2: + resolution: + { + integrity: sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==, + } + engines: { node: ">=14.16" } + + p-try@2.2.0: + resolution: + { + integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, + } + engines: { node: ">=6" } + + pagefind@1.0.4: + resolution: + { + integrity: sha512-oRIizYe+zSI2Jw4zcMU0ebDZm27751hRFiSOBLwc1OIYMrsZKk+3m8p9EVaOmc6zZdtqwwdilNUNxXvBeHcP9w==, + } + hasBin: true + + parse-entities@4.0.1: + resolution: + { + integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==, + } + + parse-latin@5.0.1: + resolution: + { + integrity: sha512-b/K8ExXaWC9t34kKeDV8kGXBkXZ1HCSAZRYE7HR14eA1GlXX5L8iWhs8USJNhQU9q5ci413jCKF0gOyovvyRBg==, + } + + parse5@7.1.2: + resolution: + { + integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==, + } + + path-browserify@1.0.1: + resolution: + { + integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==, + } + + path-exists@4.0.0: + resolution: + { + integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, + } + engines: { node: ">=8" } + + path-is-absolute@1.0.1: + resolution: + { + integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, + } + engines: { node: ">=0.10.0" } + + path-key@3.1.1: + resolution: + { + integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, + } + engines: { node: ">=8" } + + path-key@4.0.0: + resolution: + { + integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==, + } + engines: { node: ">=12" } + + path-parse@1.0.7: + resolution: + { + integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, + } + + path-to-regexp@6.2.2: + resolution: + { + integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==, + } + + periscopic@3.1.0: + resolution: + { + integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==, + } + + picocolors@1.0.0: + resolution: + { + integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==, + } + + picomatch@2.3.1: + resolution: + { + integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, + } + engines: { node: ">=8.6" } + + pify@2.3.0: + resolution: + { + integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==, + } + engines: { node: ">=0.10.0" } + + pify@4.0.1: + resolution: + { + integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==, + } + engines: { node: ">=6" } + + pirates@4.0.6: + resolution: + { + integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==, + } + engines: { node: ">= 6" } + + pkg-dir@4.2.0: + resolution: + { + integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==, + } + engines: { node: ">=8" } + + postcss-attribute-case-insensitive@6.0.3: + resolution: + { + integrity: sha512-KHkmCILThWBRtg+Jn1owTnHPnFit4OkqS+eKiGEOPIGke54DCeYGJ6r0Fx/HjfE9M9kznApCLcU0DvnPchazMQ==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + postcss-calc@10.0.0: + resolution: + { + integrity: sha512-OmjhudoNTP0QleZCwl1i6NeBwN+5MZbY5ersLZz69mjJiDVv/p57RjRuKDkHeDWr4T+S97wQfsqRTNoDHB2e3g==, + } + engines: { node: ^18.12 || ^20.9 || >=22.0 } + peerDependencies: + postcss: ^8.4.38 + + postcss-clamp@4.1.0: + resolution: + { + integrity: sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==, + } + engines: { node: ">=7.6.0" } + peerDependencies: + postcss: ^8.4.6 + + postcss-color-functional-notation@6.0.11: + resolution: + { + integrity: sha512-gJ+hAtAsgBF4w7eh28Pg7EA60lx7vE5xO/B/yZawaI6FYHky+5avA9YSe73nJHnAMEVFpCMeJc6Wts5g+niksg==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + postcss-color-hex-alpha@9.0.4: + resolution: + { + integrity: sha512-XQZm4q4fNFqVCYMGPiBjcqDhuG7Ey2xrl99AnDJMyr5eDASsAGalndVgHZF8i97VFNy1GQeZc4q2ydagGmhelQ==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + postcss-color-rebeccapurple@9.0.3: + resolution: + { + integrity: sha512-ruBqzEFDYHrcVq3FnW3XHgwRqVMrtEPLBtD7K2YmsLKVc2jbkxzzNEctJKsPCpDZ+LeMHLKRDoSShVefGc+CkQ==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + postcss-colormin@7.0.0: + resolution: + { + integrity: sha512-5CN6fqtsEtEtwf3mFV3B4UaZnlYljPpzmGeDB4yCK067PnAtfLe9uX2aFZaEwxHE7HopG5rUkW8gyHrNAesHEg==, + } + engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-convert-values@7.0.0: + resolution: + { + integrity: sha512-bMuzDgXBbFbByPgj+/r6va8zNuIDUaIIbvAFgdO1t3zdgJZ77BZvu6dfWyd6gHEJnYzmeVr9ayUsAQL3/qLJ0w==, + } + engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-custom-media@10.0.6: + resolution: + { + integrity: sha512-BjihQoIO4Wjqv9fQNExSJIim8UAmkhLxuJnhJsLTRFSba1y1MhxkJK5awsM//6JJ+/Tu5QUxf624RQAvKHv6SA==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + postcss-custom-properties@13.3.10: + resolution: + { + integrity: sha512-ejaalIpl7p0k0L5ngIZ86AZGmp3m1KdeOCbSQTK4gQcB1ncaoPTHorw206+tsZRIhIDYvh5ZButEje6740YDXw==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + postcss-custom-selectors@7.1.10: + resolution: + { + integrity: sha512-bV/6+IExyT2J4kMzX6c+ZMlN1xDfjcC4ePr1ywKezcTgwgUn11qQN3jdzFBpo8Dk1K7vO/OYOwMb5AtJP4JZcg==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + postcss-dir-pseudo-class@8.0.1: + resolution: + { + integrity: sha512-uULohfWBBVoFiZXgsQA24JV6FdKIidQ+ZqxOouhWwdE+qJlALbkS5ScB43ZTjPK+xUZZhlaO/NjfCt5h4IKUfw==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + postcss-discard-comments@7.0.0: + resolution: + { + integrity: sha512-xpSdzRqYmy4YIVmjfGyYXKaI1SRnK6CTr+4Zmvyof8ANwvgfZgGdVtmgAvzh59gJm808mJCWQC9tFN0KF5dEXA==, + } + engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-discard-duplicates@7.0.0: + resolution: + { + integrity: sha512-bAnSuBop5LpAIUmmOSsuvtKAAKREB6BBIYStWUTGq8oG5q9fClDMMuY8i4UPI/cEcDx2TN+7PMnXYIId20UVDw==, + } + engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-discard-empty@7.0.0: + resolution: + { + integrity: sha512-e+QzoReTZ8IAwhnSdp/++7gBZ/F+nBq9y6PomfwORfP7q9nBpK5AMP64kOt0bA+lShBFbBDcgpJ3X4etHg4lzA==, + } + engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-discard-overridden@7.0.0: + resolution: + { + integrity: sha512-GmNAzx88u3k2+sBTZrJSDauR0ccpE24omTQCVmaTTZFz1du6AasspjaUPMJ2ud4RslZpoFKyf+6MSPETLojc6w==, + } + engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-double-position-gradients@5.0.6: + resolution: + { + integrity: sha512-QJ+089FKMaqDxOhhIHsJrh4IP7h4PIHNC5jZP5PMmnfUScNu8Hji2lskqpFWCvu+5sj+2EJFyzKd13sLEWOZmQ==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + postcss-focus-visible@9.0.1: + resolution: + { + integrity: sha512-N2VQ5uPz3Z9ZcqI5tmeholn4d+1H14fKXszpjogZIrFbhaq0zNAtq8sAnw6VLiqGbL8YBzsnu7K9bBkTqaRimQ==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + postcss-focus-within@8.0.1: + resolution: + { + integrity: sha512-NFU3xcY/xwNaapVb+1uJ4n23XImoC86JNwkY/uduytSl2s9Ekc2EpzmRR63+ExitnW3Mab3Fba/wRPCT5oDILA==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + postcss-font-variant@5.0.0: + resolution: + { + integrity: sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==, + } + peerDependencies: + postcss: ^8.1.0 + + postcss-gap-properties@5.0.1: + resolution: + { + integrity: sha512-k2z9Cnngc24c0KF4MtMuDdToROYqGMMUQGcE6V0odwjHyOHtaDBlLeRBV70y9/vF7KIbShrTRZ70JjsI1BZyWw==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + postcss-image-set-function@6.0.3: + resolution: + { + integrity: sha512-i2bXrBYzfbRzFnm+pVuxVePSTCRiNmlfssGI4H0tJQvDue+yywXwUxe68VyzXs7cGtMaH6MCLY6IbCShrSroCw==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + postcss-import@15.1.0: + resolution: + { + integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==, + } + engines: { node: ">=14.0.0" } + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.0.1: + resolution: + { + integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==, + } + engines: { node: ^12 || ^14 || >= 16 } + peerDependencies: + postcss: ^8.4.21 + + postcss-lab-function@6.0.16: + resolution: + { + integrity: sha512-QWv0VxfjgIl8jBR/wuQcm/o31jn4P/LwzYuVKzNQoO5t7HPcU0d3RfWUiDrHN3frmSv+YYZppr3P81tKFTDyqg==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + postcss-load-config@4.0.2: + resolution: + { + integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==, + } + engines: { node: ">= 14" } + peerDependencies: + postcss: ">=8.0.9" + ts-node: ">=9.0.0" + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-logical@7.0.1: + resolution: + { + integrity: sha512-8GwUQZE0ri0K0HJHkDv87XOLC8DE0msc+HoWLeKdtjDZEwpZ5xuK3QdV6FhmHSQW40LPkg43QzvATRAI3LsRkg==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + postcss-merge-longhand@7.0.0: + resolution: + { + integrity: sha512-0X8I4/9+G03X5/5NnrfopG/YEln2XU8heDh7YqBaiq2SeaKIG3n66ShZPjIolmVuLBQ0BEm3yS8o1mlCLHdW7A==, + } + engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-merge-rules@7.0.0: + resolution: + { + integrity: sha512-Zty3VlOsD6VSjBMu6PiHCVpLegtBT/qtZRVBcSeyEZ6q1iU5qTYT0WtEoLRV+YubZZguS5/ycfP+NRiKfjv6aw==, + } + engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-minify-font-values@7.0.0: + resolution: + { + integrity: sha512-2ckkZtgT0zG8SMc5aoNwtm5234eUx1GGFJKf2b1bSp8UflqaeFzR50lid4PfqVI9NtGqJ2J4Y7fwvnP/u1cQog==, + } + engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-minify-gradients@7.0.0: + resolution: + { + integrity: sha512-pdUIIdj/C93ryCHew0UgBnL2DtUS3hfFa5XtERrs4x+hmpMYGhbzo6l/Ir5de41O0GaKVpK1ZbDNXSY6GkXvtg==, + } + engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-minify-params@7.0.0: + resolution: + { + integrity: sha512-XOJAuX8Q/9GT1sGxlUvaFEe2H9n50bniLZblXXsAT/BwSfFYvzSZeFG7uupwc0KbKpTnflnQ7aMwGzX6JUWliQ==, + } + engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-minify-selectors@7.0.0: + resolution: + { + integrity: sha512-f00CExZhD6lNw2vTZbcnmfxVgaVKzUw6IRsIFX3JTT8GdsoABc1WnhhGwL1i8YPJ3sSWw39fv7XPtvLb+3Uitw==, + } + engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-nested@6.0.1: + resolution: + { + integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==, + } + engines: { node: ">=12.0" } + peerDependencies: + postcss: ^8.2.14 + + postcss-nesting@12.1.4: + resolution: + { + integrity: sha512-CcHOq94K137E+U4Ommu7pexcpp0Tjm24zl4UcqWs1oSLAr5cLI+jLrqQ5h/bdjhMX6cMbzunyustVNnvrzF8Zg==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + postcss-normalize-charset@7.0.0: + resolution: + { + integrity: sha512-ABisNUXMeZeDNzCQxPxBCkXexvBrUHV+p7/BXOY+ulxkcjUZO0cp8ekGBwvIh2LbCwnWbyMPNJVtBSdyhM2zYQ==, + } + engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-display-values@7.0.0: + resolution: + { + integrity: sha512-lnFZzNPeDf5uGMPYgGOw7v0BfB45+irSRz9gHQStdkkhiM0gTfvWkWB5BMxpn0OqgOQuZG/mRlZyJxp0EImr2Q==, + } + engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-positions@7.0.0: + resolution: + { + integrity: sha512-I0yt8wX529UKIGs2y/9Ybs2CelSvItfmvg/DBIjTnoUSrPxSV7Z0yZ8ShSVtKNaV/wAY+m7bgtyVQLhB00A1NQ==, + } + engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-repeat-style@7.0.0: + resolution: + { + integrity: sha512-o3uSGYH+2q30ieM3ppu9GTjSXIzOrRdCUn8UOMGNw7Af61bmurHTWI87hRybrP6xDHvOe5WlAj3XzN6vEO8jLw==, + } + engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-string@7.0.0: + resolution: + { + integrity: sha512-w/qzL212DFVOpMy3UGyxrND+Kb0fvCiBBujiaONIihq7VvtC7bswjWgKQU/w4VcRyDD8gpfqUiBQ4DUOwEJ6Qg==, + } + engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-timing-functions@7.0.0: + resolution: + { + integrity: sha512-tNgw3YV0LYoRwg43N3lTe3AEWZ66W7Dh7lVEpJbHoKOuHc1sLrzMLMFjP8SNULHaykzsonUEDbKedv8C+7ej6g==, + } + engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-unicode@7.0.0: + resolution: + { + integrity: sha512-OnKV52/VFFDAim4n0pdI+JAhsolLBdnCKxE6VV5lW5Q/JeVGFN8UM8ur6/A3EAMLsT1ZRm3fDHh/rBoBQpqi2w==, + } + engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-url@7.0.0: + resolution: + { + integrity: sha512-+d7+PpE+jyPX1hDQZYG+NaFD+Nd2ris6r8fPTBAjE8z/U41n/bib3vze8x7rKs5H1uEw5ppe9IojewouHk0klQ==, + } + engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-normalize-whitespace@7.0.0: + resolution: + { + integrity: sha512-37/toN4wwZErqohedXYqWgvcHUGlT8O/m2jVkAfAe9Bd4MzRqlBmXrJRePH0e9Wgnz2X7KymTgTOaaFizQe3AQ==, + } + engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-opacity-percentage@2.0.0: + resolution: + { + integrity: sha512-lyDrCOtntq5Y1JZpBFzIWm2wG9kbEdujpNt4NLannF+J9c8CgFIzPa80YQfdza+Y+yFfzbYj/rfoOsYsooUWTQ==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.2 + + postcss-ordered-values@7.0.0: + resolution: + { + integrity: sha512-KROvC63A8UQW1eYDljQe1dtwc1E/M+mMwDT6z7khV/weHYLWTghaLRLunU7x1xw85lWFwVZOAGakxekYvKV+0w==, + } + engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-overflow-shorthand@5.0.1: + resolution: + { + integrity: sha512-XzjBYKLd1t6vHsaokMV9URBt2EwC9a7nDhpQpjoPk2HRTSQfokPfyAS/Q7AOrzUu6q+vp/GnrDBGuj/FCaRqrQ==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + postcss-page-break@3.0.4: + resolution: + { + integrity: sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==, + } + peerDependencies: + postcss: ^8 + + postcss-place@9.0.1: + resolution: + { + integrity: sha512-JfL+paQOgRQRMoYFc2f73pGuG/Aw3tt4vYMR6UA3cWVMxivviPTnMFnFTczUJOA4K2Zga6xgQVE+PcLs64WC8Q==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + postcss-preset-env@9.5.13: + resolution: + { + integrity: sha512-YQMwWu6MAc4Envrjf/mW2BTrb5J8WkrJ4dV2VostZVDhrmEPpYREOyhmvtlFLDxK1/AmTDY8aXjZViMC1qKu/w==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + postcss-pseudo-class-any-link@9.0.2: + resolution: + { + integrity: sha512-HFSsxIqQ9nA27ahyfH37cRWGk3SYyQLpk0LiWw/UGMV4VKT5YG2ONee4Pz/oFesnK0dn2AjcyequDbIjKJgB0g==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + postcss-reduce-initial@7.0.0: + resolution: + { + integrity: sha512-iqGgmBxY9LrblZ0BKLjmrA1mC/cf9A/wYCCqSmD6tMi+xAyVl0+DfixZIHSVDMbCPRPjNmVF0DFGth/IDGelFQ==, + } + engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-reduce-transforms@7.0.0: + resolution: + { + integrity: sha512-pnt1HKKZ07/idH8cpATX/ujMbtOGhUfE+m8gbqwJE05aTaNw8gbo34a2e3if0xc0dlu75sUOiqvwCGY3fzOHew==, + } + engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-replace-overflow-wrap@4.0.0: + resolution: + { + integrity: sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==, + } + peerDependencies: + postcss: ^8.0.3 + + postcss-selector-not@7.0.2: + resolution: + { + integrity: sha512-/SSxf/90Obye49VZIfc0ls4H0P6i6V1iHv0pzZH8SdgvZOPFkF37ef1r5cyWcMflJSFJ5bfuoluTnFnBBFiuSA==, + } + engines: { node: ^14 || ^16 || >=18 } + peerDependencies: + postcss: ^8.4 + + postcss-selector-parser@6.0.13: + resolution: + { + integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==, + } + engines: { node: ">=4" } + + postcss-selector-parser@6.0.16: + resolution: + { + integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==, + } + engines: { node: ">=4" } + + postcss-svgo@7.0.0: + resolution: + { + integrity: sha512-Xj5DRdvA97yRy3wjbCH2NKXtDUwEnph6EHr5ZXszsBVKCNrKXYBjzAXqav7/Afz5WwJ/1peZoTguCEJIg7ytmA==, + } + engines: { node: ^18.12.0 || ^20.9.0 || >= 18 } + peerDependencies: + postcss: ^8.4.31 + + postcss-unique-selectors@7.0.0: + resolution: + { + integrity: sha512-NYFqcft7vVQMZlQPsMdMPy+qU/zDpy95Malpw4GeA9ZZjM6dVXDshXtDmLc0m4WCD6XeZCJqjTfPT1USsdt+rA==, + } + engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + peerDependencies: + postcss: ^8.4.31 + + postcss-value-parser@4.2.0: + resolution: + { + integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==, + } + + postcss@8.4.31: + resolution: + { + integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==, + } + engines: { node: ^10 || ^12 || >=14 } + + postcss@8.4.33: + resolution: + { + integrity: sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==, + } + engines: { node: ^10 || ^12 || >=14 } + + postcss@8.4.38: + resolution: + { + integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==, + } + engines: { node: ^10 || ^12 || >=14 } + + preferred-pm@3.1.3: + resolution: + { + integrity: sha512-MkXsENfftWSRpzCzImcp4FRsCc3y1opwB73CfCNWyzMqArju2CrlMHlqB7VexKiPEOjGMbttv1r9fSCn5S610w==, + } + engines: { node: ">=10" } + + prismjs@1.29.0: + resolution: + { + integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==, + } + engines: { node: ">=6" } + + prompts@2.4.2: + resolution: + { + integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==, + } + engines: { node: ">= 6" } + + property-information@6.4.0: + resolution: + { + integrity: sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ==, + } + + queue-microtask@1.2.3: + resolution: + { + integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, + } + + read-cache@1.0.0: + resolution: + { + integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==, + } + + readdirp@3.6.0: + resolution: + { + integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, + } + engines: { node: ">=8.10.0" } + + rehype-expressive-code@0.35.3: + resolution: + { + integrity: sha512-kj43Rg+WzYUs8RRr6XyBr60pnrIZEgbmn9yJoV6qka1UDpcx7r8icn6Q2uSAgaLtlEUy+HCPgQJraOZrA53LOQ==, + } + + rehype-format@5.0.0: + resolution: + { + integrity: sha512-kM4II8krCHmUhxrlvzFSptvaWh280Fr7UGNJU5DCMuvmAwGCNmGfi9CvFAQK6JDjsNoRMWQStglK3zKJH685Wg==, + } + + rehype-minify-whitespace@6.0.0: + resolution: + { + integrity: sha512-i9It4YHR0Sf3GsnlR5jFUKXRr9oayvEk9GKQUkwZv6hs70OH9q3OCZrq9PpLvIGKt3W+JxBOxCidNVpH/6rWdA==, + } + + rehype-parse@9.0.0: + resolution: + { + integrity: sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw==, + } + + rehype-raw@7.0.0: + resolution: + { + integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==, + } + + rehype-stringify@10.0.0: + resolution: + { + integrity: sha512-1TX1i048LooI9QoecrXy7nGFFbFSufxVRAfc6Y9YMRAi56l+oB0zP51mLSV312uRuvVLPV1opSlJmslozR1XHQ==, + } + + rehype@13.0.1: + resolution: + { + integrity: sha512-AcSLS2mItY+0fYu9xKxOu1LhUZeBZZBx8//5HKzF+0XP+eP8+6a5MXn2+DW2kfXR6Dtp1FEXMVrjyKAcvcU8vg==, + } + + remark-directive@3.0.0: + resolution: + { + integrity: sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA==, + } + + remark-gfm@4.0.0: + resolution: + { + integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==, + } + + remark-mdx@3.0.0: + resolution: + { + integrity: sha512-O7yfjuC6ra3NHPbRVxfflafAj3LTwx3b73aBvkEFU5z4PsD6FD4vrqJAkE5iNGLz71GdjXfgRqm3SQ0h0VuE7g==, + } + + remark-parse@11.0.0: + resolution: + { + integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==, + } + + remark-rehype@11.1.0: + resolution: + { + integrity: sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==, + } + + remark-smartypants@2.0.0: + resolution: + { + integrity: sha512-Rc0VDmr/yhnMQIz8n2ACYXlfw/P/XZev884QU1I5u+5DgJls32o97Vc1RbK3pfumLsJomS2yy8eT4Fxj/2MDVA==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + remark-stringify@11.0.0: + resolution: + { + integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==, + } + + request-light@0.7.0: + resolution: + { + integrity: sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==, + } + + require-directory@2.1.1: + resolution: + { + integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, + } + engines: { node: ">=0.10.0" } + + resolve@1.22.8: + resolution: + { + integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==, + } + hasBin: true + + restore-cursor@4.0.0: + resolution: + { + integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + retext-latin@3.1.0: + resolution: + { + integrity: sha512-5MrD1tuebzO8ppsja5eEu+ZbBeUNCjoEarn70tkXOS7Bdsdf6tNahsv2bY0Z8VooFF6cw7/6S+d3yI/TMlMVVQ==, + } + + retext-smartypants@5.2.0: + resolution: + { + integrity: sha512-Do8oM+SsjrbzT2UNIKgheP0hgUQTDDQYyZaIY3kfq0pdFzoPk+ZClYJ+OERNXveog4xf1pZL4PfRxNoVL7a/jw==, + } + + retext-stringify@3.1.0: + resolution: + { + integrity: sha512-767TLOaoXFXyOnjx/EggXlb37ZD2u4P1n0GJqVdpipqACsQP+20W+BNpMYrlJkq7hxffnFk+jc6mAK9qrbuB8w==, + } + + retext@8.1.0: + resolution: + { + integrity: sha512-N9/Kq7YTn6ZpzfiGW45WfEGJqFf1IM1q8OsRa1CGzIebCJBNCANDRmOrholiDRGKo/We7ofKR4SEvcGAWEMD3Q==, + } + + reusify@1.0.4: + resolution: + { + integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, + } + engines: { iojs: ">=1.0.0", node: ">=0.10.0" } + + rollup@4.17.2: + resolution: + { + integrity: sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==, + } + engines: { node: ">=18.0.0", npm: ">=8.0.0" } + hasBin: true + + run-parallel@1.2.0: + resolution: + { + integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, + } + + sax@1.3.0: + resolution: + { + integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==, + } + + section-matter@1.0.0: + resolution: + { + integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==, + } + engines: { node: ">=4" } + + semver@6.3.1: + resolution: + { + integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, + } + hasBin: true + + semver@7.5.4: + resolution: + { + integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==, + } + engines: { node: ">=10" } + hasBin: true + + semver@7.6.2: + resolution: + { + integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==, + } + engines: { node: ">=10" } + hasBin: true + + sharp@0.33.4: + resolution: + { + integrity: sha512-7i/dt5kGl7qR4gwPRD2biwD2/SvBn3O04J77XKFgL2OnZtQw+AG9wnuS/csmu80nPRHLYE9E41fyEiG8nhH6/Q==, + } + engines: { libvips: ">=8.15.2", node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + + shebang-command@2.0.0: + resolution: + { + integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, + } + engines: { node: ">=8" } + + shebang-regex@3.0.0: + resolution: + { + integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, + } + engines: { node: ">=8" } + + shiki@1.5.2: + resolution: + { + integrity: sha512-fpPbuSaatinmdGijE7VYUD3hxLozR3ZZ+iAx8Iy2X6REmJGyF5hQl94SgmiUNTospq346nXUVZx0035dyGvIVw==, + } + + signal-exit@3.0.7: + resolution: + { + integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, + } + + signal-exit@4.1.0: + resolution: + { + integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==, + } + engines: { node: ">=14" } + + simple-swizzle@0.2.2: + resolution: + { + integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==, + } + + sisteransi@1.0.5: + resolution: + { + integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==, + } + + sitemap@7.1.1: + resolution: + { + integrity: sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==, + } + engines: { node: ">=12.0.0", npm: ">=5.6.0" } + hasBin: true + + source-map-js@1.0.2: + resolution: + { + integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==, + } + engines: { node: ">=0.10.0" } + + source-map-js@1.2.0: + resolution: + { + integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==, + } + engines: { node: ">=0.10.0" } + + source-map@0.7.4: + resolution: + { + integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==, + } + engines: { node: ">= 8" } + + space-separated-tokens@2.0.2: + resolution: + { + integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==, + } + + sprintf-js@1.0.3: + resolution: + { + integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==, + } + + stdin-discarder@0.2.2: + resolution: + { + integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==, + } + engines: { node: ">=18" } + + string-width@4.2.3: + resolution: + { + integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, + } + engines: { node: ">=8" } + + string-width@5.1.2: + resolution: + { + integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==, + } + engines: { node: ">=12" } + + string-width@7.1.0: + resolution: + { + integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==, + } + engines: { node: ">=18" } + + stringify-entities@4.0.3: + resolution: + { + integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==, + } + + strip-ansi@6.0.1: + resolution: + { + integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, + } + engines: { node: ">=8" } + + strip-ansi@7.1.0: + resolution: + { + integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==, + } + engines: { node: ">=12" } + + strip-bom-string@1.0.0: + resolution: + { + integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==, + } + engines: { node: ">=0.10.0" } + + strip-bom@3.0.0: + resolution: + { + integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==, + } + engines: { node: ">=4" } + + strip-final-newline@3.0.0: + resolution: + { + integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==, + } + engines: { node: ">=12" } + + style-to-object@0.4.4: + resolution: + { + integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==, + } + + style-to-object@1.0.5: + resolution: + { + integrity: sha512-rDRwHtoDD3UMMrmZ6BzOW0naTjMsVZLIjsGleSKS/0Oz+cgCfAPRspaqJuE8rDzpKha/nEvnM0IF4seEAZUTKQ==, + } + + stylehacks@7.0.0: + resolution: + { + integrity: sha512-47Nw4pQ6QJb4CA6dzF2m9810sjQik4dfk4UwAm5wlwhrW3syzZKF8AR4/cfO3Cr6lsFgAoznQq0Wg57qhjTA2A==, + } + engines: { node: ^18.12.0 || ^20.9.0 || >=22.0 } + peerDependencies: + postcss: ^8.4.31 + + sucrase@3.34.0: + resolution: + { + integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==, + } + engines: { node: ">=8" } + hasBin: true + + supports-color@5.5.0: + resolution: + { + integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==, + } + engines: { node: ">=4" } + + supports-preserve-symlinks-flag@1.0.0: + resolution: + { + integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, + } + engines: { node: ">= 0.4" } + + svgo@3.3.2: + resolution: + { + integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==, + } + engines: { node: ">=14.0.0" } + hasBin: true + + tailwindcss@3.4.3: + resolution: + { + integrity: sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==, + } + engines: { node: ">=14.0.0" } + hasBin: true + + thenify-all@1.6.0: + resolution: + { + integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==, + } + engines: { node: ">=0.8" } + + thenify@3.3.1: + resolution: + { + integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==, + } + + to-fast-properties@2.0.0: + resolution: + { + integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==, + } + engines: { node: ">=4" } + + to-regex-range@5.0.1: + resolution: + { + integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, + } + engines: { node: ">=8.0" } + + trim-lines@3.0.1: + resolution: + { + integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==, + } + + trough@2.1.0: + resolution: + { + integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==, + } + + ts-interface-checker@0.1.13: + resolution: + { + integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==, + } + + tsconfck@3.0.3: + resolution: + { + integrity: sha512-4t0noZX9t6GcPTfBAbIbbIU4pfpCwh0ueq3S4O/5qXI1VwK1outmxhe9dOiEWqMz3MW2LKgDTpqWV+37IWuVbA==, + } + engines: { node: ^18 || >=20 } + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + tslib@2.6.2: + resolution: + { + integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==, + } + + type-fest@2.19.0: + resolution: + { + integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==, + } + engines: { node: ">=12.20" } + + typesafe-path@0.2.2: + resolution: + { + integrity: sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==, + } + + typescript-auto-import-cache@0.3.2: + resolution: + { + integrity: sha512-+laqe5SFL1vN62FPOOJSUDTZxtgsoOXjneYOXIpx5rQ4UMiN89NAtJLpqLqyebv9fgQ/IMeeTX+mQyRnwvJzvg==, + } + + typescript@5.4.5: + resolution: + { + integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==, + } + engines: { node: ">=14.17" } + hasBin: true + + unherit@3.0.1: + resolution: + { + integrity: sha512-akOOQ/Yln8a2sgcLj4U0Jmx0R5jpIg2IUyRrWOzmEbjBtGzBdHtSeFKgoEcoH4KYIG/Pb8GQ/BwtYm0GCq1Sqg==, + } + + unified@10.1.2: + resolution: + { + integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==, + } + + unified@11.0.4: + resolution: + { + integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==, + } + + unist-util-find-after@5.0.0: + resolution: + { + integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==, + } + + unist-util-is@5.2.1: + resolution: + { + integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==, + } + + unist-util-is@6.0.0: + resolution: + { + integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==, + } + + unist-util-modify-children@3.1.1: + resolution: + { + integrity: sha512-yXi4Lm+TG5VG+qvokP6tpnk+r1EPwyYL04JWDxLvgvPV40jANh7nm3udk65OOWquvbMDe+PL9+LmkxDpTv/7BA==, + } + + unist-util-position-from-estree@2.0.0: + resolution: + { + integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==, + } + + unist-util-position@5.0.0: + resolution: + { + integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==, + } + + unist-util-remove-position@5.0.0: + resolution: + { + integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==, + } + + unist-util-stringify-position@3.0.3: + resolution: + { + integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==, + } + + unist-util-stringify-position@4.0.0: + resolution: + { + integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==, + } + + unist-util-visit-children@2.0.2: + resolution: + { + integrity: sha512-+LWpMFqyUwLGpsQxpumsQ9o9DG2VGLFrpz+rpVXYIEdPy57GSy5HioC0g3bg/8WP9oCLlapQtklOzQ8uLS496Q==, + } + + unist-util-visit-parents@5.1.3: + resolution: + { + integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==, + } + + unist-util-visit-parents@6.0.1: + resolution: + { + integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==, + } + + unist-util-visit@4.1.2: + resolution: + { + integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==, + } + + unist-util-visit@5.0.0: + resolution: + { + integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==, + } + + update-browserslist-db@1.0.13: + resolution: + { + integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==, + } + hasBin: true + peerDependencies: + browserslist: ">= 4.21.0" + + util-deprecate@1.0.2: + resolution: + { + integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, + } + + vfile-location@5.0.2: + resolution: + { + integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==, + } + + vfile-message@3.1.4: + resolution: + { + integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==, + } + + vfile-message@4.0.2: + resolution: + { + integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==, + } + + vfile@5.3.7: + resolution: + { + integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==, + } + + vfile@6.0.1: + resolution: + { + integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==, + } + + vite@5.2.11: + resolution: + { + integrity: sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==, + } + engines: { node: ^18.0.0 || >=20.0.0 } + hasBin: true + peerDependencies: + "@types/node": ^18.0.0 || >=20.0.0 + less: "*" + lightningcss: ^1.21.0 + sass: "*" + stylus: "*" + sugarss: "*" + terser: ^5.4.0 + peerDependenciesMeta: + "@types/node": + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vitefu@0.2.5: + resolution: + { + integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==, + } + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + vite: + optional: true + + volar-service-css@0.0.45: + resolution: + { + integrity: sha512-f+AlUI1+kESbcZSVaNJVAnK0c/9Da5StoxzPqA5/8VqUHJWNdubWNnwG5xpFVTfgh6pgTcey3UBhBfHytFaIOg==, + } + peerDependencies: + "@volar/language-service": ~2.2.3 + peerDependenciesMeta: + "@volar/language-service": + optional: true + + volar-service-emmet@0.0.45: + resolution: + { + integrity: sha512-9nLXSDkR1vA/3fQkFEsSXAu3XovQxOpTkVG2jilQgfek/K1ZLkaA/WMhN/TtmPmQg4NxE9Ni6mA5udBQ5gVXIA==, + } + peerDependencies: + "@volar/language-service": ~2.2.3 + peerDependenciesMeta: + "@volar/language-service": + optional: true + + volar-service-html@0.0.45: + resolution: + { + integrity: sha512-tLTJqfy1v5C4nmeAsfekFIKPl4r4qDMyL0L9MWywr/EApZzPCsbeUGxCqdzxSMC2q7PMCfX2i167txDo+J0LVA==, + } + peerDependencies: + "@volar/language-service": ~2.2.3 + peerDependenciesMeta: + "@volar/language-service": + optional: true + + volar-service-prettier@0.0.45: + resolution: + { + integrity: sha512-+mBS2EsDgp/kunKEBnHvhBwIQm5v2ahw4NKpKdg4sTpXy3UxqHt+Fq/wRYQ7Z8LlNVNRVfp75ThjM+w2zaZBAw==, + } + peerDependencies: + "@volar/language-service": ~2.2.3 + prettier: ^2.2 || ^3.0 + peerDependenciesMeta: + "@volar/language-service": + optional: true + prettier: + optional: true + + volar-service-typescript-twoslash-queries@0.0.45: + resolution: + { + integrity: sha512-KrPUUvKggZgV9mrDpstCzmf20irgv0ooMv+FGDzIIQUkya+d2+nSS8Mx2h9FvsYgLccUVw5jU3Rhwhd3pv/7qg==, + } + peerDependencies: + "@volar/language-service": ~2.2.3 + peerDependenciesMeta: + "@volar/language-service": + optional: true + + volar-service-typescript@0.0.45: + resolution: + { + integrity: sha512-i/mMIIAMastJ2kgPo3qvX0Rrl7NyxhIYZ0ug/B4ambZcLPI1vzBgS2fmvyWX3jhBYHh8NmbAotFj+0Y9JtN47A==, + } + peerDependencies: + "@volar/language-service": ~2.2.3 + peerDependenciesMeta: + "@volar/language-service": + optional: true + + vscode-css-languageservice@6.2.10: + resolution: + { + integrity: sha512-sYUZPku4mQ06AWGCbMyjv2tdR6juBW6hTbVPFwbJvNVzdtEfBioQOgkdXg7yMJNWnXkvWSU1FL2kb4Vxu5Cdyw==, + } + + vscode-html-languageservice@5.2.0: + resolution: + { + integrity: sha512-cdNMhyw57/SQzgUUGSIMQ66jikqEN6nBNyhx5YuOyj9310+eY9zw8Q0cXpiKzDX8aHYFewQEXRnigl06j/TVwQ==, + } + + vscode-jsonrpc@8.2.0: + resolution: + { + integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==, + } + engines: { node: ">=14.0.0" } + + vscode-languageserver-protocol@3.17.5: + resolution: + { + integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==, + } + + vscode-languageserver-textdocument@1.0.11: + resolution: + { + integrity: sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==, + } + + vscode-languageserver-types@3.17.5: + resolution: + { + integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==, + } + + vscode-languageserver@9.0.1: + resolution: + { + integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==, + } + hasBin: true + + vscode-nls@5.2.0: + resolution: + { + integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==, + } + + vscode-uri@2.1.2: + resolution: + { + integrity: sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A==, + } + + vscode-uri@3.0.8: + resolution: + { + integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==, + } + + web-namespaces@2.0.1: + resolution: + { + integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==, + } + + which-pm-runs@1.1.0: + resolution: + { + integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==, + } + engines: { node: ">=4" } + + which-pm@2.0.0: + resolution: + { + integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==, + } + engines: { node: ">=8.15" } + + which-pm@2.1.1: + resolution: + { + integrity: sha512-xzzxNw2wMaoCWXiGE8IJ9wuPMU+EYhFksjHxrRT8kMT5SnocBPRg69YAMtyV4D12fP582RA+k3P8H9J5EMdIxQ==, + } + engines: { node: ">=8.15" } + + which@2.0.2: + resolution: + { + integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, + } + engines: { node: ">= 8" } + hasBin: true + + widest-line@4.0.1: + resolution: + { + integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==, + } + engines: { node: ">=12" } + + wrap-ansi@7.0.0: + resolution: + { + integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, + } + engines: { node: ">=10" } + + wrap-ansi@8.1.0: + resolution: + { + integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==, + } + engines: { node: ">=12" } + + wrappy@1.0.2: + resolution: + { + integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, + } + + y18n@5.0.8: + resolution: + { + integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==, + } + engines: { node: ">=10" } + + yallist@3.1.1: + resolution: + { + integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, + } + + yallist@4.0.0: + resolution: + { + integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, + } + + yaml@2.3.4: + resolution: + { + integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==, + } + engines: { node: ">= 14" } + + yargs-parser@21.1.1: + resolution: + { + integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==, + } + engines: { node: ">=12" } + + yargs@17.7.2: + resolution: + { + integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==, + } + engines: { node: ">=12" } + + yocto-queue@0.1.0: + resolution: + { + integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, + } + engines: { node: ">=10" } + + yocto-queue@1.0.0: + resolution: + { + integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==, + } + engines: { node: ">=12.20" } + + zod-to-json-schema@3.23.0: + resolution: + { + integrity: sha512-az0uJ243PxsRIa2x1WmNE/pnuA05gUq/JB8Lwe1EDCCL/Fz9MgjYQ0fPlyc2Tcv6aF2ZA7WM5TWaRZVEFaAIag==, + } + peerDependencies: + zod: ^3.23.3 + + zod@3.22.4: + resolution: + { + integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==, + } + + zod@3.23.8: + resolution: + { + integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==, + } + + zwitch@2.0.4: + resolution: + { + integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==, + } + +snapshots: + "@alloc/quick-lru@5.2.0": {} + + "@ampproject/remapping@2.2.1": + dependencies: + "@jridgewell/gen-mapping": 0.3.3 + "@jridgewell/trace-mapping": 0.3.20 + + "@astrojs/check@0.7.0(typescript@5.4.5)": + dependencies: + "@astrojs/language-server": 2.10.0(typescript@5.4.5) + chokidar: 3.5.3 + fast-glob: 3.3.2 + kleur: 4.1.5 + typescript: 5.4.5 + yargs: 17.7.2 + transitivePeerDependencies: + - prettier + - prettier-plugin-astro + + "@astrojs/compiler@2.8.0": {} + + "@astrojs/internal-helpers@0.4.0": {} + + "@astrojs/language-server@2.10.0(typescript@5.4.5)": + dependencies: + "@astrojs/compiler": 2.8.0 + "@jridgewell/sourcemap-codec": 1.4.15 + "@volar/kit": 2.2.4(typescript@5.4.5) + "@volar/language-core": 2.2.4 + "@volar/language-server": 2.2.4 + "@volar/language-service": 2.2.4 + "@volar/typescript": 2.2.4 + fast-glob: 3.3.2 + volar-service-css: 0.0.45(@volar/language-service@2.2.4) + volar-service-emmet: 0.0.45(@volar/language-service@2.2.4) + volar-service-html: 0.0.45(@volar/language-service@2.2.4) + volar-service-prettier: 0.0.45(@volar/language-service@2.2.4) + volar-service-typescript: 0.0.45(@volar/language-service@2.2.4) + volar-service-typescript-twoslash-queries: 0.0.45(@volar/language-service@2.2.4) + vscode-html-languageservice: 5.2.0 + vscode-uri: 3.0.8 + transitivePeerDependencies: + - typescript + + "@astrojs/markdown-remark@5.1.0": + dependencies: + "@astrojs/prism": 3.1.0 + github-slugger: 2.0.0 + hast-util-from-html: 2.0.1 + hast-util-to-text: 4.0.2 + import-meta-resolve: 4.0.0 + mdast-util-definitions: 6.0.0 + rehype-raw: 7.0.0 + rehype-stringify: 10.0.0 + remark-gfm: 4.0.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.0 + remark-smartypants: 2.0.0 + shiki: 1.5.2 + unified: 11.0.4 + unist-util-remove-position: 5.0.0 + unist-util-visit: 5.0.0 + unist-util-visit-parents: 6.0.1 + vfile: 6.0.1 + transitivePeerDependencies: + - supports-color + + "@astrojs/mdx@2.3.1(astro@4.8.6(typescript@5.4.5))": + dependencies: + "@astrojs/markdown-remark": 5.1.0 + "@mdx-js/mdx": 3.0.0 + acorn: 8.11.2 + astro: 4.8.6(typescript@5.4.5) + es-module-lexer: 1.4.1 + estree-util-visit: 2.0.0 + github-slugger: 2.0.0 + gray-matter: 4.0.3 + hast-util-to-html: 9.0.0 + kleur: 4.1.5 + rehype-raw: 7.0.0 + remark-gfm: 4.0.0 + remark-smartypants: 2.0.0 + source-map: 0.7.4 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + transitivePeerDependencies: + - supports-color + + "@astrojs/prism@3.1.0": + dependencies: + prismjs: 1.29.0 + + "@astrojs/sitemap@3.0.5": + dependencies: + sitemap: 7.1.1 + zod: 3.22.4 + + "@astrojs/starlight-tailwind@2.0.2(@astrojs/starlight@0.22.4(astro@4.8.6(typescript@5.4.5)))(@astrojs/tailwind@5.1.0(astro@4.8.6(typescript@5.4.5))(tailwindcss@3.4.3))(tailwindcss@3.4.3)": + dependencies: + "@astrojs/starlight": 0.22.4(astro@4.8.6(typescript@5.4.5)) + "@astrojs/tailwind": 5.1.0(astro@4.8.6(typescript@5.4.5))(tailwindcss@3.4.3) + tailwindcss: 3.4.3 + + "@astrojs/starlight@0.22.4(astro@4.8.6(typescript@5.4.5))": + dependencies: + "@astrojs/mdx": 2.3.1(astro@4.8.6(typescript@5.4.5)) + "@astrojs/sitemap": 3.0.5 + "@pagefind/default-ui": 1.0.4 + "@types/hast": 3.0.3 + "@types/mdast": 4.0.3 + astro: 4.8.6(typescript@5.4.5) + astro-expressive-code: 0.35.3(astro@4.8.6(typescript@5.4.5)) + bcp-47: 2.1.0 + hast-util-from-html: 2.0.1 + hast-util-select: 6.0.2 + hast-util-to-string: 3.0.0 + hastscript: 8.0.0 + mdast-util-directive: 3.0.0 + mdast-util-to-markdown: 2.1.0 + pagefind: 1.0.4 + rehype: 13.0.1 + rehype-format: 5.0.0 + remark-directive: 3.0.0 + unified: 11.0.4 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + transitivePeerDependencies: + - supports-color + + "@astrojs/tailwind@5.1.0(astro@4.8.6(typescript@5.4.5))(tailwindcss@3.4.3)": + dependencies: + astro: 4.8.6(typescript@5.4.5) + autoprefixer: 10.4.19(postcss@8.4.31) + postcss: 8.4.31 + postcss-load-config: 4.0.2(postcss@8.4.31) + tailwindcss: 3.4.3 + transitivePeerDependencies: + - ts-node + + "@astrojs/telemetry@3.1.0": + dependencies: + ci-info: 4.0.0 + debug: 4.3.4 + dlv: 1.1.3 + dset: 3.1.3 + is-docker: 3.0.0 + is-wsl: 3.1.0 + which-pm-runs: 1.1.0 + transitivePeerDependencies: + - supports-color + + "@babel/code-frame@7.24.2": + dependencies: + "@babel/highlight": 7.24.5 + picocolors: 1.0.0 + + "@babel/compat-data@7.24.4": {} + + "@babel/core@7.24.5": + dependencies: + "@ampproject/remapping": 2.2.1 + "@babel/code-frame": 7.24.2 + "@babel/generator": 7.24.5 + "@babel/helper-compilation-targets": 7.23.6 + "@babel/helper-module-transforms": 7.24.5(@babel/core@7.24.5) + "@babel/helpers": 7.24.5 + "@babel/parser": 7.24.5 + "@babel/template": 7.24.0 + "@babel/traverse": 7.24.5 + "@babel/types": 7.24.5 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + "@babel/generator@7.24.5": + dependencies: + "@babel/types": 7.24.5 + "@jridgewell/gen-mapping": 0.3.5 + "@jridgewell/trace-mapping": 0.3.25 + jsesc: 2.5.2 + + "@babel/helper-annotate-as-pure@7.22.5": + dependencies: + "@babel/types": 7.24.5 + + "@babel/helper-compilation-targets@7.23.6": + dependencies: + "@babel/compat-data": 7.24.4 + "@babel/helper-validator-option": 7.23.5 + browserslist: 4.23.0 + lru-cache: 5.1.1 + semver: 6.3.1 + + "@babel/helper-environment-visitor@7.22.20": {} + + "@babel/helper-function-name@7.23.0": + dependencies: + "@babel/template": 7.22.15 + "@babel/types": 7.24.5 + + "@babel/helper-hoist-variables@7.22.5": + dependencies: + "@babel/types": 7.24.5 + + "@babel/helper-module-imports@7.22.15": + dependencies: + "@babel/types": 7.24.5 + + "@babel/helper-module-imports@7.24.3": + dependencies: + "@babel/types": 7.24.5 + + "@babel/helper-module-transforms@7.24.5(@babel/core@7.24.5)": + dependencies: + "@babel/core": 7.24.5 + "@babel/helper-environment-visitor": 7.22.20 + "@babel/helper-module-imports": 7.24.3 + "@babel/helper-simple-access": 7.24.5 + "@babel/helper-split-export-declaration": 7.24.5 + "@babel/helper-validator-identifier": 7.24.5 + + "@babel/helper-plugin-utils@7.22.5": {} + + "@babel/helper-simple-access@7.24.5": + dependencies: + "@babel/types": 7.24.5 + + "@babel/helper-split-export-declaration@7.24.5": + dependencies: + "@babel/types": 7.24.5 + + "@babel/helper-string-parser@7.24.1": {} + + "@babel/helper-validator-identifier@7.24.5": {} + + "@babel/helper-validator-option@7.23.5": {} + + "@babel/helpers@7.24.5": + dependencies: + "@babel/template": 7.24.0 + "@babel/traverse": 7.24.5 + "@babel/types": 7.24.5 + transitivePeerDependencies: + - supports-color + + "@babel/highlight@7.24.5": + dependencies: + "@babel/helper-validator-identifier": 7.24.5 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.0 + + "@babel/parser@7.24.5": + dependencies: + "@babel/types": 7.24.5 + + "@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.24.5)": + dependencies: + "@babel/core": 7.24.5 + "@babel/helper-plugin-utils": 7.22.5 + + "@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.5)": + dependencies: + "@babel/core": 7.24.5 + "@babel/helper-annotate-as-pure": 7.22.5 + "@babel/helper-module-imports": 7.22.15 + "@babel/helper-plugin-utils": 7.22.5 + "@babel/plugin-syntax-jsx": 7.23.3(@babel/core@7.24.5) + "@babel/types": 7.24.5 + + "@babel/template@7.22.15": + dependencies: + "@babel/code-frame": 7.24.2 + "@babel/parser": 7.24.5 + "@babel/types": 7.24.5 + + "@babel/template@7.24.0": + dependencies: + "@babel/code-frame": 7.24.2 + "@babel/parser": 7.24.5 + "@babel/types": 7.24.5 + + "@babel/traverse@7.24.5": + dependencies: + "@babel/code-frame": 7.24.2 + "@babel/generator": 7.24.5 + "@babel/helper-environment-visitor": 7.22.20 + "@babel/helper-function-name": 7.23.0 + "@babel/helper-hoist-variables": 7.22.5 + "@babel/helper-split-export-declaration": 7.24.5 + "@babel/parser": 7.24.5 + "@babel/types": 7.24.5 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + "@babel/types@7.24.5": + dependencies: + "@babel/helper-string-parser": 7.24.1 + "@babel/helper-validator-identifier": 7.24.5 + to-fast-properties: 2.0.0 + + "@csstools/cascade-layer-name-parser@1.0.11(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1)": + dependencies: + "@csstools/css-parser-algorithms": 2.6.3(@csstools/css-tokenizer@2.3.1) + "@csstools/css-tokenizer": 2.3.1 + + "@csstools/color-helpers@4.2.0": {} + + "@csstools/css-calc@1.2.2(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1)": + dependencies: + "@csstools/css-parser-algorithms": 2.6.3(@csstools/css-tokenizer@2.3.1) + "@csstools/css-tokenizer": 2.3.1 + + "@csstools/css-color-parser@2.0.2(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1)": + dependencies: + "@csstools/color-helpers": 4.2.0 + "@csstools/css-calc": 1.2.2(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1) + "@csstools/css-parser-algorithms": 2.6.3(@csstools/css-tokenizer@2.3.1) + "@csstools/css-tokenizer": 2.3.1 + + "@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1)": + dependencies: + "@csstools/css-tokenizer": 2.3.1 + + "@csstools/css-tokenizer@2.3.1": {} + + "@csstools/media-query-list-parser@2.1.11(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1)": + dependencies: + "@csstools/css-parser-algorithms": 2.6.3(@csstools/css-tokenizer@2.3.1) + "@csstools/css-tokenizer": 2.3.1 + + "@csstools/postcss-cascade-layers@4.0.6(postcss@8.4.33)": + dependencies: + "@csstools/selector-specificity": 3.1.1(postcss-selector-parser@6.0.16) + postcss: 8.4.33 + postcss-selector-parser: 6.0.16 + + "@csstools/postcss-color-function@3.0.16(postcss@8.4.33)": + dependencies: + "@csstools/css-color-parser": 2.0.2(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1) + "@csstools/css-parser-algorithms": 2.6.3(@csstools/css-tokenizer@2.3.1) + "@csstools/css-tokenizer": 2.3.1 + "@csstools/postcss-progressive-custom-properties": 3.2.0(postcss@8.4.33) + "@csstools/utilities": 1.0.0(postcss@8.4.33) + postcss: 8.4.33 + + "@csstools/postcss-color-mix-function@2.0.16(postcss@8.4.33)": + dependencies: + "@csstools/css-color-parser": 2.0.2(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1) + "@csstools/css-parser-algorithms": 2.6.3(@csstools/css-tokenizer@2.3.1) + "@csstools/css-tokenizer": 2.3.1 + "@csstools/postcss-progressive-custom-properties": 3.2.0(postcss@8.4.33) + "@csstools/utilities": 1.0.0(postcss@8.4.33) + postcss: 8.4.33 + + "@csstools/postcss-exponential-functions@1.0.7(postcss@8.4.33)": + dependencies: + "@csstools/css-calc": 1.2.2(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1) + "@csstools/css-parser-algorithms": 2.6.3(@csstools/css-tokenizer@2.3.1) + "@csstools/css-tokenizer": 2.3.1 + postcss: 8.4.33 + + "@csstools/postcss-font-format-keywords@3.0.2(postcss@8.4.33)": + dependencies: + "@csstools/utilities": 1.0.0(postcss@8.4.33) + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + + "@csstools/postcss-gamut-mapping@1.0.9(postcss@8.4.33)": + dependencies: + "@csstools/css-color-parser": 2.0.2(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1) + "@csstools/css-parser-algorithms": 2.6.3(@csstools/css-tokenizer@2.3.1) + "@csstools/css-tokenizer": 2.3.1 + postcss: 8.4.33 + + "@csstools/postcss-gradients-interpolation-method@4.0.17(postcss@8.4.33)": + dependencies: + "@csstools/css-color-parser": 2.0.2(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1) + "@csstools/css-parser-algorithms": 2.6.3(@csstools/css-tokenizer@2.3.1) + "@csstools/css-tokenizer": 2.3.1 + "@csstools/postcss-progressive-custom-properties": 3.2.0(postcss@8.4.33) + "@csstools/utilities": 1.0.0(postcss@8.4.33) + postcss: 8.4.33 + + "@csstools/postcss-hwb-function@3.0.15(postcss@8.4.33)": + dependencies: + "@csstools/css-color-parser": 2.0.2(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1) + "@csstools/css-parser-algorithms": 2.6.3(@csstools/css-tokenizer@2.3.1) + "@csstools/css-tokenizer": 2.3.1 + "@csstools/postcss-progressive-custom-properties": 3.2.0(postcss@8.4.33) + "@csstools/utilities": 1.0.0(postcss@8.4.33) + postcss: 8.4.33 + + "@csstools/postcss-ic-unit@3.0.6(postcss@8.4.33)": + dependencies: + "@csstools/postcss-progressive-custom-properties": 3.2.0(postcss@8.4.33) + "@csstools/utilities": 1.0.0(postcss@8.4.33) + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + + "@csstools/postcss-initial@1.0.1(postcss@8.4.33)": + dependencies: + postcss: 8.4.33 + + "@csstools/postcss-is-pseudo-class@4.0.8(postcss@8.4.33)": + dependencies: + "@csstools/selector-specificity": 3.1.1(postcss-selector-parser@6.0.16) + postcss: 8.4.33 + postcss-selector-parser: 6.0.16 + + "@csstools/postcss-light-dark-function@1.0.5(postcss@8.4.33)": + dependencies: + "@csstools/css-parser-algorithms": 2.6.3(@csstools/css-tokenizer@2.3.1) + "@csstools/css-tokenizer": 2.3.1 + "@csstools/postcss-progressive-custom-properties": 3.2.0(postcss@8.4.33) + "@csstools/utilities": 1.0.0(postcss@8.4.33) + postcss: 8.4.33 + + "@csstools/postcss-logical-float-and-clear@2.0.1(postcss@8.4.33)": + dependencies: + postcss: 8.4.33 + + "@csstools/postcss-logical-overflow@1.0.1(postcss@8.4.33)": + dependencies: + postcss: 8.4.33 + + "@csstools/postcss-logical-overscroll-behavior@1.0.1(postcss@8.4.33)": + dependencies: + postcss: 8.4.33 + + "@csstools/postcss-logical-resize@2.0.1(postcss@8.4.33)": + dependencies: + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + + "@csstools/postcss-logical-viewport-units@2.0.9(postcss@8.4.33)": + dependencies: + "@csstools/css-tokenizer": 2.3.1 + "@csstools/utilities": 1.0.0(postcss@8.4.33) + postcss: 8.4.33 + + "@csstools/postcss-media-minmax@1.1.6(postcss@8.4.33)": + dependencies: + "@csstools/css-calc": 1.2.2(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1) + "@csstools/css-parser-algorithms": 2.6.3(@csstools/css-tokenizer@2.3.1) + "@csstools/css-tokenizer": 2.3.1 + "@csstools/media-query-list-parser": 2.1.11(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1) + postcss: 8.4.33 + + "@csstools/postcss-media-queries-aspect-ratio-number-values@2.0.9(postcss@8.4.33)": + dependencies: + "@csstools/css-parser-algorithms": 2.6.3(@csstools/css-tokenizer@2.3.1) + "@csstools/css-tokenizer": 2.3.1 + "@csstools/media-query-list-parser": 2.1.11(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1) + postcss: 8.4.33 + + "@csstools/postcss-nested-calc@3.0.2(postcss@8.4.33)": + dependencies: + "@csstools/utilities": 1.0.0(postcss@8.4.33) + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + + "@csstools/postcss-normalize-display-values@3.0.2(postcss@8.4.33)": + dependencies: + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + + "@csstools/postcss-oklab-function@3.0.16(postcss@8.4.33)": + dependencies: + "@csstools/css-color-parser": 2.0.2(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1) + "@csstools/css-parser-algorithms": 2.6.3(@csstools/css-tokenizer@2.3.1) + "@csstools/css-tokenizer": 2.3.1 + "@csstools/postcss-progressive-custom-properties": 3.2.0(postcss@8.4.33) + "@csstools/utilities": 1.0.0(postcss@8.4.33) + postcss: 8.4.33 + + "@csstools/postcss-progressive-custom-properties@3.2.0(postcss@8.4.33)": + dependencies: + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + + "@csstools/postcss-relative-color-syntax@2.0.16(postcss@8.4.33)": + dependencies: + "@csstools/css-color-parser": 2.0.2(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1) + "@csstools/css-parser-algorithms": 2.6.3(@csstools/css-tokenizer@2.3.1) + "@csstools/css-tokenizer": 2.3.1 + "@csstools/postcss-progressive-custom-properties": 3.2.0(postcss@8.4.33) + "@csstools/utilities": 1.0.0(postcss@8.4.33) + postcss: 8.4.33 + + "@csstools/postcss-scope-pseudo-class@3.0.1(postcss@8.4.33)": + dependencies: + postcss: 8.4.33 + postcss-selector-parser: 6.0.16 + + "@csstools/postcss-stepped-value-functions@3.0.8(postcss@8.4.33)": + dependencies: + "@csstools/css-calc": 1.2.2(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1) + "@csstools/css-parser-algorithms": 2.6.3(@csstools/css-tokenizer@2.3.1) + "@csstools/css-tokenizer": 2.3.1 + postcss: 8.4.33 + + "@csstools/postcss-text-decoration-shorthand@3.0.6(postcss@8.4.33)": + dependencies: + "@csstools/color-helpers": 4.2.0 + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + + "@csstools/postcss-trigonometric-functions@3.0.8(postcss@8.4.33)": + dependencies: + "@csstools/css-calc": 1.2.2(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1) + "@csstools/css-parser-algorithms": 2.6.3(@csstools/css-tokenizer@2.3.1) + "@csstools/css-tokenizer": 2.3.1 + postcss: 8.4.33 + + "@csstools/postcss-unset-value@3.0.1(postcss@8.4.33)": + dependencies: + postcss: 8.4.33 + + "@csstools/selector-resolve-nested@1.1.0(postcss-selector-parser@6.0.16)": + dependencies: + postcss-selector-parser: 6.0.16 + + "@csstools/selector-specificity@3.1.1(postcss-selector-parser@6.0.16)": + dependencies: + postcss-selector-parser: 6.0.16 + + "@csstools/utilities@1.0.0(postcss@8.4.33)": + dependencies: + postcss: 8.4.33 + + "@ctrl/tinycolor@4.1.0": {} + + "@emmetio/abbreviation@2.3.3": + dependencies: + "@emmetio/scanner": 1.0.4 + + "@emmetio/css-abbreviation@2.1.8": + dependencies: + "@emmetio/scanner": 1.0.4 + + "@emmetio/css-parser@0.4.0": + dependencies: + "@emmetio/stream-reader": 2.2.0 + "@emmetio/stream-reader-utils": 0.1.0 + + "@emmetio/html-matcher@1.3.0": + dependencies: + "@emmetio/scanner": 1.0.4 + + "@emmetio/scanner@1.0.4": {} + + "@emmetio/stream-reader-utils@0.1.0": {} + + "@emmetio/stream-reader@2.2.0": {} + + "@emnapi/runtime@1.1.1": + dependencies: + tslib: 2.6.2 + optional: true + + "@esbuild/aix-ppc64@0.20.2": + optional: true + + "@esbuild/aix-ppc64@0.21.3": + optional: true + + "@esbuild/android-arm64@0.20.2": + optional: true + + "@esbuild/android-arm64@0.21.3": + optional: true + + "@esbuild/android-arm@0.20.2": + optional: true + + "@esbuild/android-arm@0.21.3": + optional: true + + "@esbuild/android-x64@0.20.2": + optional: true + + "@esbuild/android-x64@0.21.3": + optional: true + + "@esbuild/darwin-arm64@0.20.2": + optional: true + + "@esbuild/darwin-arm64@0.21.3": + optional: true + + "@esbuild/darwin-x64@0.20.2": + optional: true + + "@esbuild/darwin-x64@0.21.3": + optional: true + + "@esbuild/freebsd-arm64@0.20.2": + optional: true + + "@esbuild/freebsd-arm64@0.21.3": + optional: true + + "@esbuild/freebsd-x64@0.20.2": + optional: true + + "@esbuild/freebsd-x64@0.21.3": + optional: true + + "@esbuild/linux-arm64@0.20.2": + optional: true + + "@esbuild/linux-arm64@0.21.3": + optional: true + + "@esbuild/linux-arm@0.20.2": + optional: true + + "@esbuild/linux-arm@0.21.3": + optional: true + + "@esbuild/linux-ia32@0.20.2": + optional: true + + "@esbuild/linux-ia32@0.21.3": + optional: true + + "@esbuild/linux-loong64@0.20.2": + optional: true + + "@esbuild/linux-loong64@0.21.3": + optional: true + + "@esbuild/linux-mips64el@0.20.2": + optional: true + + "@esbuild/linux-mips64el@0.21.3": + optional: true + + "@esbuild/linux-ppc64@0.20.2": + optional: true + + "@esbuild/linux-ppc64@0.21.3": + optional: true + + "@esbuild/linux-riscv64@0.20.2": + optional: true + + "@esbuild/linux-riscv64@0.21.3": + optional: true + + "@esbuild/linux-s390x@0.20.2": + optional: true + + "@esbuild/linux-s390x@0.21.3": + optional: true + + "@esbuild/linux-x64@0.20.2": + optional: true + + "@esbuild/linux-x64@0.21.3": + optional: true + + "@esbuild/netbsd-x64@0.20.2": + optional: true + + "@esbuild/netbsd-x64@0.21.3": + optional: true + + "@esbuild/openbsd-x64@0.20.2": + optional: true + + "@esbuild/openbsd-x64@0.21.3": + optional: true + + "@esbuild/sunos-x64@0.20.2": + optional: true + + "@esbuild/sunos-x64@0.21.3": + optional: true + + "@esbuild/win32-arm64@0.20.2": + optional: true + + "@esbuild/win32-arm64@0.21.3": + optional: true + + "@esbuild/win32-ia32@0.20.2": + optional: true + + "@esbuild/win32-ia32@0.21.3": + optional: true + + "@esbuild/win32-x64@0.20.2": + optional: true + + "@esbuild/win32-x64@0.21.3": + optional: true + + "@expressive-code/core@0.35.3": + dependencies: + "@ctrl/tinycolor": 4.1.0 + hast-util-select: 6.0.2 + hast-util-to-html: 9.0.1 + hast-util-to-text: 4.0.2 + hastscript: 9.0.0 + postcss: 8.4.38 + postcss-nested: 6.0.1(postcss@8.4.38) + unist-util-visit: 5.0.0 + unist-util-visit-parents: 6.0.1 + + "@expressive-code/plugin-frames@0.35.3": + dependencies: + "@expressive-code/core": 0.35.3 + + "@expressive-code/plugin-shiki@0.35.3": + dependencies: + "@expressive-code/core": 0.35.3 + shiki: 1.5.2 + + "@expressive-code/plugin-text-markers@0.35.3": + dependencies: + "@expressive-code/core": 0.35.3 + + "@fontsource/inter@5.0.18": {} + + "@fontsource/rubik@5.0.20": {} + + "@img/sharp-darwin-arm64@0.33.4": + optionalDependencies: + "@img/sharp-libvips-darwin-arm64": 1.0.2 + optional: true + + "@img/sharp-darwin-x64@0.33.4": + optionalDependencies: + "@img/sharp-libvips-darwin-x64": 1.0.2 + optional: true + + "@img/sharp-libvips-darwin-arm64@1.0.2": + optional: true + + "@img/sharp-libvips-darwin-x64@1.0.2": + optional: true + + "@img/sharp-libvips-linux-arm64@1.0.2": + optional: true + + "@img/sharp-libvips-linux-arm@1.0.2": + optional: true + + "@img/sharp-libvips-linux-s390x@1.0.2": + optional: true + + "@img/sharp-libvips-linux-x64@1.0.2": + optional: true + + "@img/sharp-libvips-linuxmusl-arm64@1.0.2": + optional: true + + "@img/sharp-libvips-linuxmusl-x64@1.0.2": + optional: true + + "@img/sharp-linux-arm64@0.33.4": + optionalDependencies: + "@img/sharp-libvips-linux-arm64": 1.0.2 + optional: true + + "@img/sharp-linux-arm@0.33.4": + optionalDependencies: + "@img/sharp-libvips-linux-arm": 1.0.2 + optional: true + + "@img/sharp-linux-s390x@0.33.4": + optionalDependencies: + "@img/sharp-libvips-linux-s390x": 1.0.2 + optional: true + + "@img/sharp-linux-x64@0.33.4": + optionalDependencies: + "@img/sharp-libvips-linux-x64": 1.0.2 + optional: true + + "@img/sharp-linuxmusl-arm64@0.33.4": + optionalDependencies: + "@img/sharp-libvips-linuxmusl-arm64": 1.0.2 + optional: true + + "@img/sharp-linuxmusl-x64@0.33.4": + optionalDependencies: + "@img/sharp-libvips-linuxmusl-x64": 1.0.2 + optional: true + + "@img/sharp-wasm32@0.33.4": + dependencies: + "@emnapi/runtime": 1.1.1 + optional: true + + "@img/sharp-win32-ia32@0.33.4": + optional: true + + "@img/sharp-win32-x64@0.33.4": + optional: true + + "@johnsoncodehk/vscode-html-languageservice@5.2.0-34a5462": + dependencies: + "@vscode/l10n": 0.0.18 + vscode-languageserver-textdocument: 1.0.11 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.0.8 + + "@jridgewell/gen-mapping@0.3.3": + dependencies: + "@jridgewell/set-array": 1.1.2 + "@jridgewell/sourcemap-codec": 1.4.15 + "@jridgewell/trace-mapping": 0.3.20 + + "@jridgewell/gen-mapping@0.3.5": + dependencies: + "@jridgewell/set-array": 1.2.1 + "@jridgewell/sourcemap-codec": 1.4.15 + "@jridgewell/trace-mapping": 0.3.25 + + "@jridgewell/resolve-uri@3.1.1": {} + + "@jridgewell/set-array@1.1.2": {} + + "@jridgewell/set-array@1.2.1": {} + + "@jridgewell/sourcemap-codec@1.4.15": {} + + "@jridgewell/trace-mapping@0.3.20": + dependencies: + "@jridgewell/resolve-uri": 3.1.1 + "@jridgewell/sourcemap-codec": 1.4.15 + + "@jridgewell/trace-mapping@0.3.25": + dependencies: + "@jridgewell/resolve-uri": 3.1.1 + "@jridgewell/sourcemap-codec": 1.4.15 + + "@mdx-js/mdx@3.0.0": + dependencies: + "@types/estree": 1.0.5 + "@types/estree-jsx": 1.0.3 + "@types/hast": 3.0.3 + "@types/mdx": 2.0.10 + collapse-white-space: 2.1.0 + devlop: 1.1.0 + estree-util-build-jsx: 3.0.1 + estree-util-is-identifier-name: 3.0.0 + estree-util-to-js: 2.0.0 + estree-walker: 3.0.3 + hast-util-to-estree: 3.1.0 + hast-util-to-jsx-runtime: 2.3.0 + markdown-extensions: 2.0.0 + periscopic: 3.1.0 + remark-mdx: 3.0.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.0 + source-map: 0.7.4 + unified: 11.0.4 + unist-util-position-from-estree: 2.0.0 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + transitivePeerDependencies: + - supports-color + + "@nodelib/fs.scandir@2.1.5": + dependencies: + "@nodelib/fs.stat": 2.0.5 + run-parallel: 1.2.0 + + "@nodelib/fs.stat@2.0.5": {} + + "@nodelib/fs.walk@1.2.8": + dependencies: + "@nodelib/fs.scandir": 2.1.5 + fastq: 1.15.0 + + "@pagefind/darwin-arm64@1.0.4": + optional: true + + "@pagefind/darwin-x64@1.0.4": + optional: true + + "@pagefind/default-ui@1.0.4": {} + + "@pagefind/linux-arm64@1.0.4": + optional: true + + "@pagefind/linux-x64@1.0.4": + optional: true + + "@pagefind/windows-x64@1.0.4": + optional: true + + "@rollup/rollup-android-arm-eabi@4.17.2": + optional: true + + "@rollup/rollup-android-arm64@4.17.2": + optional: true + + "@rollup/rollup-darwin-arm64@4.17.2": + optional: true + + "@rollup/rollup-darwin-x64@4.17.2": + optional: true + + "@rollup/rollup-linux-arm-gnueabihf@4.17.2": + optional: true + + "@rollup/rollup-linux-arm-musleabihf@4.17.2": + optional: true + + "@rollup/rollup-linux-arm64-gnu@4.17.2": + optional: true + + "@rollup/rollup-linux-arm64-musl@4.17.2": + optional: true + + "@rollup/rollup-linux-powerpc64le-gnu@4.17.2": + optional: true + + "@rollup/rollup-linux-riscv64-gnu@4.17.2": + optional: true + + "@rollup/rollup-linux-s390x-gnu@4.17.2": + optional: true + + "@rollup/rollup-linux-x64-gnu@4.17.2": + optional: true + + "@rollup/rollup-linux-x64-musl@4.17.2": + optional: true + + "@rollup/rollup-win32-arm64-msvc@4.17.2": + optional: true + + "@rollup/rollup-win32-ia32-msvc@4.17.2": + optional: true + + "@rollup/rollup-win32-x64-msvc@4.17.2": + optional: true + + "@shikijs/core@1.5.2": {} + + "@trysound/sax@0.2.0": {} + + "@types/acorn@4.0.6": + dependencies: + "@types/estree": 1.0.5 + + "@types/babel__core@7.20.5": + dependencies: + "@babel/parser": 7.24.5 + "@babel/types": 7.24.5 + "@types/babel__generator": 7.6.7 + "@types/babel__template": 7.4.4 + "@types/babel__traverse": 7.20.4 + + "@types/babel__generator@7.6.7": + dependencies: + "@babel/types": 7.24.5 + + "@types/babel__template@7.4.4": + dependencies: + "@babel/parser": 7.24.5 + "@babel/types": 7.24.5 + + "@types/babel__traverse@7.20.4": + dependencies: + "@babel/types": 7.24.5 + + "@types/cookie@0.6.0": {} + + "@types/debug@4.1.12": + dependencies: + "@types/ms": 0.7.34 + + "@types/estree-jsx@1.0.3": + dependencies: + "@types/estree": 1.0.5 + + "@types/estree@1.0.5": {} + + "@types/hast@3.0.3": + dependencies: + "@types/unist": 3.0.2 + + "@types/mdast@4.0.3": + dependencies: + "@types/unist": 3.0.2 + + "@types/mdx@2.0.10": {} + + "@types/ms@0.7.34": {} + + "@types/nlcst@1.0.4": + dependencies: + "@types/unist": 2.0.10 + + "@types/node@17.0.45": {} + + "@types/sax@1.2.7": + dependencies: + "@types/node": 17.0.45 + + "@types/unist@2.0.10": {} + + "@types/unist@3.0.2": {} + + "@ungap/structured-clone@1.2.0": {} + + "@volar/kit@2.2.4(typescript@5.4.5)": + dependencies: + "@volar/language-service": 2.2.4 + "@volar/typescript": 2.2.4 + typesafe-path: 0.2.2 + typescript: 5.4.5 + vscode-languageserver-textdocument: 1.0.11 + vscode-uri: 3.0.8 + + "@volar/language-core@2.2.4": + dependencies: + "@volar/source-map": 2.2.4 + + "@volar/language-server@2.2.4": + dependencies: + "@volar/language-core": 2.2.4 + "@volar/language-service": 2.2.4 + "@volar/snapshot-document": 2.2.4 + "@volar/typescript": 2.2.4 + "@vscode/l10n": 0.0.16 + path-browserify: 1.0.1 + request-light: 0.7.0 + vscode-languageserver: 9.0.1 + vscode-languageserver-protocol: 3.17.5 + vscode-languageserver-textdocument: 1.0.11 + vscode-uri: 3.0.8 + + "@volar/language-service@2.2.4": + dependencies: + "@volar/language-core": 2.2.4 + vscode-languageserver-protocol: 3.17.5 + vscode-languageserver-textdocument: 1.0.11 + vscode-uri: 3.0.8 + + "@volar/snapshot-document@2.2.4": + dependencies: + vscode-languageserver-protocol: 3.17.5 + vscode-languageserver-textdocument: 1.0.11 + + "@volar/source-map@2.2.4": + dependencies: + muggle-string: 0.4.1 + + "@volar/typescript@2.2.4": + dependencies: + "@volar/language-core": 2.2.4 + path-browserify: 1.0.1 + + "@vscode/emmet-helper@2.9.2": + dependencies: + emmet: 2.4.6 + jsonc-parser: 2.3.1 + vscode-languageserver-textdocument: 1.0.11 + vscode-languageserver-types: 3.17.5 + vscode-uri: 2.1.2 + + "@vscode/l10n@0.0.16": {} + + "@vscode/l10n@0.0.18": {} + + acorn-jsx@5.3.2(acorn@8.11.2): + dependencies: + acorn: 8.11.2 + + acorn@8.11.2: {} + + acorn@8.11.3: {} + + ansi-align@3.0.1: + dependencies: + string-width: 4.2.3 + + ansi-regex@5.0.1: {} + + ansi-regex@6.0.1: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + arg@5.0.2: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + aria-query@5.3.0: + dependencies: + dequal: 2.0.3 + + array-iterate@2.0.1: {} + + astring@1.8.6: {} + + astro-expressive-code@0.35.3(astro@4.8.6(typescript@5.4.5)): + dependencies: + astro: 4.8.6(typescript@5.4.5) + rehype-expressive-code: 0.35.3 + + astro@4.8.6(typescript@5.4.5): + dependencies: + "@astrojs/compiler": 2.8.0 + "@astrojs/internal-helpers": 0.4.0 + "@astrojs/markdown-remark": 5.1.0 + "@astrojs/telemetry": 3.1.0 + "@babel/core": 7.24.5 + "@babel/generator": 7.24.5 + "@babel/parser": 7.24.5 + "@babel/plugin-transform-react-jsx": 7.23.4(@babel/core@7.24.5) + "@babel/traverse": 7.24.5 + "@babel/types": 7.24.5 + "@types/babel__core": 7.20.5 + "@types/cookie": 0.6.0 + acorn: 8.11.3 + aria-query: 5.3.0 + axobject-query: 4.0.0 + boxen: 7.1.1 + chokidar: 3.6.0 + ci-info: 4.0.0 + clsx: 2.1.1 + common-ancestor-path: 1.0.1 + cookie: 0.6.0 + cssesc: 3.0.0 + debug: 4.3.4 + deterministic-object-hash: 2.0.2 + devalue: 5.0.0 + diff: 5.2.0 + dlv: 1.1.3 + dset: 3.1.3 + es-module-lexer: 1.5.2 + esbuild: 0.21.3 + estree-walker: 3.0.3 + execa: 8.0.1 + fast-glob: 3.3.2 + flattie: 1.1.1 + github-slugger: 2.0.0 + gray-matter: 4.0.3 + html-escaper: 3.0.3 + http-cache-semantics: 4.1.1 + js-yaml: 4.1.0 + kleur: 4.1.5 + magic-string: 0.30.10 + mrmime: 2.0.0 + ora: 8.0.1 + p-limit: 5.0.0 + p-queue: 8.0.1 + path-to-regexp: 6.2.2 + preferred-pm: 3.1.3 + prompts: 2.4.2 + rehype: 13.0.1 + resolve: 1.22.8 + semver: 7.6.2 + shiki: 1.5.2 + string-width: 7.1.0 + strip-ansi: 7.1.0 + tsconfck: 3.0.3(typescript@5.4.5) + unist-util-visit: 5.0.0 + vfile: 6.0.1 + vite: 5.2.11 + vitefu: 0.2.5(vite@5.2.11) + which-pm: 2.1.1 + yargs-parser: 21.1.1 + zod: 3.23.8 + zod-to-json-schema: 3.23.0(zod@3.23.8) + optionalDependencies: + sharp: 0.33.4 + transitivePeerDependencies: + - "@types/node" + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + - typescript + + autoprefixer@10.4.19(postcss@8.4.31): + dependencies: + browserslist: 4.23.0 + caniuse-lite: 1.0.30001620 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.31 + postcss-value-parser: 4.2.0 + + autoprefixer@10.4.19(postcss@8.4.33): + dependencies: + browserslist: 4.23.0 + caniuse-lite: 1.0.30001620 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + + axobject-query@4.0.0: + dependencies: + dequal: 2.0.3 + + bail@2.0.2: {} + + balanced-match@1.0.2: {} + + base-64@1.0.0: {} + + bcp-47-match@2.0.3: {} + + bcp-47@2.1.0: + dependencies: + is-alphabetical: 2.0.1 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + + binary-extensions@2.2.0: {} + + boolbase@1.0.0: {} + + boxen@7.1.1: + dependencies: + ansi-align: 3.0.1 + camelcase: 7.0.1 + chalk: 5.3.0 + cli-boxes: 3.0.0 + string-width: 5.1.2 + type-fest: 2.19.0 + widest-line: 4.0.1 + wrap-ansi: 8.1.0 + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + braces@3.0.2: + dependencies: + fill-range: 7.0.1 + + browserslist@4.23.0: + dependencies: + caniuse-lite: 1.0.30001620 + electron-to-chromium: 1.4.773 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.23.0) + + camelcase-css@2.0.1: {} + + camelcase@7.0.1: {} + + caniuse-api@3.0.0: + dependencies: + browserslist: 4.23.0 + caniuse-lite: 1.0.30001620 + lodash.memoize: 4.1.2 + lodash.uniq: 4.5.0 + + caniuse-lite@1.0.30001620: {} + + ccount@2.0.1: {} + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chalk@5.3.0: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + + chokidar@3.5.3: + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + ci-info@4.0.0: {} + + cli-boxes@3.0.0: {} + + cli-cursor@4.0.0: + dependencies: + restore-cursor: 4.0.0 + + cli-spinners@2.9.2: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clsx@2.1.1: {} + + collapse-white-space@2.1.0: {} + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + + colord@2.9.3: {} + + comma-separated-tokens@2.0.3: {} + + commander@4.1.1: {} + + commander@7.2.0: {} + + common-ancestor-path@1.0.1: {} + + concat-map@0.0.1: {} + + convert-source-map@2.0.0: {} + + cookie@0.6.0: {} + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-blank-pseudo@6.0.2(postcss@8.4.33): + dependencies: + postcss: 8.4.33 + postcss-selector-parser: 6.0.16 + + css-declaration-sorter@7.2.0(postcss@8.4.33): + dependencies: + postcss: 8.4.33 + + css-has-pseudo@6.0.5(postcss@8.4.33): + dependencies: + "@csstools/selector-specificity": 3.1.1(postcss-selector-parser@6.0.16) + postcss: 8.4.33 + postcss-selector-parser: 6.0.16 + postcss-value-parser: 4.2.0 + + css-prefers-color-scheme@9.0.1(postcss@8.4.33): + dependencies: + postcss: 8.4.33 + + css-select@5.1.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.1.0 + nth-check: 2.1.1 + + css-selector-parser@3.0.4: {} + + css-tree@2.2.1: + dependencies: + mdn-data: 2.0.28 + source-map-js: 1.2.0 + + css-tree@2.3.1: + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.2.0 + + css-what@6.1.0: {} + + cssdb@8.0.1: {} + + cssesc@3.0.0: {} + + cssnano-preset-default@7.0.1(postcss@8.4.33): + dependencies: + browserslist: 4.23.0 + css-declaration-sorter: 7.2.0(postcss@8.4.33) + cssnano-utils: 5.0.0(postcss@8.4.33) + postcss: 8.4.33 + postcss-calc: 10.0.0(postcss@8.4.33) + postcss-colormin: 7.0.0(postcss@8.4.33) + postcss-convert-values: 7.0.0(postcss@8.4.33) + postcss-discard-comments: 7.0.0(postcss@8.4.33) + postcss-discard-duplicates: 7.0.0(postcss@8.4.33) + postcss-discard-empty: 7.0.0(postcss@8.4.33) + postcss-discard-overridden: 7.0.0(postcss@8.4.33) + postcss-merge-longhand: 7.0.0(postcss@8.4.33) + postcss-merge-rules: 7.0.0(postcss@8.4.33) + postcss-minify-font-values: 7.0.0(postcss@8.4.33) + postcss-minify-gradients: 7.0.0(postcss@8.4.33) + postcss-minify-params: 7.0.0(postcss@8.4.33) + postcss-minify-selectors: 7.0.0(postcss@8.4.33) + postcss-normalize-charset: 7.0.0(postcss@8.4.33) + postcss-normalize-display-values: 7.0.0(postcss@8.4.33) + postcss-normalize-positions: 7.0.0(postcss@8.4.33) + postcss-normalize-repeat-style: 7.0.0(postcss@8.4.33) + postcss-normalize-string: 7.0.0(postcss@8.4.33) + postcss-normalize-timing-functions: 7.0.0(postcss@8.4.33) + postcss-normalize-unicode: 7.0.0(postcss@8.4.33) + postcss-normalize-url: 7.0.0(postcss@8.4.33) + postcss-normalize-whitespace: 7.0.0(postcss@8.4.33) + postcss-ordered-values: 7.0.0(postcss@8.4.33) + postcss-reduce-initial: 7.0.0(postcss@8.4.33) + postcss-reduce-transforms: 7.0.0(postcss@8.4.33) + postcss-svgo: 7.0.0(postcss@8.4.33) + postcss-unique-selectors: 7.0.0(postcss@8.4.33) + + cssnano-utils@5.0.0(postcss@8.4.33): + dependencies: + postcss: 8.4.33 + + cssnano@7.0.1(postcss@8.4.33): + dependencies: + cssnano-preset-default: 7.0.1(postcss@8.4.33) + lilconfig: 3.1.1 + postcss: 8.4.33 + + csso@5.0.5: + dependencies: + css-tree: 2.2.1 + + debug@4.3.4: + dependencies: + ms: 2.1.2 + + decode-named-character-reference@1.0.2: + dependencies: + character-entities: 2.0.2 + + dequal@2.0.3: {} + + detect-libc@2.0.3: {} + + deterministic-object-hash@2.0.2: + dependencies: + base-64: 1.0.0 + + devalue@5.0.0: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + didyoumean@1.2.2: {} + + diff@5.2.0: {} + + direction@2.0.1: {} + + dlv@1.1.3: {} + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.1.0: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + dset@3.1.3: {} + + eastasianwidth@0.2.0: {} + + electron-to-chromium@1.4.773: {} + + emmet@2.4.6: + dependencies: + "@emmetio/abbreviation": 2.3.3 + "@emmetio/css-abbreviation": 2.1.8 + + emoji-regex@10.3.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + entities@4.5.0: {} + + es-module-lexer@1.4.1: {} + + es-module-lexer@1.5.2: {} + + esbuild@0.20.2: + optionalDependencies: + "@esbuild/aix-ppc64": 0.20.2 + "@esbuild/android-arm": 0.20.2 + "@esbuild/android-arm64": 0.20.2 + "@esbuild/android-x64": 0.20.2 + "@esbuild/darwin-arm64": 0.20.2 + "@esbuild/darwin-x64": 0.20.2 + "@esbuild/freebsd-arm64": 0.20.2 + "@esbuild/freebsd-x64": 0.20.2 + "@esbuild/linux-arm": 0.20.2 + "@esbuild/linux-arm64": 0.20.2 + "@esbuild/linux-ia32": 0.20.2 + "@esbuild/linux-loong64": 0.20.2 + "@esbuild/linux-mips64el": 0.20.2 + "@esbuild/linux-ppc64": 0.20.2 + "@esbuild/linux-riscv64": 0.20.2 + "@esbuild/linux-s390x": 0.20.2 + "@esbuild/linux-x64": 0.20.2 + "@esbuild/netbsd-x64": 0.20.2 + "@esbuild/openbsd-x64": 0.20.2 + "@esbuild/sunos-x64": 0.20.2 + "@esbuild/win32-arm64": 0.20.2 + "@esbuild/win32-ia32": 0.20.2 + "@esbuild/win32-x64": 0.20.2 + + esbuild@0.21.3: + optionalDependencies: + "@esbuild/aix-ppc64": 0.21.3 + "@esbuild/android-arm": 0.21.3 + "@esbuild/android-arm64": 0.21.3 + "@esbuild/android-x64": 0.21.3 + "@esbuild/darwin-arm64": 0.21.3 + "@esbuild/darwin-x64": 0.21.3 + "@esbuild/freebsd-arm64": 0.21.3 + "@esbuild/freebsd-x64": 0.21.3 + "@esbuild/linux-arm": 0.21.3 + "@esbuild/linux-arm64": 0.21.3 + "@esbuild/linux-ia32": 0.21.3 + "@esbuild/linux-loong64": 0.21.3 + "@esbuild/linux-mips64el": 0.21.3 + "@esbuild/linux-ppc64": 0.21.3 + "@esbuild/linux-riscv64": 0.21.3 + "@esbuild/linux-s390x": 0.21.3 + "@esbuild/linux-x64": 0.21.3 + "@esbuild/netbsd-x64": 0.21.3 + "@esbuild/openbsd-x64": 0.21.3 + "@esbuild/sunos-x64": 0.21.3 + "@esbuild/win32-arm64": 0.21.3 + "@esbuild/win32-ia32": 0.21.3 + "@esbuild/win32-x64": 0.21.3 + + escalade@3.1.1: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@5.0.0: {} + + esprima@4.0.1: {} + + estree-util-attach-comments@3.0.0: + dependencies: + "@types/estree": 1.0.5 + + estree-util-build-jsx@3.0.1: + dependencies: + "@types/estree-jsx": 1.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-walker: 3.0.3 + + estree-util-is-identifier-name@3.0.0: {} + + estree-util-to-js@2.0.0: + dependencies: + "@types/estree-jsx": 1.0.3 + astring: 1.8.6 + source-map: 0.7.4 + + estree-util-visit@2.0.0: + dependencies: + "@types/estree-jsx": 1.0.3 + "@types/unist": 3.0.2 + + estree-walker@3.0.3: + dependencies: + "@types/estree": 1.0.5 + + eventemitter3@5.0.1: {} + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.1.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + expressive-code@0.35.3: + dependencies: + "@expressive-code/core": 0.35.3 + "@expressive-code/plugin-frames": 0.35.3 + "@expressive-code/plugin-shiki": 0.35.3 + "@expressive-code/plugin-text-markers": 0.35.3 + + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + + extend@3.0.2: {} + + fast-glob@3.3.2: + dependencies: + "@nodelib/fs.stat": 2.0.5 + "@nodelib/fs.walk": 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + + fastq@1.15.0: + dependencies: + reusify: 1.0.4 + + fill-range@7.0.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + find-yarn-workspace-root2@1.2.16: + dependencies: + micromatch: 4.0.5 + pkg-dir: 4.2.0 + + flattie@1.1.1: {} + + fraction.js@4.3.7: {} + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.2.0: {} + + get-stream@8.0.1: {} + + github-slugger@2.0.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@7.1.6: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@11.12.0: {} + + graceful-fs@4.2.11: {} + + gray-matter@4.0.3: + dependencies: + js-yaml: 3.14.1 + kind-of: 6.0.3 + section-matter: 1.0.0 + strip-bom-string: 1.0.0 + + has-flag@3.0.0: {} + + hasown@2.0.0: + dependencies: + function-bind: 1.1.2 + + hast-util-embedded@3.0.0: + dependencies: + "@types/hast": 3.0.3 + hast-util-is-element: 3.0.0 + + hast-util-from-html@2.0.1: + dependencies: + "@types/hast": 3.0.3 + devlop: 1.1.0 + hast-util-from-parse5: 8.0.1 + parse5: 7.1.2 + vfile: 6.0.1 + vfile-message: 4.0.2 + + hast-util-from-parse5@8.0.1: + dependencies: + "@types/hast": 3.0.3 + "@types/unist": 3.0.2 + devlop: 1.1.0 + hastscript: 8.0.0 + property-information: 6.4.0 + vfile: 6.0.1 + vfile-location: 5.0.2 + web-namespaces: 2.0.1 + + hast-util-has-property@3.0.0: + dependencies: + "@types/hast": 3.0.3 + + hast-util-is-body-ok-link@3.0.0: + dependencies: + "@types/hast": 3.0.3 + + hast-util-is-element@3.0.0: + dependencies: + "@types/hast": 3.0.3 + + hast-util-parse-selector@4.0.0: + dependencies: + "@types/hast": 3.0.3 + + hast-util-phrasing@3.0.1: + dependencies: + "@types/hast": 3.0.3 + hast-util-embedded: 3.0.0 + hast-util-has-property: 3.0.0 + hast-util-is-body-ok-link: 3.0.0 + hast-util-is-element: 3.0.0 + + hast-util-raw@9.0.1: + dependencies: + "@types/hast": 3.0.3 + "@types/unist": 3.0.2 + "@ungap/structured-clone": 1.2.0 + hast-util-from-parse5: 8.0.1 + hast-util-to-parse5: 8.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.0.2 + parse5: 7.1.2 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-select@6.0.2: + dependencies: + "@types/hast": 3.0.3 + "@types/unist": 3.0.2 + bcp-47-match: 2.0.3 + comma-separated-tokens: 2.0.3 + css-selector-parser: 3.0.4 + devlop: 1.1.0 + direction: 2.0.1 + hast-util-has-property: 3.0.0 + hast-util-to-string: 3.0.0 + hast-util-whitespace: 3.0.0 + not: 0.1.0 + nth-check: 2.1.1 + property-information: 6.4.0 + space-separated-tokens: 2.0.2 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + hast-util-to-estree@3.1.0: + dependencies: + "@types/estree": 1.0.5 + "@types/estree-jsx": 1.0.3 + "@types/hast": 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-attach-comments: 3.0.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.0 + mdast-util-mdx-jsx: 3.0.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 6.4.0 + space-separated-tokens: 2.0.2 + style-to-object: 0.4.4 + unist-util-position: 5.0.0 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + + hast-util-to-html@9.0.0: + dependencies: + "@types/hast": 3.0.3 + "@types/unist": 3.0.2 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-raw: 9.0.1 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.0.2 + property-information: 6.4.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.3 + zwitch: 2.0.4 + + hast-util-to-html@9.0.1: + dependencies: + "@types/hast": 3.0.3 + "@types/unist": 3.0.2 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-raw: 9.0.1 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.0.2 + property-information: 6.4.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.3 + zwitch: 2.0.4 + + hast-util-to-jsx-runtime@2.3.0: + dependencies: + "@types/estree": 1.0.5 + "@types/hast": 3.0.3 + "@types/unist": 3.0.2 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.0 + mdast-util-mdx-jsx: 3.0.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 6.4.0 + space-separated-tokens: 2.0.2 + style-to-object: 1.0.5 + unist-util-position: 5.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + hast-util-to-parse5@8.0.0: + dependencies: + "@types/hast": 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 6.4.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-string@3.0.0: + dependencies: + "@types/hast": 3.0.3 + + hast-util-to-text@4.0.2: + dependencies: + "@types/hast": 3.0.3 + "@types/unist": 3.0.2 + hast-util-is-element: 3.0.0 + unist-util-find-after: 5.0.0 + + hast-util-whitespace@3.0.0: + dependencies: + "@types/hast": 3.0.3 + + hastscript@8.0.0: + dependencies: + "@types/hast": 3.0.3 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 6.4.0 + space-separated-tokens: 2.0.2 + + hastscript@9.0.0: + dependencies: + "@types/hast": 3.0.3 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 6.4.0 + space-separated-tokens: 2.0.2 + + html-escaper@3.0.3: {} + + html-void-elements@3.0.0: {} + + html-whitespace-sensitive-tag-names@3.0.0: {} + + http-cache-semantics@4.1.1: {} + + human-signals@5.0.0: {} + + import-meta-resolve@4.0.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + inline-style-parser@0.1.1: {} + + inline-style-parser@0.2.2: {} + + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + + is-arrayish@0.3.2: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.2.0 + + is-buffer@2.0.5: {} + + is-core-module@2.13.1: + dependencies: + hasown: 2.0.0 + + is-decimal@2.0.1: {} + + is-docker@3.0.0: {} + + is-extendable@0.1.1: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-hexadecimal@2.0.1: {} + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-interactive@2.0.0: {} + + is-number@7.0.0: {} + + is-plain-obj@4.1.0: {} + + is-reference@3.0.2: + dependencies: + "@types/estree": 1.0.5 + + is-stream@3.0.0: {} + + is-unicode-supported@1.3.0: {} + + is-unicode-supported@2.0.0: {} + + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + + isexe@2.0.0: {} + + jiti@1.21.0: {} + + js-tokens@4.0.0: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsesc@2.5.2: {} + + json5@2.2.3: {} + + jsonc-parser@2.3.1: {} + + kind-of@6.0.3: {} + + kleur@3.0.3: {} + + kleur@4.1.5: {} + + lilconfig@2.1.0: {} + + lilconfig@3.0.0: {} + + lilconfig@3.1.1: {} + + lines-and-columns@1.2.4: {} + + load-yaml-file@0.2.0: + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.14.1 + pify: 4.0.1 + strip-bom: 3.0.0 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.memoize@4.1.2: {} + + lodash.uniq@4.5.0: {} + + log-symbols@6.0.0: + dependencies: + chalk: 5.3.0 + is-unicode-supported: 1.3.0 + + longest-streak@3.1.0: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + + magic-string@0.30.10: + dependencies: + "@jridgewell/sourcemap-codec": 1.4.15 + + markdown-extensions@2.0.0: {} + + markdown-table@3.0.3: {} + + mdast-util-definitions@6.0.0: + dependencies: + "@types/mdast": 4.0.3 + "@types/unist": 3.0.2 + unist-util-visit: 5.0.0 + + mdast-util-directive@3.0.0: + dependencies: + "@types/mdast": 4.0.3 + "@types/unist": 3.0.2 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + parse-entities: 4.0.1 + stringify-entities: 4.0.3 + unist-util-visit-parents: 6.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-find-and-replace@3.0.1: + dependencies: + "@types/mdast": 4.0.3 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + mdast-util-from-markdown@2.0.0: + dependencies: + "@types/mdast": 4.0.3 + "@types/unist": 3.0.2 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-decode-string: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.0: + dependencies: + "@types/mdast": 4.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.1 + micromark-util-character: 2.0.1 + + mdast-util-gfm-footnote@2.0.0: + dependencies: + "@types/mdast": 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + micromark-util-normalize-identifier: 2.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + "@types/mdast": 4.0.3 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + "@types/mdast": 4.0.3 + devlop: 1.1.0 + markdown-table: 3.0.3 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + "@types/mdast": 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.0 + mdast-util-gfm-autolink-literal: 2.0.0 + mdast-util-gfm-footnote: 2.0.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-expression@2.0.0: + dependencies: + "@types/estree-jsx": 1.0.3 + "@types/hast": 3.0.3 + "@types/mdast": 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@3.0.0: + dependencies: + "@types/estree-jsx": 1.0.3 + "@types/hast": 3.0.3 + "@types/mdast": 4.0.3 + "@types/unist": 3.0.2 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + parse-entities: 4.0.1 + stringify-entities: 4.0.3 + unist-util-remove-position: 5.0.0 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.0 + mdast-util-mdx-expression: 2.0.0 + mdast-util-mdx-jsx: 3.0.0 + mdast-util-mdxjs-esm: 2.0.1 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + "@types/estree-jsx": 1.0.3 + "@types/hast": 3.0.3 + "@types/mdast": 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.0.0: + dependencies: + "@types/mdast": 4.0.3 + unist-util-is: 6.0.0 + + mdast-util-to-hast@13.0.2: + dependencies: + "@types/hast": 3.0.3 + "@types/mdast": 4.0.3 + "@ungap/structured-clone": 1.2.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.0 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + + mdast-util-to-markdown@2.1.0: + dependencies: + "@types/mdast": 4.0.3 + "@types/unist": 3.0.2 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.0.0 + mdast-util-to-string: 4.0.0 + micromark-util-decode-string: 2.0.0 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + "@types/mdast": 4.0.3 + + mdn-data@2.0.28: {} + + mdn-data@2.0.30: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + micromark-core-commonmark@2.0.0: + dependencies: + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-factory-destination: 2.0.0 + micromark-factory-label: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-factory-title: 2.0.0 + micromark-factory-whitespace: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-html-tag-name: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-subtokenize: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-directive@3.0.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-factory-whitespace: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + parse-entities: 4.0.1 + + micromark-extension-gfm-autolink-literal@2.0.0: + dependencies: + micromark-util-character: 2.0.1 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-footnote@2.0.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-strikethrough@2.0.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-table@2.0.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.0 + + micromark-extension-gfm-task-list-item@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.0.0 + micromark-extension-gfm-footnote: 2.0.0 + micromark-extension-gfm-strikethrough: 2.0.0 + micromark-extension-gfm-table: 2.0.0 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.0.1 + micromark-util-combine-extensions: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-mdx-expression@3.0.0: + dependencies: + "@types/estree": 1.0.5 + devlop: 1.1.0 + micromark-factory-mdx-expression: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-mdx-jsx@3.0.0: + dependencies: + "@types/acorn": 4.0.6 + "@types/estree": 1.0.5 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + micromark-factory-mdx-expression: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + vfile-message: 4.0.2 + + micromark-extension-mdx-md@2.0.0: + dependencies: + micromark-util-types: 2.0.0 + + micromark-extension-mdxjs-esm@3.0.0: + dependencies: + "@types/estree": 1.0.5 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + + micromark-extension-mdxjs@3.0.0: + dependencies: + acorn: 8.11.2 + acorn-jsx: 5.3.2(acorn@8.11.2) + micromark-extension-mdx-expression: 3.0.0 + micromark-extension-mdx-jsx: 3.0.0 + micromark-extension-mdx-md: 2.0.0 + micromark-extension-mdxjs-esm: 3.0.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-destination@2.0.0: + dependencies: + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-label@2.0.0: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-mdx-expression@2.0.1: + dependencies: + "@types/estree": 1.0.5 + devlop: 1.1.0 + micromark-util-character: 2.0.1 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + + micromark-factory-space@2.0.0: + dependencies: + micromark-util-character: 2.0.1 + micromark-util-types: 2.0.0 + + micromark-factory-title@2.0.0: + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-whitespace@2.0.0: + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-character@2.0.1: + dependencies: + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-chunked@2.0.0: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-classify-character@2.0.0: + dependencies: + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-combine-extensions@2.0.0: + dependencies: + micromark-util-chunked: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-decode-numeric-character-reference@2.0.1: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-decode-string@2.0.0: + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-symbol: 2.0.0 + + micromark-util-encode@2.0.0: {} + + micromark-util-events-to-acorn@2.0.2: + dependencies: + "@types/acorn": 4.0.6 + "@types/estree": 1.0.5 + "@types/unist": 3.0.2 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + vfile-message: 4.0.2 + + micromark-util-html-tag-name@2.0.0: {} + + micromark-util-normalize-identifier@2.0.0: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-resolve-all@2.0.0: + dependencies: + micromark-util-types: 2.0.0 + + micromark-util-sanitize-uri@2.0.0: + dependencies: + micromark-util-character: 2.0.1 + micromark-util-encode: 2.0.0 + micromark-util-symbol: 2.0.0 + + micromark-util-subtokenize@2.0.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-symbol@2.0.0: {} + + micromark-util-types@2.0.0: {} + + micromark@4.0.0: + dependencies: + "@types/debug": 4.1.12 + debug: 4.3.4 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-chunked: 2.0.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-encode: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-subtokenize: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.5: + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + + mimic-fn@2.1.0: {} + + mimic-fn@4.0.0: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + mrmime@2.0.0: {} + + ms@2.1.2: {} + + muggle-string@0.4.1: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nanoid@3.3.7: {} + + nlcst-to-string@3.1.1: + dependencies: + "@types/nlcst": 1.0.4 + + node-releases@2.0.14: {} + + normalize-path@3.0.0: {} + + normalize-range@0.1.2: {} + + not@0.1.0: {} + + npm-run-path@5.1.0: + dependencies: + path-key: 4.0.0 + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + object-assign@4.1.1: {} + + object-hash@3.0.0: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + ora@8.0.1: + dependencies: + chalk: 5.3.0 + cli-cursor: 4.0.0 + cli-spinners: 2.9.2 + is-interactive: 2.0.0 + is-unicode-supported: 2.0.0 + log-symbols: 6.0.0 + stdin-discarder: 0.2.2 + string-width: 7.1.0 + strip-ansi: 7.1.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-limit@5.0.0: + dependencies: + yocto-queue: 1.0.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-queue@8.0.1: + dependencies: + eventemitter3: 5.0.1 + p-timeout: 6.1.2 + + p-timeout@6.1.2: {} + + p-try@2.2.0: {} + + pagefind@1.0.4: + optionalDependencies: + "@pagefind/darwin-arm64": 1.0.4 + "@pagefind/darwin-x64": 1.0.4 + "@pagefind/linux-arm64": 1.0.4 + "@pagefind/linux-x64": 1.0.4 + "@pagefind/windows-x64": 1.0.4 + + parse-entities@4.0.1: + dependencies: + "@types/unist": 2.0.10 + character-entities: 2.0.2 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.0.2 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + + parse-latin@5.0.1: + dependencies: + nlcst-to-string: 3.1.1 + unist-util-modify-children: 3.1.1 + unist-util-visit-children: 2.0.2 + + parse5@7.1.2: + dependencies: + entities: 4.5.0 + + path-browserify@1.0.1: {} + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-parse@1.0.7: {} + + path-to-regexp@6.2.2: {} + + periscopic@3.1.0: + dependencies: + "@types/estree": 1.0.5 + estree-walker: 3.0.3 + is-reference: 3.0.2 + + picocolors@1.0.0: {} + + picomatch@2.3.1: {} + + pify@2.3.0: {} + + pify@4.0.1: {} + + pirates@4.0.6: {} + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + + postcss-attribute-case-insensitive@6.0.3(postcss@8.4.33): + dependencies: + postcss: 8.4.33 + postcss-selector-parser: 6.0.16 + + postcss-calc@10.0.0(postcss@8.4.33): + dependencies: + postcss: 8.4.33 + postcss-selector-parser: 6.0.16 + postcss-value-parser: 4.2.0 + + postcss-clamp@4.1.0(postcss@8.4.33): + dependencies: + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + + postcss-color-functional-notation@6.0.11(postcss@8.4.33): + dependencies: + "@csstools/css-color-parser": 2.0.2(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1) + "@csstools/css-parser-algorithms": 2.6.3(@csstools/css-tokenizer@2.3.1) + "@csstools/css-tokenizer": 2.3.1 + "@csstools/postcss-progressive-custom-properties": 3.2.0(postcss@8.4.33) + "@csstools/utilities": 1.0.0(postcss@8.4.33) + postcss: 8.4.33 + + postcss-color-hex-alpha@9.0.4(postcss@8.4.33): + dependencies: + "@csstools/utilities": 1.0.0(postcss@8.4.33) + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + + postcss-color-rebeccapurple@9.0.3(postcss@8.4.33): + dependencies: + "@csstools/utilities": 1.0.0(postcss@8.4.33) + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + + postcss-colormin@7.0.0(postcss@8.4.33): + dependencies: + browserslist: 4.23.0 + caniuse-api: 3.0.0 + colord: 2.9.3 + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + + postcss-convert-values@7.0.0(postcss@8.4.33): + dependencies: + browserslist: 4.23.0 + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + + postcss-custom-media@10.0.6(postcss@8.4.33): + dependencies: + "@csstools/cascade-layer-name-parser": 1.0.11(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1) + "@csstools/css-parser-algorithms": 2.6.3(@csstools/css-tokenizer@2.3.1) + "@csstools/css-tokenizer": 2.3.1 + "@csstools/media-query-list-parser": 2.1.11(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1) + postcss: 8.4.33 + + postcss-custom-properties@13.3.10(postcss@8.4.33): + dependencies: + "@csstools/cascade-layer-name-parser": 1.0.11(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1) + "@csstools/css-parser-algorithms": 2.6.3(@csstools/css-tokenizer@2.3.1) + "@csstools/css-tokenizer": 2.3.1 + "@csstools/utilities": 1.0.0(postcss@8.4.33) + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + + postcss-custom-selectors@7.1.10(postcss@8.4.33): + dependencies: + "@csstools/cascade-layer-name-parser": 1.0.11(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1) + "@csstools/css-parser-algorithms": 2.6.3(@csstools/css-tokenizer@2.3.1) + "@csstools/css-tokenizer": 2.3.1 + postcss: 8.4.33 + postcss-selector-parser: 6.0.16 + + postcss-dir-pseudo-class@8.0.1(postcss@8.4.33): + dependencies: + postcss: 8.4.33 + postcss-selector-parser: 6.0.16 + + postcss-discard-comments@7.0.0(postcss@8.4.33): + dependencies: + postcss: 8.4.33 + + postcss-discard-duplicates@7.0.0(postcss@8.4.33): + dependencies: + postcss: 8.4.33 + + postcss-discard-empty@7.0.0(postcss@8.4.33): + dependencies: + postcss: 8.4.33 + + postcss-discard-overridden@7.0.0(postcss@8.4.33): + dependencies: + postcss: 8.4.33 + + postcss-double-position-gradients@5.0.6(postcss@8.4.33): + dependencies: + "@csstools/postcss-progressive-custom-properties": 3.2.0(postcss@8.4.33) + "@csstools/utilities": 1.0.0(postcss@8.4.33) + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + + postcss-focus-visible@9.0.1(postcss@8.4.33): + dependencies: + postcss: 8.4.33 + postcss-selector-parser: 6.0.16 + + postcss-focus-within@8.0.1(postcss@8.4.33): + dependencies: + postcss: 8.4.33 + postcss-selector-parser: 6.0.16 + + postcss-font-variant@5.0.0(postcss@8.4.33): + dependencies: + postcss: 8.4.33 + + postcss-gap-properties@5.0.1(postcss@8.4.33): + dependencies: + postcss: 8.4.33 + + postcss-image-set-function@6.0.3(postcss@8.4.33): + dependencies: + "@csstools/utilities": 1.0.0(postcss@8.4.33) + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + + postcss-import@15.1.0(postcss@8.4.33): + dependencies: + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.8 + + postcss-js@4.0.1(postcss@8.4.33): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.33 + + postcss-lab-function@6.0.16(postcss@8.4.33): + dependencies: + "@csstools/css-color-parser": 2.0.2(@csstools/css-parser-algorithms@2.6.3(@csstools/css-tokenizer@2.3.1))(@csstools/css-tokenizer@2.3.1) + "@csstools/css-parser-algorithms": 2.6.3(@csstools/css-tokenizer@2.3.1) + "@csstools/css-tokenizer": 2.3.1 + "@csstools/postcss-progressive-custom-properties": 3.2.0(postcss@8.4.33) + "@csstools/utilities": 1.0.0(postcss@8.4.33) + postcss: 8.4.33 + + postcss-load-config@4.0.2(postcss@8.4.31): + dependencies: + lilconfig: 3.0.0 + yaml: 2.3.4 + optionalDependencies: + postcss: 8.4.31 + + postcss-load-config@4.0.2(postcss@8.4.33): + dependencies: + lilconfig: 3.0.0 + yaml: 2.3.4 + optionalDependencies: + postcss: 8.4.33 + + postcss-logical@7.0.1(postcss@8.4.33): + dependencies: + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + + postcss-merge-longhand@7.0.0(postcss@8.4.33): + dependencies: + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + stylehacks: 7.0.0(postcss@8.4.33) + + postcss-merge-rules@7.0.0(postcss@8.4.33): + dependencies: + browserslist: 4.23.0 + caniuse-api: 3.0.0 + cssnano-utils: 5.0.0(postcss@8.4.33) + postcss: 8.4.33 + postcss-selector-parser: 6.0.16 + + postcss-minify-font-values@7.0.0(postcss@8.4.33): + dependencies: + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + + postcss-minify-gradients@7.0.0(postcss@8.4.33): + dependencies: + colord: 2.9.3 + cssnano-utils: 5.0.0(postcss@8.4.33) + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + + postcss-minify-params@7.0.0(postcss@8.4.33): + dependencies: + browserslist: 4.23.0 + cssnano-utils: 5.0.0(postcss@8.4.33) + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + + postcss-minify-selectors@7.0.0(postcss@8.4.33): + dependencies: + postcss: 8.4.33 + postcss-selector-parser: 6.0.16 + + postcss-nested@6.0.1(postcss@8.4.33): + dependencies: + postcss: 8.4.33 + postcss-selector-parser: 6.0.13 + + postcss-nested@6.0.1(postcss@8.4.38): + dependencies: + postcss: 8.4.38 + postcss-selector-parser: 6.0.13 + + postcss-nesting@12.1.4(postcss@8.4.33): + dependencies: + "@csstools/selector-resolve-nested": 1.1.0(postcss-selector-parser@6.0.16) + "@csstools/selector-specificity": 3.1.1(postcss-selector-parser@6.0.16) + postcss: 8.4.33 + postcss-selector-parser: 6.0.16 + + postcss-normalize-charset@7.0.0(postcss@8.4.33): + dependencies: + postcss: 8.4.33 + + postcss-normalize-display-values@7.0.0(postcss@8.4.33): + dependencies: + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + + postcss-normalize-positions@7.0.0(postcss@8.4.33): + dependencies: + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + + postcss-normalize-repeat-style@7.0.0(postcss@8.4.33): + dependencies: + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + + postcss-normalize-string@7.0.0(postcss@8.4.33): + dependencies: + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + + postcss-normalize-timing-functions@7.0.0(postcss@8.4.33): + dependencies: + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + + postcss-normalize-unicode@7.0.0(postcss@8.4.33): + dependencies: + browserslist: 4.23.0 + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + + postcss-normalize-url@7.0.0(postcss@8.4.33): + dependencies: + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + + postcss-normalize-whitespace@7.0.0(postcss@8.4.33): + dependencies: + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + + postcss-opacity-percentage@2.0.0(postcss@8.4.33): + dependencies: + postcss: 8.4.33 + + postcss-ordered-values@7.0.0(postcss@8.4.33): + dependencies: + cssnano-utils: 5.0.0(postcss@8.4.33) + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + + postcss-overflow-shorthand@5.0.1(postcss@8.4.33): + dependencies: + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + + postcss-page-break@3.0.4(postcss@8.4.33): + dependencies: + postcss: 8.4.33 + + postcss-place@9.0.1(postcss@8.4.33): + dependencies: + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + + postcss-preset-env@9.5.13(postcss@8.4.33): + dependencies: + "@csstools/postcss-cascade-layers": 4.0.6(postcss@8.4.33) + "@csstools/postcss-color-function": 3.0.16(postcss@8.4.33) + "@csstools/postcss-color-mix-function": 2.0.16(postcss@8.4.33) + "@csstools/postcss-exponential-functions": 1.0.7(postcss@8.4.33) + "@csstools/postcss-font-format-keywords": 3.0.2(postcss@8.4.33) + "@csstools/postcss-gamut-mapping": 1.0.9(postcss@8.4.33) + "@csstools/postcss-gradients-interpolation-method": 4.0.17(postcss@8.4.33) + "@csstools/postcss-hwb-function": 3.0.15(postcss@8.4.33) + "@csstools/postcss-ic-unit": 3.0.6(postcss@8.4.33) + "@csstools/postcss-initial": 1.0.1(postcss@8.4.33) + "@csstools/postcss-is-pseudo-class": 4.0.8(postcss@8.4.33) + "@csstools/postcss-light-dark-function": 1.0.5(postcss@8.4.33) + "@csstools/postcss-logical-float-and-clear": 2.0.1(postcss@8.4.33) + "@csstools/postcss-logical-overflow": 1.0.1(postcss@8.4.33) + "@csstools/postcss-logical-overscroll-behavior": 1.0.1(postcss@8.4.33) + "@csstools/postcss-logical-resize": 2.0.1(postcss@8.4.33) + "@csstools/postcss-logical-viewport-units": 2.0.9(postcss@8.4.33) + "@csstools/postcss-media-minmax": 1.1.6(postcss@8.4.33) + "@csstools/postcss-media-queries-aspect-ratio-number-values": 2.0.9(postcss@8.4.33) + "@csstools/postcss-nested-calc": 3.0.2(postcss@8.4.33) + "@csstools/postcss-normalize-display-values": 3.0.2(postcss@8.4.33) + "@csstools/postcss-oklab-function": 3.0.16(postcss@8.4.33) + "@csstools/postcss-progressive-custom-properties": 3.2.0(postcss@8.4.33) + "@csstools/postcss-relative-color-syntax": 2.0.16(postcss@8.4.33) + "@csstools/postcss-scope-pseudo-class": 3.0.1(postcss@8.4.33) + "@csstools/postcss-stepped-value-functions": 3.0.8(postcss@8.4.33) + "@csstools/postcss-text-decoration-shorthand": 3.0.6(postcss@8.4.33) + "@csstools/postcss-trigonometric-functions": 3.0.8(postcss@8.4.33) + "@csstools/postcss-unset-value": 3.0.1(postcss@8.4.33) + autoprefixer: 10.4.19(postcss@8.4.33) + browserslist: 4.23.0 + css-blank-pseudo: 6.0.2(postcss@8.4.33) + css-has-pseudo: 6.0.5(postcss@8.4.33) + css-prefers-color-scheme: 9.0.1(postcss@8.4.33) + cssdb: 8.0.1 + postcss: 8.4.33 + postcss-attribute-case-insensitive: 6.0.3(postcss@8.4.33) + postcss-clamp: 4.1.0(postcss@8.4.33) + postcss-color-functional-notation: 6.0.11(postcss@8.4.33) + postcss-color-hex-alpha: 9.0.4(postcss@8.4.33) + postcss-color-rebeccapurple: 9.0.3(postcss@8.4.33) + postcss-custom-media: 10.0.6(postcss@8.4.33) + postcss-custom-properties: 13.3.10(postcss@8.4.33) + postcss-custom-selectors: 7.1.10(postcss@8.4.33) + postcss-dir-pseudo-class: 8.0.1(postcss@8.4.33) + postcss-double-position-gradients: 5.0.6(postcss@8.4.33) + postcss-focus-visible: 9.0.1(postcss@8.4.33) + postcss-focus-within: 8.0.1(postcss@8.4.33) + postcss-font-variant: 5.0.0(postcss@8.4.33) + postcss-gap-properties: 5.0.1(postcss@8.4.33) + postcss-image-set-function: 6.0.3(postcss@8.4.33) + postcss-lab-function: 6.0.16(postcss@8.4.33) + postcss-logical: 7.0.1(postcss@8.4.33) + postcss-nesting: 12.1.4(postcss@8.4.33) + postcss-opacity-percentage: 2.0.0(postcss@8.4.33) + postcss-overflow-shorthand: 5.0.1(postcss@8.4.33) + postcss-page-break: 3.0.4(postcss@8.4.33) + postcss-place: 9.0.1(postcss@8.4.33) + postcss-pseudo-class-any-link: 9.0.2(postcss@8.4.33) + postcss-replace-overflow-wrap: 4.0.0(postcss@8.4.33) + postcss-selector-not: 7.0.2(postcss@8.4.33) + + postcss-pseudo-class-any-link@9.0.2(postcss@8.4.33): + dependencies: + postcss: 8.4.33 + postcss-selector-parser: 6.0.16 + + postcss-reduce-initial@7.0.0(postcss@8.4.33): + dependencies: + browserslist: 4.23.0 + caniuse-api: 3.0.0 + postcss: 8.4.33 + + postcss-reduce-transforms@7.0.0(postcss@8.4.33): + dependencies: + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + + postcss-replace-overflow-wrap@4.0.0(postcss@8.4.33): + dependencies: + postcss: 8.4.33 + + postcss-selector-not@7.0.2(postcss@8.4.33): + dependencies: + postcss: 8.4.33 + postcss-selector-parser: 6.0.16 + + postcss-selector-parser@6.0.13: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-selector-parser@6.0.16: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-svgo@7.0.0(postcss@8.4.33): + dependencies: + postcss: 8.4.33 + postcss-value-parser: 4.2.0 + svgo: 3.3.2 + + postcss-unique-selectors@7.0.0(postcss@8.4.33): + dependencies: + postcss: 8.4.33 + postcss-selector-parser: 6.0.16 + + postcss-value-parser@4.2.0: {} + + postcss@8.4.31: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + + postcss@8.4.33: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + + postcss@8.4.38: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.2.0 + + preferred-pm@3.1.3: + dependencies: + find-up: 5.0.0 + find-yarn-workspace-root2: 1.2.16 + path-exists: 4.0.0 + which-pm: 2.0.0 + + prismjs@1.29.0: {} + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + property-information@6.4.0: {} + + queue-microtask@1.2.3: {} + + read-cache@1.0.0: + dependencies: + pify: 2.3.0 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + rehype-expressive-code@0.35.3: + dependencies: + expressive-code: 0.35.3 + + rehype-format@5.0.0: + dependencies: + "@types/hast": 3.0.3 + hast-util-embedded: 3.0.0 + hast-util-is-element: 3.0.0 + hast-util-phrasing: 3.0.1 + hast-util-whitespace: 3.0.0 + html-whitespace-sensitive-tag-names: 3.0.0 + rehype-minify-whitespace: 6.0.0 + unist-util-visit-parents: 6.0.1 + + rehype-minify-whitespace@6.0.0: + dependencies: + "@types/hast": 3.0.3 + hast-util-embedded: 3.0.0 + hast-util-is-element: 3.0.0 + hast-util-whitespace: 3.0.0 + unist-util-is: 6.0.0 + + rehype-parse@9.0.0: + dependencies: + "@types/hast": 3.0.3 + hast-util-from-html: 2.0.1 + unified: 11.0.4 + + rehype-raw@7.0.0: + dependencies: + "@types/hast": 3.0.3 + hast-util-raw: 9.0.1 + vfile: 6.0.1 + + rehype-stringify@10.0.0: + dependencies: + "@types/hast": 3.0.3 + hast-util-to-html: 9.0.0 + unified: 11.0.4 + + rehype@13.0.1: + dependencies: + "@types/hast": 3.0.3 + rehype-parse: 9.0.0 + rehype-stringify: 10.0.0 + unified: 11.0.4 + + remark-directive@3.0.0: + dependencies: + "@types/mdast": 4.0.3 + mdast-util-directive: 3.0.0 + micromark-extension-directive: 3.0.0 + unified: 11.0.4 + transitivePeerDependencies: + - supports-color + + remark-gfm@4.0.0: + dependencies: + "@types/mdast": 4.0.3 + mdast-util-gfm: 3.0.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.4 + transitivePeerDependencies: + - supports-color + + remark-mdx@3.0.0: + dependencies: + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + "@types/mdast": 4.0.3 + mdast-util-from-markdown: 2.0.0 + micromark-util-types: 2.0.0 + unified: 11.0.4 + transitivePeerDependencies: + - supports-color + + remark-rehype@11.1.0: + dependencies: + "@types/hast": 3.0.3 + "@types/mdast": 4.0.3 + mdast-util-to-hast: 13.0.2 + unified: 11.0.4 + vfile: 6.0.1 + + remark-smartypants@2.0.0: + dependencies: + retext: 8.1.0 + retext-smartypants: 5.2.0 + unist-util-visit: 4.1.2 + + remark-stringify@11.0.0: + dependencies: + "@types/mdast": 4.0.3 + mdast-util-to-markdown: 2.1.0 + unified: 11.0.4 + + request-light@0.7.0: {} + + require-directory@2.1.1: {} + + resolve@1.22.8: + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + restore-cursor@4.0.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + retext-latin@3.1.0: + dependencies: + "@types/nlcst": 1.0.4 + parse-latin: 5.0.1 + unherit: 3.0.1 + unified: 10.1.2 + + retext-smartypants@5.2.0: + dependencies: + "@types/nlcst": 1.0.4 + nlcst-to-string: 3.1.1 + unified: 10.1.2 + unist-util-visit: 4.1.2 + + retext-stringify@3.1.0: + dependencies: + "@types/nlcst": 1.0.4 + nlcst-to-string: 3.1.1 + unified: 10.1.2 + + retext@8.1.0: + dependencies: + "@types/nlcst": 1.0.4 + retext-latin: 3.1.0 + retext-stringify: 3.1.0 + unified: 10.1.2 + + reusify@1.0.4: {} + + rollup@4.17.2: + dependencies: + "@types/estree": 1.0.5 + optionalDependencies: + "@rollup/rollup-android-arm-eabi": 4.17.2 + "@rollup/rollup-android-arm64": 4.17.2 + "@rollup/rollup-darwin-arm64": 4.17.2 + "@rollup/rollup-darwin-x64": 4.17.2 + "@rollup/rollup-linux-arm-gnueabihf": 4.17.2 + "@rollup/rollup-linux-arm-musleabihf": 4.17.2 + "@rollup/rollup-linux-arm64-gnu": 4.17.2 + "@rollup/rollup-linux-arm64-musl": 4.17.2 + "@rollup/rollup-linux-powerpc64le-gnu": 4.17.2 + "@rollup/rollup-linux-riscv64-gnu": 4.17.2 + "@rollup/rollup-linux-s390x-gnu": 4.17.2 + "@rollup/rollup-linux-x64-gnu": 4.17.2 + "@rollup/rollup-linux-x64-musl": 4.17.2 + "@rollup/rollup-win32-arm64-msvc": 4.17.2 + "@rollup/rollup-win32-ia32-msvc": 4.17.2 + "@rollup/rollup-win32-x64-msvc": 4.17.2 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + sax@1.3.0: {} + + section-matter@1.0.0: + dependencies: + extend-shallow: 2.0.1 + kind-of: 6.0.3 + + semver@6.3.1: {} + + semver@7.5.4: + dependencies: + lru-cache: 6.0.0 + + semver@7.6.2: {} + + sharp@0.33.4: + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + semver: 7.6.2 + optionalDependencies: + "@img/sharp-darwin-arm64": 0.33.4 + "@img/sharp-darwin-x64": 0.33.4 + "@img/sharp-libvips-darwin-arm64": 1.0.2 + "@img/sharp-libvips-darwin-x64": 1.0.2 + "@img/sharp-libvips-linux-arm": 1.0.2 + "@img/sharp-libvips-linux-arm64": 1.0.2 + "@img/sharp-libvips-linux-s390x": 1.0.2 + "@img/sharp-libvips-linux-x64": 1.0.2 + "@img/sharp-libvips-linuxmusl-arm64": 1.0.2 + "@img/sharp-libvips-linuxmusl-x64": 1.0.2 + "@img/sharp-linux-arm": 0.33.4 + "@img/sharp-linux-arm64": 0.33.4 + "@img/sharp-linux-s390x": 0.33.4 + "@img/sharp-linux-x64": 0.33.4 + "@img/sharp-linuxmusl-arm64": 0.33.4 + "@img/sharp-linuxmusl-x64": 0.33.4 + "@img/sharp-wasm32": 0.33.4 + "@img/sharp-win32-ia32": 0.33.4 + "@img/sharp-win32-x64": 0.33.4 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shiki@1.5.2: + dependencies: + "@shikijs/core": 1.5.2 + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + simple-swizzle@0.2.2: + dependencies: + is-arrayish: 0.3.2 + + sisteransi@1.0.5: {} + + sitemap@7.1.1: + dependencies: + "@types/node": 17.0.45 + "@types/sax": 1.2.7 + arg: 5.0.2 + sax: 1.3.0 + + source-map-js@1.0.2: {} + + source-map-js@1.2.0: {} + + source-map@0.7.4: {} + + space-separated-tokens@2.0.2: {} + + sprintf-js@1.0.3: {} + + stdin-discarder@0.2.2: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string-width@7.1.0: + dependencies: + emoji-regex: 10.3.0 + get-east-asian-width: 1.2.0 + strip-ansi: 7.1.0 + + stringify-entities@4.0.3: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.0.1 + + strip-bom-string@1.0.0: {} + + strip-bom@3.0.0: {} + + strip-final-newline@3.0.0: {} + + style-to-object@0.4.4: + dependencies: + inline-style-parser: 0.1.1 + + style-to-object@1.0.5: + dependencies: + inline-style-parser: 0.2.2 + + stylehacks@7.0.0(postcss@8.4.33): + dependencies: + browserslist: 4.23.0 + postcss: 8.4.33 + postcss-selector-parser: 6.0.16 + + sucrase@3.34.0: + dependencies: + "@jridgewell/gen-mapping": 0.3.3 + commander: 4.1.1 + glob: 7.1.6 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + svgo@3.3.2: + dependencies: + "@trysound/sax": 0.2.0 + commander: 7.2.0 + css-select: 5.1.0 + css-tree: 2.3.1 + css-what: 6.1.0 + csso: 5.0.5 + picocolors: 1.0.0 + + tailwindcss@3.4.3: + dependencies: + "@alloc/quick-lru": 5.2.0 + arg: 5.0.2 + chokidar: 3.5.3 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.2 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.0 + lilconfig: 2.1.0 + micromatch: 4.0.5 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.0 + postcss: 8.4.33 + postcss-import: 15.1.0(postcss@8.4.33) + postcss-js: 4.0.1(postcss@8.4.33) + postcss-load-config: 4.0.2(postcss@8.4.33) + postcss-nested: 6.0.1(postcss@8.4.33) + postcss-selector-parser: 6.0.13 + resolve: 1.22.8 + sucrase: 3.34.0 + transitivePeerDependencies: + - ts-node + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + to-fast-properties@2.0.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + trim-lines@3.0.1: {} + + trough@2.1.0: {} + + ts-interface-checker@0.1.13: {} + + tsconfck@3.0.3(typescript@5.4.5): + optionalDependencies: + typescript: 5.4.5 + + tslib@2.6.2: + optional: true + + type-fest@2.19.0: {} + + typesafe-path@0.2.2: {} + + typescript-auto-import-cache@0.3.2: + dependencies: + semver: 7.5.4 + + typescript@5.4.5: {} + + unherit@3.0.1: {} + + unified@10.1.2: + dependencies: + "@types/unist": 2.0.10 + bail: 2.0.2 + extend: 3.0.2 + is-buffer: 2.0.5 + is-plain-obj: 4.1.0 + trough: 2.1.0 + vfile: 5.3.7 + + unified@11.0.4: + dependencies: + "@types/unist": 3.0.2 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.1.0 + vfile: 6.0.1 + + unist-util-find-after@5.0.0: + dependencies: + "@types/unist": 3.0.2 + unist-util-is: 6.0.0 + + unist-util-is@5.2.1: + dependencies: + "@types/unist": 2.0.10 + + unist-util-is@6.0.0: + dependencies: + "@types/unist": 3.0.2 + + unist-util-modify-children@3.1.1: + dependencies: + "@types/unist": 2.0.10 + array-iterate: 2.0.1 + + unist-util-position-from-estree@2.0.0: + dependencies: + "@types/unist": 3.0.2 + + unist-util-position@5.0.0: + dependencies: + "@types/unist": 3.0.2 + + unist-util-remove-position@5.0.0: + dependencies: + "@types/unist": 3.0.2 + unist-util-visit: 5.0.0 + + unist-util-stringify-position@3.0.3: + dependencies: + "@types/unist": 2.0.10 + + unist-util-stringify-position@4.0.0: + dependencies: + "@types/unist": 3.0.2 + + unist-util-visit-children@2.0.2: + dependencies: + "@types/unist": 2.0.10 + + unist-util-visit-parents@5.1.3: + dependencies: + "@types/unist": 2.0.10 + unist-util-is: 5.2.1 + + unist-util-visit-parents@6.0.1: + dependencies: + "@types/unist": 3.0.2 + unist-util-is: 6.0.0 + + unist-util-visit@4.1.2: + dependencies: + "@types/unist": 2.0.10 + unist-util-is: 5.2.1 + unist-util-visit-parents: 5.1.3 + + unist-util-visit@5.0.0: + dependencies: + "@types/unist": 3.0.2 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + update-browserslist-db@1.0.13(browserslist@4.23.0): + dependencies: + browserslist: 4.23.0 + escalade: 3.1.1 + picocolors: 1.0.0 + + util-deprecate@1.0.2: {} + + vfile-location@5.0.2: + dependencies: + "@types/unist": 3.0.2 + vfile: 6.0.1 + + vfile-message@3.1.4: + dependencies: + "@types/unist": 2.0.10 + unist-util-stringify-position: 3.0.3 + + vfile-message@4.0.2: + dependencies: + "@types/unist": 3.0.2 + unist-util-stringify-position: 4.0.0 + + vfile@5.3.7: + dependencies: + "@types/unist": 2.0.10 + is-buffer: 2.0.5 + unist-util-stringify-position: 3.0.3 + vfile-message: 3.1.4 + + vfile@6.0.1: + dependencies: + "@types/unist": 3.0.2 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + + vite@5.2.11: + dependencies: + esbuild: 0.20.2 + postcss: 8.4.38 + rollup: 4.17.2 + optionalDependencies: + fsevents: 2.3.3 + + vitefu@0.2.5(vite@5.2.11): + optionalDependencies: + vite: 5.2.11 + + volar-service-css@0.0.45(@volar/language-service@2.2.4): + dependencies: + vscode-css-languageservice: 6.2.10 + vscode-languageserver-textdocument: 1.0.11 + vscode-uri: 3.0.8 + optionalDependencies: + "@volar/language-service": 2.2.4 + + volar-service-emmet@0.0.45(@volar/language-service@2.2.4): + dependencies: + "@emmetio/css-parser": 0.4.0 + "@emmetio/html-matcher": 1.3.0 + "@vscode/emmet-helper": 2.9.2 + optionalDependencies: + "@volar/language-service": 2.2.4 + + volar-service-html@0.0.45(@volar/language-service@2.2.4): + dependencies: + vscode-html-languageservice: "@johnsoncodehk/vscode-html-languageservice@5.2.0-34a5462" + vscode-languageserver-textdocument: 1.0.11 + vscode-uri: 3.0.8 + optionalDependencies: + "@volar/language-service": 2.2.4 + + volar-service-prettier@0.0.45(@volar/language-service@2.2.4): + dependencies: + vscode-uri: 3.0.8 + optionalDependencies: + "@volar/language-service": 2.2.4 + + volar-service-typescript-twoslash-queries@0.0.45(@volar/language-service@2.2.4): + optionalDependencies: + "@volar/language-service": 2.2.4 + + volar-service-typescript@0.0.45(@volar/language-service@2.2.4): + dependencies: + path-browserify: 1.0.1 + semver: 7.5.4 + typescript-auto-import-cache: 0.3.2 + vscode-languageserver-textdocument: 1.0.11 + vscode-nls: 5.2.0 + optionalDependencies: + "@volar/language-service": 2.2.4 + + vscode-css-languageservice@6.2.10: + dependencies: + "@vscode/l10n": 0.0.16 + vscode-languageserver-textdocument: 1.0.11 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.0.8 + + vscode-html-languageservice@5.2.0: + dependencies: + "@vscode/l10n": 0.0.18 + vscode-languageserver-textdocument: 1.0.11 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.0.8 + + vscode-jsonrpc@8.2.0: {} + + vscode-languageserver-protocol@3.17.5: + dependencies: + vscode-jsonrpc: 8.2.0 + vscode-languageserver-types: 3.17.5 + + vscode-languageserver-textdocument@1.0.11: {} + + vscode-languageserver-types@3.17.5: {} + + vscode-languageserver@9.0.1: + dependencies: + vscode-languageserver-protocol: 3.17.5 + + vscode-nls@5.2.0: {} + + vscode-uri@2.1.2: {} + + vscode-uri@3.0.8: {} + + web-namespaces@2.0.1: {} + + which-pm-runs@1.1.0: {} + + which-pm@2.0.0: + dependencies: + load-yaml-file: 0.2.0 + path-exists: 4.0.0 + + which-pm@2.1.1: + dependencies: + load-yaml-file: 0.2.0 + path-exists: 4.0.0 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + widest-line@4.0.1: + dependencies: + string-width: 5.1.2 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yallist@4.0.0: {} + + yaml@2.3.4: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yocto-queue@0.1.0: {} + + yocto-queue@1.0.0: {} + + zod-to-json-schema@3.23.0(zod@3.23.8): + dependencies: + zod: 3.23.8 + + zod@3.22.4: {} + + zod@3.23.8: {} + + zwitch@2.0.4: {} diff --git a/docs/postcss.config.cjs b/docs/postcss.config.cjs new file mode 100644 index 00000000..378d0c29 --- /dev/null +++ b/docs/postcss.config.cjs @@ -0,0 +1,10 @@ +module.exports = { + plugins: [ + require("autoprefixer"), + require("cssnano"), + require("postcss-preset-env")({ + stage: 3, + features: { "nesting-rules": false }, + }), + ], +}; diff --git a/docs/postcss.config.js b/docs/postcss.config.js deleted file mode 100644 index b9f6f4b1..00000000 --- a/docs/postcss.config.js +++ /dev/null @@ -1,5 +0,0 @@ -/* eslint-disable */ - -module.exports = { - plugins: [require("tailwindcss")], -}; diff --git a/docs/src/public/favicon.ico b/docs/public/favicon.ico similarity index 100% rename from docs/src/public/favicon.ico rename to docs/public/favicon.ico diff --git a/docs/src/.i18n-filter b/docs/src/.i18n-filter index 6e3dfc30..a3b1edb3 100644 --- a/docs/src/.i18n-filter +++ b/docs/src/.i18n-filter @@ -1,7 +1,13 @@ -public -contributing -getting-started -index.md -fr -pt-BR -nn-NO +assets +styles +env.d.ts +content/config.ts +content/docs/en +content/docs/ca +content/docs/de +content/docs/es +content/docs/fr +content/docs/nn-no +content/docs/pt-br +content/docs/sr-latn +content/docs/zh-hans diff --git a/docs/src/ar/getting-started/_category_.json b/docs/src/ar/getting-started/_category_.json deleted file mode 100644 index 877a378f..00000000 --- a/docs/src/ar/getting-started/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Getting Started", - "position": 2 -} diff --git a/docs/src/ar/index.md b/docs/src/ar/index.md deleted file mode 100644 index 7f012c6c..00000000 --- a/docs/src/ar/index.md +++ /dev/null @@ -1,300 +0,0 @@ ---- -sidebarDepth: 2 ---- - -# Welcome 👋 - -[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] - -Castopod is a free & open-source hosting platform made for podcasters who want -engage and interact with their audience. - -Castopod is easy to install and was built on top of -[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very -small footprint. - -
- Install -
- -## Features - -- 🌱  Free & open-source (AGPL v3 License) -- 🔐  Focused on data sovereignty: your content, audience, and analytics - belong to you, and you only -- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, - chapters, location, persons, soundbites, … -- 💬  Built-in social network: - - 🚀  Castopod is part of the Fediverse, a decentralized social network - - ❤️  Create posts, share, favourite, and comment on episodes -- 📈  Built-in analytics: - - ⚖️  GDPR / CCPA / LGPD compliant - - 🪙  Standard IABv2 audience measurement - - 🏡  On-premises analytics, no third party involved -- 📢  Built-in marketing tools: - - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) - - 📱  PWA: install as a standalone app - - 🎨  Customizable theme colors - - 🎬  Generate ready-to-share Video clips from episodes - - 🔉  Generate soundbites - - ▶️  Embeddable player, embed your episodes on any website -- 💸  Monetization: - - 🔗  Funding links - - 📲  listen-to-click ads - - 🤝  value4value / WebMonetization - - 💎  Premium podcasts -- 📡  Publish your episodes everywhere with RSS: - - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, - Google Podcasts, Deezer, Podcast Addict, Podfriend, … - - ⚡  Broadcast your episodes instantly with WebSub -- 📥  Podcast import: move your existing podcast into Castopod -- 📤  Move your podcast out of Castopod -- 🔀  Multi-tenant: host as many podcasts as you want -- 👥  Multi-user: add contributors and set roles -- 🌎  i18n support: translated in English, French, Polish, German, - Brazilian Portuguese & Spanish… with - [more to come](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. - -It is in fact one of the only media to have stayed this way for a long time. - -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. - -With podcasting becoming more widely used, some companies are trying to shift it -towards a more controlled and centralized 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. - -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. - -## Comparison with other solutions - -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 you. - -### 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 it. - -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. - -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. - -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 journey. - -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. - -Finally, depending on your needs, Wordpress and Castopod can even live side by -side as they share the same requirements! - -### 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 was initially built around music. And later on, as the project -evolved, the ability to host podcasts was introduced. - -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, …). - -So, you should probably use Funkwhale if you want to host your music, and use -Castopod if you want to host your podcasts. - -### Castopod vs other podcast hosts - -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! - -Each of these solutions differ from one another, you may compare with the -[list of features](#features). - -That being said, there are two main differences with other podcasting solutions: - -- 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 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. - -## Contributing - -Love Castopod and would like to help? Take a look at the following documentation -to get you started. - -### Code of conduct - -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 tolerated. - -### Contributing 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. - -## Contributors ✨ - -Thanks goes to these wonderful people -([emoji key](https://allcontributors.org/docs/en/emoji-key)): - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Ewen
Ewen

🌍 🤔 💻
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
KrzysztofDomanczyk
KrzysztofDomanczyk

💻
Guy Martin
Guy Martin

🐛 💻
- - - - - - -This project follows the -[all-contributors](https://github.com/all-contributors/all-contributors) -specification. Contributions of any kind welcome! - -## Contact - -You may reach us for help or ask any question you have on: - -- [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) - -Alternatively, you can follow us on social media platforms to get news about -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 - -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). - -
- Ad Aures Logo - NLnet Logo -
- -## License - -[GNU Affero General Public License v3.0](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 - -[release]: https://code.castopod.org/adaures/castopod/-/releases -[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md -[contributions]: https://code.castopod.org/adaures/castopod/-/issues -[semantic-release]: https://github.com/semantic-release/semantic-release -[discord]: https://castopod.org/discord -[stars]: https://github.com/ad-aures/castopod/stargazers -[crowdin]: https://translate.castopod.org/project/castopod diff --git a/docs/src/public/images/castopod-logo-inline.svg b/docs/src/assets/castopod-logo-inline.svg similarity index 100% rename from docs/src/public/images/castopod-logo-inline.svg rename to docs/src/assets/castopod-logo-inline.svg diff --git a/docs/src/public/images/open-graph.jpg b/docs/src/assets/images/open-graph.jpg similarity index 100% rename from docs/src/public/images/open-graph.jpg rename to docs/src/assets/images/open-graph.jpg diff --git a/docs/src/assets/images/sponsors/adaures.svg b/docs/src/assets/images/sponsors/adaures.svg new file mode 100644 index 00000000..aded8d98 --- /dev/null +++ b/docs/src/assets/images/sponsors/adaures.svg @@ -0,0 +1,7 @@ + + + \ No newline at end of file diff --git a/docs/src/assets/images/sponsors/nlnet.svg b/docs/src/assets/images/sponsors/nlnet.svg new file mode 100644 index 00000000..5fa21021 --- /dev/null +++ b/docs/src/assets/images/sponsors/nlnet.svg @@ -0,0 +1,7 @@ + + + \ No newline at end of file diff --git a/docs/src/br/getting-started/_category_.json b/docs/src/br/getting-started/_category_.json deleted file mode 100644 index 877a378f..00000000 --- a/docs/src/br/getting-started/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Getting Started", - "position": 2 -} diff --git a/docs/src/br/getting-started/auth.md b/docs/src/br/getting-started/auth.md deleted file mode 100644 index 851b3ebc..00000000 --- a/docs/src/br/getting-started/auth.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -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 - -### Rolloù an istañs - - - -| roll | 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 | -| Podkaster | General users of Castopod. | admin.access | - - - -### Aotreoù war an istañs - - - -| aotre | 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 | Gallout a ra enporzhiañ podkastoù. | -| fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | - - - -## 2. Per podcast roles and permissions - -### Per podcast roles - - - -| roll | description | permissions | -| ---------- | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Merour·ez | Has complete control of podcast #{id}. | \* | -| Embanner | Manages content and publications of podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| Aozer·ez | Manages content of podcast #{id} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Kouviad·ez | General contributor of the podcast #{id}. | view, episodes.view | - - - -### Per podcast permissions - - - -| aotre | 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}. | - - diff --git a/docs/src/br/index.md b/docs/src/br/index.md deleted file mode 100644 index 292aceac..00000000 --- a/docs/src/br/index.md +++ /dev/null @@ -1,300 +0,0 @@ ---- -sidebarDepth: 2 ---- - -# Donemat 👋 - -[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] - -Castopod is a free & open-source hosting platform made for podcasters who want -engage and interact with their audience. - -Castopod is easy to install and was built on top of -[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very -small footprint. - - - -## Perzhioù - -- 🌱  Free & open-source (AGPL v3 License) -- 🔐  Focused on data sovereignty: your content, audience, and analytics - belong to you, and you only -- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, - chapters, location, persons, soundbites, … -- 💬  Built-in social network: - - 🚀  Castopod is part of the Fediverse, a decentralized social network - - ❤️  Create posts, share, favourite, and comment on episodes -- 📈  Built-in analytics: - - ⚖️  GDPR / CCPA / LGPD compliant - - 🪙  Standard IABv2 audience measurement - - 🏡  On-premises analytics, no third party involved -- 📢  Built-in marketing tools: - - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) - - 📱  PWA: install as a standalone app - - 🎨  Customizable theme colors - - 🎬  Generate ready-to-share Video clips from episodes - - 🔉  Generate soundbites - - ▶️  Embeddable player, embed your episodes on any website -- 💸  Arc'hantaouiñ : - - 🔗  Funding links - - 📲  listen-to-click ads - - 🤝  value4value / WebMonetization - - 💎  Premium podcasts -- 📡  Publish your episodes everywhere with RSS: - - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, - Google Podcasts, Deezer, Podcast Addict, Podfriend, … - - ⚡  Broadcast your episodes instantly with WebSub -- 📥  Podcast import: move your existing podcast into Castopod -- 📤  Move your podcast out of Castopod -- 🔀  Multi-tenant: host as many podcasts as you want -- 👥  Multi-user: add contributors and set roles -- 🌎  i18n support: translated in English, French, Polish, German, - Brazilian Portuguese & Spanish… with - [more to come](https://translate.castopod.org)! - -## Perak Castopod ? - -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. - -It is in fact one of the only media to have stayed this way for a long time. - -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. - -With podcasting becoming more widely used, some companies are trying to shift it -towards a more controlled and centralized 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. - -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. - -## Comparison with other solutions - -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 you. - -### 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 it. - -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. - -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. - -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 journey. - -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. - -Finally, depending on your needs, Wordpress and Castopod can even live side by -side as they share the same requirements! - -### 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 was initially built around music. And later on, as the project -evolved, the ability to host podcasts was introduced. - -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, …). - -So, you should probably use Funkwhale if you want to host your music, and use -Castopod if you want to host your podcasts. - -### Castopod vs other podcast hosts - -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! - -Each of these solutions differ from one another, you may compare with the -[list of features](#features). - -That being said, there are two main differences with other podcasting solutions: - -- 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 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. - -## Contributing - -Love Castopod and would like to help? Take a look at the following documentation -to get you started. - -### Kod an dereadegezh - -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 tolerated. - -### Contributing 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. - -## Contributors ✨ - -Thanks goes to these wonderful people -([emoji key](https://allcontributors.org/docs/en/emoji-key)): - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Ewen
Ewen

🌍 🤔 💻
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
KrzysztofDomanczyk
KrzysztofDomanczyk

💻
Guy Martin
Guy Martin

🐛 💻
- - - - - - -This project follows the -[all-contributors](https://github.com/all-contributors/all-contributors) -specification. Contributions of any kind welcome! - -## Darempred - -You may reach us for help or ask any question you have on: - -- [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) - -Alternatively, you can follow us on social media platforms to get news about -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 - -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). - -
- Ad Aures Logo - NLnet Logo -
- -## Aotre - -[GNU Affero General Public License v3.0](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 - -[release]: https://code.castopod.org/adaures/castopod/-/releases -[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md -[contributions]: https://code.castopod.org/adaures/castopod/-/issues -[semantic-release]: https://github.com/semantic-release/semantic-release -[discord]: https://castopod.org/discord -[stars]: https://github.com/ad-aures/castopod/stargazers -[crowdin]: https://translate.castopod.org/project/castopod diff --git a/docs/src/ca/index.md b/docs/src/ca/index.md deleted file mode 100644 index 93640310..00000000 --- a/docs/src/ca/index.md +++ /dev/null @@ -1,302 +0,0 @@ ---- -sidebarDepth: 2 ---- - -# Benvinguts 👋 - -[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] - -Castopod és una plataforma d'allotjament gratuïta i de codi obert creada per a -podcasters que volen involucrar i interactuar amb el seu públic. - -Castopod és fàcil d'instal·lar i s'ha creat amb -[CodeIgniter4](https://codeigniter.com/), un marc PHP potent amb una empremta -molt petita. - - - -## Característiques - -- 🌱  Gratis i de codi obert (llicència AGPL v3) -- 🔐  Centrat en la sobirania de les dades: el vostre contingut, audiència - i estadístiques us pertanyen, i només a vosaltres -- 🪄  Funcions de podcasting 2.0: GUID, bloqueigos, transcripcions, - finançament, capítols, geo-localització, persones, fragments d'àudio, … -- 💬  Xarxa social integrada: - - 🚀  Castopod forma part de Fediverse, una xarxa social descentralitzada - - ❤️  Creeu publicacions, compartiu-les, afegiu-hi com a preferits i - comenteu episodis -- 📈  Estadístiques integrades: - - ⚖️  Complint amb GDPR / CCPA / LGPD - - 🪙  Mesura d'audiència segons l'estàndard IABv2 - - 🏡  Estadístiques locals, sense cap tercer implicat -- 📢  Eines de màrqueting integrades: - - ✅  Preparada per a SEO (metaetiquetes de gràfics oberts, JSON-LD, …) - - 📱  PWA: instal·lable pels oients com a aplicació autònoma - - 🎨  Colors del tema personalitzables - - 🎬  Genereu videoclips d'episodis preparats per compartir - - 🔉  Genera fragments d'àudio de cada episodi - - ▶️  Reproductor incrustable, per incrustar els episodis a qualsevol - lloc web -- 💸  Monetització: - - 🔗  Enllaços de finançament - - 📲  Anuncis per escoltar-fent-clic - - 🤝  Integració amb value4value i WebMonetization - - 💎  Premium podcasts -- 📡  Publiqueu els vostres episodis a tot arreu amb RSS: - - 📱  A tots els directoris i aplicacions: Podcast Index, Apple Podcasts, - Spotify, Google Podcasts, Deezer, Podcast Addict, Podfriend, … - - ⚡  Emeteu els vostres episodis a l'instant amb WebSub -- 📥  Importació de podcasts: moveu el vostre podcast existent a Castopod -- 📤  Traieu el vostre podcast fora de Castopod -- 🔀  Multi-podcast: allotgeu tants programes com vulgueu en un mateix lloc -- 👥  Multi-usuari: afegiu col·laboradors i definiu rols -- 🌎  Suport i18n: traduït a l'anglès, català, espanyol, xinès, francès, - polonès, alemany, portuguès brasiler ... i - [més per venir](https://translate.castopod.org)! - -## Motivació - -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. - -It is in fact one of the only media to have stayed this way for a long time. - -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. - -With podcasting becoming more widely used, some companies are trying to shift it -towards a more controlled and centralized 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. - -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. - -## Comparació amb altres solucions - -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 you. - -### 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 it. - -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. - -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. - -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 journey. - -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. - -Finally, depending on your needs, Wordpress and Castopod can even live side by -side as they share the same requirements! - -### 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 was initially built around music. And later on, as the project -evolved, the ability to host podcasts was introduced. - -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, …). - -So, you should probably use Funkwhale if you want to host your music, and use -Castopod if you want to host your podcasts. - -### Castopod vs altres plataformes de podcast - -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! - -Each of these solutions differ from one another, you may compare with the -[list of features](#features). - -That being said, there are two main differences with other podcasting solutions: - -- Castopod es pot auto-allotjar i és la única solució que us permet mantenir el - control total sobre el que produïu. A més, com que és de codi obert, fins i - tot podeu personalitzar-lo com vulgueu. - -- Castopod és l'única solució que actualment integra tant una xarxa social - descentralitzada amb ActivityPub com moltes de les funcions de podcasting 2.0, - amb l'esperança de salvar la bretxa entre les dues. - -## Col·laborar - -Love Castopod and would like to help? Take a look at the following documentation -to get you started. - -### Codi de conducta - -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 tolerated. - -### Guia de col·laboració - -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. - -## Col·laboradors ✨ - -Thanks goes to these wonderful people -([emoji key](https://allcontributors.org/docs/en/emoji-key)): - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Ewen
Ewen

🌍 🤔 💻
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
KrzysztofDomanczyk
KrzysztofDomanczyk

💻
Guy Martin
Guy Martin

🐛 💻
- - - - - - -This project follows the -[all-contributors](https://github.com/all-contributors/all-contributors) -specification. Contributions of any kind welcome! - -## Contacte - -You may reach us for help or ask any question you have on: - -- [Discord](https://castopod.org/discord) (per a la interacció directa amb - desenvolupadors i la comunitat) -- [Seguiment d'incidències](https://code.castopod.org/adaures/castopod/-/issues) - (per a sol·licituds de noves funcionalitats i informes d'errors) - -Alternatively, you can follow us on social media platforms to get news about -Castopod: - -- [podlibre.social](https://podlibre.social/@Castopod) (instància de Mastodon) -- [Twitter](https://twitter.com/castopod) -- [LinkedIn](https://linkedin.com/company/castopod) -- [Facebook](https://www.facebook.com/castopod) - -## Patrocinadors - -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). - -
- Ad Aures Logo - NLnet Logo -
- -## Llicència - -[GNU Affero General Public License v3.0](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 - -[release]: https://code.castopod.org/adaures/castopod/-/releases -[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md -[contributions]: https://code.castopod.org/adaures/castopod/-/issues -[semantic-release]: https://github.com/semantic-release/semantic-release -[discord]: https://castopod.org/discord -[stars]: https://github.com/ad-aures/castopod/stargazers -[crowdin]: https://translate.castopod.org/project/castopod diff --git a/docs/src/content/config.ts b/docs/src/content/config.ts new file mode 100644 index 00000000..f043fb40 --- /dev/null +++ b/docs/src/content/config.ts @@ -0,0 +1,7 @@ +import { defineCollection } from "astro:content"; +import { docsSchema, i18nSchema } from "@astrojs/starlight/schema"; + +export const collections = { + docs: defineCollection({ schema: docsSchema() }), + i18n: defineCollection({ type: "data", schema: i18nSchema() }), +}; diff --git a/docs/src/content/docs/ar/getting-started/auth.mdx b/docs/src/content/docs/ar/getting-started/auth.mdx new file mode 100644 index 00000000..9c6e5a6d --- /dev/null +++ b/docs/src/content/docs/ar/getting-started/auth.mdx @@ -0,0 +1,85 @@ +--- +title: Autenticação & Autorização +--- + +Castopod lida com autenticação e autorização usando `codeigniter/shield` +juntamente com regras personalizadas. Papéis e permissões são definidos em dois +níveis: + +1. [toda instância](#1-instance-wide-roles-and-permissions) +2. [por podcast](#2-per-podcast-roles-and-permissions) + +## Papéis e permissões para toda a instância + +### Cargos de instância + +{/* 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 */} + +### Permissões da instância + +{/* 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. Por funções de podcast e permissões + +### Por cargos de podcast + +{/* 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, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| 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 */} + +### Por permissões de podcast + +{/* 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 dashboards and analytics of podcast #\{id\}'s episodes. | +| episodes.create | Can create episodes for podcast #\{id\}. | +| episodes.edit | Can edit episodes of podcast #\{id\}. | +| episodes.delete | Can delete episodes of podcast #\{id\}. | +| episodes.manage-persons | Can manage episode persons of podcast #\{id\}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #\{id\}. | +| episodes.manage-publications | Can publish/unpublish episodes and posts of podcast #\{id\}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #\{id\}. | + +{/* AUTH-PODCAST-PERMISSIONS-LIST:END */} diff --git a/docs/src/el/getting-started/docker.md b/docs/src/content/docs/ar/getting-started/docker.mdx similarity index 99% rename from docs/src/el/getting-started/docker.md rename to docs/src/content/docs/ar/getting-started/docker.mdx index 12f01619..6141377f 100644 --- a/docs/src/el/getting-started/docker.md +++ b/docs/src/content/docs/ar/getting-started/docker.mdx @@ -1,10 +1,7 @@ --- title: Official Docker images -sidebarDepth: 3 --- -# Official Docker images - Castopod pushes 3 Docker images to the Docker Hub during its automated build process: diff --git a/docs/src/sk/getting-started/install.md b/docs/src/content/docs/ar/getting-started/install.mdx similarity index 81% rename from docs/src/sk/getting-started/install.md rename to docs/src/content/docs/ar/getting-started/install.mdx index 6caca438..9471b0b3 100644 --- a/docs/src/sk/getting-started/install.md +++ b/docs/src/content/docs/ar/getting-started/install.mdx @@ -1,21 +1,20 @@ --- -title: Inštalácia -sidebarDepth: 3 +title: How to install Castopod? --- -# How to install Castopod? +import { Aside } from "@astrojs/starlight/components"; 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. -::: tip Note + ## Requirements @@ -46,14 +45,6 @@ Additionally, make sure that the following extensions are enabled in your PHP: > We recommend using [MariaDB](https://mariadb.org). -::: warning Warning - -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. - -::: - 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. @@ -115,13 +106,13 @@ want to generate Video Clips. The following extensions must be installed: 2. Follow the instructions on your screen. 3. Začať podcastovať! -::: info Note + ### Using CLI @@ -226,13 +217,35 @@ self-hosting for you. diff --git a/docs/src/sk/getting-started/security.md b/docs/src/content/docs/ar/getting-started/security.mdx similarity index 97% rename from docs/src/sk/getting-started/security.md rename to docs/src/content/docs/ar/getting-started/security.mdx index d752add8..c6e80167 100644 --- a/docs/src/sk/getting-started/security.md +++ b/docs/src/content/docs/ar/getting-started/security.mdx @@ -2,8 +2,6 @@ title: Zabezpečenie --- -# Security concerns - 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). diff --git a/docs/src/ar/getting-started/update.md b/docs/src/content/docs/ar/getting-started/update.mdx similarity index 96% rename from docs/src/ar/getting-started/update.md rename to docs/src/content/docs/ar/getting-started/update.mdx index 76668ae3..d91f98c4 100644 --- a/docs/src/ar/getting-started/update.md +++ b/docs/src/content/docs/ar/getting-started/update.mdx @@ -1,9 +1,8 @@ --- -title: Update -sidebarDepth: 3 +title: How to update Castopod? --- -# How to update Castopod? +import { Aside } from "@astrojs/starlight/components"; 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 @@ -36,12 +35,12 @@ improvements ⚡. - Remove all files except `.env` and `public/media` - Copy the new files from the downloaded package into your server - ::: info Note + 4. Update your database schema from your `Castopod Admin` > `About` page or by running: @@ -54,7 +53,7 @@ improvements ⚡. `Housekeeping` 6. ✨ Enjoy your fresh instance, you're all done! -::: info Note + ## Fully Automated updates diff --git a/docs/src/content/docs/ar/index.mdx b/docs/src/content/docs/ar/index.mdx new file mode 100644 index 00000000..6a2e5b5b --- /dev/null +++ b/docs/src/content/docs/ar/index.mdx @@ -0,0 +1,1381 @@ +--- +title: Donemat 👋 +--- + +import { LinkCard } from "@astrojs/starlight/components"; + +Castopod is a free & open-source hosting platform made for podcasters who want +engage and interact with their audience. + +Castopod is easy to install and was built on top of +[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very +small footprint. + + + +## Perzhioù + +- 🌱  Free & open-source (AGPL v3 License) +- 🔐  Focused on data sovereignty: your content, audience, and analytics + belong to you, and you only +- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, + chapters, location, persons, soundbites, … +- 💬  Built-in social network: + - 🚀  Castopod is part of the Fediverse, a decentralized social network + - ❤️  Create posts, share, favourite, and comment on episodes +- 📈  Built-in analytics: + - ⚖️  GDPR / CCPA / LGPD compliant + - 🪙  Standard IABv2 audience measurement + - 🏡  On-premises analytics, no third party involved +- 📢  Built-in marketing tools: + - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) + - 📱  PWA: install as a standalone app + - 🎨  Customizable theme colors + - 🎬  Generate ready-to-share Video clips from episodes + - 🔉  Generate soundbites + - ▶️  Embeddable player, embed your episodes on any website +- 💸  Arc'hantaouiñ : + - 🔗  Funding links + - 📲  listen-to-click ads + - 🤝  value4value / WebMonetization + - 💎  Premium podcasts +- 📡  Publish your episodes everywhere with RSS: + - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, + Google Podcasts, Deezer, Podcast Addict, Podfriend, … + - ⚡  Broadcast your episodes instantly with WebSub +- 📥  Podcast import: move your existing podcast into Castopod +- 📤  Move your podcast out of Castopod +- 🔀  Multi-tenant: host as many podcasts as you want +- 👥  Multi-user: add contributors and set roles +- 🌎  i18n support: translated in English, French, Polish, German, + Brazilian Portuguese & Spanish… with + [more to come](https://translate.castopod.org)! + +## Perak Castopod ? + +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. + +It is in fact one of the only media to have stayed this way for a long time. + +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. + +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized 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. + +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. + +## Comparison with other solutions + +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 you. + +### 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 it. + +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. + +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. + +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 journey. + +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. + +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! + +### 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 was initially built around music. And later on, as the project +evolved, the ability to host podcasts was introduced. + +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, …). + +So, you should probably use Funkwhale if you want to host your music, and use +Castopod if you want to host your podcasts. + +### Castopod vs other podcast hosts + +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! + +Each of these solutions differ from one another, you may compare with the +[list of features](#features). + +That being said, there are two main differences with other podcasting solutions: + +- 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 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. + +## Contributing + +Love Castopod and would like to help? Take a look at the following documentation +to get you started. + +### Kod an dereadegezh + +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 tolerated. + +### Contributing 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. + +## Contributors ✨ + +Thanks goes to these wonderful people +([emoji key](https://allcontributors.org/docs/en/emoji-key)): + +{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */} +{/* prettier-ignore-start */} +{/* markdownlint-disable */} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Yassine Doghri +
+ + Yassine Doghri + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 📖 + {" "} + + 👀 + {" "} + + 🚧 + {" "} + + 🖋 + {" "} + + 🎨 + {" "} + + ️️️️♿️ + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🧑‍🏫 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📆 + {" "} + + 📝 + +
+ + Benjamin Bellamy +
+ + Benjamin Bellamy + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 👀 + {" "} + + 🖋 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📝 + {" "} + + 📆 + {" "} + + 📢 + +
+ + Ola Hneini +
+ + Ola Hneini + +
+
+ + 💻 + {" "} + + 👀 + {" "} + + 📖 + {" "} + + 🚧 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Romain de Laage +
+ + Romain de Laage + +
+
+ + 💻 + {" "} + + 🚇 + {" "} + + 📖 + {" "} + + 🌍 + {" "} + + 🤔 + +
+ + Lyonel Bernard +
+ + Lyonel Bernard + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Christopher Lagonick-Weitzel +
+ + Christopher Lagonick-Weitzel + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Ernesto Acosta +
+ + Ernesto Acosta + +
+
+ + 🐛 + {" "} + + 🔊 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Ewen +
+ + Ewen + +
+
+ + 🌍 + {" "} + + 🤔 + {" "} + + 💻 + +
+ + Bastien Luneteau +
+ + Bastien Luneteau + +
+
+ + 💻 + {" "} + + 🐛 + +
+ + Cécile Ricordeau +
+ + Cécile Ricordeau + +
+
+ + 🎨 + +
+ + Patryk Miś +
+ + Patryk Miś + +
+
+ + 🌍 + +
+ + Marcin Lewandowski +
+ + Marcin Lewandowski + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Sebastian Janik +
+ + Sebastian Janik + +
+
+ + 💻 + +
+ + Patryk Karczmarczyk +
+ + Patryk Karczmarczyk + +
+
+ + 💻 + +
+ + denis d +
+ + denis d + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Douglas Kastle +
+ + Douglas Kastle + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + cExplorer +
+ + cExplorer + +
+
+ + 🐛 + {" "} + + 🌍 + +
+ + ImaCrea +
+ + ImaCrea + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Jonas S +
+ + Jonas S + +
+
+ + 💻 + +
+ + LEFEBVRE Yann +
+ + LEFEBVRE Yann + +
+
+ + 🐛 + +
+ + Sebastian Späth +
+ + Sebastian Späth + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + rocky III +
+ + rocky III + +
+
+ + 🐛 + +
+ + Hermann Josef Eckl +
+ + Hermann Josef Eckl + +
+
+ + 🐛 + +
+ + Delhaye Cyrille +
+ + Delhaye Cyrille + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + João Leandro +
+ + João Leandro + +
+
+ + 🌍 + {" "} + + 🤔 + +
+ + Angelos Chouvardas +
+ + Angelos Chouvardas + +
+
+ + 🌍 + +
+ + Eivind +
+ + Eivind + +
+
+ + 🌍 + +
+ + forght +
+ + forght + +
+
+ + 🌍 + +
+ + glottis0q +
+ + glottis0q + +
+
+ + 🌍 + +
+ + ButterflyOfFire +
+ + ButterflyOfFire + +
+
+ + 🌍 + +
+ + Lucian I. Last +
+ + Lucian I. Last + +
+
+ + 🌍 + +
+ + LuuzViir +
+ + LuuzViir + +
+
+ + 🌍 + +
+ + CTHTC +
+ + CTHTC + +
+
+ + 🌍 + +
+ + Russian Retro +
+ + Russian Retro + +
+
+ + 🌍 + +
+ + Marek L'ach +
+ + Marek L'ach + +
+
+ + 🌍 + +
+ + GunChleoc +
+ + GunChleoc + +
+
+ + 🌍 + +
+ + GabiSnow +
+ + GabiSnow + +
+
+ + 🌍 + +
+ + bendaha +
+ + bendaha + +
+
+ + 🌍 + +
+ + Samuel Roland +
+ + Samuel Roland + +
+
+ + 🌍 + +
+ + Dimitri Regnier +
+ + Dimitri Regnier + +
+
+ + 🤔 + +
+ + irithys +
+ + irithys + +
+
+ + 🌍 + +
+ + Sergi +
+ + Sergi + +
+
+ + 🌍 + +
+ + ghose (XoseM) +
+ + ghose (XoseM) + +
+
+ + 🌍 + +
+ + Andreas Olsson +
+ + Andreas Olsson + +
+
+ + 🌍 + +
+ + leonfrom +
+ + leonfrom + +
+
+ + 🌍 + +
+ + agentcobra +
+ + agentcobra + +
+
+ + 🌍 + +
+ + Alessandro +
+ + Alessandro + +
+
+ + 🌍 + +
+ + liimee +
+ + liimee + +
+
+ + 🌍 + +
+ + Ahmed Sabouni +
+ + Ahmed Sabouni + +
+
+ + 🌍 + +
+ + KrzysztofDomanczyk +
+ + KrzysztofDomanczyk + +
+
+ + 💻 + +
+ + Guy Martin +
+ + Guy Martin + +
+
+ + 🐛 + {" "} + + 💻 + +
+ +{/* markdownlint-restore */} +{/* prettier-ignore-end */} + +{/* ALL-CONTRIBUTORS-LIST:END */} + +This project follows the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind welcome! + +## Darempred + +You may reach us for help or ask any question you have on: + +- [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) + +Alternatively, you can follow us on social media platforms to get news about +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 + +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). + +[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/) + +[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/) + +## Aotre + +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) + +Copyright © 2020-present, [Ad Aures](https://adaures.com/). diff --git a/docs/src/content/docs/br/getting-started/auth.mdx b/docs/src/content/docs/br/getting-started/auth.mdx new file mode 100644 index 00000000..b51d2d1d --- /dev/null +++ b/docs/src/content/docs/br/getting-started/auth.mdx @@ -0,0 +1,84 @@ +--- +title: 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 | +| --------------- | ---------------------------------------- | ------------------------------------------------------------------------------------------ | +| Dreistmerour·ez | Ur c'hontroll klok en deus war Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Merour·ez | Merañ a ra endalc'had Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podkaster | Implijerien·ezed kustum 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 | Gallout a ra gwelet taolenn-stur Castopod. | +| admin.settings | Gallout a ra gwelet arventennoù Castopod. | +| users.manage | Gallout a ra ober war-dro implijerien·ezed Castopod. | +| persons.manage | Gallout a ra merañ an emellerien·ezed. | +| pages.manage | Gallout a ra merañ ar pajennoù. | +| podcasts.view | Gallout a ra gwelet an holl bodkastoù. | +| podcasts.create | Gallout a ra krouiñ podkastoù nevez. | +| podcasts.import | Gallout a ra enporzhiañ podkastoù. | +| fediverse.manage-blocks | Gallout a ra mirout aktourien·ezed pe domanioù ar Fediverse ouzh kaout darempredoù gant 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 | +| ---------- | ------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Merour·ez | Ur c'hontroll klok en deus war ar podkast #\{id\}. | \* | +| Embanner | Merañ a ra endalc'had hag embannadurioù ar podkast #\{id\}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Aozer·ez | Merañ a ra endalc'had ar podkast #\{id\} met ne c'hall ket embann anezho. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Kouviad·ez | Perzhiad·ez eus ar podkast #\{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 | Gallout a ra gwelet taolenn-stur ha muzulioù heklev ar podkast #\{id\}. | +| edit | Gallout a ra kemmañ ar podkast #\{id\}. | +| delete | Gallout a ra lemel ar podkast #\{id\}. | +| manage-import | Gallout a ra sinkronekaat ar podkast enporzhiet #\{id\}. | +| manage-persons | Gallout a ra merañ koumanantoù ar podkast #\{id\}. | +| manage-subscriptions | Gallout a ra merañ koumanantoù ar podkast #\{id\}. | +| manage-contributors | Gallout a ra merañ perzhidi ha perzhiadezed ar podkast #\{id\}. | +| manage-platforms | Gallout a ra ouzhpennañ pe lemel liammoù etrezek savennoù diavaez evit ar podkast #\{id\}. | +| manage-publications | Gallout a ra embann ar podkast #\{id\}. | +| manage-notifications | Gallout a ra gwelet kemennoù ar podkast #\{id\} ha lakaat anezho evel lennet. | +| interact-as | Gallout a ra ober traoù gant identelezh ar podkast #\{id\}: ouzhpennañ ur gemennadenn d'ar re garetañ, rannañ anezhi pe respont dezhi. | +| episodes.view | Gallout a ra gwelet taolennoù-stur ha muzulioù heklev rannoù ar podkast #\{id\}. | +| episodes.create | Gallout a ra krouiñ rannoù evit podkast #\{id\}. | +| episodes.edit | Gallout a ra kemmañ rannoù ar podkast #\{id\}. | +| episodes.delete | Gallout a ra lemel rannoù ar podkast #\{id\}. | +| episodes.manage-persons | Gallout a ra merañ emellerien·ezed ar podkast #\{id\}. | +| episodes.manage-clips | Gallout a ra merañ klipoù video pe tennadoù son ar podkast #\{id\}. | +| episodes.manage-publications | Gallout a ra embann pe diembann rannoù ha kemennadennoù ar podkast #\{id\}. | +| episodes.manage-comments | Gallout a ra krouiñ/lemel evezhiadennoù evit rannoù ar podkast #\{id\}. | + +{/* AUTH-PODCAST-PERMISSIONS-LIST:END */} diff --git a/docs/src/nl/getting-started/docker.md b/docs/src/content/docs/br/getting-started/docker.mdx similarity index 99% rename from docs/src/nl/getting-started/docker.md rename to docs/src/content/docs/br/getting-started/docker.mdx index eb9549d2..781a034a 100644 --- a/docs/src/nl/getting-started/docker.md +++ b/docs/src/content/docs/br/getting-started/docker.mdx @@ -1,10 +1,7 @@ --- title: Official Docker images -sidebarDepth: 3 --- -# Official Docker images - Castopod pushes 3 Docker images to the Docker Hub during its automated build process: diff --git a/docs/src/br/getting-started/install.md b/docs/src/content/docs/br/getting-started/install.mdx similarity index 81% rename from docs/src/br/getting-started/install.md rename to docs/src/content/docs/br/getting-started/install.mdx index 0825d93f..2d1f988a 100644 --- a/docs/src/br/getting-started/install.md +++ b/docs/src/content/docs/br/getting-started/install.mdx @@ -1,21 +1,20 @@ --- -title: Staliañ -sidebarDepth: 3 +title: Penaos staliañ Castopod? --- -# Penaos staliañ Castopod? +import { Aside } from "@astrojs/starlight/components"; 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. -::: tip Note + ## Requirements @@ -46,14 +45,6 @@ Additionally, make sure that the following extensions are enabled in your PHP: > We recommend using [MariaDB](https://mariadb.org). -::: warning Warning - -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. - -::: - 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. @@ -115,13 +106,13 @@ want to generate Video Clips. The following extensions must be installed: 2. Follow the instructions on your screen. 3. Kregiñ da bodkastiñ! -::: info Note + ### Using CLI @@ -226,13 +217,35 @@ self-hosting for you. diff --git a/docs/src/sr-Latn/getting-started/security.md b/docs/src/content/docs/br/getting-started/security.mdx similarity index 95% rename from docs/src/sr-Latn/getting-started/security.md rename to docs/src/content/docs/br/getting-started/security.mdx index d3f96a9d..180acd32 100644 --- a/docs/src/sr-Latn/getting-started/security.md +++ b/docs/src/content/docs/br/getting-started/security.mdx @@ -1,9 +1,7 @@ --- -title: Bezbednost +title: Bezbednosni interesi --- -# Bezbednosni interesi - Castopod je napravljen na [CodeIgniter4](https://codeigniter.com/), PHP okviru koji podstiče [dobre bezbednosne prakse](https://codeigniter.com/user_guide/concepts/security.html). diff --git a/docs/src/br/getting-started/update.md b/docs/src/content/docs/br/getting-started/update.mdx similarity index 96% rename from docs/src/br/getting-started/update.md rename to docs/src/content/docs/br/getting-started/update.mdx index 459a2304..c5f97f42 100644 --- a/docs/src/br/getting-started/update.md +++ b/docs/src/content/docs/br/getting-started/update.mdx @@ -1,9 +1,8 @@ --- -title: Update -sidebarDepth: 3 +title: How to update Castopod? --- -# How to update Castopod? +import { Aside } from "@astrojs/starlight/components"; 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 @@ -36,12 +35,12 @@ improvements ⚡. - Remove all files except `.env` and `public/media` - Copy the new files from the downloaded package into your server - ::: info Note + 4. Update your database schema from your `Castopod Admin` > `About` page or by running: @@ -54,7 +53,7 @@ improvements ⚡. `Housekeeping` 6. ✨ Enjoy your fresh instance, you're all done! -::: info Note + ## Fully Automated updates diff --git a/docs/src/content/docs/br/index.mdx b/docs/src/content/docs/br/index.mdx new file mode 100644 index 00000000..ea851240 --- /dev/null +++ b/docs/src/content/docs/br/index.mdx @@ -0,0 +1,1381 @@ +--- +title: Welcome 👋 +--- + +import { LinkCard } from "@astrojs/starlight/components"; + +Castopod is a free & open-source hosting platform made for podcasters who want +engage and interact with their audience. + +Castopod is easy to install and was built on top of +[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very +small footprint. + + + +## Features + +- 🌱  Free & open-source (AGPL v3 License) +- 🔐  Focused on data sovereignty: your content, audience, and analytics + belong to you, and you only +- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, + chapters, location, persons, soundbites, … +- 💬  Built-in social network: + - 🚀  Castopod is part of the Fediverse, a decentralized social network + - ❤️  Create posts, share, favourite, and comment on episodes +- 📈  Built-in analytics: + - ⚖️  GDPR / CCPA / LGPD compliant + - 🪙  Standard IABv2 audience measurement + - 🏡  On-premises analytics, no third party involved +- 📢  Built-in marketing tools: + - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) + - 📱  PWA: install as a standalone app + - 🎨  Customizable theme colors + - 🎬  Generate ready-to-share Video clips from episodes + - 🔉  Generate soundbites + - ▶️  Embeddable player, embed your episodes on any website +- 💸  Monetization: + - 🔗  Funding links + - 📲  listen-to-click ads + - 🤝  value4value / WebMonetization + - 💎  Premium podcasts +- 📡  Publish your episodes everywhere with RSS: + - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, + Google Podcasts, Deezer, Podcast Addict, Podfriend, … + - ⚡  Broadcast your episodes instantly with WebSub +- 📥  Podcast import: move your existing podcast into Castopod +- 📤  Move your podcast out of Castopod +- 🔀  Multi-tenant: host as many podcasts as you want +- 👥  Multi-user: add contributors and set roles +- 🌎  i18n support: translated in English, French, Polish, German, + Brazilian Portuguese & Spanish… with + [more to come](https://translate.castopod.org)! + +## Motivácia + +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. + +It is in fact one of the only media to have stayed this way for a long time. + +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. + +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized 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. + +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. + +## Comparison with other solutions + +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 you. + +### 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 it. + +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. + +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. + +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 journey. + +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. + +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! + +### 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 was initially built around music. And later on, as the project +evolved, the ability to host podcasts was introduced. + +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, …). + +So, you should probably use Funkwhale if you want to host your music, and use +Castopod if you want to host your podcasts. + +### Castopod vs other podcast hosts + +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! + +Each of these solutions differ from one another, you may compare with the +[list of features](#features). + +That being said, there are two main differences with other podcasting solutions: + +- 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 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. + +## Contributing + +Love Castopod and would like to help? Take a look at the following documentation +to get you started. + +### Code of conduct + +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 tolerated. + +### Contributing 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. + +## Contributors ✨ + +Thanks goes to these wonderful people +([emoji key](https://allcontributors.org/docs/en/emoji-key)): + +{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */} +{/* prettier-ignore-start */} +{/* markdownlint-disable */} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Yassine Doghri +
+ + Yassine Doghri + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 📖 + {" "} + + 👀 + {" "} + + 🚧 + {" "} + + 🖋 + {" "} + + 🎨 + {" "} + + ️️️️♿️ + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🧑‍🏫 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📆 + {" "} + + 📝 + +
+ + Benjamin Bellamy +
+ + Benjamin Bellamy + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 👀 + {" "} + + 🖋 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📝 + {" "} + + 📆 + {" "} + + 📢 + +
+ + Ola Hneini +
+ + Ola Hneini + +
+
+ + 💻 + {" "} + + 👀 + {" "} + + 📖 + {" "} + + 🚧 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Romain de Laage +
+ + Romain de Laage + +
+
+ + 💻 + {" "} + + 🚇 + {" "} + + 📖 + {" "} + + 🌍 + {" "} + + 🤔 + +
+ + Lyonel Bernard +
+ + Lyonel Bernard + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Christopher Lagonick-Weitzel +
+ + Christopher Lagonick-Weitzel + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Ernesto Acosta +
+ + Ernesto Acosta + +
+
+ + 🐛 + {" "} + + 🔊 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Ewen +
+ + Ewen + +
+
+ + 🌍 + {" "} + + 🤔 + {" "} + + 💻 + +
+ + Bastien Luneteau +
+ + Bastien Luneteau + +
+
+ + 💻 + {" "} + + 🐛 + +
+ + Cécile Ricordeau +
+ + Cécile Ricordeau + +
+
+ + 🎨 + +
+ + Patryk Miś +
+ + Patryk Miś + +
+
+ + 🌍 + +
+ + Marcin Lewandowski +
+ + Marcin Lewandowski + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Sebastian Janik +
+ + Sebastian Janik + +
+
+ + 💻 + +
+ + Patryk Karczmarczyk +
+ + Patryk Karczmarczyk + +
+
+ + 💻 + +
+ + denis d +
+ + denis d + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Douglas Kastle +
+ + Douglas Kastle + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + cExplorer +
+ + cExplorer + +
+
+ + 🐛 + {" "} + + 🌍 + +
+ + ImaCrea +
+ + ImaCrea + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Jonas S +
+ + Jonas S + +
+
+ + 💻 + +
+ + LEFEBVRE Yann +
+ + LEFEBVRE Yann + +
+
+ + 🐛 + +
+ + Sebastian Späth +
+ + Sebastian Späth + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + rocky III +
+ + rocky III + +
+
+ + 🐛 + +
+ + Hermann Josef Eckl +
+ + Hermann Josef Eckl + +
+
+ + 🐛 + +
+ + Delhaye Cyrille +
+ + Delhaye Cyrille + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + João Leandro +
+ + João Leandro + +
+
+ + 🌍 + {" "} + + 🤔 + +
+ + Angelos Chouvardas +
+ + Angelos Chouvardas + +
+
+ + 🌍 + +
+ + Eivind +
+ + Eivind + +
+
+ + 🌍 + +
+ + forght +
+ + forght + +
+
+ + 🌍 + +
+ + glottis0q +
+ + glottis0q + +
+
+ + 🌍 + +
+ + ButterflyOfFire +
+ + ButterflyOfFire + +
+
+ + 🌍 + +
+ + Lucian I. Last +
+ + Lucian I. Last + +
+
+ + 🌍 + +
+ + LuuzViir +
+ + LuuzViir + +
+
+ + 🌍 + +
+ + CTHTC +
+ + CTHTC + +
+
+ + 🌍 + +
+ + Russian Retro +
+ + Russian Retro + +
+
+ + 🌍 + +
+ + Marek L'ach +
+ + Marek L'ach + +
+
+ + 🌍 + +
+ + GunChleoc +
+ + GunChleoc + +
+
+ + 🌍 + +
+ + GabiSnow +
+ + GabiSnow + +
+
+ + 🌍 + +
+ + bendaha +
+ + bendaha + +
+
+ + 🌍 + +
+ + Samuel Roland +
+ + Samuel Roland + +
+
+ + 🌍 + +
+ + Dimitri Regnier +
+ + Dimitri Regnier + +
+
+ + 🤔 + +
+ + irithys +
+ + irithys + +
+
+ + 🌍 + +
+ + Sergi +
+ + Sergi + +
+
+ + 🌍 + +
+ + ghose (XoseM) +
+ + ghose (XoseM) + +
+
+ + 🌍 + +
+ + Andreas Olsson +
+ + Andreas Olsson + +
+
+ + 🌍 + +
+ + leonfrom +
+ + leonfrom + +
+
+ + 🌍 + +
+ + agentcobra +
+ + agentcobra + +
+
+ + 🌍 + +
+ + Alessandro +
+ + Alessandro + +
+
+ + 🌍 + +
+ + liimee +
+ + liimee + +
+
+ + 🌍 + +
+ + Ahmed Sabouni +
+ + Ahmed Sabouni + +
+
+ + 🌍 + +
+ + KrzysztofDomanczyk +
+ + KrzysztofDomanczyk + +
+
+ + 💻 + +
+ + Guy Martin +
+ + Guy Martin + +
+
+ + 🐛 + {" "} + + 💻 + +
+ +{/* markdownlint-restore */} +{/* prettier-ignore-end */} + +{/* ALL-CONTRIBUTORS-LIST:END */} + +This project follows the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind welcome! + +## Contact + +You may reach us for help or ask any question you have on: + +- [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) + +Alternatively, you can follow us on social media platforms to get news about +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 + +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). + +[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/) + +[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/) + +## License + +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) + +Copyright © 2020-present, [Ad Aures](https://adaures.com/). diff --git a/docs/src/content/docs/ca/getting-started/auth.mdx b/docs/src/content/docs/ca/getting-started/auth.mdx new file mode 100644 index 00000000..8a4e5e6e --- /dev/null +++ b/docs/src/content/docs/ca/getting-started/auth.mdx @@ -0,0 +1,84 @@ +--- +title: Autenticació i Autorització +--- + +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 administrador | Té control complet sobre Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Administrador | Administra el contingut de Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | Usos generals de 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 | Pot accedir a l'àrea d'administració de Castopod. | +| admin.settings | Pot accedir a la configuració de Castopod. | +| users.manage | Pot administrar els usuaris de Castopod. | +| persons.manage | Pot administrar persones. | +| pages.manage | Pot administrar pàgines. | +| podcasts.view | Pot veure els pòdcasts. | +| podcasts.create | Pot crear nous pòdcasts. | +| podcasts.import | Pot importar pòdcasts. | +| fediverse.manage-blocks | Pot evitar que actors/dominis del fedivers interactuen amb 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 | +| ------------- | -------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Administrador | Té control complet del pòdcast #\{id\}. | \* | +| Editor | Administra els continguts i la publicació del pòdcast #\{id\}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Autor | Administra el contingut del podcast #\{id\} però no el pot publicar. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Convidat | Col·laborador general del 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 | Pot veure el tauler i les estadístiques del podcast #\{id\}. | +| edit | Pot editar el podcast #\{id\}. | +| delete | Pot suprimir el podcast #\{id\}. | +| manage-import | Pot sincronitzar el podcast importat #\{id\}. | +| manage-persons | Pot gestionar les subscripcions del podcast #\{id\}. | +| manage-subscriptions | Pot gestionar les subscripcions del podcast #\{id\}. | +| manage-contributors | Pot gestionar els col·laboradors del podcast #\{id\}. | +| manage-platforms | Pot establir/eliminar enllaços de plataforma del podcast #\{id\}. | +| manage-publications | Pot publicar el podcast #\{id\}. | +| manage-notifications | Pot veure i marcar les notificacions com a llegides per al podcast #\{id\}. | +| interact-as | Pot interactuar en nom del podcast #\{id\} per marcar les publicacions com a preferides, compartir-les o respondre-hi. | +| episodes.view | Pot veure taulers i estadístiques dels episodis del podcast #\{id\}. | +| episodes.create | Pot crear episodis per al podcast #\{id\}. | +| episodes.edit | Pot editar episodis del podcast #\{id\}. | +| episodes.delete | Pot suprimir episodis del podcast #\{id\}. | +| episodes.manage-persons | Pot gestionar persones d'episodi del podcast #\{id\}. | +| episodes.manage-clips | Pot gestionar clips de vídeo o fragments de so del pòdcast #\{id\}. | +| episodes.manage-publications | Pot publicar/anul·lar la publicació d'episodis i publicacions del pòdcast #\{id\}. | +| episodes.manage-comments | Pot crear/eliminar comentaris d'episodi del pòdcast #\{id\}. | + +{/* AUTH-PODCAST-PERMISSIONS-LIST:END */} diff --git a/docs/src/ca/getting-started/docker.md b/docs/src/content/docs/ca/getting-started/docker.mdx similarity index 98% rename from docs/src/ca/getting-started/docker.md rename to docs/src/content/docs/ca/getting-started/docker.mdx index fe231b96..47da2436 100644 --- a/docs/src/ca/getting-started/docker.md +++ b/docs/src/content/docs/ca/getting-started/docker.mdx @@ -1,16 +1,13 @@ --- title: Imatges Docker oficials -sidebarDepth: 3 --- -# Imatges Docker oficials - Castopod pushes 3 Docker images to the Docker Hub during its automated build process: - [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all in one castopod image using nginx unit -- [** code>castopod/app**](https://hub.docker.com/r/castopod/app): el +- [**`castopod/app`**](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 diff --git a/docs/src/ca/getting-started/install.md b/docs/src/content/docs/ca/getting-started/install.mdx similarity index 81% rename from docs/src/ca/getting-started/install.md rename to docs/src/content/docs/ca/getting-started/install.mdx index c6dc8994..85eb926d 100644 --- a/docs/src/ca/getting-started/install.md +++ b/docs/src/content/docs/ca/getting-started/install.mdx @@ -1,22 +1,21 @@ --- -title: Instal·lació -sidebarDepth: 3 +title: Com instal·lar Castopod? --- -# Com instal·lar Castopod? +import { Aside } from "@astrojs/starlight/components"; Castopod va ser pensat per ser fàcil d'instal·lar. Ja sigui utilitzant un allotjament dedicat o un compartit, podeu instal·lar-lo a la majoria de servidors web compatibles amb PHP-MySQL. -::: tip Nota + ## Requisits @@ -48,14 +47,6 @@ PHP: > Us recomanem que utilitzeu [MariaDB](https://mariadb.org). -::: warning Avís - -Castopod només funciona amb bases de dades compatibles amb MySQL 5.7 o superior. -No funcionarà amb l'anterior MySQL v5.6, per exemple, ja que el seu final de -vida va ser el 5 de febrer de 2021. - -::: - Necessitareu el nom d'amfitrió del servidor (hostname), el nom de la base de dades, el nom d'usuari i la contrasenya per completar el procés d'instal·lació. Si no els teniu, poseu-vos en contacte amb l'administrador del vostre servidor. @@ -118,13 +109,13 @@ o superior. Cal instal·lar les següents extensions: 2. Seguiu les instruccions a la vostra pantalla. 3. Comenceu a fer podcasts! -::: info Nota + ### Using CLI @@ -229,13 +220,35 @@ self-hosting for you. diff --git a/docs/src/ca/getting-started/security.md b/docs/src/content/docs/ca/getting-started/security.mdx similarity index 95% rename from docs/src/ca/getting-started/security.md rename to docs/src/content/docs/ca/getting-started/security.mdx index 54caee00..75036e64 100644 --- a/docs/src/ca/getting-started/security.md +++ b/docs/src/content/docs/ca/getting-started/security.mdx @@ -1,9 +1,7 @@ --- -title: Seguretat +title: Detalls de seguretat --- -# Detalls de seguretat - Castopod està fet amb [CodeIgniter4](https://codeigniter.com/), un framework PHP que fomenta les [bones pràctiques de seguretat](https://codeigniter.com/user_guide/concepts/security.html). diff --git a/docs/src/ca/getting-started/update.md b/docs/src/content/docs/ca/getting-started/update.mdx similarity index 96% rename from docs/src/ca/getting-started/update.md rename to docs/src/content/docs/ca/getting-started/update.mdx index b6a4832a..d41ec18a 100644 --- a/docs/src/ca/getting-started/update.md +++ b/docs/src/content/docs/ca/getting-started/update.mdx @@ -1,9 +1,8 @@ --- -title: Actualitzar -sidebarDepth: 3 +title: Com actualitzar Castopod? --- -# Com actualitzar Castopod? +import { Aside } from "@astrojs/starlight/components"; Després d'instal·lar Castopod, és possible que vulgueu actualitzar la vostra instància a la darrera versió per gaudir de les últimes funcions ✨, correccions @@ -36,12 +35,12 @@ d'errors 🐛 i millores de rendiment ⚡. - Remove all files except `.env` and `public/media` - Copy the new files from the downloaded package into your server - ::: info Note + 4. Update your database schema from your `Castopod Admin` > `About` page or by running: @@ -54,7 +53,7 @@ d'errors 🐛 i millores de rendiment ⚡. `Housekeeping` 6. ✨ Enjoy your fresh instance, you're all done! -::: info Note + ## Fully Automated updates diff --git a/docs/src/content/docs/ca/index.mdx b/docs/src/content/docs/ca/index.mdx new file mode 100644 index 00000000..d58c33e8 --- /dev/null +++ b/docs/src/content/docs/ca/index.mdx @@ -0,0 +1,1383 @@ +--- +title: Benvinguts 👋 +--- + +import { LinkCard } from "@astrojs/starlight/components"; + +Castopod és una plataforma d'allotjament gratuïta i de codi obert creada per a +podcasters que volen involucrar i interactuar amb el seu públic. + +Castopod és fàcil d'instal·lar i s'ha creat amb +[CodeIgniter4](https://codeigniter.com/), un marc PHP potent amb una empremta +molt petita. + + + +## Característiques + +- 🌱  Gratis i de codi obert (llicència AGPL v3) +- 🔐  Centrat en la sobirania de les dades: el vostre contingut, audiència + i estadístiques us pertanyen, i només a vosaltres +- 🪄  Funcions de podcasting 2.0: GUID, bloqueigos, transcripcions, + finançament, capítols, geo-localització, persones, fragments d'àudio, … +- 💬  Xarxa social integrada: + - 🚀  Castopod forma part de Fediverse, una xarxa social descentralitzada + - ❤️  Creeu publicacions, compartiu-les, afegiu-hi com a preferits i + comenteu episodis +- 📈  Estadístiques integrades: + - ⚖️  Complint amb GDPR / CCPA / LGPD + - 🪙  Mesura d'audiència segons l'estàndard IABv2 + - 🏡  Estadístiques locals, sense cap tercer implicat +- 📢  Eines de màrqueting integrades: + - ✅  Preparada per a SEO (metaetiquetes de gràfics oberts, JSON-LD, …) + - 📱  PWA: instal·lable pels oients com a aplicació autònoma + - 🎨  Colors del tema personalitzables + - 🎬  Genereu videoclips d'episodis preparats per compartir + - 🔉  Genera fragments d'àudio de cada episodi + - ▶️  Reproductor incrustable, per incrustar els episodis a qualsevol + lloc web +- 💸  Monetització: + - 🔗  Enllaços de finançament + - 📲  Anuncis per escoltar-fent-clic + - 🤝  Integració amb value4value i WebMonetization + - 💎  Premium podcasts +- 📡  Publiqueu els vostres episodis a tot arreu amb RSS: + - 📱  A tots els directoris i aplicacions: Podcast Index, Apple Podcasts, + Spotify, Google Podcasts, Deezer, Podcast Addict, Podfriend, … + - ⚡  Emeteu els vostres episodis a l'instant amb WebSub +- 📥  Importació de podcasts: moveu el vostre podcast existent a Castopod +- 📤  Traieu el vostre podcast fora de Castopod +- 🔀  Multi-podcast: allotgeu tants programes com vulgueu en un mateix lloc +- 👥  Multi-usuari: afegiu col·laboradors i definiu rols +- 🌎  Suport i18n: traduït a l'anglès, català, espanyol, xinès, francès, + polonès, alemany, portuguès brasiler ... i + [més per venir](https://translate.castopod.org)! + +## Motivació + +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. + +It is in fact one of the only media to have stayed this way for a long time. + +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. + +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized 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. + +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. + +## Comparació amb altres solucions + +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 you. + +### 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 it. + +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. + +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. + +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 journey. + +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. + +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! + +### 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 was initially built around music. And later on, as the project +evolved, the ability to host podcasts was introduced. + +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, …). + +So, you should probably use Funkwhale if you want to host your music, and use +Castopod if you want to host your podcasts. + +### Castopod vs altres plataformes de podcast + +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! + +Each of these solutions differ from one another, you may compare with the +[list of features](#features). + +That being said, there are two main differences with other podcasting solutions: + +- Castopod es pot auto-allotjar i és la única solució que us permet mantenir el + control total sobre el que produïu. A més, com que és de codi obert, fins i + tot podeu personalitzar-lo com vulgueu. + +- Castopod és l'única solució que actualment integra tant una xarxa social + descentralitzada amb ActivityPub com moltes de les funcions de podcasting 2.0, + amb l'esperança de salvar la bretxa entre les dues. + +## Col·laborar + +Love Castopod and would like to help? Take a look at the following documentation +to get you started. + +### Codi de conducta + +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 tolerated. + +### Guia de col·laboració + +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. + +## Col·laboradors ✨ + +Thanks goes to these wonderful people +([emoji key](https://allcontributors.org/docs/en/emoji-key)): + +{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */} +{/* prettier-ignore-start */} +{/* markdownlint-disable */} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Yassine Doghri +
+ + Yassine Doghri + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 📖 + {" "} + + 👀 + {" "} + + 🚧 + {" "} + + 🖋 + {" "} + + 🎨 + {" "} + + ️️️️♿️ + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🧑‍🏫 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📆 + {" "} + + 📝 + +
+ + Benjamin Bellamy +
+ + Benjamin Bellamy + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 👀 + {" "} + + 🖋 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📝 + {" "} + + 📆 + {" "} + + 📢 + +
+ + Ola Hneini +
+ + Ola Hneini + +
+
+ + 💻 + {" "} + + 👀 + {" "} + + 📖 + {" "} + + 🚧 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Romain de Laage +
+ + Romain de Laage + +
+
+ + 💻 + {" "} + + 🚇 + {" "} + + 📖 + {" "} + + 🌍 + {" "} + + 🤔 + +
+ + Lyonel Bernard +
+ + Lyonel Bernard + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Christopher Lagonick-Weitzel +
+ + Christopher Lagonick-Weitzel + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Ernesto Acosta +
+ + Ernesto Acosta + +
+
+ + 🐛 + {" "} + + 🔊 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Ewen +
+ + Ewen + +
+
+ + 🌍 + {" "} + + 🤔 + {" "} + + 💻 + +
+ + Bastien Luneteau +
+ + Bastien Luneteau + +
+
+ + 💻 + {" "} + + 🐛 + +
+ + Cécile Ricordeau +
+ + Cécile Ricordeau + +
+
+ + 🎨 + +
+ + Patryk Miś +
+ + Patryk Miś + +
+
+ + 🌍 + +
+ + Marcin Lewandowski +
+ + Marcin Lewandowski + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Sebastian Janik +
+ + Sebastian Janik + +
+
+ + 💻 + +
+ + Patryk Karczmarczyk +
+ + Patryk Karczmarczyk + +
+
+ + 💻 + +
+ + denis d +
+ + denis d + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Douglas Kastle +
+ + Douglas Kastle + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + cExplorer +
+ + cExplorer + +
+
+ + 🐛 + {" "} + + 🌍 + +
+ + ImaCrea +
+ + ImaCrea + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Jonas S +
+ + Jonas S + +
+
+ + 💻 + +
+ + LEFEBVRE Yann +
+ + LEFEBVRE Yann + +
+
+ + 🐛 + +
+ + Sebastian Späth +
+ + Sebastian Späth + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + rocky III +
+ + rocky III + +
+
+ + 🐛 + +
+ + Hermann Josef Eckl +
+ + Hermann Josef Eckl + +
+
+ + 🐛 + +
+ + Delhaye Cyrille +
+ + Delhaye Cyrille + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + João Leandro +
+ + João Leandro + +
+
+ + 🌍 + {" "} + + 🤔 + +
+ + Angelos Chouvardas +
+ + Angelos Chouvardas + +
+
+ + 🌍 + +
+ + Eivind +
+ + Eivind + +
+
+ + 🌍 + +
+ + forght +
+ + forght + +
+
+ + 🌍 + +
+ + glottis0q +
+ + glottis0q + +
+
+ + 🌍 + +
+ + ButterflyOfFire +
+ + ButterflyOfFire + +
+
+ + 🌍 + +
+ + Lucian I. Last +
+ + Lucian I. Last + +
+
+ + 🌍 + +
+ + LuuzViir +
+ + LuuzViir + +
+
+ + 🌍 + +
+ + CTHTC +
+ + CTHTC + +
+
+ + 🌍 + +
+ + Russian Retro +
+ + Russian Retro + +
+
+ + 🌍 + +
+ + Marek L'ach +
+ + Marek L'ach + +
+
+ + 🌍 + +
+ + GunChleoc +
+ + GunChleoc + +
+
+ + 🌍 + +
+ + GabiSnow +
+ + GabiSnow + +
+
+ + 🌍 + +
+ + bendaha +
+ + bendaha + +
+
+ + 🌍 + +
+ + Samuel Roland +
+ + Samuel Roland + +
+
+ + 🌍 + +
+ + Dimitri Regnier +
+ + Dimitri Regnier + +
+
+ + 🤔 + +
+ + irithys +
+ + irithys + +
+
+ + 🌍 + +
+ + Sergi +
+ + Sergi + +
+
+ + 🌍 + +
+ + ghose (XoseM) +
+ + ghose (XoseM) + +
+
+ + 🌍 + +
+ + Andreas Olsson +
+ + Andreas Olsson + +
+
+ + 🌍 + +
+ + leonfrom +
+ + leonfrom + +
+
+ + 🌍 + +
+ + agentcobra +
+ + agentcobra + +
+
+ + 🌍 + +
+ + Alessandro +
+ + Alessandro + +
+
+ + 🌍 + +
+ + liimee +
+ + liimee + +
+
+ + 🌍 + +
+ + Ahmed Sabouni +
+ + Ahmed Sabouni + +
+
+ + 🌍 + +
+ + KrzysztofDomanczyk +
+ + KrzysztofDomanczyk + +
+
+ + 💻 + +
+ + Guy Martin +
+ + Guy Martin + +
+
+ + 🐛 + {" "} + + 💻 + +
+ +{/* markdownlint-restore */} +{/* prettier-ignore-end */} + +{/* ALL-CONTRIBUTORS-LIST:END */} + +This project follows the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind welcome! + +## Contacte + +You may reach us for help or ask any question you have on: + +- [Discord](https://castopod.org/discord) (per a la interacció directa amb + desenvolupadors i la comunitat) +- [Seguiment d'incidències](https://code.castopod.org/adaures/castopod/-/issues) + (per a sol·licituds de noves funcionalitats i informes d'errors) + +Alternatively, you can follow us on social media platforms to get news about +Castopod: + +- [podlibre.social](https://podlibre.social/@Castopod) (instància de Mastodon) +- [Twitter](https://twitter.com/castopod) +- [LinkedIn](https://linkedin.com/company/castopod) +- [Facebook](https://www.facebook.com/castopod) + +## Patrocinadors + +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). + +[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/) + +[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/) + +## Llicència + +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) + +Copyright © 2020-present, [Ad Aures](https://adaures.com/). diff --git a/docs/src/content/docs/da/getting-started/auth.mdx b/docs/src/content/docs/da/getting-started/auth.mdx new file mode 100644 index 00000000..70fecd1c --- /dev/null +++ b/docs/src/content/docs/da/getting-started/auth.mdx @@ -0,0 +1,84 @@ +--- +title: 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 + +### Rolloù an istañs + +{/* 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 */} + +### Aotreoù war an istañs + +{/* 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, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| 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 dashboards and analytics of podcast #\{id\}'s episodes. | +| episodes.create | Can create episodes for podcast #\{id\}. | +| episodes.edit | Can edit episodes of podcast #\{id\}. | +| episodes.delete | Can delete episodes of podcast #\{id\}. | +| episodes.manage-persons | Can manage episode persons of podcast #\{id\}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #\{id\}. | +| episodes.manage-publications | Can publish/unpublish episodes and posts of podcast #\{id\}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #\{id\}. | + +{/* AUTH-PODCAST-PERMISSIONS-LIST:END */} diff --git a/docs/src/sr_Latn/getting-started/docker.md b/docs/src/content/docs/da/getting-started/docker.mdx similarity index 99% rename from docs/src/sr_Latn/getting-started/docker.md rename to docs/src/content/docs/da/getting-started/docker.mdx index b73daca5..be15a64e 100644 --- a/docs/src/sr_Latn/getting-started/docker.md +++ b/docs/src/content/docs/da/getting-started/docker.mdx @@ -1,10 +1,7 @@ --- title: Zvanične Docker slike -sidebarDepth: 3 --- -# Zvanične Docker slike - Castopod gura 3 Docker slike u Docker Hub tokom njegovog automatizovanog procesa izrade: diff --git a/docs/src/eu/getting-started/install.md b/docs/src/content/docs/da/getting-started/install.mdx similarity index 81% rename from docs/src/eu/getting-started/install.md rename to docs/src/content/docs/da/getting-started/install.mdx index cdea18ec..d8888954 100644 --- a/docs/src/eu/getting-started/install.md +++ b/docs/src/content/docs/da/getting-started/install.mdx @@ -1,21 +1,20 @@ --- -title: Installation -sidebarDepth: 3 +title: How to install Castopod? --- -# How to install Castopod? +import { Aside } from "@astrojs/starlight/components"; 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. -::: tip Note + ## Requirements @@ -46,14 +45,6 @@ Additionally, make sure that the following extensions are enabled in your PHP: > We recommend using [MariaDB](https://mariadb.org). -::: warning Warning - -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. - -::: - 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. @@ -115,13 +106,13 @@ want to generate Video Clips. The following extensions must be installed: 2. Follow the instructions on your screen. 3. Start podcasting! -::: info Note + ### Using CLI @@ -226,13 +217,35 @@ self-hosting for you. diff --git a/docs/src/br/getting-started/security.md b/docs/src/content/docs/da/getting-started/security.mdx similarity index 96% rename from docs/src/br/getting-started/security.md rename to docs/src/content/docs/da/getting-started/security.mdx index d0d59be2..c039493c 100644 --- a/docs/src/br/getting-started/security.md +++ b/docs/src/content/docs/da/getting-started/security.mdx @@ -1,9 +1,7 @@ --- -title: Security +title: Security concerns --- -# Ar surentez - 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). diff --git a/docs/src/content/docs/da/getting-started/update.mdx b/docs/src/content/docs/da/getting-started/update.mdx new file mode 100644 index 00000000..7700739b --- /dev/null +++ b/docs/src/content/docs/da/getting-started/update.mdx @@ -0,0 +1,108 @@ +--- +title: Ako aktualizovať Castopod? +--- + +import { Aside } from "@astrojs/starlight/components"; + +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 ⚡. + +## Update instructions + +0. ⚠️ Before any update, we highly recommend you backup your Castopod files and + database. + + - cf. + [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 + + - cf. + [Where can I find my 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 + + - ⚠️ 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/) + +3. On your server: + + - Remove all files except `.env` and `public/media` + - Copy the new files from the downloaded package into your server + + + +4. Update your database schema from your `Castopod Admin` > `About` page or by + running: + + ```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! + + + +## Fully Automated updates + +> Coming soon... 👀 + +## Frequently asked questions (FAQ) + +### Where can I find my Castopod version? + +Go to your Castopod admin panel, the version is displayed on the bottom left +corner. + +Alternatively, you can find the version in the `app > Config > Constants.php` +file. + +### I haven't updated my instance in a long time… What should I do? + +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. + +> You may want to backup your instance depending on how long you haven't updated +> Castopod. + +For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to +`v1.0.0-beta.1`: + +0. (highly recommended) Make a backup of your files and database. + +1. Download the latest release, overwrite your files whilst keeping `.env` and + `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`, + `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`. + +3. ✨ Enjoy your fresh instance, you're all done! + +### Should I make a backup before updating? + +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… diff --git a/docs/src/content/docs/da/index.mdx b/docs/src/content/docs/da/index.mdx new file mode 100644 index 00000000..baf59d03 --- /dev/null +++ b/docs/src/content/docs/da/index.mdx @@ -0,0 +1,1383 @@ +--- +title: Dobrodošli 👋 +--- + +import { LinkCard } from "@astrojs/starlight/components"; + +Castopod je besplatna platforma otvorenog koda napravljena za podkastere koji +žele interakciju sa svojom publikom. + +Castopod se lako instalira i napravljen je na +[CodeIgniter4](https://codeigniter.com/), moćnom PHP okviru sa jako malim +otiskom (footprint). + + + +## Funkcionalnosti + +- 🌱 Besplatan i otvorenog koda (AGPL v3 License) +- 🔐 Fokusiran an suverenitet podataka: vaš sadržaj, publika i analitika pripada + vama i samo vama +- 🪄  Podkasting 2.0 funkcionalnosti: GUID, zaključan, transkripti, + podrška, poglavlja, lokacija, posobe, zvučni isečci, … +- 💬  Ugrađena društvena mreža: + - 🚀  Castopod je deo Fediversa, decentralizovane društvene mreže + - ❤️  Napravite objave, delite, dodajte u omiljene i komentarišite + epizode +- 📈  Ugrađena analitika: + - ⚖️  U skladu sa GDPR / CCPA / LGPD + - 🪙  Merenje publike putem IABv2 standarda + - 🏡  Analitika na licu mesta, bez uključenosti trećih strana +- 📢  Ugrađeni marketinški alati: + - ✅  SEO spremno (open-graph meta-tags, JSON-LD, …) + - 📱  PWA: instalirajte kao samostojeću aplikaciju + - 🎨  Prilagodljive boje teme + - 🎬  Napravite video isečke iz epizoda koji su spremni za deljenje + - 🔉  Napravite audio isečke + - ▶️  Plejer koji možete koristiti na svom sajtu (embed) +- 💸  Monetizacija: + - 🔗  Linkovi za podršku publike + - 📲  Slušaj i klikni reklame + - 🤝  value4value / Veb Monetizacija + - 💎  Premijum podkasti +- 📡  Objavite svoje epizode svugde uz RSS: + - 📱  Na svim agregatorima i aplikacijama: Podcast Index, Apple Podcasts, + Spotify, Google Podcasts, Deezer, Podcast Addict, Podfriend, … + - ⚡  Emitujte svoje epizode instant uz WebSub +- 📥  Uvoz podkasta: prebacite svoj postojeći podkast na Castopod +- 📤  Prebacite svoj podkast sa Castopod-a +- 🔀  Mreža: hostujte koliko god želite podkasta +- 👥  Više korisnika: dodajte saradnike i odredite njihove uloge +- 🌎  i18n podrška: prevedeno na engleski, francuski, poljski, nemački, + brazilski portugalski, španski… + [još jezika uskoro](https://translate.castopod.org)! + +## Motivacija + +Ekosistem podcasta je po prirodi decentralizovan: možete kreirati svoj podkast +kao RSS datoteku, objavite je na vebu i deliti svuda na mreži. + +To je zapravo jedan od retkih medija koji je ostao decentralizovan ovako dugo. + +Kako se upotreba razvija, sve više ljudi ulazi u podkaste: ili kao kreatori koji +pronalaze nove načine da podele svoje ideje ili kao slušaoci u potrazi za boljim +sadržajem. + +Kako podkasting postaje sve više korišćen, neke kompanije pokušavaju da ga +promene ka kontrolisanijem i centralizovanijem mediju. + +Castopod je stvoren u nastojanju da pruži otvorenu i održivu alternativu za +hostovanje vaših podkasta, promovišući decentralizaciju kako bi se osiguralo da +podkasterska kreativnost može da se izrazi. + +Ovaj projekat gura zajednica otvorenog koda, ponajviše +[Fedivers](https://fediverse.party/en/fediverse/) i +[Podcasting 2.0](https://podcastindex.org/) pokreti. + +## Poređenje sa drugim rešenjima + +Verujemo da jedno rešenje nije dobro za sve, već da sve zavisi od vaših potreba. +Tako da evo poređenja sa drugim alatima kako bi ste mogli da procenite da li je +Castopod prava stvar za vas. + +### Castopod protiv Wordpress-a + +Castopod je često nazivan "Wordpress-om za podkaste" zbog sličnosti koje deli sa +ovom ploatformom. U neku ruku ovo je tačno. I zapravo, Castopod bio je u velikoj +meri inspirisan Wordpress ekosistemom, videvši lakoću usvajanja od zajednice i +broja veb lokacija koje rade na njemu. + +Isto kao i Wordpress, Castopod je besplatan i otvorenog koda, napravljen +koristeći PHP i MySQL baze podataka i spakovan na način koji vam omogućava +jednostavnu instalaciju na većini veb servera. + +Wordpress je odličan način na napravite veb stranicu i upotpunite je dodatcima +kako bi dobili ono što želite. To je potpuno razvijen CMS koji vam pomaže da +dobijete bilo koju vrstu veb stranica na mreži. + +S druge strane, Castopod treba da odgovori na posebne potrebe podkastera, +fokusirajući se na podkasting, i ništa drugo. Nisu vam potrebni nikakvi dodatci +kako bi ste krenuli na svoje podkastersko putovanje. + +Ovo omogućava optimizaciju procesa specifičnih za podcasting: u rasponu od +kreiranja vaših podkasta i objavljivanja novih epizoda sve do emitovanja, +marketinga i analitike. + +Konačno, u zavisnosti od vaših potreba, Wordpress i Castopod mogu čak i da +funkcionišu zajedno jer dele iste zahteve! + +### Castopod protiv Funkwhale-a + +Funkwhale je moderan besplatni muzički server otvorenog koda koji se samostalno +hostuje. Kao i Castopod, Funkwhale je deo Fedivers-a, decentralizovane društvene +mreže što omogućava kompatibilnost između njih. + +Funkwhale je u početku napravljen oko muzike. Kasnije, kako je projekat +napredovao, dodata je opcija hostovanja podkasta. + +Za razliku od Funkwhale-a, Castopod je dizajniran i napravljen isključivo oko +podkasta. Ovo omogućava lakšu implementaciju funkcionalnosti koje se odnose na +podkast ekosistem, kao što su podkasting 2.0 alati (transkripti, poglavlja, +lokacije, osobe, ...). + +Tako da bi ste verovatno trebali da koristite Funkwhale ukoliko želite da +hostujete svoju muziku a Castopod ukoliko želite da hostujete svoje podkaste. + +### Castopod protiv drugih podkast hosting-a + +Postoji mnogo različitih rešenja za hostovanje vaših podkasta, neka od njih su +stvarno fantastična i [ dosta njih](https://podcastindex.org/apps) se +priključuje Podcasting 2.0 trendu, isto kao i Castopod! + +Svako od ovih rešenja se razlikuje jedno od drugog, možete ih uporediti sa +[listom funkcionalnosti](#features). + +Imajući to u vidu, postoje dve glavne razlike u odnosu na druga rešenja za +podkasting: + +- Castopod može biti samostalno hostovan i jedino je rešenje koje vam omogućava + da zadržite punu kontrolu nad onim što proizvodite. Takođe, pošto je otvorenog + koda, možete ga čak prilagoditi kako želite. + +- Castopod je jedino rešenje koje trenutno uklapa decentralizovanu društvenu + mrežu sa ActivityPub-om kao i mnoge funkcionalnosti podkasting-a 2.0, nadajući + se da će ih tako približiti. + +## Doprinos + +Volite Catsopod i voleli bi ste da pomognete? Pogledajte dokumentaciju koja +sledi kako bi ste počeli. + +### Kodeks ponašanja + +Castopod je usvojio Kodeks ponašanja kojeg očekujemo da se učesnici u projektu +pridržavaju. Molimo da pročitate +[Uputstvo Kodeksa ponašanja](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md) +kako bi ste razumeli šta hoće a šta neće biti tolerisano. + +### Vodič za doprinos + +Pročitajte naše [uputstvo za doprinos](../contributing/guidelines.md) kako bi +ste bolje razumeli naš proces razvoja, kako da predložite popravke bagova i +unapređenja i kako da napravite i testirate svoje promene na Castopod-u. + +## Saradnici ✨ + +Veliko hvala ovim divnim ljudima +([ključ emotikona](https://allcontributors.org/docs/en/emoji-key)): + +{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */} +{/* prettier-ignore-start */} +{/* markdownlint-disable */} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Yassine Doghri +
+ + Yassine Doghri + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 📖 + {" "} + + 👀 + {" "} + + 🚧 + {" "} + + 🖋 + {" "} + + 🎨 + {" "} + + ️️️️♿️ + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🧑‍🏫 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📆 + {" "} + + 📝 + +
+ + Benjamin Bellamy +
+ + Benjamin Bellamy + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 👀 + {" "} + + 🖋 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📝 + {" "} + + 📆 + {" "} + + 📢 + +
+ + Ola Hneini +
+ + Ola Hneini + +
+
+ + 💻 + {" "} + + 👀 + {" "} + + 📖 + {" "} + + 🚧 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Romain de Laage +
+ + Romain de Laage + +
+
+ + 💻 + {" "} + + 🚇 + {" "} + + 📖 + {" "} + + 🌍 + {" "} + + 🤔 + +
+ + Lyonel Bernard +
+ + Lyonel Bernard + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Christopher Lagonick-Weitzel +
+ + Christopher Lagonick-Weitzel + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Ernesto Acosta +
+ + Ernesto Acosta + +
+
+ + 🐛 + {" "} + + 🔊 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Ewen +
+ + Ewen + +
+
+ + 🌍 + {" "} + + 🤔 + {" "} + + 💻 + +
+ + Bastien Luneteau +
+ + Bastien Luneteau + +
+
+ + 💻 + {" "} + + 🐛 + +
+ + Cécile Ricordeau +
+ + Cécile Ricordeau + +
+
+ + 🎨 + +
+ + Patryk Miś +
+ + Patryk Miś + +
+
+ + 🌍 + +
+ + Marcin Lewandowski +
+ + Marcin Lewandowski + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Sebastian Janik +
+ + Sebastian Janik + +
+
+ + 💻 + +
+ + Patryk Karczmarczyk +
+ + Patryk Karczmarczyk + +
+
+ + 💻 + +
+ + denis d +
+ + denis d + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Douglas Kastle +
+ + Douglas Kastle + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + cExplorer +
+ + cExplorer + +
+
+ + 🐛 + {" "} + + 🌍 + +
+ + ImaCrea +
+ + ImaCrea + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Jonas S +
+ + Jonas S + +
+
+ + 💻 + +
+ + LEFEBVRE Yann +
+ + LEFEBVRE Yann + +
+
+ + 🐛 + +
+ + Sebastian Späth +
+ + Sebastian Späth + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + rocky III +
+ + rocky III + +
+
+ + 🐛 + +
+ + Hermann Josef Eckl +
+ + Hermann Josef Eckl + +
+
+ + 🐛 + +
+ + Delhaye Cyrille +
+ + Delhaye Cyrille + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + João Leandro +
+ + João Leandro + +
+
+ + 🌍 + {" "} + + 🤔 + +
+ + Angelos Chouvardas +
+ + Angelos Chouvardas + +
+
+ + 🌍 + +
+ + Eivind +
+ + Eivind + +
+
+ + 🌍 + +
+ + forght +
+ + forght + +
+
+ + 🌍 + +
+ + glottis0q +
+ + glottis0q + +
+
+ + 🌍 + +
+ + glottis0q +
+ + glottis0q + +
+
+ + 🌍 + +
+ + Lucian I. Last +
+ + Lucian I. Last + +
+
+ + 🌍 + +
+ + LuuzViir +
+ + LuuzViir + +
+
+ + 🌍 + +
+ + CTHTC +
+ + CTHTC + +
+
+ + 🌍 + +
+ + Russian Retro +
+ + Russian Retro + +
+
+ + 🌍 + +
+ + Marek L'ach +
+ + Marek L'ach + +
+
+ + 🌍 + +
+ + GunChleoc +
+ + GunChleoc + +
+
+ + 🌍 + +
+ + GabiSnow +
+ + GabiSnow + +
+
+ + 🌍 + +
+ + bendaha +
+ + bendaha + +
+
+ + 🌍 + +
+ + Samuel Roland +
+ + Samuel Roland + +
+
+ + 🌍 + +
+ + Dimitri Regnier +
+ + Dimitri Regnier + +
+
+ + 🤔 + +
+ + irithys +
+ + irithys + +
+
+ + 🌍 + +
+ + Sergi +
+ + Sergi + +
+
+ + 🌍 + +
+ + ghose (XoseM) +
+ + ghose (XoseM) + +
+
+ + 🌍 + +
+ + Andreas Olsson +
+ + Andreas Olsson + +
+
+ + 🌍 + +
+ + leonfrom +
+ + leonfrom + +
+
+ + 🌍 + +
+ + agentcobra +
+ + agentcobra + +
+
+ + 🌍 + +
+ + Alessandro +
+ + Alessandro + +
+
+ + 🌍 + +
+ + liimee +
+ + liimee + +
+
+ + 🌍 + +
+ + Ahmed Sabouni +
+ + Ahmed Sabouni + +
+
+ + 🌍 + +
+ + KrzysztofDomanczyk +
+ + KrzysztofDomanczyk + +
+
+ + 💻 + +
+ + Guy Martin +
+ + Guy Martin + +
+
+ + 🐛 + {" "} + + 💻 + +
+ +{/* markdownlint-restore */} +{/* prettier-ignore-end */} + +{/* ALL-CONTRIBUTORS-LIST:END */} + +Ovaj projekat prati specifikaciju +[svih saradnika](https://github.com/all-contributors/all-contributors). +Doprinosi bilo koje vrste su dobrodošli! + +## Kontakt + +Možete nas kontaktirati za pomoć ili postaviti bilo koje pitanje koje imate na: + +- [Discord-u](https://castopod.org/discord) (za direktnu interakciju sa + programerima i zajednicom) +- [Listi pitanja](https://code.castopod.org/adaures/castopod/-/issues) (za + zahteve za funkcionalnostima i prijavu bagova) + +Takođe, možete nas pratiti na društvenim mrežama kako bi ste dobili najnovije +vesti o Castopod-u: + +- [podlibre.social](https://podlibre.social/@Castopod) (instanca Mastodon-a) +- [Twitter](https://twitter.com/castopod) +- [LinkedIn](https://linkedin.com/company/castopod) +- [Facebook](https://www.facebook.com/castopod) + +## Sponzori + +Tekući razvoj Castopod-a je omogućen uz podršku vas koji nas podržavate. Ukoliko +želite da pomognete, razmislite o +[sponzorisanju razvoja Castopod-a](https://opencollective.com/castopod/contribute). + +[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/) + +[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/) + +## Licenca + +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) + +Autorska prava © 2020-danas, [Ad Aures](https://adaures.com/). diff --git a/docs/src/content/docs/de/getting-started/auth.mdx b/docs/src/content/docs/de/getting-started/auth.mdx new file mode 100644 index 00000000..ae3f20f2 --- /dev/null +++ b/docs/src/content/docs/de/getting-started/auth.mdx @@ -0,0 +1,85 @@ +--- +title: Authentifizierung & Autorisierung +--- + +Castopod behandelt Authentifizierung und Autorisierung mit `codeigniter/shield` +kombiniert mit eigenen Regeln. Rollen und Berechtigungen sind auf zwei Ebenen +definiert: + +1. [instanzweit](#1-instance-wide-roles-and-permissions) +2. [je Podcast](#2-per-podcast-roles-and-permissions) + +## 1. Instanzweite Rollen und Berechtigungen + +### Instanz Rollen + +{/* AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section */} + +| role | description | permissions | +| ------------------- | --------------------------------------------- | ------------------------------------------------------------------------------------------ | +| Super-Administrator | Hat die vollständige Kontrolle über Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Manager | Verwaltet Castopods Inhalte. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | Allgemeine Benutzer von Castopod. | admin.access | + +{/* AUTH-INSTANCE-ROLES-LIST:END */} + +### Instanz Berechtigungen + +{/* AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section */} + +| permission | description | +| ----------------------- | ---------------------------------------------------------------------------- | +| admin.access | Kann auf den Admin-Bereich von Castopod zugreifen. | +| admin.settings | Kann auf die Einstellungen von Castopod zugreifen. | +| users.manage | Kann Castopod-Benutzer verwalten. | +| persons.manage | Kann Mitwirkende verwalten. | +| pages.manage | Kann Seiten verwalten. | +| podcasts.view | Kann alle Podcasts einsehen. | +| podcasts.create | Kann neue Podcasts erstellen. | +| podcasts.import | Kann Podcasts importieren. | +| fediverse.manage-blocks | Kann föderierte Nutzer/Domains davon abhalten, mit Castopod zu interagieren. | + +{/* AUTH-INSTANCE-PERMISSIONS-LIST:END */} + +## 2. Pro Podcast Rollen und Berechtigungen + +### Pro Podcast Rollen + +{/* AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section */} + +| role | description | permissions | +| ------------- | ----------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Administrator | Hat die vollständige Kontrolle über Podcast #\{id\}. | \* | +| Editor | Verwaltet Inhalte und Veröffentlichungen von Podcast #\{id\}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Autor | Verwaltet Inhalte von Podcast #\{id\}, kann diese aber nicht veröffentlichen. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Gast | Allgemeiner Mitwirkender des Podcasts #\{id\}. | view, episodes.view | + +{/* AUTH-PODCAST-ROLES-LIST:END */} + +### Pro Podcast Berechtigung + +{/* AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section */} + +| permission | description | +| ---------------------------- | -------------------------------------------------------------------------------------------------------- | +| view | Kann das Dashboard und Analysen des Podcasts #\{id\} einsehen. | +| edit | Kann Podcast #\{id\} bearbeiten. | +| delete | Kann Podcast #\{id\} löschen. | +| manage-import | Kann den importierten Podcast #\{id\} synchronisieren. | +| manage-persons | Kann Abonnements des Podcasts #\{id\} verwalten. | +| manage-subscriptions | Kann Abonnements des Podcasts #\{id\} verwalten. | +| manage-contributors | Kann Mitwirkende des Podcasts #\{id\} verwalten. | +| manage-platforms | Kann Plattform-Links des Podcasts #\{id\} verwalten. | +| manage-publications | Kann Podcast #\{id\} veröffentlichen. | +| manage-notifications | Kann Benachrichtigungen des Podcasts #\{id\} einsehen und als gelesen markieren. | +| interact-as | Kann als Podcast #\{id\} interagieren, um Beiträge zu favorisieren, zu teilen oder diese zu beantworten. | +| episodes.view | Kann Dashboards und Analysen von Episoden des Podcasts #\{id\} einsehen. | +| episodes.create | Kann Folgen für Podcast #\{id\} erstellen. | +| episodes.edit | Kann Folgen von Podcast #\{id\} bearbeiten. | +| episodes.delete | Kann Folgen von Podcast #\{id\} löschen. | +| episodes.manage-persons | Kann Personen von Episoden des Podcasts #\{id\} verwalten. | +| episodes.manage-clips | Kann Videoclips und Soundbites des Podcasts #\{id\} verwalten. | +| episodes.manage-publications | Kann Episoden und Posts von Podcast #\{id\} veröffentlichen/zurückziehen. | +| episodes.manage-comments | Kann Kommentare von Folgen des Podcasts #\{id\} erstellen und löschen. | + +{/* AUTH-PODCAST-PERMISSIONS-LIST:END */} diff --git a/docs/src/de/getting-started/docker.md b/docs/src/content/docs/de/getting-started/docker.mdx similarity index 99% rename from docs/src/de/getting-started/docker.md rename to docs/src/content/docs/de/getting-started/docker.mdx index 20713090..5377d120 100644 --- a/docs/src/de/getting-started/docker.md +++ b/docs/src/content/docs/de/getting-started/docker.mdx @@ -1,10 +1,7 @@ --- title: Offizielle Docker Images -sidebarDepth: 3 --- -# Offizielle Docker Images - Castopod erstellt während des automatischen Build-Prozesses 3 Docker-Images auf Docker Hub: diff --git a/docs/src/de/getting-started/install.md b/docs/src/content/docs/de/getting-started/install.mdx similarity index 82% rename from docs/src/de/getting-started/install.md rename to docs/src/content/docs/de/getting-started/install.mdx index 3625a9aa..5401bc22 100644 --- a/docs/src/de/getting-started/install.md +++ b/docs/src/content/docs/de/getting-started/install.mdx @@ -1,22 +1,21 @@ --- -title: Installation -sidebarDepth: 3 +title: Wie installiere ich Castopod? --- -# Wie installiere ich Castopod? +import { Aside } from "@astrojs/starlight/components"; Castopod ist für eine einfache Installation konzipiert. Ob dediziertes oder Shared-Hosting, du kannst es auf den meisten PHP-MySQL-kompatiblen Webservern installieren. -::: tip Note + ## Voraussetzungen @@ -49,14 +48,6 @@ sind: > Wir empfehlen [MariaDB](https://mariadb.org). -::: warning Warning - -Castopod funktioniert nur mit unterstützten MySQL 5.7 oder höher kompatiblen -Datenbanken. Es wird zum Beispiel mit dem vorherigen MySQL v5.6 nicht mehr -funktionieren, dessen Lebensende am 5. Februar 2021 war. - -::: - Du benötigst den Servernamen, den Datenbanknamen, den Benutzernamen und das Passwort, um den Installationsvorgang abzuschließen. Kontaktiere bitte den Administrator, falls du keinen Benutzeraccount hast. @@ -120,13 +111,13 @@ nicht installiert: %s: 2. Folge der Anleitung auf dem Bildschirm. 3. Podcasting starten! -::: info Note + ### Using CLI @@ -234,13 +225,35 @@ kümmert sich um den Aufwand von self-hosting für dich. diff --git a/docs/src/de/getting-started/security.md b/docs/src/content/docs/de/getting-started/security.mdx similarity index 95% rename from docs/src/de/getting-started/security.md rename to docs/src/content/docs/de/getting-started/security.mdx index b2886641..efd84ed4 100644 --- a/docs/src/de/getting-started/security.md +++ b/docs/src/content/docs/de/getting-started/security.mdx @@ -1,9 +1,7 @@ --- -title: Sicherheit +title: Sicherheitsbedenken --- -# Sicherheitsbedenken - Castopod wurde mittels [CodeIgniter4](https://codeigniter.com/) (einem PHP Framework) gebaut, welches [gute Sicherheitspraktiken](https://codeigniter.com/user_guide/concepts/security.html) diff --git a/docs/src/sr-Latn/getting-started/update.md b/docs/src/content/docs/de/getting-started/update.mdx similarity index 96% rename from docs/src/sr-Latn/getting-started/update.md rename to docs/src/content/docs/de/getting-started/update.mdx index 5ca69797..d1ceb313 100644 --- a/docs/src/sr-Latn/getting-started/update.md +++ b/docs/src/content/docs/de/getting-started/update.mdx @@ -1,9 +1,8 @@ --- -title: Ažuriranje -sidebarDepth: 3 +title: Kako da ažurirate Castopod? --- -# Kako da ažurirate Castopod? +import { Aside } from "@astrojs/starlight/components"; Nakon instalacije Castopod-a, možete poželeti da ažurirate svoju instancu na najnoviju verziju kako bi ste uživali u najnovijim opcijama ✨, sređenim @@ -36,12 +35,12 @@ bagovima 🐛 i unapređenim performansama ⚡. - Uklonite sve datoteke sem `.env` i `public/media` - Kopirajte nove datoteke iz preuzetog paketa na vaš server - ::: info Napomena + 4. Ažurirajte svoju šemu baze podataka iz vaše `Castopod Admin` > `About` stranice ili tako što ćete pokrenuti: @@ -53,7 +52,7 @@ bagovima 🐛 i unapređenim performansama ⚡. 5. Očistite keš iz `Castopod Admin` > `Settings` > `general` > `Housekeeping` 6. ✨ Uživajte u svežoj instanci, završili ste! -::: info Napomena + ## Potpuno automatsko ažuriranje diff --git a/docs/src/content/docs/de/index.mdx b/docs/src/content/docs/de/index.mdx new file mode 100644 index 00000000..f24684b4 --- /dev/null +++ b/docs/src/content/docs/de/index.mdx @@ -0,0 +1,1382 @@ +--- +title: Willkommen 👋 +--- + +import { LinkCard } from "@astrojs/starlight/components"; + +Castopod ist eine freie & Open-Source-Hosting-Plattform für Podcastende, die ihr +Publikum einbinden und mit ihnen interagieren möchten. + +Castopod ist einfach zu installieren und wurde auf +[CodeIgniter4](https://codeigniter.com/) aufgebaut, ein mächtiges PHP Framework, +mit einem sehr kleinen Fußabdruck. + + + +## Merkmale + +- 🌱 Kostenlos & Open-Source (AGPL v3 Lizenz) +- 🔐  Fokussiert auf die Datensouveränität: Ihre Inhalte, Ihr Publikum und + Analysen gehören zu Ihnen, und nur Ihnen  +- 🪄  Podcasting 2.0 Features: GUID, gesperrt, Transkripte, Finanzierung, + Kapitel, Standort, Personen, Soundbites, … +- 💬  Integriertes soziales Netzwerk: + - 🚀  Castopod ist Teil des Fediversums, einem dezentralen sozialen + Netzwerk + - ❤️  Erstelle Beiträge, teile, favorisiere und kommentiere Episoden +- 📈  Integrierte Analyse: + - ⚖️  GDPR / CCPA / LGPD konform + - 🪙  Standard IABv2 Zuschauermessung + - 🏡  On-premises Analytik, kein Dritter beteiligt +- 📢  Integrierte Marketing-Tools: + - ✅  SEO bereit (open-graph Meta-Tags, JSON-LD, …) + - 📱  PWA: als eigenständige App installieren + - 🎨  Anpassbare Theme-Farben + - 🎬  Generiere Videoclips aus Episoden fertig zum Teilen + - 🔉  Soundbites erstellen + - ▶️  Embeddable Player, binde deine Episoden auf jeder Webseite ein +- 💸  Monetarisierung: + - 🔗  Funding links + - 📲  listen-to-click ads + - 🤝  value4value / WebMonetization + - 💎  Premium podcasts +- 📡  Publish your episodes everywhere with RSS: + - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, + Google Podcasts, Deezer, Podcast Addict, Podfriend, … + - ⚡  Broadcast your episodes instantly with WebSub +- 📥  Podcast import: move your existing podcast into Castopod +- 📤  Move your podcast out of Castopod +- 🔀  Multi-tenant: host as many podcasts as you want +- 👥  Multi-user: add contributors and set roles +- 🌎  i18n support: translated in English, French, Polish, German, + Brazilian Portuguese & Spanish… with + [more to come](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. + +It is in fact one of the only media to have stayed this way for a long time. + +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. + +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized 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. + +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. + +## Vergleiche mit anderen Lösungen + +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 you. + +### 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 it. + +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. + +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. + +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 journey. + +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. + +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! + +### Castopod vs Funkwale + +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 was initially built around music. And later on, as the project +evolved, the ability to host podcasts was introduced. + +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, …). + +So, you should probably use Funkwhale if you want to host your music, and use +Castopod if you want to host your podcasts. + +### Castopod vs other podcast hosts + +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! + +Each of these solutions differ from one another, you may compare with the +[list of features](#features). + +That being said, there are two main differences with other podcasting solutions: + +- 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 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. + +## Contributing + +Love Castopod and would like to help? Take a look at the following documentation +to get you started. + +### Code of conduct + +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 tolerated. + +### Contributing 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. + +## Contributors ✨ + +Thanks goes to these wonderful people +([emoji key](https://allcontributors.org/docs/en/emoji-key)): + +{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */} +{/* prettier-ignore-start */} +{/* markdownlint-disable */} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Yassine Doghri +
+ + Yassine Doghri + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 📖 + {" "} + + 👀 + {" "} + + 🚧 + {" "} + + 🖋 + {" "} + + 🎨 + {" "} + + ️️️️♿️ + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🧑‍🏫 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📆 + {" "} + + 📝 + +
+ + Benjamin Bellamy +
+ + Benjamin Bellamy + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 👀 + {" "} + + 🖋 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📝 + {" "} + + 📆 + {" "} + + 📢 + +
+ + Ola Hneini +
+ + Ola Hneini + +
+
+ + 💻 + {" "} + + 👀 + {" "} + + 📖 + {" "} + + 🚧 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Romain de Laage +
+ + Romain de Laage + +
+
+ + 💻 + {" "} + + 🚇 + {" "} + + 📖 + {" "} + + 🌍 + {" "} + + 🤔 + +
+ + Lyonel Bernard +
+ + Lyonel Bernard + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Christopher Lagonick-Weitzel +
+ + Christopher Lagonick-Weitzel + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Ernesto Acosta +
+ + Ernesto Acosta + +
+
+ + 🐛 + {" "} + + 🔊 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Ewen +
+ + Ewen + +
+
+ + 🌍 + {" "} + + 🤔 + {" "} + + 💻 + +
+ + Bastien Luneteau +
+ + Bastien Luneteau + +
+
+ + 💻 + {" "} + + 🐛 + +
+ + Cécile Ricordeau +
+ + Cécile Ricordeau + +
+
+ + 🎨 + +
+ + Patryk Miś +
+ + Patryk Miś + +
+
+ + 🌍 + +
+ + Marcin Lewandowski +
+ + Marcin Lewandowski + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Sebastian Janik +
+ + Sebastian Janik + +
+
+ + 💻 + +
+ + Patryk Karczmarczyk +
+ + Patryk Karczmarczyk + +
+
+ + 💻 + +
+ + denis d +
+ + denis d + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Douglas Kastle +
+ + Douglas Kastle + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + cExplorer +
+ + cExplorer + +
+
+ + 🐛 + {" "} + + 🌍 + +
+ + ImaCrea +
+ + ImaCrea + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Jonas S +
+ + Jonas S + +
+
+ + 💻 + +
+ + LEFEBVRE Yann +
+ + LEFEBVRE Yann + +
+
+ + 🐛 + +
+ + Sebastian Späth +
+ + Sebastian Späth + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + rocky III +
+ + rocky III + +
+
+ + 🐛 + +
+ + Hermann Josef Eckl +
+ + Hermann Josef Eckl + +
+
+ + 🐛 + +
+ + Delhaye Cyrille +
+ + Delhaye Cyrille + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + João Leandro +
+ + João Leandro + +
+
+ + 🌍 + {" "} + + 🤔 + +
+ + Angelos Chouvardas +
+ + Angelos Chouvardas + +
+
+ + 🌍 + +
+ + Eivind +
+ + Eivind + +
+
+ + 🌍 + +
+ + forght +
+ + forght + +
+
+ + 🌍 + +
+ + glottis0q +
+ + glottis0q + +
+
+ + 🌍 + +
+ + ButterflyOfFire +
+ + ButterflyOfFire + +
+
+ + 🌍 + +
+ + Lucian I. Last +
+ + Lucian I. Last + +
+
+ + 🌍 + +
+ + LuuzViir +
+ + LuuzViir + +
+
+ + 🌍 + +
+ + CTHTC +
+ + CTHTC + +
+
+ + 🌍 + +
+ + Russian Retro +
+ + Russian Retro + +
+
+ + 🌍 + +
+ + Marek L'ach +
+ + Marek L'ach + +
+
+ + 🌍 + +
+ + GunChleoc +
+ + GunChleoc + +
+
+ + 🌍 + +
+ + GabiSnow +
+ + GabiSnow + +
+
+ + 🌍 + +
+ + bendaha +
+ + bendaha + +
+
+ + 🌍 + +
+ + Samuel Roland +
+ + Samuel Roland + +
+
+ + 🌍 + +
+ + Dimitri Regnier +
+ + Dimitri Regnier + +
+
+ + 🤔 + +
+ + irithys +
+ + irithys + +
+
+ + 🌍 + +
+ + Sergi +
+ + Sergi + +
+
+ + 🌍 + +
+ + ghose (XoseM) +
+ + ghose (XoseM) + +
+
+ + 🌍 + +
+ + Andreas Olsson +
+ + Andreas Olsson + +
+
+ + 🌍 + +
+ + leonfrom +
+ + leonfrom + +
+
+ + 🌍 + +
+ + agentcobra +
+ + agentcobra + +
+
+ + 🌍 + +
+ + Alessandro +
+ + Alessandro + +
+
+ + 🌍 + +
+ + liimee +
+ + liimee + +
+
+ + 🌍 + +
+ + Ahmed Sabouni +
+ + Ahmed Sabouni + +
+
+ + 🌍 + +
+ + KrzysztofDomanczyk +
+ + KrzysztofDomanczyk + +
+
+ + 💻 + +
+ + Guy Martin +
+ + Guy Martin + +
+
+ + 🐛 + {" "} + + 💻 + +
+ +{/* markdownlint-restore */} +{/* prettier-ignore-end */} + +{/* ALL-CONTRIBUTORS-LIST:END */} + +This project follows the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind welcome! + +## Contact + +You may reach us for help or ask any question you have on: + +- [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) + +Alternatively, you can follow us on social media platforms to get news about +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 + +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). + +[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/) + +[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/) + +## License + +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) + +Copyright © 2020-present, [Ad Aures](https://adaures.com/). diff --git a/docs/src/content/docs/el/getting-started/auth.mdx b/docs/src/content/docs/el/getting-started/auth.mdx new file mode 100644 index 00000000..f4aa667d --- /dev/null +++ b/docs/src/content/docs/el/getting-started/auth.mdx @@ -0,0 +1,85 @@ +--- +title: Ταυτοποίηση & εξουσιοδότηση +--- + +Ο Castopod χειρίζεται τον έλεγχο ταυτότητας και την έγκριση χρησιμοποιώντας +`codeigniter/shield` σε συνδυασμό με προσαρμοσμένους κανόνες. Οι ρόλοι και τα +δικαιώματα καθορίζονται σε δύο επίπεδα: + +1. [ευρεία παρουσία](#1-instance-wide-roles-and-permissions) +2. [ανά podcast](#2-per-podcast-roles-and-permissions) + +## 1. Διαχείριση ρόλων και δικαιωμάτων + +### Ρόλοι εμφάνισης + +{/* AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section */} + +| role | description | permissions | +| ---------------- | ------------------------------------- | ------------------------------------------------------------------------------------------ | +| Υπερδιαχειριστής | Έχει πλήρη έλεγχο του Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Διαχειριστής | Διαχείριση περιεχομένου του Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | Γενικοί χρήστες του 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 | Μπορεί να έχει πρόσβαση στην περιοχή διαχείρισης Castopod. | +| admin.settings | Μπορεί να έχει πρόσβαση στις ρυθμίσεις Castopod. | +| users.manage | Μπορεί να διαχειριστεί τους χρήστες Castopod. | +| persons.manage | Μπορεί να διαχειριστεί τα άτομα. | +| pages.manage | Μπορεί να διαχειριστεί τις σελίδες. | +| podcasts.view | Μπορεί να δει όλα τα podcasts. | +| podcasts.create | Μπορεί να δημιουργήσει νέα podcasts. | +| podcasts.import | Μπορεί να εισάγει podcasts. | +| fediverse.manage-blocks | Μπορεί να εμποδίσει τους ψευτογενείς ηθοποιούς/τομείς να αλληλεπιδρούν με το 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 | +| ------------ | --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Διαχειριστής | Έχει πλήρη έλεγχο του podcast #\{id\}. | \* | +| Εκδότης | Διαχειρίζεται περιεχόμενο και δημοσιεύσεις του podcast #\{id\}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Συντάκτης | Manages content of podcast #\{id\} but cannot publish them. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Επισκέπτης | Γενικός συντελεστής του 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 dashboards and analytics of podcast #\{id\}'s episodes. | +| episodes.create | Can create episodes for podcast #\{id\}. | +| episodes.edit | Can edit episodes of podcast #\{id\}. | +| episodes.delete | Can delete episodes of podcast #\{id\}. | +| episodes.manage-persons | Can manage episode persons of podcast #\{id\}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #\{id\}. | +| episodes.manage-publications | Can publish/unpublish episodes and posts of podcast #\{id\}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #\{id\}. | + +{/* AUTH-PODCAST-PERMISSIONS-LIST:END */} diff --git a/docs/src/br/getting-started/docker.md b/docs/src/content/docs/el/getting-started/docker.mdx similarity index 99% rename from docs/src/br/getting-started/docker.md rename to docs/src/content/docs/el/getting-started/docker.mdx index ec96d3dc..5fec985c 100644 --- a/docs/src/br/getting-started/docker.md +++ b/docs/src/content/docs/el/getting-started/docker.mdx @@ -1,10 +1,7 @@ --- title: Official Docker images -sidebarDepth: 3 --- -# Official Docker images - Castopod pushes 3 Docker images to the Docker Hub during its automated build process: diff --git a/docs/src/nl/getting-started/install.md b/docs/src/content/docs/el/getting-started/install.mdx similarity index 82% rename from docs/src/nl/getting-started/install.md rename to docs/src/content/docs/el/getting-started/install.mdx index ad399c31..92961778 100644 --- a/docs/src/nl/getting-started/install.md +++ b/docs/src/content/docs/el/getting-started/install.mdx @@ -1,21 +1,20 @@ --- -title: Installatie -sidebarDepth: 3 +title: Hoe installeer je Castopod? --- -# Hoe installeer je Castopod? +import { Aside } from "@astrojs/starlight/components"; 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. -::: tip Note + ## Vereisten @@ -46,14 +45,6 @@ Additionally, make sure that the following extensions are enabled in your PHP: > We recommend using [MariaDB](https://mariadb.org). -::: warning Warning - -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. - -::: - 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. @@ -115,13 +106,13 @@ want to generate Video Clips. The following extensions must be installed: 2. Follow the instructions on your screen. 3. Begin met podcasting! -::: info Note + ### Using CLI @@ -226,13 +217,35 @@ self-hosting for you. diff --git a/docs/src/ar/getting-started/security.md b/docs/src/content/docs/el/getting-started/security.mdx similarity index 95% rename from docs/src/ar/getting-started/security.md rename to docs/src/content/docs/el/getting-started/security.mdx index e205698d..cbf948ba 100644 --- a/docs/src/ar/getting-started/security.md +++ b/docs/src/content/docs/el/getting-started/security.mdx @@ -1,9 +1,7 @@ --- -title: Security +title: Veiligheidszorgen --- -# Security concerns - 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). diff --git a/docs/src/nl/getting-started/update.md b/docs/src/content/docs/el/getting-started/update.mdx similarity index 96% rename from docs/src/nl/getting-started/update.md rename to docs/src/content/docs/el/getting-started/update.mdx index f1490c38..d90426f4 100644 --- a/docs/src/nl/getting-started/update.md +++ b/docs/src/content/docs/el/getting-started/update.mdx @@ -1,9 +1,8 @@ --- -title: Bijwerken -sidebarDepth: 3 +title: How to update Castopod? --- -# How to update Castopod? +import { Aside } from "@astrojs/starlight/components"; 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 @@ -36,12 +35,12 @@ improvements ⚡. - Remove all files except `.env` and `public/media` - Copy the new files from the downloaded package into your server - ::: info Note + 4. Update your database schema from your `Castopod Admin` > `About` page or by running: @@ -54,7 +53,7 @@ improvements ⚡. `Housekeeping` 6. ✨ Enjoy your fresh instance, you're all done! -::: info Note + ## Volledig geautomatiseerde updates diff --git a/docs/src/content/docs/el/index.mdx b/docs/src/content/docs/el/index.mdx new file mode 100644 index 00000000..d15cf157 --- /dev/null +++ b/docs/src/content/docs/el/index.mdx @@ -0,0 +1,1382 @@ +--- +title: Καλώς Ήλθατε 👋 +--- + +import { LinkCard } from "@astrojs/starlight/components"; + +Το Castopod είναι μια δωρεάν & ανοικτού κώδικα πλατφόρμα φιλοξενίας podcast που +κατασκευάζεται για podcasters που θέλουν να συμμετάσχουν και να αλληλεπιδράσουν +με το κοινό τους. + +Το Castopod είναι εύκολο στην εγκατάσταση και χτίστηκε με το +[CodeIgniter4](https://codeigniter.com/), ένα ισχυρό PHP framework με ένα πολύ +μικρό αποτύπωμα. + + + +## Χαρακτηριστικά + +- 🌱  Δωρεάν & open-source (AGPL v3 License) +- 🔐  Εστιάζει στην κυριαρχία των δεδομένων: το περιεχόμενο, το κοινό και + τα αναλυτικά στοιχεία ανήκουν σε εσάς μόνο +- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, + chapters, location, persons, soundbites, … +- 💬  Ενσωματωμένο κοινωνικό δίκτυο: + - 🚀  Castopod is part of the Fediverse, a decentralized social network + - ❤️  Create posts, share, favourite, and comment on episodes +- 📈  Built-in analytics: + - ⚖️  GDPR / CCPA / LGPD compliant + - 🪙  Standard IABv2 audience measurement + - 🏡  On-premises analytics, no third party involved +- 📢  Built-in marketing tools: + - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) + - 📱  PWA: install as a standalone app + - 🎨  Customizable theme colors + - 🎬  Generate ready-to-share Video clips from episodes + - 🔉  Generate soundbites + - ▶️  Embeddable player, embed your episodes on any website +- 💸  Monetization: + - 🔗  Funding links + - 📲  listen-to-click ads + - 🤝  value4value / WebMonetization + - 💎  Premium podcasts +- 📡  Publish your episodes everywhere with RSS: + - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, + Google Podcasts, Deezer, Podcast Addict, Podfriend, … + - ⚡  Broadcast your episodes instantly with WebSub +- 📥  Podcast import: move your existing podcast into Castopod +- 📤  Move your podcast out of Castopod +- 🔀  Multi-tenant: host as many podcasts as you want +- 👥  Multi-user: add contributors and set roles +- 🌎  i18n support: translated in English, French, Polish, German, + Brazilian Portuguese & Spanish… with + [more to come](https://translate.castopod.org)! + +## Κίνητρα + +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. + +It is in fact one of the only media to have stayed this way for a long time. + +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. + +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized 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. + +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. + +## Comparison with other solutions + +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 you. + +### 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 it. + +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. + +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. + +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 journey. + +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. + +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! + +### 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 was initially built around music. And later on, as the project +evolved, the ability to host podcasts was introduced. + +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, …). + +So, you should probably use Funkwhale if you want to host your music, and use +Castopod if you want to host your podcasts. + +### Castopod vs other podcast hosts + +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! + +Each of these solutions differ from one another, you may compare with the +[list of features](#features). + +That being said, there are two main differences with other podcasting solutions: + +- 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 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. + +## Contributing + +Love Castopod and would like to help? Take a look at the following documentation +to get you started. + +### Code of conduct + +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 tolerated. + +### Contributing 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. + +## Contributors ✨ + +Thanks goes to these wonderful people +([emoji key](https://allcontributors.org/docs/en/emoji-key)): + +{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */} +{/* prettier-ignore-start */} +{/* markdownlint-disable */} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Yassine Doghri +
+ + Yassine Doghri + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 📖 + {" "} + + 👀 + {" "} + + 🚧 + {" "} + + 🖋 + {" "} + + 🎨 + {" "} + + ️️️️♿️ + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🧑‍🏫 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📆 + {" "} + + 📝 + +
+ + Benjamin Bellamy +
+ + Benjamin Bellamy + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 👀 + {" "} + + 🖋 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📝 + {" "} + + 📆 + {" "} + + 📢 + +
+ + Ola Hneini +
+ + Ola Hneini + +
+
+ + 💻 + {" "} + + 👀 + {" "} + + 📖 + {" "} + + 🚧 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Romain de Laage +
+ + Romain de Laage + +
+
+ + 💻 + {" "} + + 🚇 + {" "} + + 📖 + {" "} + + 🌍 + {" "} + + 🤔 + +
+ + Lyonel Bernard +
+ + Lyonel Bernard + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Christopher Lagonick-Weitzel +
+ + Christopher Lagonick-Weitzel + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Ernesto Acosta +
+ + Ernesto Acosta + +
+
+ + 🐛 + {" "} + + 🔊 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Ewen +
+ + Ewen + +
+
+ + 🌍 + {" "} + + 🤔 + {" "} + + 💻 + +
+ + Bastien Luneteau +
+ + Bastien Luneteau + +
+
+ + 💻 + {" "} + + 🐛 + +
+ + Cécile Ricordeau +
+ + Cécile Ricordeau + +
+
+ + 🎨 + +
+ + Patryk Miś +
+ + Patryk Miś + +
+
+ + 🌍 + +
+ + Marcin Lewandowski +
+ + Marcin Lewandowski + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Sebastian Janik +
+ + Sebastian Janik + +
+
+ + 💻 + +
+ + Patryk Karczmarczyk +
+ + Patryk Karczmarczyk + +
+
+ + 💻 + +
+ + denis d +
+ + denis d + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Douglas Kastle +
+ + Douglas Kastle + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + cExplorer +
+ + cExplorer + +
+
+ + 🐛 + {" "} + + 🌍 + +
+ + ImaCrea +
+ + ImaCrea + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Jonas S +
+ + Jonas S + +
+
+ + 💻 + +
+ + LEFEBVRE Yann +
+ + LEFEBVRE Yann + +
+
+ + 🐛 + +
+ + Sebastian Späth +
+ + Sebastian Späth + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + rocky III +
+ + rocky III + +
+
+ + 🐛 + +
+ + Hermann Josef Eckl +
+ + Hermann Josef Eckl + +
+
+ + 🐛 + +
+ + Delhaye Cyrille +
+ + Delhaye Cyrille + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + João Leandro +
+ + João Leandro + +
+
+ + 🌍 + {" "} + + 🤔 + +
+ + Angelos Chouvardas +
+ + Angelos Chouvardas + +
+
+ + 🌍 + +
+ + Eivind +
+ + Eivind + +
+
+ + 🌍 + +
+ + forght +
+ + forght + +
+
+ + 🌍 + +
+ + glottis0q +
+ + glottis0q + +
+
+ + 🌍 + +
+ + ButterflyOfFire +
+ + ButterflyOfFire + +
+
+ + 🌍 + +
+ + Lucian I. Last +
+ + Lucian I. Last + +
+
+ + 🌍 + +
+ + LuuzViir +
+ + LuuzViir + +
+
+ + 🌍 + +
+ + CTHTC +
+ + CTHTC + +
+
+ + 🌍 + +
+ + Russian Retro +
+ + Russian Retro + +
+
+ + 🌍 + +
+ + Marek L'ach +
+ + Marek L'ach + +
+
+ + 🌍 + +
+ + GunChleoc +
+ + GunChleoc + +
+
+ + 🌍 + +
+ + GabiSnow +
+ + GabiSnow + +
+
+ + 🌍 + +
+ + bendaha +
+ + bendaha + +
+
+ + 🌍 + +
+ + Samuel Roland +
+ + Samuel Roland + +
+
+ + 🌍 + +
+ + Dimitri Regnier +
+ + Dimitri Regnier + +
+
+ + 🤔 + +
+ + irithys +
+ + irithys + +
+
+ + 🌍 + +
+ + Sergi +
+ + Sergi + +
+
+ + 🌍 + +
+ + ghose (XoseM) +
+ + ghose (XoseM) + +
+
+ + 🌍 + +
+ + Andreas Olsson +
+ + Andreas Olsson + +
+
+ + 🌍 + +
+ + leonfrom +
+ + leonfrom + +
+
+ + 🌍 + +
+ + agentcobra +
+ + agentcobra + +
+
+ + 🌍 + +
+ + Alessandro +
+ + Alessandro + +
+
+ + 🌍 + +
+ + liimee +
+ + liimee + +
+
+ + 🌍 + +
+ + Ahmed Sabouni +
+ + Ahmed Sabouni + +
+
+ + 🌍 + +
+ + KrzysztofDomanczyk +
+ + KrzysztofDomanczyk + +
+
+ + 💻 + +
+ + Guy Martin +
+ + Guy Martin + +
+
+ + 🐛 + {" "} + + 💻 + +
+ +{/* markdownlint-restore */} +{/* prettier-ignore-end */} + +{/* ALL-CONTRIBUTORS-LIST:END */} + +This project follows the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind welcome! + +## Contact + +You may reach us for help or ask any question you have on: + +- [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) + +Alternatively, you can follow us on social media platforms to get news about +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 + +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). + +[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/) + +[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/) + +## License + +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) + +Copyright © 2020-present, [Ad Aures](https://adaures.com/). diff --git a/docs/src/eu/getting-started/auth.md b/docs/src/content/docs/en/getting-started/auth.mdx similarity index 56% rename from docs/src/eu/getting-started/auth.md rename to docs/src/content/docs/en/getting-started/auth.mdx index ff5d59c0..d4dd4dd5 100644 --- a/docs/src/eu/getting-started/auth.md +++ b/docs/src/content/docs/en/getting-started/auth.mdx @@ -1,10 +1,7 @@ --- 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: @@ -15,7 +12,7 @@ coupled with custom rules. Roles and permissions are defined at two levels: ### Instance roles - +{/* AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section */} | role | description | permissions | | ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | @@ -23,11 +20,11 @@ coupled with custom rules. Roles and permissions are defined at two levels: | 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 | | ----------------------- | ------------------------------------------------------------------ | @@ -41,47 +38,47 @@ coupled with custom rules. Roles and permissions are defined at two levels: | 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, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| 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 | +| 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, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| 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}. | +| 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 dashboards and analytics of podcast #\{id\}'s episodes. | +| episodes.create | Can create episodes for podcast #\{id\}. | +| episodes.edit | Can edit episodes of podcast #\{id\}. | +| episodes.delete | Can delete episodes of podcast #\{id\}. | +| episodes.manage-persons | Can manage episode persons of podcast #\{id\}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #\{id\}. | +| episodes.manage-publications | Can publish/unpublish episodes and posts of podcast #\{id\}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #\{id\}. | - +{/* AUTH-PODCAST-PERMISSIONS-LIST:END */} diff --git a/docs/src/getting-started/docker.md b/docs/src/content/docs/en/getting-started/docker.mdx similarity index 96% rename from docs/src/getting-started/docker.md rename to docs/src/content/docs/en/getting-started/docker.mdx index efa8424f..deb2d4b6 100644 --- a/docs/src/getting-started/docker.md +++ b/docs/src/content/docs/en/getting-started/docker.mdx @@ -1,10 +1,7 @@ --- title: Official Docker images -sidebarDepth: 3 --- -# Official Docker images - Castopod pushes 3 Docker images to the Docker Hub during its automated build process: @@ -35,9 +32,9 @@ can be added as a cache handler. version: "3.7" services: - app: + castopod: image: castopod/castopod:latest - container_name: "castopod-app" + container_name: "castopod" volumes: - castopod-media:/var/www/castopod/public/media environment: @@ -50,14 +47,14 @@ can be added as a cache handler. CP_REDIS_HOST: redis CP_REDIS_PASSWORD: changeme networks: - - castopod-app + - castopod - castopod-db ports: - 8000:8000 restart: unless-stopped mariadb: - image: mariadb:10.5 + image: mariadb:11.2 container_name: "castopod-mariadb" networks: - castopod-db @@ -71,13 +68,13 @@ can be added as a cache handler. restart: unless-stopped redis: - image: redis:7.0-alpine + image: redis:7.2-alpine container_name: "castopod-redis" command: --requirepass changeme volumes: - castopod-cache:/data networks: - - castopod-app + - castopod volumes: castopod-media: @@ -85,7 +82,7 @@ can be added as a cache handler. castopod-cache: networks: - castopod-app: + castopod: castopod-db: ``` diff --git a/docs/src/content/docs/en/getting-started/install.mdx b/docs/src/content/docs/en/getting-started/install.mdx new file mode 100644 index 00000000..6f08c121 --- /dev/null +++ b/docs/src/content/docs/en/getting-started/install.mdx @@ -0,0 +1,242 @@ +--- +title: How to install Castopod? +--- + +import { Aside } from "@astrojs/starlight/components"; + +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. + +## Requirements + +- PHP v8.1 or higher +- MySQL version 5.7 or higher or MariaDB version 10.2 or higher +- HTTPS support +- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's + incoming requests + +### PHP v8.1 or higher + +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. +- [exif](https://www.php.net/manual/en/exif.installation.php) + +Additionally, make sure that the following extensions are enabled in your PHP: + +- json (enabled by default - don't turn it off) +- xml (enabled by default - don't turn it off) +- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php) + +### MySQL compatible database + +> We recommend using [MariaDB](https://mariadb.org). + +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. + +#### Privileges + +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`. + +### (Optional) FFmpeg v4.1.8 or higher for Video Clips + +[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: + +- **FreeType 2** library for + [gd](https://www.php.net/manual/en/image.installation.php). + +### (Optional) Other recommendations + +- Redis for better cache performances. +- CDN for static files caching and better performances. +- e-mail gateway for lost passwords. + +## Install instructions + +### Pre-requisites + +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 haven’t 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): + + ```bash + * * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1 + ``` + + **Note** - If you do not add this cron task, the following Castopod features + will not work: + + - Importing a podcast from an existing RSS feed + - Broadcasting social activities to your followers in the fediverse + - Broadcasting episodes to open hubs using + [WebSub](https://en.wikipedia.org/wiki/WebSub) + - Generating video clips - + [requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips) + +### (recommended) Install Wizard + +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! + + + +### Using CLI + +1. Create a `.env` file in the package root based on the `.env.example` file. +2. Initialize the database using: + + ```sh + php spark install:init-database + ``` + +3. Create the superadmin user using: + + ```sh + php spark install:create-superadmin + ``` + +4. Head on to your admin gateway to start podcasting! + +### Email/SMTP setup + +Email configuration is required for some features to work properly (eg. +retrieving your forgotten password, sending instructions to premium subscribers, +…) + +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" +``` + +#### Email config options + +| 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"` | + +### Media storage + +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 + +If you prefer storing your media files on an S3 compatible storage, you may +specify it in your `.env`: + +```ini +# […] + +media.fileManager="s3" +media.s3.endpoint="your_s3_host" +media.s3.key="your_s3_key" +media.s3.secret="your_s3_secret" +media.s3.region="your_s3_region" +``` + +#### S3 config options + +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | + +## Community packages + +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. + +### Install with 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. + + diff --git a/docs/src/da/getting-started/security.md b/docs/src/content/docs/en/getting-started/security.mdx similarity index 95% rename from docs/src/da/getting-started/security.md rename to docs/src/content/docs/en/getting-started/security.mdx index e205698d..c039493c 100644 --- a/docs/src/da/getting-started/security.md +++ b/docs/src/content/docs/en/getting-started/security.mdx @@ -1,9 +1,7 @@ --- -title: Security +title: Security concerns --- -# Security concerns - 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). diff --git a/docs/src/eu/getting-started/update.md b/docs/src/content/docs/en/getting-started/update.mdx similarity index 96% rename from docs/src/eu/getting-started/update.md rename to docs/src/content/docs/en/getting-started/update.mdx index 98e019fb..f1a26974 100644 --- a/docs/src/eu/getting-started/update.md +++ b/docs/src/content/docs/en/getting-started/update.mdx @@ -1,9 +1,8 @@ --- -title: Update -sidebarDepth: 3 +title: How to update Castopod? --- -# How to update Castopod? +import { Aside } from "@astrojs/starlight/components"; 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 @@ -36,12 +35,12 @@ improvements ⚡. - Remove all files except `.env` and `public/media` - Copy the new files from the downloaded package into your server - ::: info Note + 4. Update your database schema from your `Castopod Admin` > `About` page or by running: @@ -54,7 +53,7 @@ improvements ⚡. `Housekeeping` 6. ✨ Enjoy your fresh instance, you're all done! -::: info Note + ## Fully Automated updates diff --git a/docs/src/content/docs/en/index.mdx b/docs/src/content/docs/en/index.mdx new file mode 100644 index 00000000..1a8364b9 --- /dev/null +++ b/docs/src/content/docs/en/index.mdx @@ -0,0 +1,194 @@ +--- +title: Welcome 👋 +--- + +import { LinkCard } from "@astrojs/starlight/components"; + +Castopod is a free & open-source hosting platform made for podcasters who want +engage and interact with their audience. + +Castopod is easy to install and was built on top of +[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very +small footprint. + + + +## Features + +- 🌱  Free & open-source (AGPL v3 License) +- 🔐  Focused on data sovereignty: your content, audience, and analytics + belong to you, and you only +- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, + chapters, location, persons, soundbites, … +- 💬  Built-in social network: + - 🚀  Castopod is part of the Fediverse, a decentralized social network + - ❤️  Create posts, share, favourite, and comment on episodes +- 📈  Built-in analytics: + - ⚖️  GDPR / CCPA / LGPD compliant + - 🪙  Standard IABv2 audience measurement + - 🏡  On-premises analytics, no third party involved +- 📢  Built-in marketing tools: + - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) + - 📱  PWA: install as a standalone app + - 🎨  Customizable theme colors + - 🎬  Generate ready-to-share Video clips from episodes + - 🔉  Generate soundbites + - ▶️  Embeddable player, embed your episodes on any website +- 💸  Monetization: + - 🔗  Funding links + - 📲  listen-to-click ads + - 🤝  value4value / WebMonetization + - 💎  Premium podcasts +- 📡  Publish your episodes everywhere with RSS: + - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, + Google Podcasts, Deezer, Podcast Addict, Podfriend, … + - ⚡  Broadcast your episodes instantly with WebSub +- 📥  Podcast import: move your existing podcast into Castopod +- 📤  Move your podcast out of Castopod +- 🔀  Multi-tenant: host as many podcasts as you want +- 👥  Multi-user: add contributors and set roles +- 🌎  i18n support: translated in English, French, Polish, German, + Brazilian Portuguese, Spanish, simplified Chinese… and + [many more](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. + +It is in fact one of the only media to have stayed this way for a long time. + +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. + +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized 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. + +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. + +## Comparison with other solutions + +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 you. + +### 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 it. + +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. + +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. + +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 journey. + +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. + +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! + +### 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 was initially built around music. And later on, as the project +evolved, the ability to host podcasts was introduced. + +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, …). + +So, you should probably use Funkwhale if you want to host your music, and use +Castopod if you want to host your podcasts. + +### Castopod vs other podcast hosts + +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! + +Each of these solutions differ from one another, you may compare with the +[list of features](#features). + +That being said, there are two main differences with other podcasting solutions: + +- 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 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. + +## Contributing + +Love Castopod and would like to help? Take a look at the following documentation +to get you started. + +### Code of conduct + +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 tolerated. + +### Contributing guide + +Read our +[contributing guide](https://code.castopod.org/adaures/castopod/-/blob/develop/CONTRIBUTING.md) +to learn about our development process, how to propose bugfixes and +improvements, and how to build and test your changes to Castopod. + +## Contact + +You may reach us for help or ask any question you have on: + +- [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) + +Alternatively, you can follow us on social media platforms to get news about +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 + +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). + +[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/) + +[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/) + +## License + +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) + +Copyright © 2020-present, [Ad Aures](https://adaures.com/). diff --git a/docs/src/es/getting-started/auth.md b/docs/src/content/docs/es/getting-started/auth.mdx similarity index 50% rename from docs/src/es/getting-started/auth.md rename to docs/src/content/docs/es/getting-started/auth.mdx index 9024c6c0..53f0a67c 100644 --- a/docs/src/es/getting-started/auth.md +++ b/docs/src/content/docs/es/getting-started/auth.mdx @@ -1,10 +1,7 @@ --- title: Autenticación & Autenticación -sidebarDepth: 3 --- -# Autenticación & Autenticación - Castopod gestiona la autenticación y autorización usando `codeignitor/escudo` emparejado con reglas personalizadas. Los roles y permisos se definen en dos niveles: @@ -16,21 +13,21 @@ niveles: ### Roles de instancia - +{/* AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section */} -| roles | descripción | permisos | +| role | description | permissions | | ------------------- | -------------------------------------- | ------------------------------------------------------------------------------------------ | | Super administrador | Tiene control completo sobre Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Administrador | Gestiona el contenido de Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Administrador | Administrar contenido de Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | | Podcaster | Usuarios generales de Castopod. | admin.access | - +{/* AUTH-INSTANCE-ROLES-LIST:END */} ### Permisos de instancia - +{/* AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section */} -| permisos | descripción | +| permission | description | | ----------------------- | ------------------------------------------------------------------------------ | | admin.access | Puedes acceder al área de administración de Castopod. | | admin.settings | Puede acceder a la configuración de Castopod. | @@ -42,47 +39,47 @@ niveles: | podcasts.import | Puede importar podcasts. | | fediverse.manage-blocks | Puedes bloquear la interacción de actores/dominios del fediverso con Castopod. | - +{/* AUTH-INSTANCE-PERMISSIONS-LIST:END */} ## 2. Permisos y roles por podcast ### Roles por podcast - +{/* AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section */} -| roles | descripción | permisos | -| ------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Administrador | Tiene el control completo del podcast #{id}. | \* | -| Editor | Gestiona el contenido y las publicaciones del podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| Autor | Gestiona el contenido del podcast #{id} pero no puede publicarlo. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Invitado | Colaborador general del podcast #{id}. | view, episodes.view | +| role | description | permissions | +| ------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Administrador | Tiene el control completo del podcast #\{id\}. | \* | +| Editor | Gestiona el contenido y las publicaciones del podcast #\{id\}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Autor | Gestiona el contenido del podcast #\{id\} pero no puede publicarlo. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Invitado | Colaborador general del podcast #\{id\}. | view, episodes.view | - +{/* AUTH-PODCAST-ROLES-LIST:END */} ### Permisos por podcast - +{/* AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section */} -| permisos | descripción | -| ---------------------------- | -------------------------------------------------------------------------------------------------- | -| view | Puede ver el panel de control y análisis del podcast #{id}. | -| edit | Puede editar podcast #{id}. | -| delete | Puede borrar el podcast #{id}. | -| manage-import | Puede sincronizar el podcast importado #{id}. | -| manage-persons | Puede administrar las suscripciones del podcast #{id}. | -| manage-subscriptions | Puede administrar las suscripciones del podcast #{id}. | -| manage-contributors | Puede administrar colaboradores del podcast #{id}. | -| manage-platforms | Puede establecer/eliminar enlaces a la plataforma del podcast #{id}. | -| manage-publications | Puede publicar el podcast #{id}. | -| manage-notifications | Puede ver y marcar las notificaciones como leídas para podcast #{id}. | -| interact-as | Puede interactuar como el podcast #{id} para favoritar, compartir o responder a las publicaciones. | -| episodes.view | Puede ver el panel de control y analíticas del episodio #{id}. | -| episodes.create | Puede crear episodios para el podcast #{id}. | -| episodes.edit | Puede editar episodios #{id}. | -| episodes.delete | Puede borrar el podcast #{id}. | -| episodes.manage-persons | Puede administrar las suscripciones del podcast #{id}. | -| episodes.manage-clips | Puedes administrar video clips o sonidos del podcast #{id}. | -| episodes.manage-publications | Puede publicar el podcast #{id}. | -| episodes.manage-comments | Puede crear/eliminar los comentarios de episodio del podcast #{id}. | +| permission | description | +| ---------------------------- | --------------------------------------------------------------------------------------------------------------- | +| view | Puede ver el panel de control y analíticas del episodio #\{id\}. | +| edit | Puede editar el podcast #\{id\}. | +| delete | Puede borrar el podcast #\{id\}. | +| manage-import | Puede sincronizar el podcast importado #\{id\}. | +| manage-persons | Puede administrar las suscripciones del podcast #\{id\}. | +| manage-subscriptions | Puede administrar las suscripciones del podcast #\{id\}. | +| manage-contributors | Puede administrar colaboradores del podcast #\{id\}. | +| manage-platforms | Puede establecer/eliminar enlaces a la plataforma del podcast #\{id\}. | +| manage-publications | Puede publicar el podcast #\{id\}. | +| manage-notifications | Puede ver y marcar las notificaciones como leídas para podcast #\{id\}. | +| interact-as | Puede interactuar como el podcast #\{id\} para marcar como favarito, compartir o responder a las publicaciones. | +| episodes.view | Puede ver el panel de control y analíticas del episodio #\{id\}. | +| episodes.create | Puede crear episodios para el podcast #\{id\}. | +| episodes.edit | Puede editar episodios del podcast #\{id\}. | +| episodes.delete | Puede borrar episodios del podcast #\{id\}. | +| episodes.manage-persons | Puede administrar las personas de los episodios del podcast #\{id\}. | +| episodes.manage-clips | Puedes administrar video clips o sonidos del podcast #\{id\}. | +| episodes.manage-publications | Puede publicar/despublicar episodios y publicaciones del podcast #\{id\}. | +| episodes.manage-comments | Puede crear/eliminar los comentarios de episodio del podcast #\{id\}. | - +{/* AUTH-PODCAST-PERMISSIONS-LIST:END */} diff --git a/docs/src/es/getting-started/docker.md b/docs/src/content/docs/es/getting-started/docker.mdx similarity index 99% rename from docs/src/es/getting-started/docker.md rename to docs/src/content/docs/es/getting-started/docker.mdx index 63c2cf95..24a04ee2 100644 --- a/docs/src/es/getting-started/docker.md +++ b/docs/src/content/docs/es/getting-started/docker.mdx @@ -1,10 +1,7 @@ --- title: Imágenes oficiales de Docker -sidebarDepth: 3 --- -# Imágenes oficiales de Docker - Castopod lanza 3 imágenes Docker al Docker Hub durante su proceso de construcción automatizada: diff --git a/docs/src/es/getting-started/install.md b/docs/src/content/docs/es/getting-started/install.mdx similarity index 82% rename from docs/src/es/getting-started/install.md rename to docs/src/content/docs/es/getting-started/install.mdx index a01fa4c3..dd575eb6 100644 --- a/docs/src/es/getting-started/install.md +++ b/docs/src/content/docs/es/getting-started/install.mdx @@ -1,22 +1,21 @@ --- -title: Instalación -sidebarDepth: 3 +title: ¿Cómo instalar Castopod? --- -# ¿Cómo instalar Castopod? +import { Aside } from "@astrojs/starlight/components"; Castopod está pensado para ser fácil de instalar. Ya sea usando un alojamiento dedicado o compartido, puedes instalarlo en la mayoría de servidores web compatibles con PHP-MySQL. -::: tip Nota + ## Requisitos @@ -47,14 +46,6 @@ Además, asegúrate de que las siguientes extensiones están habilitadas en tu P > Se recomienda usar [MariaDB](https://mariadb.org). -::: warning Alerta - -Castopod solo funciona con base de datos compatibles con MySQL 5.7 o superior. -No funcionará por ejemplo con la version previa MySQL v5.6, ya que su vida útil -terminó el 5 de febrero de 2021. - -::: - Necesitarás la dirección/nombre del servidor (hostname), el nombre de la base de datos, el usuario y la contraseña para completar el proceso de instalación. Si no cuentas con esta información, contacta con el administrador de tu servidor. @@ -118,13 +109,13 @@ extensiones: 2. Sigue las instrucciones en pantalla. 3. ¡Empieza a hacer podcasting! -::: info Nota + ### Using CLI @@ -230,13 +221,35 @@ self-hosting for you. diff --git a/docs/src/es/getting-started/security.md b/docs/src/content/docs/es/getting-started/security.mdx similarity index 95% rename from docs/src/es/getting-started/security.md rename to docs/src/content/docs/es/getting-started/security.mdx index 58c13a76..41825cf6 100644 --- a/docs/src/es/getting-started/security.md +++ b/docs/src/content/docs/es/getting-started/security.mdx @@ -1,9 +1,7 @@ --- -title: Seguridad +title: Problemas de seguridad --- -# Problemas de seguridad - Castopod está construido sobre [CodeIgniter4](https://codeigniter.com/), un framework de PHP que alienta [buenas prácticas de seguridad](https://codeigniter.com/user_guide/concepts/security.html). diff --git a/docs/src/es/getting-started/update.md b/docs/src/content/docs/es/getting-started/update.mdx similarity index 96% rename from docs/src/es/getting-started/update.md rename to docs/src/content/docs/es/getting-started/update.mdx index bf7552ea..77e8fd96 100644 --- a/docs/src/es/getting-started/update.md +++ b/docs/src/content/docs/es/getting-started/update.mdx @@ -1,9 +1,8 @@ --- -title: Actualización -sidebarDepth: 3 +title: ¿Cómo actualizar Castopod? --- -# ¿Cómo actualizar Castopod? +import { Aside } from "@astrojs/starlight/components"; Después de instalar Castopod, es posible que quieras actualizar tu instancia a la última versión para disfrutar de las últimas características ✨, correcciones @@ -36,13 +35,13 @@ de errores 🐛 y mejoras de rendimiento ⚡. - Eliminar todos los archivos excepto `.env` y la carpeta `public/media` - Copie los nuevos archivos del paquete descargado en su servidor - ::: Nota informativa + 4. Actualice su esquema de base de datos desde su `Administrador de Castopod` > `Acerca de` página o ejecutando: @@ -55,7 +54,7 @@ de errores 🐛 y mejoras de rendimiento ⚡. `Housekeeping` 6. ✨ ¡Disfruta de tu instancia recién instalada, todo listo! -::: Nota informativa + ## Actualizaciones totalmente automatizadas diff --git a/docs/src/content/docs/es/index.mdx b/docs/src/content/docs/es/index.mdx new file mode 100644 index 00000000..d833d105 --- /dev/null +++ b/docs/src/content/docs/es/index.mdx @@ -0,0 +1,1402 @@ +--- +title: Bienvenido 👋 +--- + +import { LinkCard } from "@astrojs/starlight/components"; + +Castopod es una plataforma gratuita y de código abierto para hospedar podcasts +hecha para podcasters que quieren involucrar e interactuar más con su audiencia. + +Castopod es fácil de instalar y se ha desarrollado sobre +[CodeIgniter4](https://codeigniter.com/), un potente y muy ligero framework PHP. + + + +## Características + +- 🌱  Gratis & de código abierto (licencia AGPL v3). +- 🔐  Centrado en la soberanía de los datos: tu contenido, tu audiencia, y + tus estadísticas te pertenecen a ti y solo a ti. +- 🪄  Funciones de Podcasting 2.0: GUID (interfaz gráfica de usuario), + protección y bloqueo del podcast, transcripciones, monetización, episodios, + geo-localización, personas, fragmentos de audio, … +- 💬  Integración con redes sociales: + - 🚀  Castopod es parte del Fediverso, una red social descentralizada + - ❤️  Se puede crear mensajes, compartir, agregar a favoritos y comentar + en episodios +- 📈  Análisis estadísticos integrados: + - ⚖️  Compatible con GDPR / CCPA / LGPD + - 🪙  Medida de audiencia con el estándar IABv2 + - 🏡  Estadísticas sin terceras partes involucradas +- 📢  Herramientas de marketing incorporadas: + - ✅  Listo para SEO (meta-etiquetas de open-graph, JSON-LD, …) + - 📱  PWA: instalable como una aplicación independiente + - 🎨  Personalizar los colores del tema + - 🎬  Generar recortes de vídeo listos para compartir, a partir de tus + episodios + - 🔉  Generar fragmentos de audio (Soundbites) para la promoción de tus + episodios. + - ▶️  Reproductor incrustable, con el que insertar tus episodios en + cualquier sitio web! +- 💸  Monetización: + - 🔗  Enlaces de financiación + - 📲  Anuncios publicitarios del tipo click-para-escuchar + - 🤝  value4value / WebMonetization (criptomonedas para creadores de + contenido). + - 💎  Premium podcasts +- 📡  Publica tus episodios en todas partes con RSS: + - 📱  En todos los directorios y aplicaciones: Podcast Index, Apple + Podcasts, Spotify, Google Podcasts, Deezer, Podcast Addict, Podfriend, … + - ⚡  Emite tus episodios al instante con WebSub. +- 📥  Importación de podcasts: mueve tu podcast existente en otro servicio + a tu servidor Castopod. +- 📤  Mueve tu podcast fuera de Castopod. +- 🔀  Multi-podcast: aloja tantos podcasts como quieras en una misma + instancia/panel de CASTOPOD. +- 👥  Multi-usuario: añade colaboradores y define roles. +- 🌎  Soporte multilingüe i18n: traducido al Inglés, Francés, Polaco, + Alemán, Portugués brasileño, Español, Noruego, … ¡y + [más por venir](https://translate.castopod.org)! + +## Motivación + +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. + +It is in fact one of the only media to have stayed this way for a long time. + +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. + +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized 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. + +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. + +## Comparación con otras soluciones + +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 you. + +### 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 it. + +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. + +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. + +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 journey. + +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. + +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! + +### 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 was initially built around music. And later on, as the project +evolved, the ability to host podcasts was introduced. + +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, …). + +So, you should probably use Funkwhale if you want to host your music, and use +Castopod if you want to host your podcasts. + +### Castopod vs. otras plataformas de podcast + +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! + +Each of these solutions differ from one another, you may compare with the +[list of features](#features). + +That being said, there are two main differences with other podcasting solutions: + +- Castopod puede ser auto-hospedado en tu propio servidor y es la única solución + que te permite mantener un control completo sobre los contenidos que produces. + También, como es de código abierto, puedes incluso personalizarlo como desees + y necesites. + +- Castopod es la única solución que hasta el momento integra tanto una red + social descentralizada con ActivityPub así como muchas de las características + del podcasting 2.0, con la esperanza de cerrar la brecha entre ambos. + +## Cómo colaborar + +Love Castopod and would like to help? Take a look at the following documentation +to get you started. + +### Código de conducta + +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 tolerated. + +### Guía para colaborar + +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. + +## Colaboradores ✨ + +Thanks goes to these wonderful people +([emoji key](https://allcontributors.org/docs/en/emoji-key)): + +{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */} +{/* prettier-ignore-start */} +{/* markdownlint-disable */} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Yassine Doghri +
+ + Yassine Doghri + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 📖 + {" "} + + 👀 + {" "} + + 🚧 + {" "} + + 🖋 + {" "} + + 🎨 + {" "} + + ️️️️♿️ + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🧑‍🏫 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📆 + {" "} + + 📝 + +
+ + Benjamin Bellamy +
+ + Benjamin Bellamy + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 👀 + {" "} + + 🖋 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📝 + {" "} + + 📆 + {" "} + + 📢 + +
+ + Ola Hneini +
+ + Ola Hneini + +
+
+ + 💻 + {" "} + + 👀 + {" "} + + 📖 + {" "} + + 🚧 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Romain de Laage +
+ + Romain de Laage + +
+
+ + 💻 + {" "} + + 🚇 + {" "} + + 📖 + {" "} + + 🌍 + {" "} + + 🤔 + +
+ + Lyonel Bernard +
+ + Lyonel Bernard + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Christopher Lagonick-Weitzel +
+ + Christopher Lagonick-Weitzel + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Ernesto Acosta +
+ + Ernesto Acosta + +
+
+ + 🐛 + {" "} + + 🔊 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Ewen +
+ + Ewen + +
+
+ + 🌍 + {" "} + + 🤔 + {" "} + + 💻 + +
+ + Bastien Luneteau +
+ + Bastien Luneteau + +
+
+ + 💻 + {" "} + + 🐛 + +
+ + Cécile Ricordeau +
+ + Cécile Ricordeau + +
+
+ + 🎨 + +
+ + Patryk Miś +
+ + Patryk Miś + +
+
+ + 🌍 + +
+ + Marcin Lewandowski +
+ + Marcin Lewandowski + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Sebastian Janik +
+ + Sebastian Janik + +
+
+ + 💻 + +
+ + Patryk Karczmarczyk +
+ + Patryk Karczmarczyk + +
+
+ + 💻 + +
+ + denis d +
+ + denis d + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Douglas Kastle +
+ + Douglas Kastle + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + cExplorer +
+ + cExplorer + +
+
+ + 🐛 + {" "} + + 🌍 + +
+ + ImaCrea +
+ + ImaCrea + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Jonas S +
+ + Jonas S + +
+
+ + 💻 + +
+ + LEFEBVRE Yann +
+ + LEFEBVRE Yann + +
+
+ + 🐛 + +
+ + Sebastian Späth +
+ + Sebastian Späth + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + rocky III +
+ + rocky III + +
+
+ + 🐛 + +
+ + Hermann Josef Eckl +
+ + Hermann Josef Eckl + +
+
+ + 🐛 + +
+ + Delhaye Cyrille +
+ + Delhaye Cyrille + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + João Leandro +
+ + João Leandro + +
+
+ + 🌍 + {" "} + + 🤔 + +
+ + Angelos Chouvardas +
+ + Angelos Chouvardas + +
+
+ + 🌍 + +
+ + Eivind +
+ + Eivind + +
+
+ + 🌍 + +
+ + forght +
+ + forght + +
+
+ + 🌍 + +
+ + glottis0q +
+ + glottis0q + +
+
+ + 🌍 + +
+ + ButterflyOfFire +
+ + ButterflyOfFire + +
+
+ + 🌍 + +
+ + Lucian I. Last +
+ + Lucian I. Last + +
+
+ + 🌍 + +
+ + LuuzViir +
+ + LuuzViir + +
+
+ + 🌍 + +
+ + CTHTC +
+ + CTHTC + +
+
+ + 🌍 + +
+ + Russian Retro +
+ + Russian Retro + +
+
+ + 🌍 + +
+ + Marek L'ach +
+ + Marek L'ach + +
+
+ + 🌍 + +
+ + GunChleoc +
+ + GunChleoc + +
+
+ + 🌍 + +
+ + GabiSnow +
+ + GabiSnow + +
+
+ + 🌍 + +
+ + bendaha +
+ + bendaha + +
+
+ + 🌍 + +
+ + Samuel Roland +
+ + Samuel Roland + +
+
+ + 🌍 + +
+ + Dimitri Regnier +
+ + Dimitri Regnier + +
+
+ + 🤔 + +
+ + irithys +
+ + irithys + +
+
+ + 🌍 + +
+ + Sergi +
+ + Sergi + +
+
+ + 🌍 + +
+ + ghose (XoseM) +
+ + ghose (XoseM) + +
+
+ + 🌍 + +
+ + Andreas Olsson +
+ + Andreas Olsson + +
+
+ + 🌍 + +
+ + leonfrom +
+ + leonfrom + +
+
+ + 🌍 + +
+ + agentcobra +
+ + agentcobra + +
+
+ + 🌍 + +
+ + Alessandro +
+ + Alessandro + +
+
+ + 🌍 + +
+ + liimee +
+ + liimee + +
+
+ + 🌍 + +
+ + Ahmed Sabouni +
+ + Ahmed Sabouni + +
+
+ + 🌍 + +
+ + KrzysztofDomanczyk +
+ + KrzysztofDomanczyk + +
+
+ + 💻 + +
+ + Guy Martin +
+ + Guy Martin + +
+
+ + 🐛 + {" "} + + 💻 + +
+ +{/* markdownlint-restore */} +{/* prettier-ignore-end */} + +{/* ALL-CONTRIBUTORS-LIST:END */} + +This project follows the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind welcome! + +## Contacto + +You may reach us for help or ask any question you have on: + +- [Discord](https://castopod.org/discord) (para interacción directa con + desarrolladores y la comunidad) +- [Seguimiento de incidencias](https://code.castopod.org/adaures/castopod/-/issues) + (para informar de errores y solicitar nuevas funcionalidades) + +Alternatively, you can follow us on social media platforms to get news about +Castopod: + +- [podlibre.social](https://podlibre.social/@castopod) (instancia de Mastodon) +- [[Twitter](https://twitter.com/castopod)](https://twitter.com/castopod) +- [[LinkedIn](https://linkedin.com/company/ad-aures)](https://linkedin.com/company/castopod) +- [Facebook (próximamente?)](https://www.facebook.com/castopod) + +## Patrocinadores + +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). + + + +## Licencia + +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) + +Copyright © 2020-present, [Ad Aures](https://adaures.com/). diff --git a/docs/src/ar/getting-started/auth.md b/docs/src/content/docs/eu/getting-started/auth.mdx similarity index 56% rename from docs/src/ar/getting-started/auth.md rename to docs/src/content/docs/eu/getting-started/auth.mdx index ff5d59c0..d4dd4dd5 100644 --- a/docs/src/ar/getting-started/auth.md +++ b/docs/src/content/docs/eu/getting-started/auth.mdx @@ -1,10 +1,7 @@ --- 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: @@ -15,7 +12,7 @@ coupled with custom rules. Roles and permissions are defined at two levels: ### Instance roles - +{/* AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section */} | role | description | permissions | | ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | @@ -23,11 +20,11 @@ coupled with custom rules. Roles and permissions are defined at two levels: | 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 | | ----------------------- | ------------------------------------------------------------------ | @@ -41,47 +38,47 @@ coupled with custom rules. Roles and permissions are defined at two levels: | 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, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| 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 | +| 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, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| 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}. | +| 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 dashboards and analytics of podcast #\{id\}'s episodes. | +| episodes.create | Can create episodes for podcast #\{id\}. | +| episodes.edit | Can edit episodes of podcast #\{id\}. | +| episodes.delete | Can delete episodes of podcast #\{id\}. | +| episodes.manage-persons | Can manage episode persons of podcast #\{id\}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #\{id\}. | +| episodes.manage-publications | Can publish/unpublish episodes and posts of podcast #\{id\}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #\{id\}. | - +{/* AUTH-PODCAST-PERMISSIONS-LIST:END */} diff --git a/docs/src/da/getting-started/docker.md b/docs/src/content/docs/eu/getting-started/docker.mdx similarity index 99% rename from docs/src/da/getting-started/docker.md rename to docs/src/content/docs/eu/getting-started/docker.mdx index 12f01619..6141377f 100644 --- a/docs/src/da/getting-started/docker.md +++ b/docs/src/content/docs/eu/getting-started/docker.mdx @@ -1,10 +1,7 @@ --- title: Official Docker images -sidebarDepth: 3 --- -# Official Docker images - Castopod pushes 3 Docker images to the Docker Hub during its automated build process: diff --git a/docs/src/da/getting-started/install.md b/docs/src/content/docs/eu/getting-started/install.mdx similarity index 81% rename from docs/src/da/getting-started/install.md rename to docs/src/content/docs/eu/getting-started/install.mdx index cdea18ec..d8888954 100644 --- a/docs/src/da/getting-started/install.md +++ b/docs/src/content/docs/eu/getting-started/install.mdx @@ -1,21 +1,20 @@ --- -title: Installation -sidebarDepth: 3 +title: How to install Castopod? --- -# How to install Castopod? +import { Aside } from "@astrojs/starlight/components"; 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. -::: tip Note + ## Requirements @@ -46,14 +45,6 @@ Additionally, make sure that the following extensions are enabled in your PHP: > We recommend using [MariaDB](https://mariadb.org). -::: warning Warning - -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. - -::: - 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. @@ -115,13 +106,13 @@ want to generate Video Clips. The following extensions must be installed: 2. Follow the instructions on your screen. 3. Start podcasting! -::: info Note + ### Using CLI @@ -226,13 +217,35 @@ self-hosting for you. diff --git a/docs/src/el/getting-started/security.md b/docs/src/content/docs/eu/getting-started/security.mdx similarity index 95% rename from docs/src/el/getting-started/security.md rename to docs/src/content/docs/eu/getting-started/security.mdx index e205698d..c039493c 100644 --- a/docs/src/el/getting-started/security.md +++ b/docs/src/content/docs/eu/getting-started/security.mdx @@ -1,9 +1,7 @@ --- -title: Security +title: Security concerns --- -# Security concerns - 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). diff --git a/docs/src/el/getting-started/update.md b/docs/src/content/docs/eu/getting-started/update.mdx similarity index 96% rename from docs/src/el/getting-started/update.md rename to docs/src/content/docs/eu/getting-started/update.mdx index 98e019fb..f1a26974 100644 --- a/docs/src/el/getting-started/update.md +++ b/docs/src/content/docs/eu/getting-started/update.mdx @@ -1,9 +1,8 @@ --- -title: Update -sidebarDepth: 3 +title: How to update Castopod? --- -# How to update Castopod? +import { Aside } from "@astrojs/starlight/components"; 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 @@ -36,12 +35,12 @@ improvements ⚡. - Remove all files except `.env` and `public/media` - Copy the new files from the downloaded package into your server - ::: info Note + 4. Update your database schema from your `Castopod Admin` > `About` page or by running: @@ -54,7 +53,7 @@ improvements ⚡. `Housekeeping` 6. ✨ Enjoy your fresh instance, you're all done! -::: info Note + ## Fully Automated updates diff --git a/docs/src/content/docs/eu/index.mdx b/docs/src/content/docs/eu/index.mdx new file mode 100644 index 00000000..c3769fc2 --- /dev/null +++ b/docs/src/content/docs/eu/index.mdx @@ -0,0 +1,1381 @@ +--- +title: Welcome 👋 +--- + +import { LinkCard } from "@astrojs/starlight/components"; + +Castopod is a free & open-source hosting platform made for podcasters who want +engage and interact with their audience. + +Castopod is easy to install and was built on top of +[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very +small footprint. + + + +## Features + +- 🌱  Free & open-source (AGPL v3 License) +- 🔐  Focused on data sovereignty: your content, audience, and analytics + belong to you, and you only +- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, + chapters, location, persons, soundbites, … +- 💬  Built-in social network: + - 🚀  Castopod is part of the Fediverse, a decentralized social network + - ❤️  Create posts, share, favourite, and comment on episodes +- 📈  Built-in analytics: + - ⚖️  GDPR / CCPA / LGPD compliant + - 🪙  Standard IABv2 audience measurement + - 🏡  On-premises analytics, no third party involved +- 📢  Built-in marketing tools: + - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) + - 📱  PWA: install as a standalone app + - 🎨  Customizable theme colors + - 🎬  Generate ready-to-share Video clips from episodes + - 🔉  Generate soundbites + - ▶️  Embeddable player, embed your episodes on any website +- 💸  Monetization: + - 🔗  Funding links + - 📲  listen-to-click ads + - 🤝  value4value / WebMonetization + - 💎  Premium podcasts +- 📡  Publish your episodes everywhere with RSS: + - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, + Google Podcasts, Deezer, Podcast Addict, Podfriend, … + - ⚡  Broadcast your episodes instantly with WebSub +- 📥  Podcast import: move your existing podcast into Castopod +- 📤  Move your podcast out of Castopod +- 🔀  Multi-tenant: host as many podcasts as you want +- 👥  Multi-user: add contributors and set roles +- 🌎  i18n support: translated in English, French, Polish, German, + Brazilian Portuguese & Spanish… with + [more to come](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. + +It is in fact one of the only media to have stayed this way for a long time. + +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. + +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized 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. + +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. + +## Comparison with other solutions + +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 you. + +### 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 it. + +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. + +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. + +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 journey. + +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. + +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! + +### 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 was initially built around music. And later on, as the project +evolved, the ability to host podcasts was introduced. + +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, …). + +So, you should probably use Funkwhale if you want to host your music, and use +Castopod if you want to host your podcasts. + +### Castopod vs other podcast hosts + +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! + +Each of these solutions differ from one another, you may compare with the +[list of features](#features). + +That being said, there are two main differences with other podcasting solutions: + +- 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 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. + +## Contributing + +Love Castopod and would like to help? Take a look at the following documentation +to get you started. + +### Code of conduct + +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 tolerated. + +### Contributing 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. + +## Contributors ✨ + +Thanks goes to these wonderful people +([emoji key](https://allcontributors.org/docs/en/emoji-key)): + +{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */} +{/* prettier-ignore-start */} +{/* markdownlint-disable */} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Yassine Doghri +
+ + Yassine Doghri + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 📖 + {" "} + + 👀 + {" "} + + 🚧 + {" "} + + 🖋 + {" "} + + 🎨 + {" "} + + ️️️️♿️ + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🧑‍🏫 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📆 + {" "} + + 📝 + +
+ + Benjamin Bellamy +
+ + Benjamin Bellamy + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 👀 + {" "} + + 🖋 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📝 + {" "} + + 📆 + {" "} + + 📢 + +
+ + Ola Hneini +
+ + Ola Hneini + +
+
+ + 💻 + {" "} + + 👀 + {" "} + + 📖 + {" "} + + 🚧 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Romain de Laage +
+ + Romain de Laage + +
+
+ + 💻 + {" "} + + 🚇 + {" "} + + 📖 + {" "} + + 🌍 + {" "} + + 🤔 + +
+ + Lyonel Bernard +
+ + Lyonel Bernard + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Christopher Lagonick-Weitzel +
+ + Christopher Lagonick-Weitzel + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Ernesto Acosta +
+ + Ernesto Acosta + +
+
+ + 🐛 + {" "} + + 🔊 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Ewen +
+ + Ewen + +
+
+ + 🌍 + {" "} + + 🤔 + {" "} + + 💻 + +
+ + Bastien Luneteau +
+ + Bastien Luneteau + +
+
+ + 💻 + {" "} + + 🐛 + +
+ + Cécile Ricordeau +
+ + Cécile Ricordeau + +
+
+ + 🎨 + +
+ + Patryk Miś +
+ + Patryk Miś + +
+
+ + 🌍 + +
+ + Marcin Lewandowski +
+ + Marcin Lewandowski + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Sebastian Janik +
+ + Sebastian Janik + +
+
+ + 💻 + +
+ + Patryk Karczmarczyk +
+ + Patryk Karczmarczyk + +
+
+ + 💻 + +
+ + denis d +
+ + denis d + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Douglas Kastle +
+ + Douglas Kastle + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + cExplorer +
+ + cExplorer + +
+
+ + 🐛 + {" "} + + 🌍 + +
+ + ImaCrea +
+ + ImaCrea + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Jonas S +
+ + Jonas S + +
+
+ + 💻 + +
+ + LEFEBVRE Yann +
+ + LEFEBVRE Yann + +
+
+ + 🐛 + +
+ + Sebastian Späth +
+ + Sebastian Späth + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + rocky III +
+ + rocky III + +
+
+ + 🐛 + +
+ + Hermann Josef Eckl +
+ + Hermann Josef Eckl + +
+
+ + 🐛 + +
+ + Delhaye Cyrille +
+ + Delhaye Cyrille + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + João Leandro +
+ + João Leandro + +
+
+ + 🌍 + {" "} + + 🤔 + +
+ + Angelos Chouvardas +
+ + Angelos Chouvardas + +
+
+ + 🌍 + +
+ + Eivind +
+ + Eivind + +
+
+ + 🌍 + +
+ + forght +
+ + forght + +
+
+ + 🌍 + +
+ + glottis0q +
+ + glottis0q + +
+
+ + 🌍 + +
+ + ButterflyOfFire +
+ + ButterflyOfFire + +
+
+ + 🌍 + +
+ + Lucian I. Last +
+ + Lucian I. Last + +
+
+ + 🌍 + +
+ + LuuzViir +
+ + LuuzViir + +
+
+ + 🌍 + +
+ + CTHTC +
+ + CTHTC + +
+
+ + 🌍 + +
+ + Russian Retro +
+ + Russian Retro + +
+
+ + 🌍 + +
+ + Marek L'ach +
+ + Marek L'ach + +
+
+ + 🌍 + +
+ + GunChleoc +
+ + GunChleoc + +
+
+ + 🌍 + +
+ + GabiSnow +
+ + GabiSnow + +
+
+ + 🌍 + +
+ + bendaha +
+ + bendaha + +
+
+ + 🌍 + +
+ + Samuel Roland +
+ + Samuel Roland + +
+
+ + 🌍 + +
+ + Dimitri Regnier +
+ + Dimitri Regnier + +
+
+ + 🤔 + +
+ + irithys +
+ + irithys + +
+
+ + 🌍 + +
+ + Sergi +
+ + Sergi + +
+
+ + 🌍 + +
+ + ghose (XoseM) +
+ + ghose (XoseM) + +
+
+ + 🌍 + +
+ + Andreas Olsson +
+ + Andreas Olsson + +
+
+ + 🌍 + +
+ + leonfrom +
+ + leonfrom + +
+
+ + 🌍 + +
+ + agentcobra +
+ + agentcobra + +
+
+ + 🌍 + +
+ + Alessandro +
+ + Alessandro + +
+
+ + 🌍 + +
+ + liimee +
+ + liimee + +
+
+ + 🌍 + +
+ + Ahmed Sabouni +
+ + Ahmed Sabouni + +
+
+ + 🌍 + +
+ + KrzysztofDomanczyk +
+ + KrzysztofDomanczyk + +
+
+ + 💻 + +
+ + Guy Martin +
+ + Guy Martin + +
+
+ + 🐛 + {" "} + + 💻 + +
+ +{/* markdownlint-restore */} +{/* prettier-ignore-end */} + +{/* ALL-CONTRIBUTORS-LIST:END */} + +This project follows the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind welcome! + +## Contact + +You may reach us for help or ask any question you have on: + +- [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) + +Alternatively, you can follow us on social media platforms to get news about +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 + +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). + +[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/) + +[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/) + +## License + +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) + +Copyright © 2020-present, [Ad Aures](https://adaures.com/). diff --git a/docs/src/fa/getting-started/auth.md b/docs/src/content/docs/fa/getting-started/auth.mdx similarity index 56% rename from docs/src/fa/getting-started/auth.md rename to docs/src/content/docs/fa/getting-started/auth.mdx index ff5d59c0..d4dd4dd5 100644 --- a/docs/src/fa/getting-started/auth.md +++ b/docs/src/content/docs/fa/getting-started/auth.mdx @@ -1,10 +1,7 @@ --- 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: @@ -15,7 +12,7 @@ coupled with custom rules. Roles and permissions are defined at two levels: ### Instance roles - +{/* AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section */} | role | description | permissions | | ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | @@ -23,11 +20,11 @@ coupled with custom rules. Roles and permissions are defined at two levels: | 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 | | ----------------------- | ------------------------------------------------------------------ | @@ -41,47 +38,47 @@ coupled with custom rules. Roles and permissions are defined at two levels: | 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, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| 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 | +| 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, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| 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}. | +| 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 dashboards and analytics of podcast #\{id\}'s episodes. | +| episodes.create | Can create episodes for podcast #\{id\}. | +| episodes.edit | Can edit episodes of podcast #\{id\}. | +| episodes.delete | Can delete episodes of podcast #\{id\}. | +| episodes.manage-persons | Can manage episode persons of podcast #\{id\}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #\{id\}. | +| episodes.manage-publications | Can publish/unpublish episodes and posts of podcast #\{id\}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #\{id\}. | - +{/* AUTH-PODCAST-PERMISSIONS-LIST:END */} diff --git a/docs/src/ar/getting-started/docker.md b/docs/src/content/docs/fa/getting-started/docker.mdx similarity index 99% rename from docs/src/ar/getting-started/docker.md rename to docs/src/content/docs/fa/getting-started/docker.mdx index 12f01619..6141377f 100644 --- a/docs/src/ar/getting-started/docker.md +++ b/docs/src/content/docs/fa/getting-started/docker.mdx @@ -1,10 +1,7 @@ --- title: Official Docker images -sidebarDepth: 3 --- -# Official Docker images - Castopod pushes 3 Docker images to the Docker Hub during its automated build process: diff --git a/docs/src/ar/getting-started/install.md b/docs/src/content/docs/fa/getting-started/install.mdx similarity index 81% rename from docs/src/ar/getting-started/install.md rename to docs/src/content/docs/fa/getting-started/install.mdx index cdea18ec..d8888954 100644 --- a/docs/src/ar/getting-started/install.md +++ b/docs/src/content/docs/fa/getting-started/install.mdx @@ -1,21 +1,20 @@ --- -title: Installation -sidebarDepth: 3 +title: How to install Castopod? --- -# How to install Castopod? +import { Aside } from "@astrojs/starlight/components"; 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. -::: tip Note + ## Requirements @@ -46,14 +45,6 @@ Additionally, make sure that the following extensions are enabled in your PHP: > We recommend using [MariaDB](https://mariadb.org). -::: warning Warning - -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. - -::: - 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. @@ -115,13 +106,13 @@ want to generate Video Clips. The following extensions must be installed: 2. Follow the instructions on your screen. 3. Start podcasting! -::: info Note + ### Using CLI @@ -226,13 +217,35 @@ self-hosting for you. diff --git a/docs/src/content/docs/fa/getting-started/security.mdx b/docs/src/content/docs/fa/getting-started/security.mdx new file mode 100644 index 00000000..f6e5f8c3 --- /dev/null +++ b/docs/src/content/docs/fa/getting-started/security.mdx @@ -0,0 +1,24 @@ +--- +title: Ar surentez +--- + +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). + +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): + +- `writable/` folder must be **readable** and **writable**. +- `public/media/` folder must be **readable** and **writable**. +- any other file must be set to **readonly**. + +For instance, if you are using Apache or NGINX with Ubuntu you may do the +following: + +```bash +sudo chown -R root:root /path/to/castopod +sudo chown -R www-data:www-data /path/to/castopod/writable +sudo chown -R www-data:www-data /path/to/castopod/public/media +``` diff --git a/docs/src/de/getting-started/update.md b/docs/src/content/docs/fa/getting-started/update.mdx similarity index 96% rename from docs/src/de/getting-started/update.md rename to docs/src/content/docs/fa/getting-started/update.mdx index 98e019fb..f1a26974 100644 --- a/docs/src/de/getting-started/update.md +++ b/docs/src/content/docs/fa/getting-started/update.mdx @@ -1,9 +1,8 @@ --- -title: Update -sidebarDepth: 3 +title: How to update Castopod? --- -# How to update Castopod? +import { Aside } from "@astrojs/starlight/components"; 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 @@ -36,12 +35,12 @@ improvements ⚡. - Remove all files except `.env` and `public/media` - Copy the new files from the downloaded package into your server - ::: info Note + 4. Update your database schema from your `Castopod Admin` > `About` page or by running: @@ -54,7 +53,7 @@ improvements ⚡. `Housekeeping` 6. ✨ Enjoy your fresh instance, you're all done! -::: info Note + ## Fully Automated updates diff --git a/docs/src/content/docs/fa/index.mdx b/docs/src/content/docs/fa/index.mdx new file mode 100644 index 00000000..3d80dbb2 --- /dev/null +++ b/docs/src/content/docs/fa/index.mdx @@ -0,0 +1,1381 @@ +--- +title: Welcome 👋 +--- + +import { LinkCard } from "@astrojs/starlight/components"; + +Castopod is a free & open-source hosting platform made for podcasters who want +engage and interact with their audience. + +Castopod is easy to install and was built on top of +[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very +small footprint. + + + +## Features + +- 🌱  Free & open-source (AGPL v3 License) +- 🔐  Focused on data sovereignty: your content, audience, and analytics + belong to you, and you only +- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, + chapters, location, persons, soundbites, … +- 💬  Built-in social network: + - 🚀  Castopod is part of the Fediverse, a decentralized social network + - ❤️  Create posts, share, favourite, and comment on episodes +- 📈  Built-in analytics: + - ⚖️  GDPR / CCPA / LGPD compliant + - 🪙  Standard IABv2 audience measurement + - 🏡  On-premises analytics, no third party involved +- 📢  Built-in marketing tools: + - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) + - 📱  PWA: install as a standalone app + - 🎨  Customizable theme colors + - 🎬  Generate ready-to-share Video clips from episodes + - 🔉  Generate soundbites + - ▶️  Embeddable player, embed your episodes on any website +- 💸  Monetization: + - 🔗  Funding links + - 📲  listen-to-click ads + - 🤝  value4value / WebMonetization + - 💎  Premium podcasts +- 📡  Publish your episodes everywhere with RSS: + - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, + Google Podcasts, Deezer, Podcast Addict, Podfriend, … + - ⚡  Broadcast your episodes instantly with WebSub +- 📥  Podcast import: move your existing podcast into Castopod +- 📤  Move your podcast out of Castopod +- 🔀  Multi-tenant: host as many podcasts as you want +- 👥  Multi-user: add contributors and set roles +- 🌎  i18n support: translated in English, French, Polish, German, + Brazilian Portuguese & Spanish… with + [more to come](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. + +It is in fact one of the only media to have stayed this way for a long time. + +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. + +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized 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. + +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. + +## Comparison with other solutions + +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 you. + +### 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 it. + +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. + +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. + +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 journey. + +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. + +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! + +### 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 was initially built around music. And later on, as the project +evolved, the ability to host podcasts was introduced. + +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, …). + +So, you should probably use Funkwhale if you want to host your music, and use +Castopod if you want to host your podcasts. + +### Castopod vs other podcast hosts + +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! + +Each of these solutions differ from one another, you may compare with the +[list of features](#features). + +That being said, there are two main differences with other podcasting solutions: + +- 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 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. + +## Contributing + +Love Castopod and would like to help? Take a look at the following documentation +to get you started. + +### Code of conduct + +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 tolerated. + +### Contributing 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. + +## Contributors ✨ + +Thanks goes to these wonderful people +([emoji key](https://allcontributors.org/docs/en/emoji-key)): + +{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */} +{/* prettier-ignore-start */} +{/* markdownlint-disable */} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Yassine Doghri +
+ + Yassine Doghri + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 📖 + {" "} + + 👀 + {" "} + + 🚧 + {" "} + + 🖋 + {" "} + + 🎨 + {" "} + + ️️️️♿️ + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🧑‍🏫 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📆 + {" "} + + 📝 + +
+ + Benjamin Bellamy +
+ + Benjamin Bellamy + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 👀 + {" "} + + 🖋 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📝 + {" "} + + 📆 + {" "} + + 📢 + +
+ + Ola Hneini +
+ + Ola Hneini + +
+
+ + 💻 + {" "} + + 👀 + {" "} + + 📖 + {" "} + + 🚧 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Romain de Laage +
+ + Romain de Laage + +
+
+ + 💻 + {" "} + + 🚇 + {" "} + + 📖 + {" "} + + 🌍 + {" "} + + 🤔 + +
+ + Lyonel Bernard +
+ + Lyonel Bernard + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Christopher Lagonick-Weitzel +
+ + Christopher Lagonick-Weitzel + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Ernesto Acosta +
+ + Ernesto Acosta + +
+
+ + 🐛 + {" "} + + 🔊 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Ewen +
+ + Ewen + +
+
+ + 🌍 + {" "} + + 🤔 + {" "} + + 💻 + +
+ + Bastien Luneteau +
+ + Bastien Luneteau + +
+
+ + 💻 + {" "} + + 🐛 + +
+ + Cécile Ricordeau +
+ + Cécile Ricordeau + +
+
+ + 🎨 + +
+ + Patryk Miś +
+ + Patryk Miś + +
+
+ + 🌍 + +
+ + Marcin Lewandowski +
+ + Marcin Lewandowski + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Sebastian Janik +
+ + Sebastian Janik + +
+
+ + 💻 + +
+ + Patryk Karczmarczyk +
+ + Patryk Karczmarczyk + +
+
+ + 💻 + +
+ + denis d +
+ + denis d + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Douglas Kastle +
+ + Douglas Kastle + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + cExplorer +
+ + cExplorer + +
+
+ + 🐛 + {" "} + + 🌍 + +
+ + ImaCrea +
+ + ImaCrea + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Jonas S +
+ + Jonas S + +
+
+ + 💻 + +
+ + LEFEBVRE Yann +
+ + LEFEBVRE Yann + +
+
+ + 🐛 + +
+ + Sebastian Späth +
+ + Sebastian Späth + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + rocky III +
+ + rocky III + +
+
+ + 🐛 + +
+ + Hermann Josef Eckl +
+ + Hermann Josef Eckl + +
+
+ + 🐛 + +
+ + Delhaye Cyrille +
+ + Delhaye Cyrille + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + João Leandro +
+ + João Leandro + +
+
+ + 🌍 + {" "} + + 🤔 + +
+ + Angelos Chouvardas +
+ + Angelos Chouvardas + +
+
+ + 🌍 + +
+ + Eivind +
+ + Eivind + +
+
+ + 🌍 + +
+ + forght +
+ + forght + +
+
+ + 🌍 + +
+ + glottis0q +
+ + glottis0q + +
+
+ + 🌍 + +
+ + ButterflyOfFire +
+ + ButterflyOfFire + +
+
+ + 🌍 + +
+ + Lucian I. Last +
+ + Lucian I. Last + +
+
+ + 🌍 + +
+ + LuuzViir +
+ + LuuzViir + +
+
+ + 🌍 + +
+ + CTHTC +
+ + CTHTC + +
+
+ + 🌍 + +
+ + Russian Retro +
+ + Russian Retro + +
+
+ + 🌍 + +
+ + Marek L'ach +
+ + Marek L'ach + +
+
+ + 🌍 + +
+ + GunChleoc +
+ + GunChleoc + +
+
+ + 🌍 + +
+ + GabiSnow +
+ + GabiSnow + +
+
+ + 🌍 + +
+ + bendaha +
+ + bendaha + +
+
+ + 🌍 + +
+ + Samuel Roland +
+ + Samuel Roland + +
+
+ + 🌍 + +
+ + Dimitri Regnier +
+ + Dimitri Regnier + +
+
+ + 🤔 + +
+ + irithys +
+ + irithys + +
+
+ + 🌍 + +
+ + Sergi +
+ + Sergi + +
+
+ + 🌍 + +
+ + ghose (XoseM) +
+ + ghose (XoseM) + +
+
+ + 🌍 + +
+ + Andreas Olsson +
+ + Andreas Olsson + +
+
+ + 🌍 + +
+ + leonfrom +
+ + leonfrom + +
+
+ + 🌍 + +
+ + agentcobra +
+ + agentcobra + +
+
+ + 🌍 + +
+ + Alessandro +
+ + Alessandro + +
+
+ + 🌍 + +
+ + liimee +
+ + liimee + +
+
+ + 🌍 + +
+ + Ahmed Sabouni +
+ + Ahmed Sabouni + +
+
+ + 🌍 + +
+ + KrzysztofDomanczyk +
+ + KrzysztofDomanczyk + +
+
+ + 💻 + +
+ + Guy Martin +
+ + Guy Martin + +
+
+ + 🐛 + {" "} + + 💻 + +
+ +{/* markdownlint-restore */} +{/* prettier-ignore-end */} + +{/* ALL-CONTRIBUTORS-LIST:END */} + +This project follows the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind welcome! + +## Contact + +You may reach us for help or ask any question you have on: + +- [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) + +Alternatively, you can follow us on social media platforms to get news about +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 + +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). + +[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/) + +[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/) + +## License + +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) + +Copyright © 2020-present, [Ad Aures](https://adaures.com/). diff --git a/docs/src/content/docs/fr/getting-started/auth.mdx b/docs/src/content/docs/fr/getting-started/auth.mdx new file mode 100644 index 00000000..b63d5839 --- /dev/null +++ b/docs/src/content/docs/fr/getting-started/auth.mdx @@ -0,0 +1,85 @@ +--- +title: Authentification et Autorisation +--- + +Castopod gère l'authentification et l'autorisation à l'aide de +`codeigniter/shield` associés à des règles personnalisées. Les rôles et les +autorisations sont définis sur deux niveaux : + +1. [à l'échelle de l'instance](#1-instance-wide-roles-and-permissions) +2. [par podcast](#2-per-podcast-roles-and-permissions) + +## 1. Rôles et autorisations à l'échelle de l'instance + +### Rôles dans l’instance + +{/* AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section */} + +| role | description | permissions | +| -------------------------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | +| Super administrat·rice·eur | A un contrôle complet sur Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Gestionnaire | Gère le contenu de Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcast·rice·eur | Utilisateurs généraux de Castopod. | admin.access | + +{/* AUTH-INSTANCE-ROLES-LIST:END */} + +### Autorisations dans l'instance + +{/* AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section */} + +| permission | description | +| ----------------------- | -------------------------------------------------------------------- | +| admin.access | Peut accéder à la zone d'administration Castopod. | +| admin.settings | Peut accéder aux paramètres de Castopod. | +| users.manage | Peut gérer les utilisateurs de Castopod. | +| persons.manage | Permet de gérer les personnes. | +| pages.manage | Permet de gérer les pages. | +| podcasts.view | Peut voir tous les podcasts. | +| podcasts.create | Peut créer de nouveaux podcasts. | +| podcasts.import | Peut importer des podcasts. | +| fediverse.manage-blocks | Peut empêcher des act·rice·eur·s/domaines d'interagir avec Castopod. | + +{/* AUTH-INSTANCE-PERMISSIONS-LIST:END */} + +## 2. Rôles et autorisations par podcast + +### Rôles par podcast + +{/* AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section */} + +| role | description | permissions | +| ---------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Administrateur | A un contrôle total sur le podcast #\{id\}. | \* | +| Éditeur | Gère le contenu et les publications du podcast #\{id\}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Auteur / Autrice | Gère le contenu du podcast #\{id\} , mais ne peut pas le publier. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Invité | Contributeur général du podcast #\{id\}. | view, episodes.view | + +{/* AUTH-PODCAST-ROLES-LIST:END */} + +### Permissions par podcast + +{/* AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section */} + +| permission | description | +| ---------------------------- | ---------------------------------------------------------------------------------------------------- | +| view | Peut voir le tableau de bord et les analyses du podcast #\{id\}. | +| edit | Peut éditer le podcast #\{id\}. | +| delete | Peut supprimer le podcast #\{id\}. | +| manage-import | Peut synchroniser le podcast importé #\{id\}. | +| manage-persons | Permet de gérer les abonnements au podcast #\{id\}. | +| manage-subscriptions | Permet de gérer les abonnements au podcast #\{id\}. | +| manage-contributors | Permet de gérer les contributeurs du podcast #\{id\}. | +| manage-platforms | Peut configurer/supprimer les liens de la plateforme du podcast #\{id\}. | +| manage-publications | Peut publier le podcast #\{id\}. | +| manage-notifications | Peut afficher et marquer les notifications comme lues pour le podcast #\{id\}. | +| interact-as | Peut interagir en tant que podcast #\{id\} pour mettre en favori, partager ou répondre aux messages. | +| episodes.view | Peut voir le tableau de bord et les statistiques du podcast #\{id\}. | +| episodes.create | Peut créer des épisodes pour le podcast #\{id\}. | +| episodes.edit | Peut modifier les épisodes du podcast #\{id\}. | +| episodes.delete | Peut supprimer les épisodes du podcast #\{id\}. | +| episodes.manage-persons | Peut gérer les intervenants des épisodes du podcast #\{id\}. | +| episodes.manage-clips | Permet de gérer les clips vidéo ou les parties sonores du podcast #\{id\}. | +| episodes.manage-publications | Peut publier/dépublier des épisodes et des messages de podcast #\{id\}. | +| episodes.manage-comments | Peut créer/supprimer les commentaires de l'épisode du podcast #\{id\}. | + +{/* AUTH-PODCAST-PERMISSIONS-LIST:END */} diff --git a/docs/src/fr/getting-started/docker.md b/docs/src/content/docs/fr/getting-started/docker.mdx similarity index 98% rename from docs/src/fr/getting-started/docker.md rename to docs/src/content/docs/fr/getting-started/docker.mdx index 6419825e..c856c2d8 100644 --- a/docs/src/fr/getting-started/docker.md +++ b/docs/src/content/docs/fr/getting-started/docker.mdx @@ -1,10 +1,7 @@ --- -title: Images officielles Docker -sidebarDepth: 3 +title: Images officielles de Docker --- -# Images officielles de Docker - Castopod envoie 3 images Docker au Hub Docker pendant son processus de construction automatisée : diff --git a/docs/src/fr/getting-started/install.md b/docs/src/content/docs/fr/getting-started/install.mdx similarity index 82% rename from docs/src/fr/getting-started/install.md rename to docs/src/content/docs/fr/getting-started/install.mdx index b30392c5..e8647bfd 100644 --- a/docs/src/fr/getting-started/install.md +++ b/docs/src/content/docs/fr/getting-started/install.mdx @@ -1,22 +1,21 @@ --- -title: Installation -sidebarDepth: 3 +title: Comment installer Castopod ? --- -# Comment installer Castopod ? +import { Aside } from "@astrojs/starlight/components"; Castopod a été pensé pour être facile à installer. Que vous utilisiez un hébergement dédié ou mutualisé, vous pouvez l'installer sur la plupart des serveurs web compatibles avec PHP-MySQL. -::: Note d'astuce + ## Prérequis @@ -49,14 +48,6 @@ De plus, assurez-vous que les extensions suivantes sont activées dans votre PHP > Nous vous recommandons d'utiliser [MariaDB](https://mariadb.org). -::: warning Attention - -Castopod ne fonctionne qu'avec les bases de données MySQL 5.7 ou plus récentes. -Les versions 5.6 (dont le support a cessé le 5 février 2021) ou précédentes de -MySQL ne fonctionneront pas. - -::: - Vous aurez besoin du nom d'hôte du serveur, du nom de la base de données, du nom d'utilisateur et du mot de passe pour terminer le processus d'installation. Si vous ne disposez pas de ces informations, veuillez contacter votre @@ -121,13 +112,13 @@ installées : 2. Suivez les instructions affichée. 3. Commencer à baladodiffuser ! -:::info Note + ### Utilisation du CLI @@ -234,13 +225,35 @@ simplifier l'auto-hébergement. diff --git a/docs/src/fr/getting-started/security.md b/docs/src/content/docs/fr/getting-started/security.mdx similarity index 95% rename from docs/src/fr/getting-started/security.md rename to docs/src/content/docs/fr/getting-started/security.mdx index 868fa065..a8d42f2c 100644 --- a/docs/src/fr/getting-started/security.md +++ b/docs/src/content/docs/fr/getting-started/security.mdx @@ -1,9 +1,7 @@ --- -title: Sécurité +title: Questions de sécurité --- -# Questions de sécurité - Castopod est développé sur [CodeIgniter4](https://codeigniter.com/), un framework PHP qui encourage [de bonnes pratiques de sécurité](https://codeigniter.com/user_guide/concepts/security.html). diff --git a/docs/src/fr/getting-started/update.md b/docs/src/content/docs/fr/getting-started/update.mdx similarity index 94% rename from docs/src/fr/getting-started/update.md rename to docs/src/content/docs/fr/getting-started/update.mdx index 6ca39bea..51cf59af 100644 --- a/docs/src/fr/getting-started/update.md +++ b/docs/src/content/docs/fr/getting-started/update.mdx @@ -1,9 +1,8 @@ --- -title: Mise à jour -sidebarDepth: 3 +title: Comment installer Castopod ? --- -# Comment installer Castopod ? +import { Aside } from "@astrojs/starlight/components"; Après avoir installé Castopod, vous pouvez mettre à jour votre instance vers la dernière version afin de profiter des dernières fonctionnalités ✨, des @@ -37,13 +36,13 @@ corrections de bugs 🐛 et des améliorations de performance ⚡. - Supprimer tous les fichiers sauf `.env` et `public/media` - Copiez les nouveaux fichiers du paquet téléchargé sur votre serveur - ::: info Note + 4. Mettez à jour votre schéma de base de données depuis `Administrateur Castopod` > `À propos` ou en exécutant : @@ -56,16 +55,16 @@ corrections de bugs 🐛 et des améliorations de performance ⚡. `Général` > `Foyer` 6. ✨Profitez de votre nouvelle instance, vous avez terminé ! -::: Note d'information + ## Mises à jour entièrement automatisées diff --git a/docs/src/content/docs/fr/index.mdx b/docs/src/content/docs/fr/index.mdx new file mode 100644 index 00000000..b951ec1b --- /dev/null +++ b/docs/src/content/docs/fr/index.mdx @@ -0,0 +1,1416 @@ +--- +title: Bienvenue 👋 +description: + Castopod est une plateforme d’hébergement gratuite & open-source conçue pour + les podcasteurs qui veulent échanger et interagir avec leur public. +--- + +import { LinkCard } from "@astrojs/starlight/components"; + +Castopod est une plateforme d’hébergement gratuite & open-source conçue pour les +podcasteurs qui veulent échanger et interagir avec leur public. + +Castopod est facile à installer et a été conçu avec +[CodeIgniter4](https://codeigniter.com/), un framework PHP puissant de très +petite taille. + + + +## Fonctionnalités + +- 🌱  Libre, gratuit & open-source (Licence AGPL v3) +- 🔐  focalisé sur la souveraineté des données : votre contenu, votre + audience et vos statiistiques vous appartiennent, et à vous seulement +- 🪄 Fonctionnalités du Podcasting 2.0 : GUID, verrouillage, + transcriptions, financement, chapitres, géo-localisation, intervenants, + extraits sonores, … +- 💬  Réseau social intégré : + - 🚀  Castopod fait partie du Fédivers, un réseau social décentralisé + - ❤️  Créer des publications, partager, mettre en favori et commenter des + épisodes +- 📈  Statistiques intégrées : + - ⚖️  Conforme GDPR / CCPA / LGPD + - 🪙 Mesure d'audience IABv2 + - 🏡  Statistiques intégrées, aucune tierce partie intermédiaire +- 📢  Outils de marketing intégrés : + - ✅  Prêt pour le SEO (méta-tags open-graph, JSON-LD…) + - 📱  PWA: installez comme application autonome + - 🎨  Couleurs de thèmes personnalisables + - 🎬  Générez des clips vidéo prêts à partager à partir d'épisodes + - 🔉  Générez des extraits sonores + - ▶️  Intégrer vos épisodes dans n'importe quel site web +- 💸  Monétisation: + - 🔗  Liens de financement + - 📲  publicité “listen-to-click” + - 🤝  value4value / WebMonetization + - 💎  Podcasts premium +- 📡 Publiez vos épisodes partout avec RSS : + - 📱  Sur tous les index et toutes les applications : Podcast Index, + Podcasts Apple, Spotify, Google Podcasts, Deezer, Podcast Addict, Podfriend… + - ⚡ Diffusez instantanément vos épisodes avec WebSub +- 📥  Importation de Podcast : déménagez votre podcast existant vers + Castopod +- 📤  Déplacez votre podcast chez un autre hébergeur +- 🔀  Multi-locataire : hébergez autant de podcasts que vous le souhaitez +- 👥  Multi-utilisateur : ajoutez des contributeurs et définissez leurs + rôles +- 🌎  support de i18n : traduit en anglais, français, polonais, allemand, + portugais, brésilien & espagnol… et + [plus à l'avenir](https://translate.castopod.org)! + +## Pourquoi Castopod ? + +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. + +It is in fact one of the only media to have stayed this way for a long time. + +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. + +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized 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. + +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. + +## Comparaison avec d'autres solutions + +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 you. + +### 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 it. + +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. + +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. + +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 journey. + +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. + +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! + +### 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 was initially built around music. And later on, as the project +evolved, the ability to host podcasts was introduced. + +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, …). + +So, you should probably use Funkwhale if you want to host your music, and use +Castopod if you want to host your podcasts. + +### Castopod vs Autres hébergeurs de podcasts + +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! + +Each of these solutions differ from one another, you may compare with the +[list of features](#features). + +That being said, there are two main differences with other podcasting solutions: + +- Castopod peut être auto-hébergé et est la seule solution qui vous permet de + garder le contrôle total sur ce que vous produisez. D'autre part, comme il est + open-source, vous avez le pouvoir de le modifier comme vous le souhaitez. + +- Castopod est la seule solution qui intègre aujourd'hui à la fois un réseau + social décentralisé avec ActivityPub et des fonctionnalités de « Podcasting + 2.0 », réduisant ainsi l'écart entre les deux. + +## Contribuer + +Love Castopod and would like to help? Take a look at the following documentation +to get you started. + +### Code de conduite + +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 tolerated. + +### Guide de contribution + +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. + +## Contributeurs ✨ + +Thanks goes to these wonderful people +([emoji key](https://allcontributors.org/docs/en/emoji-key)): + +{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */} +{/* prettier-ignore-start */} +{/* markdownlint-disable */} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Yassine Doghri +
+ + Yassine Doghri + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 📖 + {" "} + + 👀 + {" "} + + 🚧 + {" "} + + 🖋 + {" "} + + 🎨 + {" "} + + ️️️️♿️ + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🧑‍🏫 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📆 + {" "} + + 📝 + +
+ + Benjamin Bellamy +
+ + Benjamin Bellamy + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 👀 + {" "} + + 🖋 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📝 + {" "} + + 📆 + {" "} + + 📢 + +
+ + Ola Hneini +
+ + Ola Hneini + +
+
+ + 💻 + {" "} + + 👀 + {" "} + + 📖 + {" "} + + 🚧 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Romain de Laage +
+ + Romain de Laage + +
+
+ + 💻 + {" "} + + 🚇 + {" "} + + 📖 + {" "} + + 🌍 + {" "} + + 🤔 + +
+ + Lyonel Bernard +
+ + Lyonel Bernard + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Christopher Lagonick-Weitzel +
+ + Christopher Lagonick-Weitzel + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Ernesto Acosta +
+ + Ernesto Acosta + +
+
+ + 🐛 + {" "} + + 🔊 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Ewen +
+ + Ewen + +
+
+ + 🌍 + {" "} + + 🤔 + {" "} + + 💻 + +
+ + Bastien Luneteau +
+ + Bastien Luneteau + +
+
+ + 💻 + {" "} + + 🐛 + +
+ + Cécile Ricordeau +
+ + Cécile Ricordeau + +
+
+ + 🎨 + +
+ + Patryk Miś +
+ + Patryk Miś + +
+
+ + 🌍 + +
+ + Marcin Lewandowski +
+ + Marcin Lewandowski + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Sebastian Janik +
+ + Sebastian Janik + +
+
+ + 💻 + +
+ + Patryk Karczmarczyk +
+ + Patryk Karczmarczyk + +
+
+ + 💻 + +
+ + denis d +
+ + denis d + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Douglas Kastle +
+ + Douglas Kastle + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + cExplorer +
+ + cExplorer + +
+
+ + 🐛 + {" "} + + 🌍 + +
+ + ImaCrea +
+ + ImaCrea + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Jonas S +
+ + Jonas S + +
+
+ + 💻 + +
+ + LEFEBVRE Yann +
+ + LEFEBVRE Yann + +
+
+ + 🐛 + +
+ + Sebastian Späth +
+ + Sebastian Späth + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + rocky III +
+ + rocky III + +
+
+ + 🐛 + +
+ + Hermann Josef Eckl +
+ + Hermann Josef Eckl + +
+
+ + 🐛 + +
+ + Delhaye Cyrille +
+ + Delhaye Cyrille + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + João Leandro +
+ + João Leandro + +
+
+ + 🌍 + {" "} + + 🤔 + +
+ + Angelos Chouvardas +
+ + Angelos Chouvardas + +
+
+ + 🌍 + +
+ + Eivind +
+ + Eivind + +
+
+ + 🌍 + +
+ + forght +
+ + forght + +
+
+ + 🌍 + +
+ + glottis0q +
+ + glottis0q + +
+
+ + 🌍 + +
+ + ButterflyOfFire +
+ + ButterflyOfFire + +
+
+ + 🌍 + +
+ + Lucian I. Last +
+ + Lucian I. Last + +
+
+ + 🌍 + +
+ + LuuzViir +
+ + LuuzViir + +
+
+ + 🌍 + +
+ + CTHTC +
+ + CTHTC + +
+
+ + 🌍 + +
+ + Russian Retro +
+ + Russian Retro + +
+
+ + 🌍 + +
+ + Marek L'ach +
+ + Marek L'ach + +
+
+ + 🌍 + +
+ + GunChleoc +
+ + GunChleoc + +
+
+ + 🌍 + +
+ + GabiSnow +
+ + GabiSnow + +
+
+ + 🌍 + +
+ + bendaha +
+ + bendaha + +
+
+ + 🌍 + +
+ + Samuel Roland +
+ + Samuel Roland + +
+
+ + 🌍 + +
+ + Dimitri Regnier +
+ + Dimitri Regnier + +
+
+ + 🤔 + +
+ + irithys +
+ + irithys + +
+
+ + 🌍 + +
+ + Sergi +
+ + Sergi + +
+
+ + 🌍 + +
+ + ghose (XoseM) +
+ + ghose (XoseM) + +
+
+ + 🌍 + +
+ + Andreas Olsson +
+ + Andreas Olsson + +
+
+ + 🌍 + +
+ + leonfrom +
+ + leonfrom + +
+
+ + 🌍 + +
+ + agentcobra +
+ + agentcobra + +
+
+ + 🌍 + +
+ + Alessandro +
+ + Alessandro + +
+
+ + 🌍 + +
+ + liimee +
+ + liimee + +
+
+ + 🌍 + +
+ + Ahmed Sabouni +
+ + Ahmed Sabouni + +
+
+ + 🌍 + +
+ + KrzysztofDomanczyk +
+ + KrzysztofDomanczyk + +
+
+ + 💻 + +
+ + Guy Martin +
+ + Guy Martin + +
+
+ + 🐛 + {" "} + + 💻 + +
+ +{/* markdownlint-restore */} +{/* prettier-ignore-end */} + +{/* ALL-CONTRIBUTORS-LIST:END */} + +This project follows the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind welcome! + +## Contact + +You may reach us for help or ask any question you have on: + +- [Discord](https://castopod.org/discord) (pour dialoguer en temps réel avec les + développeurs et la communauté) +- [Suivi de problèmes](https://code.castopod.org/adaures/castopod/-/issues) + (pour toute demande de nouvelle fonctionnalité ou rapport de bug) + +Alternatively, you can follow us on social media platforms to get news about +Castopod: + +- [podlibre.social](https://podlibre.social/@Castopod) (Instance Mastodon) +- [Twitter](https://twitter.com/castopod) +- [LinkedIn](https://linkedin.com/company/castopod) +- [Facebook](https://www.facebook.com/castopod) + +## Sponsors + +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). + + + +## Licence + +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) + +Copyright © 2020-present, [Ad Aures](https://adaures.com/). + +[release]: https://code.castopod.org/adaures/castopod/-/releases +[release-badge]: https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release +[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md +[license-badge]: https://img.shields.io/github/license/ad-aures/castopod?color=blue +[contributions]: https://code.castopod.org/adaures/castopod/-/issues +[contributions-badge]: https://img.shields.io/badge/contributions-welcome-brightgreen.svg +[semantic-release]: https://github.com/semantic-release/semantic-release +[semantic-release-badge]: https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg +[discord]: https://castopod.org/discord +[discord-badge]: https://img.shields.io/badge/chat-on%20discord-7389D8 +[stars]: https://github.com/ad-aures/castopod/stargazers +[stars-badge]: https://img.shields.io/github/stars/ad-aures/castopod?style=social +[crowdin]: https://translate.castopod.org/project/castopod +[crowdin-badge]: https://badges.crowdin.net/castopod/localized.svg diff --git a/docs/src/content/docs/fr2/getting-started/auth.mdx b/docs/src/content/docs/fr2/getting-started/auth.mdx new file mode 100644 index 00000000..d1ef215e --- /dev/null +++ b/docs/src/content/docs/fr2/getting-started/auth.mdx @@ -0,0 +1,85 @@ +--- +title: Authentification et Autorisation +--- + +Castopod gère l'authentification et l'autorisation à l'aide de +`codeigniter/shield` associés à des règles personnalisées. Les rôles et les +autorisations sont définis sur deux niveaux : + +1. [à l'échelle de l'instance](#1-instance-wide-roles-and-permissions) +2. [par podcast](#2-per-podcast-roles-and-permissions) + +## 1. Rôles et autorisations à l'échelle de l'instance + +### Rôles dans l’instance + +{/* 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 */} + +### Autorisations dans l'instance + +{/* 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. Rôles et autorisations par podcast + +### Rôles par podcast + +{/* 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, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| 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 */} + +### Permissions par podcast + +{/* 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 dashboards and analytics of podcast #\{id\}'s episodes. | +| episodes.create | Can create episodes for podcast #\{id\}. | +| episodes.edit | Can edit episodes of podcast #\{id\}. | +| episodes.delete | Can delete episodes of podcast #\{id\}. | +| episodes.manage-persons | Can manage episode persons of podcast #\{id\}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #\{id\}. | +| episodes.manage-publications | Can publish/unpublish episodes and posts of podcast #\{id\}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #\{id\}. | + +{/* AUTH-PODCAST-PERMISSIONS-LIST:END */} diff --git a/docs/src/content/docs/fr2/getting-started/docker.mdx b/docs/src/content/docs/fr2/getting-started/docker.mdx new file mode 100644 index 00000000..c856c2d8 --- /dev/null +++ b/docs/src/content/docs/fr2/getting-started/docker.mdx @@ -0,0 +1,158 @@ +--- +title: Images officielles de Docker +--- + +Castopod envoie 3 images Docker au Hub Docker pendant son processus de +construction automatisée : + +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): une + image castopod tout-en-un sous nginx unit +- [**`castopod/app`**](https://hub.docker.com/r/castopod/app): le paquet + d'applications avec toutes les dépendances de Castopod +- [**`castopod/web-server`**](https://hub.docker.com/r/castopod/web-server): une + configuration Nginx pour Castopod + +De plus, Castopod nécessite une base de données compatible avec MySQL. Une base +de données Redis peut être ajoutée en tant que gestionnaire de cache. + +## Tags supportés + +- `développer` [unstable], la dernière version de la branche de développement +- `beta` [stable], dernière version bêta +- `beta` [stable], dernière version bêta +- `1.x.x` [stable], version spécifique (depuis `1.0.0`) + +## Exemple d'utilisation + +1. Installez [docker](https://docs.docker.com/get-docker/) et + [docker-compose](https://docs.docker.com/compose/install/) +2. Créez un fichier `docker-compose.yml` avec les éléments suivants : + + ```yml + version: "3.7" + + services: + app: + image: castopod/castopod:latest + container_name: "castopod-app" + volumes: + - castopod-media:/var/www/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + CP_BASEURL: "https://castopod.example.com" + CP_ANALYTICS_SALT: changeme + CP_CACHE_HANDLER: redis + CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme + networks: + - castopod-app + - castopod-db + ports: + - 8000:8000 + restart: unless-stopped + + mariadb: + image: mariadb:10.5 + container_name: "castopod-mariadb" + networks: + - castopod-db + volumes: + - castopod-db:/var/lib/mysql + environment: + MYSQL_ROOT_PASSWORD: changeme + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + restart: unless-stopped + + redis: + image: redis:7.0-alpine + container_name: "castopod-redis" + command: --requirepass changeme + volumes: + - castopod-cache:/data + networks: + - castopod-app + + volumes: + castopod-media: + castopod-db: + castopod-cache: + + networks: + castopod-app: + castopod-db: + ``` + + Vous devez adapter certaines variables à vos besoins (p. ex. `CP_BASEURL`, + `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` et `CP_ANALYTICS_SALT`). + +3. Setup a reverse proxy for 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/): + + ``` + #castopod + castopod.example.com { + reverse_proxy localhost:8000 + } + ``` + +4. Exécutez `docker-compose up -d`, attendez qu'il s'initialise sur + `https://castopod.example.com/cp-install` pour terminer la configuration de + Castopod ! + +5. Vous êtes prêt, commencez à podcaster! 🎙️🚀 + +## Environment Variables + +- **castopod/castopod** and **castopod/app** + + | Nom de la variable | Type (`default`) | Par défaut | + | ------------------------------------- | ----------------------- | ---------------- | + | **`CP_BASEURL`** | string | `undefined` | + | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | + | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | + | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | + | **`CP_ANALYTICS_SALT`** | string | `undefined` | + | **`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_REDIS_HOST`** | ?string | `"localhost"` | + | **`CP_REDIS_PASSWORD`** | ?string | `null` | + | **`CP_REDIS_PORT`** | ?number | `6379` | + | **`CP_REDIS_DATABASE`** | ?number | `0` | + | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | + | **`CP_EMAIL_FROM`** | ?string | `undefined` | + | **`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_ENABLE_2FA`** | ?boolean | `undefined` | + | **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` | + | **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` | + | **`CP_MEDIA_S3_KEY`** | ?string | `undefined` | + | **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` | + | **`CP_MEDIA_S3_REGION`** | ?string | `undefined` | + | **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` | + | **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` | + | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` | + | **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` | + | **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` | + | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | + | **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | + +- **castopod/web-server** + + | Variable name | Type | Par défaut | + | ---------------------- | --------------------- | ---------- | + | **`CP_APP_HOSTNAME`** | ?string | `"app"` | + | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | diff --git a/docs/src/content/docs/fr2/getting-started/install.mdx b/docs/src/content/docs/fr2/getting-started/install.mdx new file mode 100644 index 00000000..f1706b56 --- /dev/null +++ b/docs/src/content/docs/fr2/getting-started/install.mdx @@ -0,0 +1,256 @@ +--- +title: Comment installer Castopod ? +--- + +import { Aside } from "@astrojs/starlight/components"; + +Castopod a été pensé pour être facile à installer. Que vous utilisiez un +hébergement dédié ou mutualisé, vous pouvez l'installer sur la plupart des +serveurs web compatibles avec PHP-MySQL. + + + +## Prérequis + +- PHP v8.1 or higher +- MySQL version 5.7 ou supérieure ou MariaDB version 10.2 ou supérieure +- Prise en charge HTTPS +- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's + incoming requests + +### PHP v8.1 or higher + +PHP version 8.1 or higher is required, with the following extensions installed: + +- [intl](https://www.php.net/manual/fr/intl.requirements.php) +- [libcurl](https://www.php.net/manual/fr/curl.requirements.php) +- [mbstring](https://www.php.net/manual/fr/mbstring.installation.php) +- [gd](https://www.php.net/manual/en/image.installation.php) avec **JPEG**, + **PNG** et bibliothèques **WEBP**. +- [exif](https://www.php.net/manual/fr/exif.installation.php) + +De plus, assurez-vous que les extensions suivantes sont activées dans votre PHP +: + +- json (activé par défaut - ne le désactivez pas) +- xml (activé par défaut - ne pas le désactiver) +- [mysqlnd](https://www.php.net/manual/fr/mysqlnd.install.php) + +### Base de données compatible MySQL + +> Nous vous recommandons d'utiliser [MariaDB](https://mariadb.org). + +Vous aurez besoin du nom d'hôte du serveur, du nom de la base de données, du nom +d'utilisateur et du mot de passe pour terminer le processus d'installation. Si +vous ne disposez pas de ces informations, veuillez contacter votre +administrateur. + +#### Droits d'accès + +L'utilisateur doit avoir au moins ces droits d'accès sur la base de données pour +que Castopod fonctionne : `CREATE`, `ALTER`, `DELETE`, `EXECUTE`, +`INDEX`,`INSERT`, `SELECT`, `UPDATE`,`REFERENCES`, `CREATE VIEW`. + +### (Facultatif) FFmpeg v4.1.8 ou supérieur pour les clips vidéo + +[FFmpeg](https://www.ffmpeg.org/) version 4.1.8 ou supérieure est requis si vous +souhaitez générer des Clips Vidéo. Les extensions suivantes doivent être +installées : + +- bibliothèque **FreeType 2** pour + [gd](https://www.php.net/manual/en/image.installation.php). + +### (Facultatif) Autres recommandations + +- Redis pour de meilleures performances de cache. +- CDN pour la mise en cache de fichiers statiques et de meilleures performances. +- passerelle e-mail pour les mots de passe perdus. + +## Instructions d'installation + +### Pré-requis + +0. Obtenez un serveur Web avec [les pré-requis](#requirements) installés +1. Créer une base de données MySQL pour Castopod avec un utilisateur ayant les + droits d'accès et les droits de modification (pour plus d'informations, cf. + [base de données compatible MySQL](#mysql-compatible-database)). +2. Activez HTTPS sur votre domaine avec un _certificat SSL_. +3. Téléchargez et dézippez le dernier [paquet Castopod](https://castopod.org/) + sur le serveur web si vous ne l'avez pas déjà fait. + - ⚠️ Faites pointer la racine du document du serveur web vers le sous-dossier + `public/` du dossier `castopod`. +4. Add **cron tasks** on your web server for various background processes + (replace the paths accordingly): + + ```bash + * * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1 + ``` + + **Note** - If you do not add this cron task, the following Castopod features + will not work: + + - Importing a podcast from an existing RSS feed + - Broadcasting social activities to your followers in the fediverse + - Broadcasting episodes to open hubs using + [WebSub](https://en.wikipedia.org/wiki/WebSub) + - Generating video clips - + [requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips) + +### (Méthode recommandée) Assistant d'installation + +1. Exécutez le script d'installation de Castopod en vous rendant sur la page + d'assistant d'installation (`https://votre_domain_name.com/cp-install`) dans + votre navigateur Web favori. +2. Suivez les instructions affichée. +3. Commencer à baladodiffuser ! + + + +### Using CLI + +1. Create a `.env` file in the package root based on the `.env.example` file. +2. Initialize the database using: + + ```sh + php spark install:init-database + ``` + +3. Create the superadmin user using: + + ```sh + php spark install:create-superadmin + ``` + +4. Head on to your admin gateway to start podcasting! + +### Email/SMTP setup + +Email configuration is required for some features to work properly (eg. +retrieving your forgotten password, sending instructions to premium subscribers, +…) + +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" +``` + +#### Email config options + +| 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"` | + +### Media storage + +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 + +If you prefer storing your media files on an S3 compatible storage, you may +specify it in your `.env`: + +```ini +# […] + +media.fileManager="s3" +media.s3.endpoint="your_s3_host" +media.s3.key="your_s3_key" +media.s3.secret="your_s3_secret" +media.s3.region="your_s3_region" +``` + +#### S3 config options + +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | + +## Paquets fournis par la communauté + +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. + +### Install with 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. + + diff --git a/docs/src/content/docs/fr2/getting-started/security.mdx b/docs/src/content/docs/fr2/getting-started/security.mdx new file mode 100644 index 00000000..a8d42f2c --- /dev/null +++ b/docs/src/content/docs/fr2/getting-started/security.mdx @@ -0,0 +1,26 @@ +--- +title: Questions de sécurité +--- + +Castopod est développé sur [CodeIgniter4](https://codeigniter.com/), un +framework PHP qui encourage +[de bonnes pratiques de sécurité](https://codeigniter.com/user_guide/concepts/security.html). + +Pour garantir au mieux la sécurité de votre instance et éviter les attaques +malveillantes, nous vous recommandons de mettre à jour les permissions des +fichiers de Castopod après l'installation et chaque mise à jour (et éviter toute +erreur de droit d'accès aux fichiers) : + +- Le dossier `writable/` doit être accessible en **lecture** et en **écriture**. +- Le dossier `public/media/` doit être accessible en **lecture** et en + **écriture**. +- tout autre fichier doit être accessible en **lecture seule**. + +Par exemple, si vous utilisez Apache ou NGINX avec Ubuntu, vous pouvez exécuter +les commandes suivantes : + +```bash +sudo chown -R root:root /path/to/castopod +sudo chown -R www-data:www-data /path/to/castopod/writable +sudo chown -R www-data:www-data /path/to/castopod/public/media +``` diff --git a/docs/src/content/docs/fr2/getting-started/update.mdx b/docs/src/content/docs/fr2/getting-started/update.mdx new file mode 100644 index 00000000..09b5643a --- /dev/null +++ b/docs/src/content/docs/fr2/getting-started/update.mdx @@ -0,0 +1,110 @@ +--- +title: Comment installer Castopod ? +--- + +import { Aside } from "@astrojs/starlight/components"; + +Après avoir installé Castopod, vous pouvez mettre à jour votre instance vers la +dernière version afin de profiter des dernières fonctionnalités ✨, des +corrections de bugs 🐛 et des améliorations de performance ⚡. + +## Instructions de mise à jour + +0. ⚠️ Avant toute mise à jour, nous vous recommandons fortement de sauvegarder + vos fichiers Castopod et la base de données . + + - cf. + [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 + + - cf. + [Where can I find my 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 + + - ⚠️ 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/) + +3. Sur votre serveur : + + - Supprimer tous les fichiers sauf `.env` et `public/media` + - Copiez les nouveaux fichiers du paquet téléchargé sur votre serveur + + + +4. Update your database schema from your `Castopod Admin` > `About` page or by + running: + + ```bash + php spark castopod:database-update + ``` + +5. Clear your cache from your `Castopod Admin` > `Settings` > `general` > + `Housekeeping` +6. ✨Profitez de votre nouvelle instance, vous avez terminé ! + + + +## Mises à jour entièrement automatisées + +> Prochainement... 👀 + +## Foire Aux Questions (FAQ) + +### Où puis-je trouver ma version de Castopod ? + +Allez dans votre panneau d'administration de Castopod, la version s'affiche en +bas à gauche. + +Vous pouvez également trouver la version dans l'application +`> Configuration > Constantes.php` dossier. + +### [Je n'ai pas mis à jour mon instance depuis longtemps… Que devrais-je faire ?](#i-havent-updated-my-instance-in-a-long-time-what-should-i-do) + +Pas de problème ! Il suffit d'obtenir la dernière version comme décrit +ci-dessus. Lorsque vous exécutez les instructions de mise à jour (4), lancez-les +séquentiellement, de la plus ancienne à la plus récente. + +> Vous devriez sauvegarder votre instance selon la date de votre dernière mise à +> jour de Castopod. + +Par exemple, si vous êtes en `v1.0.0-alpha.42` et souhaitez mettre à jour vers +la `v1.0.0-beta.1` : + +0. (fortement recommandé) Faites une sauvegarde de vos fichiers et de votre base + de données. + +1. Téléchargez la dernière version, écrasez vos fichiers tout en conservant + `.env` et `public/media`. + +2. Effectuez les instructions de mise à jour l'une après l'autre (de la plus + ancienne à la plus récente). + +3. ✨ Votre nouvelle instance est prête ! + +### Dois-je faire une sauvegarde avant de mettre à jour ? + +Nous vous conseillons de le faire, afin de ne pas tout perdre si quelque chose +se passait mal ! + +Plus généralement, nous vous conseillons de faire des sauvegardes régulières de +vos fichiers Castopod et de votre base de données afin d'éviter de tout perdre… diff --git a/docs/src/content/docs/fr2/index.mdx b/docs/src/content/docs/fr2/index.mdx new file mode 100644 index 00000000..b951ec1b --- /dev/null +++ b/docs/src/content/docs/fr2/index.mdx @@ -0,0 +1,1416 @@ +--- +title: Bienvenue 👋 +description: + Castopod est une plateforme d’hébergement gratuite & open-source conçue pour + les podcasteurs qui veulent échanger et interagir avec leur public. +--- + +import { LinkCard } from "@astrojs/starlight/components"; + +Castopod est une plateforme d’hébergement gratuite & open-source conçue pour les +podcasteurs qui veulent échanger et interagir avec leur public. + +Castopod est facile à installer et a été conçu avec +[CodeIgniter4](https://codeigniter.com/), un framework PHP puissant de très +petite taille. + + + +## Fonctionnalités + +- 🌱  Libre, gratuit & open-source (Licence AGPL v3) +- 🔐  focalisé sur la souveraineté des données : votre contenu, votre + audience et vos statiistiques vous appartiennent, et à vous seulement +- 🪄 Fonctionnalités du Podcasting 2.0 : GUID, verrouillage, + transcriptions, financement, chapitres, géo-localisation, intervenants, + extraits sonores, … +- 💬  Réseau social intégré : + - 🚀  Castopod fait partie du Fédivers, un réseau social décentralisé + - ❤️  Créer des publications, partager, mettre en favori et commenter des + épisodes +- 📈  Statistiques intégrées : + - ⚖️  Conforme GDPR / CCPA / LGPD + - 🪙 Mesure d'audience IABv2 + - 🏡  Statistiques intégrées, aucune tierce partie intermédiaire +- 📢  Outils de marketing intégrés : + - ✅  Prêt pour le SEO (méta-tags open-graph, JSON-LD…) + - 📱  PWA: installez comme application autonome + - 🎨  Couleurs de thèmes personnalisables + - 🎬  Générez des clips vidéo prêts à partager à partir d'épisodes + - 🔉  Générez des extraits sonores + - ▶️  Intégrer vos épisodes dans n'importe quel site web +- 💸  Monétisation: + - 🔗  Liens de financement + - 📲  publicité “listen-to-click” + - 🤝  value4value / WebMonetization + - 💎  Podcasts premium +- 📡 Publiez vos épisodes partout avec RSS : + - 📱  Sur tous les index et toutes les applications : Podcast Index, + Podcasts Apple, Spotify, Google Podcasts, Deezer, Podcast Addict, Podfriend… + - ⚡ Diffusez instantanément vos épisodes avec WebSub +- 📥  Importation de Podcast : déménagez votre podcast existant vers + Castopod +- 📤  Déplacez votre podcast chez un autre hébergeur +- 🔀  Multi-locataire : hébergez autant de podcasts que vous le souhaitez +- 👥  Multi-utilisateur : ajoutez des contributeurs et définissez leurs + rôles +- 🌎  support de i18n : traduit en anglais, français, polonais, allemand, + portugais, brésilien & espagnol… et + [plus à l'avenir](https://translate.castopod.org)! + +## Pourquoi Castopod ? + +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. + +It is in fact one of the only media to have stayed this way for a long time. + +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. + +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized 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. + +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. + +## Comparaison avec d'autres solutions + +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 you. + +### 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 it. + +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. + +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. + +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 journey. + +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. + +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! + +### 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 was initially built around music. And later on, as the project +evolved, the ability to host podcasts was introduced. + +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, …). + +So, you should probably use Funkwhale if you want to host your music, and use +Castopod if you want to host your podcasts. + +### Castopod vs Autres hébergeurs de podcasts + +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! + +Each of these solutions differ from one another, you may compare with the +[list of features](#features). + +That being said, there are two main differences with other podcasting solutions: + +- Castopod peut être auto-hébergé et est la seule solution qui vous permet de + garder le contrôle total sur ce que vous produisez. D'autre part, comme il est + open-source, vous avez le pouvoir de le modifier comme vous le souhaitez. + +- Castopod est la seule solution qui intègre aujourd'hui à la fois un réseau + social décentralisé avec ActivityPub et des fonctionnalités de « Podcasting + 2.0 », réduisant ainsi l'écart entre les deux. + +## Contribuer + +Love Castopod and would like to help? Take a look at the following documentation +to get you started. + +### Code de conduite + +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 tolerated. + +### Guide de contribution + +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. + +## Contributeurs ✨ + +Thanks goes to these wonderful people +([emoji key](https://allcontributors.org/docs/en/emoji-key)): + +{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */} +{/* prettier-ignore-start */} +{/* markdownlint-disable */} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Yassine Doghri +
+ + Yassine Doghri + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 📖 + {" "} + + 👀 + {" "} + + 🚧 + {" "} + + 🖋 + {" "} + + 🎨 + {" "} + + ️️️️♿️ + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🧑‍🏫 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📆 + {" "} + + 📝 + +
+ + Benjamin Bellamy +
+ + Benjamin Bellamy + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 👀 + {" "} + + 🖋 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📝 + {" "} + + 📆 + {" "} + + 📢 + +
+ + Ola Hneini +
+ + Ola Hneini + +
+
+ + 💻 + {" "} + + 👀 + {" "} + + 📖 + {" "} + + 🚧 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Romain de Laage +
+ + Romain de Laage + +
+
+ + 💻 + {" "} + + 🚇 + {" "} + + 📖 + {" "} + + 🌍 + {" "} + + 🤔 + +
+ + Lyonel Bernard +
+ + Lyonel Bernard + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Christopher Lagonick-Weitzel +
+ + Christopher Lagonick-Weitzel + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Ernesto Acosta +
+ + Ernesto Acosta + +
+
+ + 🐛 + {" "} + + 🔊 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Ewen +
+ + Ewen + +
+
+ + 🌍 + {" "} + + 🤔 + {" "} + + 💻 + +
+ + Bastien Luneteau +
+ + Bastien Luneteau + +
+
+ + 💻 + {" "} + + 🐛 + +
+ + Cécile Ricordeau +
+ + Cécile Ricordeau + +
+
+ + 🎨 + +
+ + Patryk Miś +
+ + Patryk Miś + +
+
+ + 🌍 + +
+ + Marcin Lewandowski +
+ + Marcin Lewandowski + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Sebastian Janik +
+ + Sebastian Janik + +
+
+ + 💻 + +
+ + Patryk Karczmarczyk +
+ + Patryk Karczmarczyk + +
+
+ + 💻 + +
+ + denis d +
+ + denis d + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Douglas Kastle +
+ + Douglas Kastle + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + cExplorer +
+ + cExplorer + +
+
+ + 🐛 + {" "} + + 🌍 + +
+ + ImaCrea +
+ + ImaCrea + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Jonas S +
+ + Jonas S + +
+
+ + 💻 + +
+ + LEFEBVRE Yann +
+ + LEFEBVRE Yann + +
+
+ + 🐛 + +
+ + Sebastian Späth +
+ + Sebastian Späth + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + rocky III +
+ + rocky III + +
+
+ + 🐛 + +
+ + Hermann Josef Eckl +
+ + Hermann Josef Eckl + +
+
+ + 🐛 + +
+ + Delhaye Cyrille +
+ + Delhaye Cyrille + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + João Leandro +
+ + João Leandro + +
+
+ + 🌍 + {" "} + + 🤔 + +
+ + Angelos Chouvardas +
+ + Angelos Chouvardas + +
+
+ + 🌍 + +
+ + Eivind +
+ + Eivind + +
+
+ + 🌍 + +
+ + forght +
+ + forght + +
+
+ + 🌍 + +
+ + glottis0q +
+ + glottis0q + +
+
+ + 🌍 + +
+ + ButterflyOfFire +
+ + ButterflyOfFire + +
+
+ + 🌍 + +
+ + Lucian I. Last +
+ + Lucian I. Last + +
+
+ + 🌍 + +
+ + LuuzViir +
+ + LuuzViir + +
+
+ + 🌍 + +
+ + CTHTC +
+ + CTHTC + +
+
+ + 🌍 + +
+ + Russian Retro +
+ + Russian Retro + +
+
+ + 🌍 + +
+ + Marek L'ach +
+ + Marek L'ach + +
+
+ + 🌍 + +
+ + GunChleoc +
+ + GunChleoc + +
+
+ + 🌍 + +
+ + GabiSnow +
+ + GabiSnow + +
+
+ + 🌍 + +
+ + bendaha +
+ + bendaha + +
+
+ + 🌍 + +
+ + Samuel Roland +
+ + Samuel Roland + +
+
+ + 🌍 + +
+ + Dimitri Regnier +
+ + Dimitri Regnier + +
+
+ + 🤔 + +
+ + irithys +
+ + irithys + +
+
+ + 🌍 + +
+ + Sergi +
+ + Sergi + +
+
+ + 🌍 + +
+ + ghose (XoseM) +
+ + ghose (XoseM) + +
+
+ + 🌍 + +
+ + Andreas Olsson +
+ + Andreas Olsson + +
+
+ + 🌍 + +
+ + leonfrom +
+ + leonfrom + +
+
+ + 🌍 + +
+ + agentcobra +
+ + agentcobra + +
+
+ + 🌍 + +
+ + Alessandro +
+ + Alessandro + +
+
+ + 🌍 + +
+ + liimee +
+ + liimee + +
+
+ + 🌍 + +
+ + Ahmed Sabouni +
+ + Ahmed Sabouni + +
+
+ + 🌍 + +
+ + KrzysztofDomanczyk +
+ + KrzysztofDomanczyk + +
+
+ + 💻 + +
+ + Guy Martin +
+ + Guy Martin + +
+
+ + 🐛 + {" "} + + 💻 + +
+ +{/* markdownlint-restore */} +{/* prettier-ignore-end */} + +{/* ALL-CONTRIBUTORS-LIST:END */} + +This project follows the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind welcome! + +## Contact + +You may reach us for help or ask any question you have on: + +- [Discord](https://castopod.org/discord) (pour dialoguer en temps réel avec les + développeurs et la communauté) +- [Suivi de problèmes](https://code.castopod.org/adaures/castopod/-/issues) + (pour toute demande de nouvelle fonctionnalité ou rapport de bug) + +Alternatively, you can follow us on social media platforms to get news about +Castopod: + +- [podlibre.social](https://podlibre.social/@Castopod) (Instance Mastodon) +- [Twitter](https://twitter.com/castopod) +- [LinkedIn](https://linkedin.com/company/castopod) +- [Facebook](https://www.facebook.com/castopod) + +## Sponsors + +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). + + + +## Licence + +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) + +Copyright © 2020-present, [Ad Aures](https://adaures.com/). + +[release]: https://code.castopod.org/adaures/castopod/-/releases +[release-badge]: https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release +[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md +[license-badge]: https://img.shields.io/github/license/ad-aures/castopod?color=blue +[contributions]: https://code.castopod.org/adaures/castopod/-/issues +[contributions-badge]: https://img.shields.io/badge/contributions-welcome-brightgreen.svg +[semantic-release]: https://github.com/semantic-release/semantic-release +[semantic-release-badge]: https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg +[discord]: https://castopod.org/discord +[discord-badge]: https://img.shields.io/badge/chat-on%20discord-7389D8 +[stars]: https://github.com/ad-aures/castopod/stargazers +[stars-badge]: https://img.shields.io/github/stars/ad-aures/castopod?style=social +[crowdin]: https://translate.castopod.org/project/castopod +[crowdin-badge]: https://badges.crowdin.net/castopod/localized.svg diff --git a/docs/src/content/docs/gd/getting-started/auth.mdx b/docs/src/content/docs/gd/getting-started/auth.mdx new file mode 100644 index 00000000..87de3884 --- /dev/null +++ b/docs/src/content/docs/gd/getting-started/auth.mdx @@ -0,0 +1,84 @@ +--- +title: 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 | +| --------------- | --------------------------------------- | ------------------------------------------------------------------------------------------ | +| Sàr-rianaire | Smachd gu lèir air Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Manaidsear | Stiùireadh susbaint Chastopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Pod-chraoladair | Luchd-cleachdaidh coitcheann Chastopod. | 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 | ’S urrainn dhaibh raon rianachd Chastopod inntrigeadh. | +| admin.settings | ’S urrainn dhaibh roghainnean Chastopod inntrigeadh. | +| users.manage | ’S urrainn dhaibh luchdc-leachdaidh Chastopod a stiùireadh. | +| persons.manage | ’S urrainn dhaibh daoine a stiùireadh. | +| pages.manage | ’S urrainn dhaibh duilleagan a stiùireadh. | +| podcasts.view | Chì iad a h-uile pod-chraoladh. | +| podcasts.create | ’S urrainn dhaibh pod-chraolaidhean ùra a chruthachadh. | +| podcasts.import | ’S urrainn dhaibh pod-chraolaidhean ion-phortadh. | +| fediverse.manage-blocks | ’S urrainn dhaibh actairean/àrainnean a cho-shaoghail a bhacadh o eadar-ghabhail le 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 | +| --------- | -------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Rianaire | Smachd gu lèir air air a’ phod-chraoladh #\{id\}. | \* | +| Deasaiche | A’ stiùireadh susbaint is foillseachaidhean a’ phod-chraoladh #\{id\}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Ùghdar | A’ stiùireadh susbaint a’ phod-chraolaidh #\{id\} ach gun chomas foillseachaidh. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Aoigh | Neach-cuideachaidh a’ phod-chraolaidh #\{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 | Cead an deas-bhòrd agus anailiseachd a’ phod-chraolaidh #\{id\} a shealltainn. | +| edit | ’S urrainn dhaibh am pod-chraoladh #\{id\} a dheasachadh. | +| delete | ’S urrainn dhaibh am pod-chraoladh #\{id\} a sguabadh às. | +| manage-import | ’S urrainn dhaibh am pod-chraoladh #\{id\} air ion-phortadh a shioncronachadh. | +| manage-persons | ’S urrainn dhaibh na fo-sgrìobhaidhean air a’ phod-chraoladh #\{id\} a stiùireadh. | +| manage-subscriptions | ’S urrainn dhaibh na fo-sgrìobhaidhean air a’ phod-chraoladh #\{id\} a stiùireadh. | +| manage-contributors | ’S urrainn dhaibh an luchd-cuideachaidh aig a’ phod-chraoladh #\{id\} a stiùireadh. | +| manage-platforms | ’S urrainn dhaibh ceanglaichean-ùrlair a’ phod-chraolaidh #\{id\} a shuidheachadh/a thoirt air falbh. | +| manage-publications | ’S urrainn dhaibh am pod-chraoladh #\{id\} fhoillseachadh. | +| manage-notifications | Chì iad brathan a’ phod-chraolaidh #\{id\} agus ’s urrainn dhaibh comharra a chur gun deach an leughadh. | +| interact-as | ’S urrainn dhaibh eadar-ghabhail ’na phod-chraoladh #\{id\} airson annsachdan, co-roinneadh is freagairtean do phostaichean. | +| episodes.view | Chì iad deas-bhùird is anailiseachd do dh’eapasodan a’ phod-chraolaidh #\{id\}. | +| episodes.create | ’S urrainn dhaibh eapasodan a chruthachadh dhan phod-chraoladh #\{id\}. | +| episodes.edit | ’S urrainn dhaibh eapasodan a’ phod-chraolaidh #\{id\} a dheasachadh. | +| episodes.delete | ’S urrainn dhaibh eapasodan a’ phod-chraolaidh #\{id\} a sguabadh às. | +| episodes.manage-persons | ’S urrainn dhaibh daoine nan eapasodan aig a’ phod-chraoladh #\{id\} a stiùireadh. | +| episodes.manage-clips | ’S urrainn dhaibh cliopaichean video no blasan-fuaime aig a’ phod-chraoladh #\{id\} a stiùireadh. | +| episodes.manage-publications | ’S urrainn dhaibh eapasodan is postaichean a’ phod-chraolaidh #\{id\} fhoillseachadh/neo-fhoillseachadh. | +| episodes.manage-comments | ’S urrainn dhaibh beachdan air eapasod a’ phod-chraolaidh #\{id\} a chruthachadh/a thoirt air falbh. | + +{/* AUTH-PODCAST-PERMISSIONS-LIST:END */} diff --git a/docs/src/eu/getting-started/docker.md b/docs/src/content/docs/gd/getting-started/docker.mdx similarity index 99% rename from docs/src/eu/getting-started/docker.md rename to docs/src/content/docs/gd/getting-started/docker.mdx index 12f01619..6141377f 100644 --- a/docs/src/eu/getting-started/docker.md +++ b/docs/src/content/docs/gd/getting-started/docker.mdx @@ -1,10 +1,7 @@ --- title: Official Docker images -sidebarDepth: 3 --- -# Official Docker images - Castopod pushes 3 Docker images to the Docker Hub during its automated build process: diff --git a/docs/src/content/docs/gd/getting-started/install.mdx b/docs/src/content/docs/gd/getting-started/install.mdx new file mode 100644 index 00000000..d8888954 --- /dev/null +++ b/docs/src/content/docs/gd/getting-started/install.mdx @@ -0,0 +1,251 @@ +--- +title: How to install Castopod? +--- + +import { Aside } from "@astrojs/starlight/components"; + +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. + + + +## Requirements + +- PHP v8.1 or higher +- MySQL version 5.7 or higher or MariaDB version 10.2 or higher +- HTTPS support +- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's + incoming requests + +### PHP v8.1 or higher + +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. +- [exif](https://www.php.net/manual/en/exif.installation.php) + +Additionally, make sure that the following extensions are enabled in your PHP: + +- json (enabled by default - don't turn it off) +- xml (enabled by default - don't turn it off) +- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php) + +### MySQL compatible database + +> We recommend using [MariaDB](https://mariadb.org). + +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. + +#### Privileges + +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`. + +### (Optional) FFmpeg v4.1.8 or higher for Video Clips + +[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: + +- **FreeType 2** library for + [gd](https://www.php.net/manual/en/image.installation.php). + +### (Optional) Other recommendations + +- Redis for better cache performances. +- CDN for static files caching and better performances. +- e-mail gateway for lost passwords. + +## Install instructions + +### Pre-requisites + +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 haven’t 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): + + ```bash + * * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1 + ``` + + **Note** - If you do not add this cron task, the following Castopod features + will not work: + + - Importing a podcast from an existing RSS feed + - Broadcasting social activities to your followers in the fediverse + - Broadcasting episodes to open hubs using + [WebSub](https://en.wikipedia.org/wiki/WebSub) + - Generating video clips - + [requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips) + +### (recommended) Install Wizard + +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! + + + +### Using CLI + +1. Create a `.env` file in the package root based on the `.env.example` file. +2. Initialize the database using: + + ```sh + php spark install:init-database + ``` + +3. Create the superadmin user using: + + ```sh + php spark install:create-superadmin + ``` + +4. Head on to your admin gateway to start podcasting! + +### Email/SMTP setup + +Email configuration is required for some features to work properly (eg. +retrieving your forgotten password, sending instructions to premium subscribers, +…) + +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" +``` + +#### Email config options + +| 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"` | + +### Media storage + +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 + +If you prefer storing your media files on an S3 compatible storage, you may +specify it in your `.env`: + +```ini +# […] + +media.fileManager="s3" +media.s3.endpoint="your_s3_host" +media.s3.key="your_s3_key" +media.s3.secret="your_s3_secret" +media.s3.region="your_s3_region" +``` + +#### S3 config options + +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | + +## Community packages + +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. + +### Install with 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. + + diff --git a/docs/src/content/docs/gd/getting-started/security.mdx b/docs/src/content/docs/gd/getting-started/security.mdx new file mode 100644 index 00000000..c039493c --- /dev/null +++ b/docs/src/content/docs/gd/getting-started/security.mdx @@ -0,0 +1,24 @@ +--- +title: Security concerns +--- + +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). + +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): + +- `writable/` folder must be **readable** and **writable**. +- `public/media/` folder must be **readable** and **writable**. +- any other file must be set to **readonly**. + +For instance, if you are using Apache or NGINX with Ubuntu you may do the +following: + +```bash +sudo chown -R root:root /path/to/castopod +sudo chown -R www-data:www-data /path/to/castopod/writable +sudo chown -R www-data:www-data /path/to/castopod/public/media +``` diff --git a/docs/src/da/getting-started/update.md b/docs/src/content/docs/gd/getting-started/update.mdx similarity index 96% rename from docs/src/da/getting-started/update.md rename to docs/src/content/docs/gd/getting-started/update.mdx index 98e019fb..f1a26974 100644 --- a/docs/src/da/getting-started/update.md +++ b/docs/src/content/docs/gd/getting-started/update.mdx @@ -1,9 +1,8 @@ --- -title: Update -sidebarDepth: 3 +title: How to update Castopod? --- -# How to update Castopod? +import { Aside } from "@astrojs/starlight/components"; 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 @@ -36,12 +35,12 @@ improvements ⚡. - Remove all files except `.env` and `public/media` - Copy the new files from the downloaded package into your server - ::: info Note + 4. Update your database schema from your `Castopod Admin` > `About` page or by running: @@ -54,7 +53,7 @@ improvements ⚡. `Housekeeping` 6. ✨ Enjoy your fresh instance, you're all done! -::: info Note + ## Fully Automated updates diff --git a/docs/src/content/docs/gd/index.mdx b/docs/src/content/docs/gd/index.mdx new file mode 100644 index 00000000..3d80dbb2 --- /dev/null +++ b/docs/src/content/docs/gd/index.mdx @@ -0,0 +1,1381 @@ +--- +title: Welcome 👋 +--- + +import { LinkCard } from "@astrojs/starlight/components"; + +Castopod is a free & open-source hosting platform made for podcasters who want +engage and interact with their audience. + +Castopod is easy to install and was built on top of +[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very +small footprint. + + + +## Features + +- 🌱  Free & open-source (AGPL v3 License) +- 🔐  Focused on data sovereignty: your content, audience, and analytics + belong to you, and you only +- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, + chapters, location, persons, soundbites, … +- 💬  Built-in social network: + - 🚀  Castopod is part of the Fediverse, a decentralized social network + - ❤️  Create posts, share, favourite, and comment on episodes +- 📈  Built-in analytics: + - ⚖️  GDPR / CCPA / LGPD compliant + - 🪙  Standard IABv2 audience measurement + - 🏡  On-premises analytics, no third party involved +- 📢  Built-in marketing tools: + - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) + - 📱  PWA: install as a standalone app + - 🎨  Customizable theme colors + - 🎬  Generate ready-to-share Video clips from episodes + - 🔉  Generate soundbites + - ▶️  Embeddable player, embed your episodes on any website +- 💸  Monetization: + - 🔗  Funding links + - 📲  listen-to-click ads + - 🤝  value4value / WebMonetization + - 💎  Premium podcasts +- 📡  Publish your episodes everywhere with RSS: + - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, + Google Podcasts, Deezer, Podcast Addict, Podfriend, … + - ⚡  Broadcast your episodes instantly with WebSub +- 📥  Podcast import: move your existing podcast into Castopod +- 📤  Move your podcast out of Castopod +- 🔀  Multi-tenant: host as many podcasts as you want +- 👥  Multi-user: add contributors and set roles +- 🌎  i18n support: translated in English, French, Polish, German, + Brazilian Portuguese & Spanish… with + [more to come](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. + +It is in fact one of the only media to have stayed this way for a long time. + +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. + +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized 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. + +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. + +## Comparison with other solutions + +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 you. + +### 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 it. + +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. + +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. + +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 journey. + +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. + +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! + +### 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 was initially built around music. And later on, as the project +evolved, the ability to host podcasts was introduced. + +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, …). + +So, you should probably use Funkwhale if you want to host your music, and use +Castopod if you want to host your podcasts. + +### Castopod vs other podcast hosts + +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! + +Each of these solutions differ from one another, you may compare with the +[list of features](#features). + +That being said, there are two main differences with other podcasting solutions: + +- 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 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. + +## Contributing + +Love Castopod and would like to help? Take a look at the following documentation +to get you started. + +### Code of conduct + +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 tolerated. + +### Contributing 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. + +## Contributors ✨ + +Thanks goes to these wonderful people +([emoji key](https://allcontributors.org/docs/en/emoji-key)): + +{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */} +{/* prettier-ignore-start */} +{/* markdownlint-disable */} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Yassine Doghri +
+ + Yassine Doghri + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 📖 + {" "} + + 👀 + {" "} + + 🚧 + {" "} + + 🖋 + {" "} + + 🎨 + {" "} + + ️️️️♿️ + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🧑‍🏫 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📆 + {" "} + + 📝 + +
+ + Benjamin Bellamy +
+ + Benjamin Bellamy + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 👀 + {" "} + + 🖋 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📝 + {" "} + + 📆 + {" "} + + 📢 + +
+ + Ola Hneini +
+ + Ola Hneini + +
+
+ + 💻 + {" "} + + 👀 + {" "} + + 📖 + {" "} + + 🚧 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Romain de Laage +
+ + Romain de Laage + +
+
+ + 💻 + {" "} + + 🚇 + {" "} + + 📖 + {" "} + + 🌍 + {" "} + + 🤔 + +
+ + Lyonel Bernard +
+ + Lyonel Bernard + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Christopher Lagonick-Weitzel +
+ + Christopher Lagonick-Weitzel + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Ernesto Acosta +
+ + Ernesto Acosta + +
+
+ + 🐛 + {" "} + + 🔊 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Ewen +
+ + Ewen + +
+
+ + 🌍 + {" "} + + 🤔 + {" "} + + 💻 + +
+ + Bastien Luneteau +
+ + Bastien Luneteau + +
+
+ + 💻 + {" "} + + 🐛 + +
+ + Cécile Ricordeau +
+ + Cécile Ricordeau + +
+
+ + 🎨 + +
+ + Patryk Miś +
+ + Patryk Miś + +
+
+ + 🌍 + +
+ + Marcin Lewandowski +
+ + Marcin Lewandowski + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Sebastian Janik +
+ + Sebastian Janik + +
+
+ + 💻 + +
+ + Patryk Karczmarczyk +
+ + Patryk Karczmarczyk + +
+
+ + 💻 + +
+ + denis d +
+ + denis d + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Douglas Kastle +
+ + Douglas Kastle + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + cExplorer +
+ + cExplorer + +
+
+ + 🐛 + {" "} + + 🌍 + +
+ + ImaCrea +
+ + ImaCrea + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Jonas S +
+ + Jonas S + +
+
+ + 💻 + +
+ + LEFEBVRE Yann +
+ + LEFEBVRE Yann + +
+
+ + 🐛 + +
+ + Sebastian Späth +
+ + Sebastian Späth + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + rocky III +
+ + rocky III + +
+
+ + 🐛 + +
+ + Hermann Josef Eckl +
+ + Hermann Josef Eckl + +
+
+ + 🐛 + +
+ + Delhaye Cyrille +
+ + Delhaye Cyrille + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + João Leandro +
+ + João Leandro + +
+
+ + 🌍 + {" "} + + 🤔 + +
+ + Angelos Chouvardas +
+ + Angelos Chouvardas + +
+
+ + 🌍 + +
+ + Eivind +
+ + Eivind + +
+
+ + 🌍 + +
+ + forght +
+ + forght + +
+
+ + 🌍 + +
+ + glottis0q +
+ + glottis0q + +
+
+ + 🌍 + +
+ + ButterflyOfFire +
+ + ButterflyOfFire + +
+
+ + 🌍 + +
+ + Lucian I. Last +
+ + Lucian I. Last + +
+
+ + 🌍 + +
+ + LuuzViir +
+ + LuuzViir + +
+
+ + 🌍 + +
+ + CTHTC +
+ + CTHTC + +
+
+ + 🌍 + +
+ + Russian Retro +
+ + Russian Retro + +
+
+ + 🌍 + +
+ + Marek L'ach +
+ + Marek L'ach + +
+
+ + 🌍 + +
+ + GunChleoc +
+ + GunChleoc + +
+
+ + 🌍 + +
+ + GabiSnow +
+ + GabiSnow + +
+
+ + 🌍 + +
+ + bendaha +
+ + bendaha + +
+
+ + 🌍 + +
+ + Samuel Roland +
+ + Samuel Roland + +
+
+ + 🌍 + +
+ + Dimitri Regnier +
+ + Dimitri Regnier + +
+
+ + 🤔 + +
+ + irithys +
+ + irithys + +
+
+ + 🌍 + +
+ + Sergi +
+ + Sergi + +
+
+ + 🌍 + +
+ + ghose (XoseM) +
+ + ghose (XoseM) + +
+
+ + 🌍 + +
+ + Andreas Olsson +
+ + Andreas Olsson + +
+
+ + 🌍 + +
+ + leonfrom +
+ + leonfrom + +
+
+ + 🌍 + +
+ + agentcobra +
+ + agentcobra + +
+
+ + 🌍 + +
+ + Alessandro +
+ + Alessandro + +
+
+ + 🌍 + +
+ + liimee +
+ + liimee + +
+
+ + 🌍 + +
+ + Ahmed Sabouni +
+ + Ahmed Sabouni + +
+
+ + 🌍 + +
+ + KrzysztofDomanczyk +
+ + KrzysztofDomanczyk + +
+
+ + 💻 + +
+ + Guy Martin +
+ + Guy Martin + +
+
+ + 🐛 + {" "} + + 💻 + +
+ +{/* markdownlint-restore */} +{/* prettier-ignore-end */} + +{/* ALL-CONTRIBUTORS-LIST:END */} + +This project follows the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind welcome! + +## Contact + +You may reach us for help or ask any question you have on: + +- [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) + +Alternatively, you can follow us on social media platforms to get news about +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 + +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). + +[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/) + +[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/) + +## License + +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) + +Copyright © 2020-present, [Ad Aures](https://adaures.com/). diff --git a/docs/src/content/docs/gl/getting-started/auth.mdx b/docs/src/content/docs/gl/getting-started/auth.mdx new file mode 100644 index 00000000..83c0a96a --- /dev/null +++ b/docs/src/content/docs/gl/getting-started/auth.mdx @@ -0,0 +1,84 @@ +--- +title: 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 | Ten control completo sobre Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Xestora | Quen xestiona o contido de Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | Usuaria común de 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 | Pode acceder á área de administración. | +| admin.settings | Pode acceder aos axustes de Castopod. | +| users.manage | Pode xestionar as usuarias de Castopod. | +| persons.manage | Pode xestionar persoas. | +| pages.manage | Pode xestionar páxinas. | +| podcasts.view | Pode ver tódolos podcast. | +| podcasts.create | Pode crear novos podcast. | +| podcasts.import | Pode importar podcasts. | +| fediverse.manage-blocks | Pode bloquear actores/dominios do fediverso evitando interactuar con 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 | Ten control total sobre o podcast #\{id\}. | \* | +| Editora | Persoa que xestiona o contido e publicacións do podcast #\{id\}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Autora | Persoa que xestiona o contido do podcast #\{id\} pero non pode publicalo. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Convidada | Contribuínte básico ao 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 | Pode ver o taboleiro e estatísticas do podcast #\{id\}. | +| edit | Pode editar o podcast #\{id\}. | +| delete | Pode eliminar o podcast #\{id\}. | +| manage-import | Pode sincronizar o podcast importado #\{id\}. | +| manage-persons | Pode xestionar as subscricións do podcast #\{id\}. | +| manage-subscriptions | Pode xestionar as subscricións do podcast #\{id\}. | +| manage-contributors | Pode xestionar as contribucións ao podcast #\{id\}. | +| manage-platforms | Pode establecer/eliminar ligazóns a plataformas do podcast #\{id\}. | +| manage-publications | Pode publicar o podcast #\{id\}. | +| manage-notifications | Pode ver e marcar as notificacións como lidas no podcast #\{id\}. | +| interact-as | Pode actuar como o podcast #\{id\} para compartir, favorecer ou responder a publicacións. | +| episodes.view | Pode ver os taboleiros e estatísticas dos episodios do podcast #\{id\}. | +| episodes.create | Pode crear episodios para o podcast #\{id\}. | +| episodes.edit | Pode editar os episodios do podcast #\{id\}. | +| episodes.delete | Pode eliminar episodios do podcast #\{id\}. | +| episodes.manage-persons | Pode xestionar as persoas do episodio do podcast #\{id\}. | +| episodes.manage-clips | Pode xestionar os clips de vídeo e extractos de audio do podcast #\{id\}. | +| episodes.manage-publications | Pode publicar/retirar episodios e publicacións do podcast #\{id\}. | +| episodes.manage-comments | Pode crear/eliminar comentarios dos episodios do podcast #\{id\}. | + +{/* AUTH-PODCAST-PERMISSIONS-LIST:END */} diff --git a/docs/src/content/docs/gl/getting-started/docker.mdx b/docs/src/content/docs/gl/getting-started/docker.mdx new file mode 100644 index 00000000..6141377f --- /dev/null +++ b/docs/src/content/docs/gl/getting-started/docker.mdx @@ -0,0 +1,157 @@ +--- +title: Official Docker images +--- + +Castopod pushes 3 Docker images to the Docker Hub during its automated build +process: + +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit +- [**`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 + +Additionally, Castopod requires a MySQL-compatible database. A Redis database +can be added as a cache handler. + +## Supported tags + +- `develop` [unstable], latest development branch build +- `beta` [stable], latest beta version build +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) + +## Example usage + +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: + + ```yml + version: "3.7" + + services: + app: + image: castopod/castopod:latest + container_name: "castopod-app" + volumes: + - castopod-media:/var/www/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + CP_BASEURL: "https://castopod.example.com" + CP_ANALYTICS_SALT: changeme + CP_CACHE_HANDLER: redis + CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme + networks: + - castopod-app + - castopod-db + ports: + - 8000:8000 + restart: unless-stopped + + mariadb: + image: mariadb:10.5 + container_name: "castopod-mariadb" + networks: + - castopod-db + volumes: + - castopod-db:/var/lib/mysql + environment: + MYSQL_ROOT_PASSWORD: changeme + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + restart: unless-stopped + + redis: + image: redis:7.0-alpine + container_name: "castopod-redis" + command: --requirepass changeme + volumes: + - castopod-cache:/data + networks: + - castopod-app + + volumes: + castopod-media: + castopod-db: + castopod-cache: + + networks: + castopod-app: + castopod-db: + ``` + + You have to adapt some variables to your needs (e.g. `CP_BASEURL`, + `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). + +3. Setup a reverse proxy for 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/): + + ``` + #castopod + castopod.example.com { + reverse_proxy localhost:8000 + } + ``` + +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! + +5. You're all set, start podcasting! 🎙️🚀 + +## Environment Variables + +- **castopod/castopod** and **castopod/app** + + | Variable name | Type (`default`) | Default | + | ------------------------------------- | ----------------------- | ---------------- | + | **`CP_BASEURL`** | string | `undefined` | + | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | + | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | + | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | + | **`CP_ANALYTICS_SALT`** | string | `undefined` | + | **`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_REDIS_HOST`** | ?string | `"localhost"` | + | **`CP_REDIS_PASSWORD`** | ?string | `null` | + | **`CP_REDIS_PORT`** | ?number | `6379` | + | **`CP_REDIS_DATABASE`** | ?number | `0` | + | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | + | **`CP_EMAIL_FROM`** | ?string | `undefined` | + | **`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_ENABLE_2FA`** | ?boolean | `undefined` | + | **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` | + | **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` | + | **`CP_MEDIA_S3_KEY`** | ?string | `undefined` | + | **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` | + | **`CP_MEDIA_S3_REGION`** | ?string | `undefined` | + | **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` | + | **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` | + | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` | + | **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` | + | **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` | + | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | + | **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | + +- **castopod/web-server** + + | Variable name | Type | Default | + | ---------------------- | --------------------- | ------- | + | **`CP_APP_HOSTNAME`** | ?string | `"app"` | + | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | diff --git a/docs/src/content/docs/gl/getting-started/install.mdx b/docs/src/content/docs/gl/getting-started/install.mdx new file mode 100644 index 00000000..d8888954 --- /dev/null +++ b/docs/src/content/docs/gl/getting-started/install.mdx @@ -0,0 +1,251 @@ +--- +title: How to install Castopod? +--- + +import { Aside } from "@astrojs/starlight/components"; + +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. + + + +## Requirements + +- PHP v8.1 or higher +- MySQL version 5.7 or higher or MariaDB version 10.2 or higher +- HTTPS support +- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's + incoming requests + +### PHP v8.1 or higher + +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. +- [exif](https://www.php.net/manual/en/exif.installation.php) + +Additionally, make sure that the following extensions are enabled in your PHP: + +- json (enabled by default - don't turn it off) +- xml (enabled by default - don't turn it off) +- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php) + +### MySQL compatible database + +> We recommend using [MariaDB](https://mariadb.org). + +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. + +#### Privileges + +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`. + +### (Optional) FFmpeg v4.1.8 or higher for Video Clips + +[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: + +- **FreeType 2** library for + [gd](https://www.php.net/manual/en/image.installation.php). + +### (Optional) Other recommendations + +- Redis for better cache performances. +- CDN for static files caching and better performances. +- e-mail gateway for lost passwords. + +## Install instructions + +### Pre-requisites + +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 haven’t 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): + + ```bash + * * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1 + ``` + + **Note** - If you do not add this cron task, the following Castopod features + will not work: + + - Importing a podcast from an existing RSS feed + - Broadcasting social activities to your followers in the fediverse + - Broadcasting episodes to open hubs using + [WebSub](https://en.wikipedia.org/wiki/WebSub) + - Generating video clips - + [requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips) + +### (recommended) Install Wizard + +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! + + + +### Using CLI + +1. Create a `.env` file in the package root based on the `.env.example` file. +2. Initialize the database using: + + ```sh + php spark install:init-database + ``` + +3. Create the superadmin user using: + + ```sh + php spark install:create-superadmin + ``` + +4. Head on to your admin gateway to start podcasting! + +### Email/SMTP setup + +Email configuration is required for some features to work properly (eg. +retrieving your forgotten password, sending instructions to premium subscribers, +…) + +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" +``` + +#### Email config options + +| 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"` | + +### Media storage + +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 + +If you prefer storing your media files on an S3 compatible storage, you may +specify it in your `.env`: + +```ini +# […] + +media.fileManager="s3" +media.s3.endpoint="your_s3_host" +media.s3.key="your_s3_key" +media.s3.secret="your_s3_secret" +media.s3.region="your_s3_region" +``` + +#### S3 config options + +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | + +## Community packages + +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. + +### Install with 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. + + diff --git a/docs/src/content/docs/gl/getting-started/security.mdx b/docs/src/content/docs/gl/getting-started/security.mdx new file mode 100644 index 00000000..c039493c --- /dev/null +++ b/docs/src/content/docs/gl/getting-started/security.mdx @@ -0,0 +1,24 @@ +--- +title: Security concerns +--- + +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). + +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): + +- `writable/` folder must be **readable** and **writable**. +- `public/media/` folder must be **readable** and **writable**. +- any other file must be set to **readonly**. + +For instance, if you are using Apache or NGINX with Ubuntu you may do the +following: + +```bash +sudo chown -R root:root /path/to/castopod +sudo chown -R www-data:www-data /path/to/castopod/writable +sudo chown -R www-data:www-data /path/to/castopod/public/media +``` diff --git a/docs/src/content/docs/gl/getting-started/update.mdx b/docs/src/content/docs/gl/getting-started/update.mdx new file mode 100644 index 00000000..f1a26974 --- /dev/null +++ b/docs/src/content/docs/gl/getting-started/update.mdx @@ -0,0 +1,108 @@ +--- +title: How to update Castopod? +--- + +import { Aside } from "@astrojs/starlight/components"; + +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 ⚡. + +## Update instructions + +0. ⚠️ Before any update, we highly recommend you backup your Castopod files and + database. + + - cf. + [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 + + - cf. + [Where can I find my 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 + + - ⚠️ 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/) + +3. On your server: + + - Remove all files except `.env` and `public/media` + - Copy the new files from the downloaded package into your server + + + +4. Update your database schema from your `Castopod Admin` > `About` page or by + running: + + ```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! + + + +## Fully Automated updates + +> Coming soon... 👀 + +## Frequently asked questions (FAQ) + +### Where can I find my Castopod version? + +Go to your Castopod admin panel, the version is displayed on the bottom left +corner. + +Alternatively, you can find the version in the `app > Config > Constants.php` +file. + +### I haven't updated my instance in a long time… What should I do? + +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. + +> You may want to backup your instance depending on how long you haven't updated +> Castopod. + +For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to +`v1.0.0-beta.1`: + +0. (highly recommended) Make a backup of your files and database. + +1. Download the latest release, overwrite your files whilst keeping `.env` and + `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`, + `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`. + +3. ✨ Enjoy your fresh instance, you're all done! + +### Should I make a backup before updating? + +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… diff --git a/docs/src/content/docs/gl/index.mdx b/docs/src/content/docs/gl/index.mdx new file mode 100644 index 00000000..3d80dbb2 --- /dev/null +++ b/docs/src/content/docs/gl/index.mdx @@ -0,0 +1,1381 @@ +--- +title: Welcome 👋 +--- + +import { LinkCard } from "@astrojs/starlight/components"; + +Castopod is a free & open-source hosting platform made for podcasters who want +engage and interact with their audience. + +Castopod is easy to install and was built on top of +[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very +small footprint. + + + +## Features + +- 🌱  Free & open-source (AGPL v3 License) +- 🔐  Focused on data sovereignty: your content, audience, and analytics + belong to you, and you only +- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, + chapters, location, persons, soundbites, … +- 💬  Built-in social network: + - 🚀  Castopod is part of the Fediverse, a decentralized social network + - ❤️  Create posts, share, favourite, and comment on episodes +- 📈  Built-in analytics: + - ⚖️  GDPR / CCPA / LGPD compliant + - 🪙  Standard IABv2 audience measurement + - 🏡  On-premises analytics, no third party involved +- 📢  Built-in marketing tools: + - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) + - 📱  PWA: install as a standalone app + - 🎨  Customizable theme colors + - 🎬  Generate ready-to-share Video clips from episodes + - 🔉  Generate soundbites + - ▶️  Embeddable player, embed your episodes on any website +- 💸  Monetization: + - 🔗  Funding links + - 📲  listen-to-click ads + - 🤝  value4value / WebMonetization + - 💎  Premium podcasts +- 📡  Publish your episodes everywhere with RSS: + - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, + Google Podcasts, Deezer, Podcast Addict, Podfriend, … + - ⚡  Broadcast your episodes instantly with WebSub +- 📥  Podcast import: move your existing podcast into Castopod +- 📤  Move your podcast out of Castopod +- 🔀  Multi-tenant: host as many podcasts as you want +- 👥  Multi-user: add contributors and set roles +- 🌎  i18n support: translated in English, French, Polish, German, + Brazilian Portuguese & Spanish… with + [more to come](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. + +It is in fact one of the only media to have stayed this way for a long time. + +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. + +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized 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. + +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. + +## Comparison with other solutions + +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 you. + +### 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 it. + +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. + +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. + +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 journey. + +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. + +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! + +### 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 was initially built around music. And later on, as the project +evolved, the ability to host podcasts was introduced. + +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, …). + +So, you should probably use Funkwhale if you want to host your music, and use +Castopod if you want to host your podcasts. + +### Castopod vs other podcast hosts + +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! + +Each of these solutions differ from one another, you may compare with the +[list of features](#features). + +That being said, there are two main differences with other podcasting solutions: + +- 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 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. + +## Contributing + +Love Castopod and would like to help? Take a look at the following documentation +to get you started. + +### Code of conduct + +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 tolerated. + +### Contributing 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. + +## Contributors ✨ + +Thanks goes to these wonderful people +([emoji key](https://allcontributors.org/docs/en/emoji-key)): + +{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */} +{/* prettier-ignore-start */} +{/* markdownlint-disable */} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Yassine Doghri +
+ + Yassine Doghri + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 📖 + {" "} + + 👀 + {" "} + + 🚧 + {" "} + + 🖋 + {" "} + + 🎨 + {" "} + + ️️️️♿️ + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🧑‍🏫 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📆 + {" "} + + 📝 + +
+ + Benjamin Bellamy +
+ + Benjamin Bellamy + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 👀 + {" "} + + 🖋 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📝 + {" "} + + 📆 + {" "} + + 📢 + +
+ + Ola Hneini +
+ + Ola Hneini + +
+
+ + 💻 + {" "} + + 👀 + {" "} + + 📖 + {" "} + + 🚧 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Romain de Laage +
+ + Romain de Laage + +
+
+ + 💻 + {" "} + + 🚇 + {" "} + + 📖 + {" "} + + 🌍 + {" "} + + 🤔 + +
+ + Lyonel Bernard +
+ + Lyonel Bernard + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Christopher Lagonick-Weitzel +
+ + Christopher Lagonick-Weitzel + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Ernesto Acosta +
+ + Ernesto Acosta + +
+
+ + 🐛 + {" "} + + 🔊 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Ewen +
+ + Ewen + +
+
+ + 🌍 + {" "} + + 🤔 + {" "} + + 💻 + +
+ + Bastien Luneteau +
+ + Bastien Luneteau + +
+
+ + 💻 + {" "} + + 🐛 + +
+ + Cécile Ricordeau +
+ + Cécile Ricordeau + +
+
+ + 🎨 + +
+ + Patryk Miś +
+ + Patryk Miś + +
+
+ + 🌍 + +
+ + Marcin Lewandowski +
+ + Marcin Lewandowski + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Sebastian Janik +
+ + Sebastian Janik + +
+
+ + 💻 + +
+ + Patryk Karczmarczyk +
+ + Patryk Karczmarczyk + +
+
+ + 💻 + +
+ + denis d +
+ + denis d + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Douglas Kastle +
+ + Douglas Kastle + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + cExplorer +
+ + cExplorer + +
+
+ + 🐛 + {" "} + + 🌍 + +
+ + ImaCrea +
+ + ImaCrea + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Jonas S +
+ + Jonas S + +
+
+ + 💻 + +
+ + LEFEBVRE Yann +
+ + LEFEBVRE Yann + +
+
+ + 🐛 + +
+ + Sebastian Späth +
+ + Sebastian Späth + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + rocky III +
+ + rocky III + +
+
+ + 🐛 + +
+ + Hermann Josef Eckl +
+ + Hermann Josef Eckl + +
+
+ + 🐛 + +
+ + Delhaye Cyrille +
+ + Delhaye Cyrille + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + João Leandro +
+ + João Leandro + +
+
+ + 🌍 + {" "} + + 🤔 + +
+ + Angelos Chouvardas +
+ + Angelos Chouvardas + +
+
+ + 🌍 + +
+ + Eivind +
+ + Eivind + +
+
+ + 🌍 + +
+ + forght +
+ + forght + +
+
+ + 🌍 + +
+ + glottis0q +
+ + glottis0q + +
+
+ + 🌍 + +
+ + ButterflyOfFire +
+ + ButterflyOfFire + +
+
+ + 🌍 + +
+ + Lucian I. Last +
+ + Lucian I. Last + +
+
+ + 🌍 + +
+ + LuuzViir +
+ + LuuzViir + +
+
+ + 🌍 + +
+ + CTHTC +
+ + CTHTC + +
+
+ + 🌍 + +
+ + Russian Retro +
+ + Russian Retro + +
+
+ + 🌍 + +
+ + Marek L'ach +
+ + Marek L'ach + +
+
+ + 🌍 + +
+ + GunChleoc +
+ + GunChleoc + +
+
+ + 🌍 + +
+ + GabiSnow +
+ + GabiSnow + +
+
+ + 🌍 + +
+ + bendaha +
+ + bendaha + +
+
+ + 🌍 + +
+ + Samuel Roland +
+ + Samuel Roland + +
+
+ + 🌍 + +
+ + Dimitri Regnier +
+ + Dimitri Regnier + +
+
+ + 🤔 + +
+ + irithys +
+ + irithys + +
+
+ + 🌍 + +
+ + Sergi +
+ + Sergi + +
+
+ + 🌍 + +
+ + ghose (XoseM) +
+ + ghose (XoseM) + +
+
+ + 🌍 + +
+ + Andreas Olsson +
+ + Andreas Olsson + +
+
+ + 🌍 + +
+ + leonfrom +
+ + leonfrom + +
+
+ + 🌍 + +
+ + agentcobra +
+ + agentcobra + +
+
+ + 🌍 + +
+ + Alessandro +
+ + Alessandro + +
+
+ + 🌍 + +
+ + liimee +
+ + liimee + +
+
+ + 🌍 + +
+ + Ahmed Sabouni +
+ + Ahmed Sabouni + +
+
+ + 🌍 + +
+ + KrzysztofDomanczyk +
+ + KrzysztofDomanczyk + +
+
+ + 💻 + +
+ + Guy Martin +
+ + Guy Martin + +
+
+ + 🐛 + {" "} + + 💻 + +
+ +{/* markdownlint-restore */} +{/* prettier-ignore-end */} + +{/* ALL-CONTRIBUTORS-LIST:END */} + +This project follows the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind welcome! + +## Contact + +You may reach us for help or ask any question you have on: + +- [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) + +Alternatively, you can follow us on social media platforms to get news about +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 + +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). + +[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/) + +[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/) + +## License + +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) + +Copyright © 2020-present, [Ad Aures](https://adaures.com/). diff --git a/docs/src/da/getting-started/auth.md b/docs/src/content/docs/id/getting-started/auth.mdx similarity index 56% rename from docs/src/da/getting-started/auth.md rename to docs/src/content/docs/id/getting-started/auth.mdx index ff5d59c0..d4dd4dd5 100644 --- a/docs/src/da/getting-started/auth.md +++ b/docs/src/content/docs/id/getting-started/auth.mdx @@ -1,10 +1,7 @@ --- 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: @@ -15,7 +12,7 @@ coupled with custom rules. Roles and permissions are defined at two levels: ### Instance roles - +{/* AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section */} | role | description | permissions | | ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | @@ -23,11 +20,11 @@ coupled with custom rules. Roles and permissions are defined at two levels: | 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 | | ----------------------- | ------------------------------------------------------------------ | @@ -41,47 +38,47 @@ coupled with custom rules. Roles and permissions are defined at two levels: | 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, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| 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 | +| 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, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| 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}. | +| 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 dashboards and analytics of podcast #\{id\}'s episodes. | +| episodes.create | Can create episodes for podcast #\{id\}. | +| episodes.edit | Can edit episodes of podcast #\{id\}. | +| episodes.delete | Can delete episodes of podcast #\{id\}. | +| episodes.manage-persons | Can manage episode persons of podcast #\{id\}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #\{id\}. | +| episodes.manage-publications | Can publish/unpublish episodes and posts of podcast #\{id\}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #\{id\}. | - +{/* AUTH-PODCAST-PERMISSIONS-LIST:END */} diff --git a/docs/src/content/docs/id/getting-started/docker.mdx b/docs/src/content/docs/id/getting-started/docker.mdx new file mode 100644 index 00000000..6141377f --- /dev/null +++ b/docs/src/content/docs/id/getting-started/docker.mdx @@ -0,0 +1,157 @@ +--- +title: Official Docker images +--- + +Castopod pushes 3 Docker images to the Docker Hub during its automated build +process: + +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit +- [**`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 + +Additionally, Castopod requires a MySQL-compatible database. A Redis database +can be added as a cache handler. + +## Supported tags + +- `develop` [unstable], latest development branch build +- `beta` [stable], latest beta version build +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) + +## Example usage + +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: + + ```yml + version: "3.7" + + services: + app: + image: castopod/castopod:latest + container_name: "castopod-app" + volumes: + - castopod-media:/var/www/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + CP_BASEURL: "https://castopod.example.com" + CP_ANALYTICS_SALT: changeme + CP_CACHE_HANDLER: redis + CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme + networks: + - castopod-app + - castopod-db + ports: + - 8000:8000 + restart: unless-stopped + + mariadb: + image: mariadb:10.5 + container_name: "castopod-mariadb" + networks: + - castopod-db + volumes: + - castopod-db:/var/lib/mysql + environment: + MYSQL_ROOT_PASSWORD: changeme + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + restart: unless-stopped + + redis: + image: redis:7.0-alpine + container_name: "castopod-redis" + command: --requirepass changeme + volumes: + - castopod-cache:/data + networks: + - castopod-app + + volumes: + castopod-media: + castopod-db: + castopod-cache: + + networks: + castopod-app: + castopod-db: + ``` + + You have to adapt some variables to your needs (e.g. `CP_BASEURL`, + `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). + +3. Setup a reverse proxy for 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/): + + ``` + #castopod + castopod.example.com { + reverse_proxy localhost:8000 + } + ``` + +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! + +5. You're all set, start podcasting! 🎙️🚀 + +## Environment Variables + +- **castopod/castopod** and **castopod/app** + + | Variable name | Type (`default`) | Default | + | ------------------------------------- | ----------------------- | ---------------- | + | **`CP_BASEURL`** | string | `undefined` | + | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | + | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | + | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | + | **`CP_ANALYTICS_SALT`** | string | `undefined` | + | **`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_REDIS_HOST`** | ?string | `"localhost"` | + | **`CP_REDIS_PASSWORD`** | ?string | `null` | + | **`CP_REDIS_PORT`** | ?number | `6379` | + | **`CP_REDIS_DATABASE`** | ?number | `0` | + | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | + | **`CP_EMAIL_FROM`** | ?string | `undefined` | + | **`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_ENABLE_2FA`** | ?boolean | `undefined` | + | **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` | + | **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` | + | **`CP_MEDIA_S3_KEY`** | ?string | `undefined` | + | **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` | + | **`CP_MEDIA_S3_REGION`** | ?string | `undefined` | + | **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` | + | **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` | + | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` | + | **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` | + | **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` | + | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | + | **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | + +- **castopod/web-server** + + | Variable name | Type | Default | + | ---------------------- | --------------------- | ------- | + | **`CP_APP_HOSTNAME`** | ?string | `"app"` | + | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | diff --git a/docs/src/content/docs/id/getting-started/install.mdx b/docs/src/content/docs/id/getting-started/install.mdx new file mode 100644 index 00000000..d8888954 --- /dev/null +++ b/docs/src/content/docs/id/getting-started/install.mdx @@ -0,0 +1,251 @@ +--- +title: How to install Castopod? +--- + +import { Aside } from "@astrojs/starlight/components"; + +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. + + + +## Requirements + +- PHP v8.1 or higher +- MySQL version 5.7 or higher or MariaDB version 10.2 or higher +- HTTPS support +- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's + incoming requests + +### PHP v8.1 or higher + +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. +- [exif](https://www.php.net/manual/en/exif.installation.php) + +Additionally, make sure that the following extensions are enabled in your PHP: + +- json (enabled by default - don't turn it off) +- xml (enabled by default - don't turn it off) +- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php) + +### MySQL compatible database + +> We recommend using [MariaDB](https://mariadb.org). + +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. + +#### Privileges + +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`. + +### (Optional) FFmpeg v4.1.8 or higher for Video Clips + +[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: + +- **FreeType 2** library for + [gd](https://www.php.net/manual/en/image.installation.php). + +### (Optional) Other recommendations + +- Redis for better cache performances. +- CDN for static files caching and better performances. +- e-mail gateway for lost passwords. + +## Install instructions + +### Pre-requisites + +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 haven’t 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): + + ```bash + * * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1 + ``` + + **Note** - If you do not add this cron task, the following Castopod features + will not work: + + - Importing a podcast from an existing RSS feed + - Broadcasting social activities to your followers in the fediverse + - Broadcasting episodes to open hubs using + [WebSub](https://en.wikipedia.org/wiki/WebSub) + - Generating video clips - + [requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips) + +### (recommended) Install Wizard + +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! + + + +### Using CLI + +1. Create a `.env` file in the package root based on the `.env.example` file. +2. Initialize the database using: + + ```sh + php spark install:init-database + ``` + +3. Create the superadmin user using: + + ```sh + php spark install:create-superadmin + ``` + +4. Head on to your admin gateway to start podcasting! + +### Email/SMTP setup + +Email configuration is required for some features to work properly (eg. +retrieving your forgotten password, sending instructions to premium subscribers, +…) + +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" +``` + +#### Email config options + +| 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"` | + +### Media storage + +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 + +If you prefer storing your media files on an S3 compatible storage, you may +specify it in your `.env`: + +```ini +# […] + +media.fileManager="s3" +media.s3.endpoint="your_s3_host" +media.s3.key="your_s3_key" +media.s3.secret="your_s3_secret" +media.s3.region="your_s3_region" +``` + +#### S3 config options + +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | + +## Community packages + +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. + +### Install with 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. + + diff --git a/docs/src/content/docs/id/getting-started/security.mdx b/docs/src/content/docs/id/getting-started/security.mdx new file mode 100644 index 00000000..c039493c --- /dev/null +++ b/docs/src/content/docs/id/getting-started/security.mdx @@ -0,0 +1,24 @@ +--- +title: Security concerns +--- + +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). + +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): + +- `writable/` folder must be **readable** and **writable**. +- `public/media/` folder must be **readable** and **writable**. +- any other file must be set to **readonly**. + +For instance, if you are using Apache or NGINX with Ubuntu you may do the +following: + +```bash +sudo chown -R root:root /path/to/castopod +sudo chown -R www-data:www-data /path/to/castopod/writable +sudo chown -R www-data:www-data /path/to/castopod/public/media +``` diff --git a/docs/src/content/docs/id/getting-started/update.mdx b/docs/src/content/docs/id/getting-started/update.mdx new file mode 100644 index 00000000..f1a26974 --- /dev/null +++ b/docs/src/content/docs/id/getting-started/update.mdx @@ -0,0 +1,108 @@ +--- +title: How to update Castopod? +--- + +import { Aside } from "@astrojs/starlight/components"; + +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 ⚡. + +## Update instructions + +0. ⚠️ Before any update, we highly recommend you backup your Castopod files and + database. + + - cf. + [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 + + - cf. + [Where can I find my 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 + + - ⚠️ 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/) + +3. On your server: + + - Remove all files except `.env` and `public/media` + - Copy the new files from the downloaded package into your server + + + +4. Update your database schema from your `Castopod Admin` > `About` page or by + running: + + ```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! + + + +## Fully Automated updates + +> Coming soon... 👀 + +## Frequently asked questions (FAQ) + +### Where can I find my Castopod version? + +Go to your Castopod admin panel, the version is displayed on the bottom left +corner. + +Alternatively, you can find the version in the `app > Config > Constants.php` +file. + +### I haven't updated my instance in a long time… What should I do? + +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. + +> You may want to backup your instance depending on how long you haven't updated +> Castopod. + +For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to +`v1.0.0-beta.1`: + +0. (highly recommended) Make a backup of your files and database. + +1. Download the latest release, overwrite your files whilst keeping `.env` and + `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`, + `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`. + +3. ✨ Enjoy your fresh instance, you're all done! + +### Should I make a backup before updating? + +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… diff --git a/docs/src/content/docs/id/index.mdx b/docs/src/content/docs/id/index.mdx new file mode 100644 index 00000000..6e433623 --- /dev/null +++ b/docs/src/content/docs/id/index.mdx @@ -0,0 +1,1391 @@ +--- +title: Selamat Datang 👋 +--- + +import { LinkCard } from "@astrojs/starlight/components"; + +Castopod adalah platform hosting yang gratis & sumber terbuka untuk pembuat +siniar yang ingin berinteraksi dengan pendengar mereka. + +Castopod is easy to install and was built on top of +[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very +small footprint. + + + +## Fitur-fitur + +- 🌱  Gratis & sumber terbuka (Lisensi AGPL v3) +- 🔐  Focused on data sovereignty: your content, audience, and analytics + belong to you, and you only +- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, + chapters, location, persons, soundbites, … +- 💬  Jaringan sosial bawaan: + - 🚀  Castopod termasuk bagian dari Fediverse, jaringan sosial + terdesentralisasi + - ❤️  Create posts, share, favourite, and comment on episodes +- 📈  Analitik bawaan: + - ⚖️  Sesuai dengan GDPR / CCPA / LGPD + - 🪙  Standard IABv2 audience measurement + - 🏡  On-premises analytics, no third party involved +- 📢  Built-in marketing tools: + - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) + - 📱  PWA: install as a standalone app + - 🎨  Customizable theme colors + - 🎬  Generate ready-to-share Video clips from episodes + - 🔉  Generate soundbites + - ▶️  Embeddable player, embed your episodes on any website +- 💸  Monetization: + - 🔗  Funding links + - 📲  listen-to-click ads + - 🤝  value4value / WebMonetization + - 💎  Premium podcasts +- 📡  Terbitkan episode-episode Anda dimana pun dengan RSS: + - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, + Google Podcasts, Deezer, Podcast Addict, Podfriend, … + - ⚡  Broadcast your episodes instantly with WebSub +- 📥  Podcast import: move your existing podcast into Castopod +- 📤  Move your podcast out of Castopod +- 🔀  Multi-tenant: host as many podcasts as you want +- 👥  Multi-user: add contributors and set roles +- 🌎  i18n support: translated in English, French, Polish, German, + Brazilian Portuguese & Spanish… with + [more to come](https://translate.castopod.org)! + +## Motivasi + +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. + +It is in fact one of the only media to have stayed this way for a long time. + +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. + +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized 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. + +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. + +## Perbandingan dengan solusi lain + +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 you. + +### 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 it. + +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. + +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. + +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 journey. + +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. + +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! + +### 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 was initially built around music. And later on, as the project +evolved, the ability to host podcasts was introduced. + +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, …). + +So, you should probably use Funkwhale if you want to host your music, and use +Castopod if you want to host your podcasts. + +### Castopod vs other podcast hosts + +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! + +Each of these solutions differ from one another, you may compare with the +[list of features](#features). + +That being said, there are two main differences with other podcasting solutions: + +- 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 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. + +## Berkontribusi + +Love Castopod and would like to help? Take a look at the following documentation +to get you started. + +### Code of conduct + +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 tolerated. + +### Panduan berkontribusi + +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. + +## Kontributor-kontributor ✨ + +Thanks goes to these wonderful people +([emoji key](https://allcontributors.org/docs/en/emoji-key)): + +{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */} +{/* prettier-ignore-start */} +{/* markdownlint-disable */} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Yassine Doghri +
+ + Yassine Doghri + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 📖 + {" "} + + 👀 + {" "} + + 🚧 + {" "} + + 🖋 + {" "} + + 🎨 + {" "} + + ️️️️♿️ + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🧑‍🏫 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📆 + {" "} + + 📝 + +
+ + Benjamin Bellamy +
+ + Benjamin Bellamy + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 👀 + {" "} + + 🖋 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📝 + {" "} + + 📆 + {" "} + + 📢 + +
+ + Ola Hneini +
+ + Ola Hneini + +
+
+ + 💻 + {" "} + + 👀 + {" "} + + 📖 + {" "} + + 🚧 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Romain de Laage +
+ + Romain de Laage + +
+
+ + 💻 + {" "} + + 🚇 + {" "} + + 📖 + {" "} + + 🌍 + {" "} + + 🤔 + +
+ + Lyonel Bernard +
+ + Lyonel Bernard + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Christopher Lagonick-Weitzel +
+ + Christopher Lagonick-Weitzel + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Ernesto Acosta +
+ + Ernesto Acosta + +
+
+ + 🐛 + {" "} + + 🔊 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Ewen +
+ + Ewen + +
+
+ + 🌍 + {" "} + + 🤔 + {" "} + + 💻 + +
+ + Bastien Luneteau +
+ + Bastien Luneteau + +
+
+ + 💻 + {" "} + + 🐛 + +
+ + Cécile Ricordeau +
+ + Cécile Ricordeau + +
+
+ + 🎨 + +
+ + Patryk Miś +
+ + Patryk Miś + +
+
+ + 🌍 + +
+ + Marcin Lewandowski +
+ + Marcin Lewandowski + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Sebastian Janik +
+ + Sebastian Janik + +
+
+ + 💻 + +
+ + Patryk Karczmarczyk +
+ + Patryk Karczmarczyk + +
+
+ + 💻 + +
+ + denis d +
+ + denis d + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Douglas Kastle +
+ + Douglas Kastle + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + cExplorer +
+ + cExplorer + +
+
+ + 🐛 + {" "} + + 🌍 + +
+ + ImaCrea +
+ + ImaCrea + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Jonas S +
+ + Jonas S + +
+
+ + 💻 + +
+ + LEFEBVRE Yann +
+ + LEFEBVRE Yann + +
+
+ + 🐛 + +
+ + Sebastian Späth +
+ + Sebastian Späth + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + rocky III +
+ + rocky III + +
+
+ + 🐛 + +
+ + Hermann Josef Eckl +
+ + Hermann Josef Eckl + +
+
+ + 🐛 + +
+ + Delhaye Cyrille +
+ + Delhaye Cyrille + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + João Leandro +
+ + João Leandro + +
+
+ + 🌍 + {" "} + + 🤔 + +
+ + Angelos Chouvardas +
+ + Angelos Chouvardas + +
+
+ + 🌍 + +
+ + Eivind +
+ + Eivind + +
+
+ + 🌍 + +
+ + forght +
+ + forght + +
+
+ + 🌍 + +
+ + glottis0q +
+ + glottis0q + +
+
+ + 🌍 + +
+ + ButterflyOfFire +
+ + ButterflyOfFire + +
+
+ + 🌍 + +
+ + Lucian I. Last +
+ + Lucian I. Last + +
+
+ + 🌍 + +
+ + LuuzViir +
+ + LuuzViir + +
+
+ + 🌍 + +
+ + CTHTC +
+ + CTHTC + +
+
+ + 🌍 + +
+ + Russian Retro +
+ + Russian Retro + +
+
+ + 🌍 + +
+ + Marek L'ach +
+ + Marek L'ach + +
+
+ + 🌍 + +
+ + GunChleoc +
+ + GunChleoc + +
+
+ + 🌍 + +
+ + GabiSnow +
+ + GabiSnow + +
+
+ + 🌍 + +
+ + bendaha +
+ + bendaha + +
+
+ + 🌍 + +
+ + Samuel Roland +
+ + Samuel Roland + +
+
+ + 🌍 + +
+ + Dimitri Regnier +
+ + Dimitri Regnier + +
+
+ + 🤔 + +
+ + irithys +
+ + irithys + +
+
+ + 🌍 + +
+ + Sergi +
+ + Sergi + +
+
+ + 🌍 + +
+ + ghose (XoseM) +
+ + ghose (XoseM) + +
+
+ + 🌍 + +
+ + Andreas Olsson +
+ + Andreas Olsson + +
+
+ + 🌍 + +
+ + leonfrom +
+ + leonfrom + +
+
+ + 🌍 + +
+ + agentcobra +
+ + agentcobra + +
+
+ + 🌍 + +
+ + Alessandro +
+ + Alessandro + +
+
+ + 🌍 + +
+ + liimee +
+ + liimee + +
+
+ + 🌍 + +
+ + Ahmed Sabouni +
+ + Ahmed Sabouni + +
+
+ + 🌍 + +
+ + KrzysztofDomanczyk +
+ + KrzysztofDomanczyk + +
+
+ + 💻 + +
+ + Guy Martin +
+ + Guy Martin + +
+
+ + 🐛 + {" "} + + 💻 + +
+ +{/* markdownlint-restore */} +{/* prettier-ignore-end */} + +{/* ALL-CONTRIBUTORS-LIST:END */} + +This project follows the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind welcome! + +## Kontak + +You may reach us for help or ask any question you have on: + +- [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) + +Alternatively, you can follow us on social media platforms to get news about +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) + +## Sponsor-sponsor + +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). + + + +## Lisensi + +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) + +Copyright © 2020-present, [Ad Aures](https://adaures.com/). diff --git a/docs/src/content/docs/it/getting-started/auth.mdx b/docs/src/content/docs/it/getting-started/auth.mdx new file mode 100644 index 00000000..a9d81278 --- /dev/null +++ b/docs/src/content/docs/it/getting-started/auth.mdx @@ -0,0 +1,85 @@ +--- +title: Autenticazione & Autorizzazione +--- + +Castopod gestisce l'autenticazione e l'autorizzazione utilizzando +`codeigniter/shield` abbinato a regole personalizzate. Ruoli e permessi sono +definiti a due livelli: + +1. [intera istanza](#1-instance-wide-roles-and-permissions) +2. [per podcast](#2-per-podcast-roles-and-permissions) + +## 1. Ruoli e permessi per l'intera istanza + +### Ruoli dell'istanza + +{/* 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 */} + +### Permessi istanza + +{/* 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 i ruoli e le autorizzazioni del podcast + +### Per i ruoli del podcast + +{/* 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, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| 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 */} + +### Autorizzazioni per podcast + +{/* 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 dashboards and analytics of podcast #\{id\}'s episodes. | +| episodes.create | Can create episodes for podcast #\{id\}. | +| episodes.edit | Can edit episodes of podcast #\{id\}. | +| episodes.delete | Can delete episodes of podcast #\{id\}. | +| episodes.manage-persons | Can manage episode persons of podcast #\{id\}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #\{id\}. | +| episodes.manage-publications | Can publish/unpublish episodes and posts of podcast #\{id\}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #\{id\}. | + +{/* AUTH-PODCAST-PERMISSIONS-LIST:END */} diff --git a/docs/src/content/docs/it/getting-started/docker.mdx b/docs/src/content/docs/it/getting-started/docker.mdx new file mode 100644 index 00000000..6141377f --- /dev/null +++ b/docs/src/content/docs/it/getting-started/docker.mdx @@ -0,0 +1,157 @@ +--- +title: Official Docker images +--- + +Castopod pushes 3 Docker images to the Docker Hub during its automated build +process: + +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit +- [**`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 + +Additionally, Castopod requires a MySQL-compatible database. A Redis database +can be added as a cache handler. + +## Supported tags + +- `develop` [unstable], latest development branch build +- `beta` [stable], latest beta version build +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) + +## Example usage + +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: + + ```yml + version: "3.7" + + services: + app: + image: castopod/castopod:latest + container_name: "castopod-app" + volumes: + - castopod-media:/var/www/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + CP_BASEURL: "https://castopod.example.com" + CP_ANALYTICS_SALT: changeme + CP_CACHE_HANDLER: redis + CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme + networks: + - castopod-app + - castopod-db + ports: + - 8000:8000 + restart: unless-stopped + + mariadb: + image: mariadb:10.5 + container_name: "castopod-mariadb" + networks: + - castopod-db + volumes: + - castopod-db:/var/lib/mysql + environment: + MYSQL_ROOT_PASSWORD: changeme + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + restart: unless-stopped + + redis: + image: redis:7.0-alpine + container_name: "castopod-redis" + command: --requirepass changeme + volumes: + - castopod-cache:/data + networks: + - castopod-app + + volumes: + castopod-media: + castopod-db: + castopod-cache: + + networks: + castopod-app: + castopod-db: + ``` + + You have to adapt some variables to your needs (e.g. `CP_BASEURL`, + `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). + +3. Setup a reverse proxy for 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/): + + ``` + #castopod + castopod.example.com { + reverse_proxy localhost:8000 + } + ``` + +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! + +5. You're all set, start podcasting! 🎙️🚀 + +## Environment Variables + +- **castopod/castopod** and **castopod/app** + + | Variable name | Type (`default`) | Default | + | ------------------------------------- | ----------------------- | ---------------- | + | **`CP_BASEURL`** | string | `undefined` | + | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | + | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | + | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | + | **`CP_ANALYTICS_SALT`** | string | `undefined` | + | **`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_REDIS_HOST`** | ?string | `"localhost"` | + | **`CP_REDIS_PASSWORD`** | ?string | `null` | + | **`CP_REDIS_PORT`** | ?number | `6379` | + | **`CP_REDIS_DATABASE`** | ?number | `0` | + | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | + | **`CP_EMAIL_FROM`** | ?string | `undefined` | + | **`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_ENABLE_2FA`** | ?boolean | `undefined` | + | **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` | + | **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` | + | **`CP_MEDIA_S3_KEY`** | ?string | `undefined` | + | **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` | + | **`CP_MEDIA_S3_REGION`** | ?string | `undefined` | + | **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` | + | **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` | + | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` | + | **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` | + | **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` | + | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | + | **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | + +- **castopod/web-server** + + | Variable name | Type | Default | + | ---------------------- | --------------------- | ------- | + | **`CP_APP_HOSTNAME`** | ?string | `"app"` | + | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | diff --git a/docs/src/content/docs/it/getting-started/install.mdx b/docs/src/content/docs/it/getting-started/install.mdx new file mode 100644 index 00000000..d8888954 --- /dev/null +++ b/docs/src/content/docs/it/getting-started/install.mdx @@ -0,0 +1,251 @@ +--- +title: How to install Castopod? +--- + +import { Aside } from "@astrojs/starlight/components"; + +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. + + + +## Requirements + +- PHP v8.1 or higher +- MySQL version 5.7 or higher or MariaDB version 10.2 or higher +- HTTPS support +- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's + incoming requests + +### PHP v8.1 or higher + +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. +- [exif](https://www.php.net/manual/en/exif.installation.php) + +Additionally, make sure that the following extensions are enabled in your PHP: + +- json (enabled by default - don't turn it off) +- xml (enabled by default - don't turn it off) +- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php) + +### MySQL compatible database + +> We recommend using [MariaDB](https://mariadb.org). + +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. + +#### Privileges + +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`. + +### (Optional) FFmpeg v4.1.8 or higher for Video Clips + +[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: + +- **FreeType 2** library for + [gd](https://www.php.net/manual/en/image.installation.php). + +### (Optional) Other recommendations + +- Redis for better cache performances. +- CDN for static files caching and better performances. +- e-mail gateway for lost passwords. + +## Install instructions + +### Pre-requisites + +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 haven’t 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): + + ```bash + * * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1 + ``` + + **Note** - If you do not add this cron task, the following Castopod features + will not work: + + - Importing a podcast from an existing RSS feed + - Broadcasting social activities to your followers in the fediverse + - Broadcasting episodes to open hubs using + [WebSub](https://en.wikipedia.org/wiki/WebSub) + - Generating video clips - + [requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips) + +### (recommended) Install Wizard + +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! + + + +### Using CLI + +1. Create a `.env` file in the package root based on the `.env.example` file. +2. Initialize the database using: + + ```sh + php spark install:init-database + ``` + +3. Create the superadmin user using: + + ```sh + php spark install:create-superadmin + ``` + +4. Head on to your admin gateway to start podcasting! + +### Email/SMTP setup + +Email configuration is required for some features to work properly (eg. +retrieving your forgotten password, sending instructions to premium subscribers, +…) + +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" +``` + +#### Email config options + +| 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"` | + +### Media storage + +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 + +If you prefer storing your media files on an S3 compatible storage, you may +specify it in your `.env`: + +```ini +# […] + +media.fileManager="s3" +media.s3.endpoint="your_s3_host" +media.s3.key="your_s3_key" +media.s3.secret="your_s3_secret" +media.s3.region="your_s3_region" +``` + +#### S3 config options + +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | + +## Community packages + +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. + +### Install with 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. + + diff --git a/docs/src/content/docs/it/getting-started/security.mdx b/docs/src/content/docs/it/getting-started/security.mdx new file mode 100644 index 00000000..c039493c --- /dev/null +++ b/docs/src/content/docs/it/getting-started/security.mdx @@ -0,0 +1,24 @@ +--- +title: Security concerns +--- + +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). + +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): + +- `writable/` folder must be **readable** and **writable**. +- `public/media/` folder must be **readable** and **writable**. +- any other file must be set to **readonly**. + +For instance, if you are using Apache or NGINX with Ubuntu you may do the +following: + +```bash +sudo chown -R root:root /path/to/castopod +sudo chown -R www-data:www-data /path/to/castopod/writable +sudo chown -R www-data:www-data /path/to/castopod/public/media +``` diff --git a/docs/src/ru/getting-started/update.md b/docs/src/content/docs/it/getting-started/update.mdx similarity index 96% rename from docs/src/ru/getting-started/update.md rename to docs/src/content/docs/it/getting-started/update.mdx index 76668ae3..d91f98c4 100644 --- a/docs/src/ru/getting-started/update.md +++ b/docs/src/content/docs/it/getting-started/update.mdx @@ -1,9 +1,8 @@ --- -title: Update -sidebarDepth: 3 +title: How to update Castopod? --- -# How to update Castopod? +import { Aside } from "@astrojs/starlight/components"; 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 @@ -36,12 +35,12 @@ improvements ⚡. - Remove all files except `.env` and `public/media` - Copy the new files from the downloaded package into your server - ::: info Note + 4. Update your database schema from your `Castopod Admin` > `About` page or by running: @@ -54,7 +53,7 @@ improvements ⚡. `Housekeeping` 6. ✨ Enjoy your fresh instance, you're all done! -::: info Note + ## Fully Automated updates diff --git a/docs/src/content/docs/it/index.mdx b/docs/src/content/docs/it/index.mdx new file mode 100644 index 00000000..3f1ec043 --- /dev/null +++ b/docs/src/content/docs/it/index.mdx @@ -0,0 +1,1349 @@ +--- +title: Welcome 👋 +--- + +import { LinkCard } from "@astrojs/starlight/components"; + +Castopod is a free & open-source hosting platform made for podcasters who want +engage and interact with their audience. + +Castopod is easy to install and was built on top of +[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very +small footprint. + + + +## Features + +- 🌱  Free & open-source (AGPL v3 License) +- 🔐  Focused on data sovereignty: your content, audience, and analytics + belong to you, and you only +- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, + chapters, location, persons, soundbites, … +- 💬  Built-in social network: + - 🚀  Castopod is part of the Fediverse, a decentralized social network + - ❤️  Create posts, share, favourite, and comment on episodes +- 📈  Built-in analytics: + - ⚖️  GDPR / CCPA / LGPD compliant + - 🪙  Standard IABv2 audience measurement + - 🏡  On-premises analytics, no third party involved +- 📢  Built-in marketing tools: + - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) + - 📱  PWA: install as a standalone app + - 🎨  Customizable theme colors + - 🎬  Generate ready-to-share Video clips from episodes + - 🔉  Generate soundbites + - ▶️  Embeddable player, embed your episodes on any website +- 💸  Monetization: + - 🔗  Funding links + - 📲  listen-to-click ads + - 🤝  value4value / WebMonetization + - 💎  Premium podcasts +- 📡  Publish your episodes everywhere with RSS: + - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, + Google Podcasts, Deezer, Podcast Addict, Podfriend, … + - ⚡  Broadcast your episodes instantly with WebSub +- 📥  Podcast import: move your existing podcast into Castopod +- 📤  Move your podcast out of Castopod +- 🔀  Multi-tenant: host as many podcasts as you want +- 👥  Multi-user: add contributors and set roles +- 🌎  i18n support: translated in English, French, Polish, German, + Brazilian Portuguese & Spanish… with + [more to come](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. + +It is in fact one of the only media to have stayed this way for a long time. + +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. + +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized 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. + +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. + +## Comparison with other solutions + +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 you. + +### 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 it. + +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. + +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. + +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 journey. + +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. + +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! + +### 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 was initially built around music. And later on, as the project +evolved, the ability to host podcasts was introduced. + +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, …). + +So, you should probably use Funkwhale if you want to host your music, and use +Castopod if you want to host your podcasts. + +### Castopod vs other podcast hosts + +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! + +Each of these solutions differ from one another, you may compare with the +[list of features](#features). + +That being said, there are two main differences with other podcasting solutions: + +- 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 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. + +## Contributing + +Love Castopod and would like to help? Take a look at the following documentation +to get you started. + +### Code of conduct + +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 tolerated. + +### Contributing 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. + +## Contributors ✨ + +Thanks goes to these wonderful people +([emoji key](https://allcontributors.org/docs/en/emoji-key)): + +{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */} +{/* prettier-ignore-start */} +{/* markdownlint-disable */} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Yassine Doghri +
+ + Yassine Doghri + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 📖 + {" "} + + 👀 + {" "} + + 🚧 + {" "} + + 🖋 + {" "} + + 🎨 + {" "} + + ️️️️♿️ + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🧑‍🏫 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📆 + {" "} + + 📝 + +
+ + Benjamin Bellamy +
+ + Benjamin Bellamy + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 👀 + {" "} + + 🖋 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📝 + {" "} + + 📆 + {" "} + + 📢 + +
+ + Ola Hneini +
+ + Ola Hneini + +
+
+ + 💻 + {" "} + + 👀 + {" "} + + 📖 + {" "} + + 🚧 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Romain de Laage +
+ + Romain de Laage + +
+
+ + 💻 + {" "} + + 🚇 + {" "} + + 📖 + {" "} + + 🌍 + {" "} + + 🤔 + +
+ + Lyonel Bernard +
+ + Lyonel Bernard + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Christopher Lagonick-Weitzel +
+ + Christopher Lagonick-Weitzel + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Ernesto Acosta +
+ + Ernesto Acosta + +
+
+ + 🐛 + {" "} + + 🔊 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Bastien Luneteau +
+ + Bastien Luneteau + +
+
+ + 💻 + {" "} + + 🐛 + +
+ + Cécile Ricordeau +
+ + Cécile Ricordeau + +
+
+ + 🎨 + +
+ + Patryk Miś +
+ + Patryk Miś + +
+
+ + 🌍 + +
+ + Marcin Lewandowski +
+ + Marcin Lewandowski + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Sebastian Janik +
+ + Sebastian Janik + +
+
+ + 💻 + +
+ + Patryk Karczmarczyk +
+ + Patryk Karczmarczyk + +
+
+ + 💻 + +
+ + denis d +
+ + denis d + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Douglas Kastle +
+ + Douglas Kastle + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + cExplorer +
+ + cExplorer + +
+
+ + 🐛 + {" "} + + 🌍 + +
+ + ImaCrea +
+ + ImaCrea + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Jonas S +
+ + Jonas S + +
+
+ + 💻 + +
+ + LEFEBVRE Yann +
+ + LEFEBVRE Yann + +
+
+ + 🐛 + +
+ + Sebastian Späth +
+ + Sebastian Späth + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + rocky III +
+ + rocky III + +
+
+ + 🐛 + +
+ + Hermann Josef Eckl +
+ + Hermann Josef Eckl + +
+
+ + 🐛 + +
+ + Delhaye Cyrille +
+ + Delhaye Cyrille + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + João Leandro +
+ + João Leandro + +
+
+ + 🌍 + {" "} + + 🤔 + +
+ + Angelos Chouvardas +
+ + Angelos Chouvardas + +
+
+ + 🌍 + +
+ + Eivind +
+ + Eivind + +
+
+ + 🌍 + +
+ + Ewen +
+ + Ewen + +
+
+ + 🌍 + {" "} + + 🤔 + +
+ + forght +
+ + forght + +
+
+ + 🌍 + +
+ + glottis0q +
+ + glottis0q + +
+
+ + 🌍 + +
+ + ButterflyOfFire +
+ + ButterflyOfFire + +
+
+ + 🌍 + +
+ + Lucian I. Last +
+ + Lucian I. Last + +
+
+ + 🌍 + +
+ + LuuzViir +
+ + LuuzViir + +
+
+ + 🌍 + +
+ + CTHTC +
+ + CTHTC + +
+
+ + 🌍 + +
+ + Russian Retro +
+ + Russian Retro + +
+
+ + 🌍 + +
+ + Marek L'ach +
+ + Marek L'ach + +
+
+ + 🌍 + +
+ + GunChleoc +
+ + GunChleoc + +
+
+ + 🌍 + +
+ + GabiSnow +
+ + GabiSnow + +
+
+ + 🌍 + +
+ + bendaha +
+ + bendaha + +
+
+ + 🌍 + +
+ + Samuel Roland +
+ + Samuel Roland + +
+
+ + 🌍 + +
+ + Dimitri Regnier +
+ + Dimitri Regnier + +
+
+ + 🤔 + +
+ + irithys +
+ + irithys + +
+
+ + 🌍 + +
+ + Sergi +
+ + Sergi + +
+
+ + 🌍 + +
+ + ghose (XoseM) +
+ + ghose (XoseM) + +
+
+ + 🌍 + +
+ + Andreas Olsson +
+ + Andreas Olsson + +
+
+ + 🌍 + +
+ + leonfrom +
+ + leonfrom + +
+
+ + 🌍 + +
+ + agentcobra +
+ + agentcobra + +
+
+ + 🌍 + +
+ + Alessandro +
+ + Alessandro + +
+
+ + 🌍 + +
+ + liimee +
+ + liimee + +
+
+ + 🌍 + +
+ + Ahmed Sabouni +
+ + Ahmed Sabouni + +
+
+ + 🌍 + +
+ + KrzysztofDomanczyk +
+ + KrzysztofDomanczyk + +
+
+ + 💻 + +
+ +{/* markdownlint-restore */} +{/* prettier-ignore-end */} + +{/* ALL-CONTRIBUTORS-LIST:END */} + +This project follows the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind welcome! + +## Contact + +You may reach us for help or ask any question you have on: + +- [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) + +Alternatively, you can follow us on social media platforms to get news about +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 + +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). + +[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/) + +[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/) + +## License + +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) + +Copyright © 2020-present, [Ad Aures](https://adaures.com/). diff --git a/docs/src/content/docs/ja/getting-started/auth.mdx b/docs/src/content/docs/ja/getting-started/auth.mdx new file mode 100644 index 00000000..d4dd4dd5 --- /dev/null +++ b/docs/src/content/docs/ja/getting-started/auth.mdx @@ -0,0 +1,84 @@ +--- +title: 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, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| 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 dashboards and analytics of podcast #\{id\}'s episodes. | +| episodes.create | Can create episodes for podcast #\{id\}. | +| episodes.edit | Can edit episodes of podcast #\{id\}. | +| episodes.delete | Can delete episodes of podcast #\{id\}. | +| episodes.manage-persons | Can manage episode persons of podcast #\{id\}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #\{id\}. | +| episodes.manage-publications | Can publish/unpublish episodes and posts of podcast #\{id\}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #\{id\}. | + +{/* AUTH-PODCAST-PERMISSIONS-LIST:END */} diff --git a/docs/src/content/docs/ja/getting-started/docker.mdx b/docs/src/content/docs/ja/getting-started/docker.mdx new file mode 100644 index 00000000..6141377f --- /dev/null +++ b/docs/src/content/docs/ja/getting-started/docker.mdx @@ -0,0 +1,157 @@ +--- +title: Official Docker images +--- + +Castopod pushes 3 Docker images to the Docker Hub during its automated build +process: + +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit +- [**`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 + +Additionally, Castopod requires a MySQL-compatible database. A Redis database +can be added as a cache handler. + +## Supported tags + +- `develop` [unstable], latest development branch build +- `beta` [stable], latest beta version build +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) + +## Example usage + +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: + + ```yml + version: "3.7" + + services: + app: + image: castopod/castopod:latest + container_name: "castopod-app" + volumes: + - castopod-media:/var/www/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + CP_BASEURL: "https://castopod.example.com" + CP_ANALYTICS_SALT: changeme + CP_CACHE_HANDLER: redis + CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme + networks: + - castopod-app + - castopod-db + ports: + - 8000:8000 + restart: unless-stopped + + mariadb: + image: mariadb:10.5 + container_name: "castopod-mariadb" + networks: + - castopod-db + volumes: + - castopod-db:/var/lib/mysql + environment: + MYSQL_ROOT_PASSWORD: changeme + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + restart: unless-stopped + + redis: + image: redis:7.0-alpine + container_name: "castopod-redis" + command: --requirepass changeme + volumes: + - castopod-cache:/data + networks: + - castopod-app + + volumes: + castopod-media: + castopod-db: + castopod-cache: + + networks: + castopod-app: + castopod-db: + ``` + + You have to adapt some variables to your needs (e.g. `CP_BASEURL`, + `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). + +3. Setup a reverse proxy for 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/): + + ``` + #castopod + castopod.example.com { + reverse_proxy localhost:8000 + } + ``` + +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! + +5. You're all set, start podcasting! 🎙️🚀 + +## Environment Variables + +- **castopod/castopod** and **castopod/app** + + | Variable name | Type (`default`) | Default | + | ------------------------------------- | ----------------------- | ---------------- | + | **`CP_BASEURL`** | string | `undefined` | + | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | + | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | + | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | + | **`CP_ANALYTICS_SALT`** | string | `undefined` | + | **`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_REDIS_HOST`** | ?string | `"localhost"` | + | **`CP_REDIS_PASSWORD`** | ?string | `null` | + | **`CP_REDIS_PORT`** | ?number | `6379` | + | **`CP_REDIS_DATABASE`** | ?number | `0` | + | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | + | **`CP_EMAIL_FROM`** | ?string | `undefined` | + | **`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_ENABLE_2FA`** | ?boolean | `undefined` | + | **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` | + | **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` | + | **`CP_MEDIA_S3_KEY`** | ?string | `undefined` | + | **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` | + | **`CP_MEDIA_S3_REGION`** | ?string | `undefined` | + | **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` | + | **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` | + | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` | + | **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` | + | **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` | + | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | + | **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | + +- **castopod/web-server** + + | Variable name | Type | Default | + | ---------------------- | --------------------- | ------- | + | **`CP_APP_HOSTNAME`** | ?string | `"app"` | + | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | diff --git a/docs/src/el/getting-started/install.md b/docs/src/content/docs/ja/getting-started/install.mdx similarity index 82% rename from docs/src/el/getting-started/install.md rename to docs/src/content/docs/ja/getting-started/install.mdx index cdea18ec..3067a367 100644 --- a/docs/src/el/getting-started/install.md +++ b/docs/src/content/docs/ja/getting-started/install.mdx @@ -1,21 +1,20 @@ --- -title: Installation -sidebarDepth: 3 +title: How to install Castopod? --- -# How to install Castopod? +import { Aside } from "@astrojs/starlight/components"; 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. -::: tip Note + ## Requirements @@ -46,13 +45,13 @@ Additionally, make sure that the following extensions are enabled in your PHP: > We recommend using [MariaDB](https://mariadb.org). -::: warning Warning + 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 @@ -115,13 +114,13 @@ want to generate Video Clips. The following extensions must be installed: 2. Follow the instructions on your screen. 3. Start podcasting! -::: info Note + ### Using CLI @@ -226,13 +225,35 @@ self-hosting for you. diff --git a/docs/src/content/docs/ja/getting-started/security.mdx b/docs/src/content/docs/ja/getting-started/security.mdx new file mode 100644 index 00000000..c039493c --- /dev/null +++ b/docs/src/content/docs/ja/getting-started/security.mdx @@ -0,0 +1,24 @@ +--- +title: Security concerns +--- + +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). + +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): + +- `writable/` folder must be **readable** and **writable**. +- `public/media/` folder must be **readable** and **writable**. +- any other file must be set to **readonly**. + +For instance, if you are using Apache or NGINX with Ubuntu you may do the +following: + +```bash +sudo chown -R root:root /path/to/castopod +sudo chown -R www-data:www-data /path/to/castopod/writable +sudo chown -R www-data:www-data /path/to/castopod/public/media +``` diff --git a/docs/src/content/docs/ja/getting-started/update.mdx b/docs/src/content/docs/ja/getting-started/update.mdx new file mode 100644 index 00000000..f1a26974 --- /dev/null +++ b/docs/src/content/docs/ja/getting-started/update.mdx @@ -0,0 +1,108 @@ +--- +title: How to update Castopod? +--- + +import { Aside } from "@astrojs/starlight/components"; + +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 ⚡. + +## Update instructions + +0. ⚠️ Before any update, we highly recommend you backup your Castopod files and + database. + + - cf. + [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 + + - cf. + [Where can I find my 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 + + - ⚠️ 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/) + +3. On your server: + + - Remove all files except `.env` and `public/media` + - Copy the new files from the downloaded package into your server + + + +4. Update your database schema from your `Castopod Admin` > `About` page or by + running: + + ```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! + + + +## Fully Automated updates + +> Coming soon... 👀 + +## Frequently asked questions (FAQ) + +### Where can I find my Castopod version? + +Go to your Castopod admin panel, the version is displayed on the bottom left +corner. + +Alternatively, you can find the version in the `app > Config > Constants.php` +file. + +### I haven't updated my instance in a long time… What should I do? + +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. + +> You may want to backup your instance depending on how long you haven't updated +> Castopod. + +For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to +`v1.0.0-beta.1`: + +0. (highly recommended) Make a backup of your files and database. + +1. Download the latest release, overwrite your files whilst keeping `.env` and + `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`, + `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`. + +3. ✨ Enjoy your fresh instance, you're all done! + +### Should I make a backup before updating? + +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… diff --git a/docs/src/content/docs/ja/index.mdx b/docs/src/content/docs/ja/index.mdx new file mode 100644 index 00000000..3f1ec043 --- /dev/null +++ b/docs/src/content/docs/ja/index.mdx @@ -0,0 +1,1349 @@ +--- +title: Welcome 👋 +--- + +import { LinkCard } from "@astrojs/starlight/components"; + +Castopod is a free & open-source hosting platform made for podcasters who want +engage and interact with their audience. + +Castopod is easy to install and was built on top of +[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very +small footprint. + + + +## Features + +- 🌱  Free & open-source (AGPL v3 License) +- 🔐  Focused on data sovereignty: your content, audience, and analytics + belong to you, and you only +- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, + chapters, location, persons, soundbites, … +- 💬  Built-in social network: + - 🚀  Castopod is part of the Fediverse, a decentralized social network + - ❤️  Create posts, share, favourite, and comment on episodes +- 📈  Built-in analytics: + - ⚖️  GDPR / CCPA / LGPD compliant + - 🪙  Standard IABv2 audience measurement + - 🏡  On-premises analytics, no third party involved +- 📢  Built-in marketing tools: + - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) + - 📱  PWA: install as a standalone app + - 🎨  Customizable theme colors + - 🎬  Generate ready-to-share Video clips from episodes + - 🔉  Generate soundbites + - ▶️  Embeddable player, embed your episodes on any website +- 💸  Monetization: + - 🔗  Funding links + - 📲  listen-to-click ads + - 🤝  value4value / WebMonetization + - 💎  Premium podcasts +- 📡  Publish your episodes everywhere with RSS: + - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, + Google Podcasts, Deezer, Podcast Addict, Podfriend, … + - ⚡  Broadcast your episodes instantly with WebSub +- 📥  Podcast import: move your existing podcast into Castopod +- 📤  Move your podcast out of Castopod +- 🔀  Multi-tenant: host as many podcasts as you want +- 👥  Multi-user: add contributors and set roles +- 🌎  i18n support: translated in English, French, Polish, German, + Brazilian Portuguese & Spanish… with + [more to come](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. + +It is in fact one of the only media to have stayed this way for a long time. + +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. + +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized 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. + +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. + +## Comparison with other solutions + +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 you. + +### 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 it. + +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. + +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. + +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 journey. + +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. + +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! + +### 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 was initially built around music. And later on, as the project +evolved, the ability to host podcasts was introduced. + +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, …). + +So, you should probably use Funkwhale if you want to host your music, and use +Castopod if you want to host your podcasts. + +### Castopod vs other podcast hosts + +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! + +Each of these solutions differ from one another, you may compare with the +[list of features](#features). + +That being said, there are two main differences with other podcasting solutions: + +- 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 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. + +## Contributing + +Love Castopod and would like to help? Take a look at the following documentation +to get you started. + +### Code of conduct + +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 tolerated. + +### Contributing 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. + +## Contributors ✨ + +Thanks goes to these wonderful people +([emoji key](https://allcontributors.org/docs/en/emoji-key)): + +{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */} +{/* prettier-ignore-start */} +{/* markdownlint-disable */} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Yassine Doghri +
+ + Yassine Doghri + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 📖 + {" "} + + 👀 + {" "} + + 🚧 + {" "} + + 🖋 + {" "} + + 🎨 + {" "} + + ️️️️♿️ + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🧑‍🏫 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📆 + {" "} + + 📝 + +
+ + Benjamin Bellamy +
+ + Benjamin Bellamy + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 👀 + {" "} + + 🖋 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📝 + {" "} + + 📆 + {" "} + + 📢 + +
+ + Ola Hneini +
+ + Ola Hneini + +
+
+ + 💻 + {" "} + + 👀 + {" "} + + 📖 + {" "} + + 🚧 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Romain de Laage +
+ + Romain de Laage + +
+
+ + 💻 + {" "} + + 🚇 + {" "} + + 📖 + {" "} + + 🌍 + {" "} + + 🤔 + +
+ + Lyonel Bernard +
+ + Lyonel Bernard + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Christopher Lagonick-Weitzel +
+ + Christopher Lagonick-Weitzel + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Ernesto Acosta +
+ + Ernesto Acosta + +
+
+ + 🐛 + {" "} + + 🔊 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Bastien Luneteau +
+ + Bastien Luneteau + +
+
+ + 💻 + {" "} + + 🐛 + +
+ + Cécile Ricordeau +
+ + Cécile Ricordeau + +
+
+ + 🎨 + +
+ + Patryk Miś +
+ + Patryk Miś + +
+
+ + 🌍 + +
+ + Marcin Lewandowski +
+ + Marcin Lewandowski + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Sebastian Janik +
+ + Sebastian Janik + +
+
+ + 💻 + +
+ + Patryk Karczmarczyk +
+ + Patryk Karczmarczyk + +
+
+ + 💻 + +
+ + denis d +
+ + denis d + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Douglas Kastle +
+ + Douglas Kastle + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + cExplorer +
+ + cExplorer + +
+
+ + 🐛 + {" "} + + 🌍 + +
+ + ImaCrea +
+ + ImaCrea + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Jonas S +
+ + Jonas S + +
+
+ + 💻 + +
+ + LEFEBVRE Yann +
+ + LEFEBVRE Yann + +
+
+ + 🐛 + +
+ + Sebastian Späth +
+ + Sebastian Späth + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + rocky III +
+ + rocky III + +
+
+ + 🐛 + +
+ + Hermann Josef Eckl +
+ + Hermann Josef Eckl + +
+
+ + 🐛 + +
+ + Delhaye Cyrille +
+ + Delhaye Cyrille + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + João Leandro +
+ + João Leandro + +
+
+ + 🌍 + {" "} + + 🤔 + +
+ + Angelos Chouvardas +
+ + Angelos Chouvardas + +
+
+ + 🌍 + +
+ + Eivind +
+ + Eivind + +
+
+ + 🌍 + +
+ + Ewen +
+ + Ewen + +
+
+ + 🌍 + {" "} + + 🤔 + +
+ + forght +
+ + forght + +
+
+ + 🌍 + +
+ + glottis0q +
+ + glottis0q + +
+
+ + 🌍 + +
+ + ButterflyOfFire +
+ + ButterflyOfFire + +
+
+ + 🌍 + +
+ + Lucian I. Last +
+ + Lucian I. Last + +
+
+ + 🌍 + +
+ + LuuzViir +
+ + LuuzViir + +
+
+ + 🌍 + +
+ + CTHTC +
+ + CTHTC + +
+
+ + 🌍 + +
+ + Russian Retro +
+ + Russian Retro + +
+
+ + 🌍 + +
+ + Marek L'ach +
+ + Marek L'ach + +
+
+ + 🌍 + +
+ + GunChleoc +
+ + GunChleoc + +
+
+ + 🌍 + +
+ + GabiSnow +
+ + GabiSnow + +
+
+ + 🌍 + +
+ + bendaha +
+ + bendaha + +
+
+ + 🌍 + +
+ + Samuel Roland +
+ + Samuel Roland + +
+
+ + 🌍 + +
+ + Dimitri Regnier +
+ + Dimitri Regnier + +
+
+ + 🤔 + +
+ + irithys +
+ + irithys + +
+
+ + 🌍 + +
+ + Sergi +
+ + Sergi + +
+
+ + 🌍 + +
+ + ghose (XoseM) +
+ + ghose (XoseM) + +
+
+ + 🌍 + +
+ + Andreas Olsson +
+ + Andreas Olsson + +
+
+ + 🌍 + +
+ + leonfrom +
+ + leonfrom + +
+
+ + 🌍 + +
+ + agentcobra +
+ + agentcobra + +
+
+ + 🌍 + +
+ + Alessandro +
+ + Alessandro + +
+
+ + 🌍 + +
+ + liimee +
+ + liimee + +
+
+ + 🌍 + +
+ + Ahmed Sabouni +
+ + Ahmed Sabouni + +
+
+ + 🌍 + +
+ + KrzysztofDomanczyk +
+ + KrzysztofDomanczyk + +
+
+ + 💻 + +
+ +{/* markdownlint-restore */} +{/* prettier-ignore-end */} + +{/* ALL-CONTRIBUTORS-LIST:END */} + +This project follows the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind welcome! + +## Contact + +You may reach us for help or ask any question you have on: + +- [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) + +Alternatively, you can follow us on social media platforms to get news about +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 + +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). + +[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/) + +[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/) + +## License + +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) + +Copyright © 2020-present, [Ad Aures](https://adaures.com/). diff --git a/docs/src/content/docs/kk/getting-started/auth.mdx b/docs/src/content/docs/kk/getting-started/auth.mdx new file mode 100644 index 00000000..d4dd4dd5 --- /dev/null +++ b/docs/src/content/docs/kk/getting-started/auth.mdx @@ -0,0 +1,84 @@ +--- +title: 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, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| 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 dashboards and analytics of podcast #\{id\}'s episodes. | +| episodes.create | Can create episodes for podcast #\{id\}. | +| episodes.edit | Can edit episodes of podcast #\{id\}. | +| episodes.delete | Can delete episodes of podcast #\{id\}. | +| episodes.manage-persons | Can manage episode persons of podcast #\{id\}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #\{id\}. | +| episodes.manage-publications | Can publish/unpublish episodes and posts of podcast #\{id\}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #\{id\}. | + +{/* AUTH-PODCAST-PERMISSIONS-LIST:END */} diff --git a/docs/src/content/docs/kk/getting-started/docker.mdx b/docs/src/content/docs/kk/getting-started/docker.mdx new file mode 100644 index 00000000..6141377f --- /dev/null +++ b/docs/src/content/docs/kk/getting-started/docker.mdx @@ -0,0 +1,157 @@ +--- +title: Official Docker images +--- + +Castopod pushes 3 Docker images to the Docker Hub during its automated build +process: + +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit +- [**`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 + +Additionally, Castopod requires a MySQL-compatible database. A Redis database +can be added as a cache handler. + +## Supported tags + +- `develop` [unstable], latest development branch build +- `beta` [stable], latest beta version build +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) + +## Example usage + +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: + + ```yml + version: "3.7" + + services: + app: + image: castopod/castopod:latest + container_name: "castopod-app" + volumes: + - castopod-media:/var/www/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + CP_BASEURL: "https://castopod.example.com" + CP_ANALYTICS_SALT: changeme + CP_CACHE_HANDLER: redis + CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme + networks: + - castopod-app + - castopod-db + ports: + - 8000:8000 + restart: unless-stopped + + mariadb: + image: mariadb:10.5 + container_name: "castopod-mariadb" + networks: + - castopod-db + volumes: + - castopod-db:/var/lib/mysql + environment: + MYSQL_ROOT_PASSWORD: changeme + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + restart: unless-stopped + + redis: + image: redis:7.0-alpine + container_name: "castopod-redis" + command: --requirepass changeme + volumes: + - castopod-cache:/data + networks: + - castopod-app + + volumes: + castopod-media: + castopod-db: + castopod-cache: + + networks: + castopod-app: + castopod-db: + ``` + + You have to adapt some variables to your needs (e.g. `CP_BASEURL`, + `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). + +3. Setup a reverse proxy for 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/): + + ``` + #castopod + castopod.example.com { + reverse_proxy localhost:8000 + } + ``` + +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! + +5. You're all set, start podcasting! 🎙️🚀 + +## Environment Variables + +- **castopod/castopod** and **castopod/app** + + | Variable name | Type (`default`) | Default | + | ------------------------------------- | ----------------------- | ---------------- | + | **`CP_BASEURL`** | string | `undefined` | + | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | + | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | + | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | + | **`CP_ANALYTICS_SALT`** | string | `undefined` | + | **`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_REDIS_HOST`** | ?string | `"localhost"` | + | **`CP_REDIS_PASSWORD`** | ?string | `null` | + | **`CP_REDIS_PORT`** | ?number | `6379` | + | **`CP_REDIS_DATABASE`** | ?number | `0` | + | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | + | **`CP_EMAIL_FROM`** | ?string | `undefined` | + | **`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_ENABLE_2FA`** | ?boolean | `undefined` | + | **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` | + | **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` | + | **`CP_MEDIA_S3_KEY`** | ?string | `undefined` | + | **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` | + | **`CP_MEDIA_S3_REGION`** | ?string | `undefined` | + | **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` | + | **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` | + | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` | + | **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` | + | **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` | + | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | + | **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | + +- **castopod/web-server** + + | Variable name | Type | Default | + | ---------------------- | --------------------- | ------- | + | **`CP_APP_HOSTNAME`** | ?string | `"app"` | + | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | diff --git a/docs/src/content/docs/kk/getting-started/install.mdx b/docs/src/content/docs/kk/getting-started/install.mdx new file mode 100644 index 00000000..d8888954 --- /dev/null +++ b/docs/src/content/docs/kk/getting-started/install.mdx @@ -0,0 +1,251 @@ +--- +title: How to install Castopod? +--- + +import { Aside } from "@astrojs/starlight/components"; + +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. + + + +## Requirements + +- PHP v8.1 or higher +- MySQL version 5.7 or higher or MariaDB version 10.2 or higher +- HTTPS support +- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's + incoming requests + +### PHP v8.1 or higher + +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. +- [exif](https://www.php.net/manual/en/exif.installation.php) + +Additionally, make sure that the following extensions are enabled in your PHP: + +- json (enabled by default - don't turn it off) +- xml (enabled by default - don't turn it off) +- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php) + +### MySQL compatible database + +> We recommend using [MariaDB](https://mariadb.org). + +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. + +#### Privileges + +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`. + +### (Optional) FFmpeg v4.1.8 or higher for Video Clips + +[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: + +- **FreeType 2** library for + [gd](https://www.php.net/manual/en/image.installation.php). + +### (Optional) Other recommendations + +- Redis for better cache performances. +- CDN for static files caching and better performances. +- e-mail gateway for lost passwords. + +## Install instructions + +### Pre-requisites + +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 haven’t 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): + + ```bash + * * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1 + ``` + + **Note** - If you do not add this cron task, the following Castopod features + will not work: + + - Importing a podcast from an existing RSS feed + - Broadcasting social activities to your followers in the fediverse + - Broadcasting episodes to open hubs using + [WebSub](https://en.wikipedia.org/wiki/WebSub) + - Generating video clips - + [requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips) + +### (recommended) Install Wizard + +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! + + + +### Using CLI + +1. Create a `.env` file in the package root based on the `.env.example` file. +2. Initialize the database using: + + ```sh + php spark install:init-database + ``` + +3. Create the superadmin user using: + + ```sh + php spark install:create-superadmin + ``` + +4. Head on to your admin gateway to start podcasting! + +### Email/SMTP setup + +Email configuration is required for some features to work properly (eg. +retrieving your forgotten password, sending instructions to premium subscribers, +…) + +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" +``` + +#### Email config options + +| 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"` | + +### Media storage + +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 + +If you prefer storing your media files on an S3 compatible storage, you may +specify it in your `.env`: + +```ini +# […] + +media.fileManager="s3" +media.s3.endpoint="your_s3_host" +media.s3.key="your_s3_key" +media.s3.secret="your_s3_secret" +media.s3.region="your_s3_region" +``` + +#### S3 config options + +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | + +## Community packages + +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. + +### Install with 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. + + diff --git a/docs/src/content/docs/kk/getting-started/security.mdx b/docs/src/content/docs/kk/getting-started/security.mdx new file mode 100644 index 00000000..c039493c --- /dev/null +++ b/docs/src/content/docs/kk/getting-started/security.mdx @@ -0,0 +1,24 @@ +--- +title: Security concerns +--- + +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). + +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): + +- `writable/` folder must be **readable** and **writable**. +- `public/media/` folder must be **readable** and **writable**. +- any other file must be set to **readonly**. + +For instance, if you are using Apache or NGINX with Ubuntu you may do the +following: + +```bash +sudo chown -R root:root /path/to/castopod +sudo chown -R www-data:www-data /path/to/castopod/writable +sudo chown -R www-data:www-data /path/to/castopod/public/media +``` diff --git a/docs/src/content/docs/kk/getting-started/update.mdx b/docs/src/content/docs/kk/getting-started/update.mdx new file mode 100644 index 00000000..f1a26974 --- /dev/null +++ b/docs/src/content/docs/kk/getting-started/update.mdx @@ -0,0 +1,108 @@ +--- +title: How to update Castopod? +--- + +import { Aside } from "@astrojs/starlight/components"; + +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 ⚡. + +## Update instructions + +0. ⚠️ Before any update, we highly recommend you backup your Castopod files and + database. + + - cf. + [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 + + - cf. + [Where can I find my 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 + + - ⚠️ 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/) + +3. On your server: + + - Remove all files except `.env` and `public/media` + - Copy the new files from the downloaded package into your server + + + +4. Update your database schema from your `Castopod Admin` > `About` page or by + running: + + ```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! + + + +## Fully Automated updates + +> Coming soon... 👀 + +## Frequently asked questions (FAQ) + +### Where can I find my Castopod version? + +Go to your Castopod admin panel, the version is displayed on the bottom left +corner. + +Alternatively, you can find the version in the `app > Config > Constants.php` +file. + +### I haven't updated my instance in a long time… What should I do? + +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. + +> You may want to backup your instance depending on how long you haven't updated +> Castopod. + +For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to +`v1.0.0-beta.1`: + +0. (highly recommended) Make a backup of your files and database. + +1. Download the latest release, overwrite your files whilst keeping `.env` and + `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`, + `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`. + +3. ✨ Enjoy your fresh instance, you're all done! + +### Should I make a backup before updating? + +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… diff --git a/docs/src/content/docs/kk/index.mdx b/docs/src/content/docs/kk/index.mdx new file mode 100644 index 00000000..3d80dbb2 --- /dev/null +++ b/docs/src/content/docs/kk/index.mdx @@ -0,0 +1,1381 @@ +--- +title: Welcome 👋 +--- + +import { LinkCard } from "@astrojs/starlight/components"; + +Castopod is a free & open-source hosting platform made for podcasters who want +engage and interact with their audience. + +Castopod is easy to install and was built on top of +[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very +small footprint. + + + +## Features + +- 🌱  Free & open-source (AGPL v3 License) +- 🔐  Focused on data sovereignty: your content, audience, and analytics + belong to you, and you only +- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, + chapters, location, persons, soundbites, … +- 💬  Built-in social network: + - 🚀  Castopod is part of the Fediverse, a decentralized social network + - ❤️  Create posts, share, favourite, and comment on episodes +- 📈  Built-in analytics: + - ⚖️  GDPR / CCPA / LGPD compliant + - 🪙  Standard IABv2 audience measurement + - 🏡  On-premises analytics, no third party involved +- 📢  Built-in marketing tools: + - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) + - 📱  PWA: install as a standalone app + - 🎨  Customizable theme colors + - 🎬  Generate ready-to-share Video clips from episodes + - 🔉  Generate soundbites + - ▶️  Embeddable player, embed your episodes on any website +- 💸  Monetization: + - 🔗  Funding links + - 📲  listen-to-click ads + - 🤝  value4value / WebMonetization + - 💎  Premium podcasts +- 📡  Publish your episodes everywhere with RSS: + - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, + Google Podcasts, Deezer, Podcast Addict, Podfriend, … + - ⚡  Broadcast your episodes instantly with WebSub +- 📥  Podcast import: move your existing podcast into Castopod +- 📤  Move your podcast out of Castopod +- 🔀  Multi-tenant: host as many podcasts as you want +- 👥  Multi-user: add contributors and set roles +- 🌎  i18n support: translated in English, French, Polish, German, + Brazilian Portuguese & Spanish… with + [more to come](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. + +It is in fact one of the only media to have stayed this way for a long time. + +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. + +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized 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. + +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. + +## Comparison with other solutions + +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 you. + +### 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 it. + +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. + +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. + +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 journey. + +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. + +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! + +### 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 was initially built around music. And later on, as the project +evolved, the ability to host podcasts was introduced. + +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, …). + +So, you should probably use Funkwhale if you want to host your music, and use +Castopod if you want to host your podcasts. + +### Castopod vs other podcast hosts + +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! + +Each of these solutions differ from one another, you may compare with the +[list of features](#features). + +That being said, there are two main differences with other podcasting solutions: + +- 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 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. + +## Contributing + +Love Castopod and would like to help? Take a look at the following documentation +to get you started. + +### Code of conduct + +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 tolerated. + +### Contributing 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. + +## Contributors ✨ + +Thanks goes to these wonderful people +([emoji key](https://allcontributors.org/docs/en/emoji-key)): + +{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */} +{/* prettier-ignore-start */} +{/* markdownlint-disable */} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Yassine Doghri +
+ + Yassine Doghri + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 📖 + {" "} + + 👀 + {" "} + + 🚧 + {" "} + + 🖋 + {" "} + + 🎨 + {" "} + + ️️️️♿️ + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🧑‍🏫 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📆 + {" "} + + 📝 + +
+ + Benjamin Bellamy +
+ + Benjamin Bellamy + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 👀 + {" "} + + 🖋 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📝 + {" "} + + 📆 + {" "} + + 📢 + +
+ + Ola Hneini +
+ + Ola Hneini + +
+
+ + 💻 + {" "} + + 👀 + {" "} + + 📖 + {" "} + + 🚧 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Romain de Laage +
+ + Romain de Laage + +
+
+ + 💻 + {" "} + + 🚇 + {" "} + + 📖 + {" "} + + 🌍 + {" "} + + 🤔 + +
+ + Lyonel Bernard +
+ + Lyonel Bernard + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Christopher Lagonick-Weitzel +
+ + Christopher Lagonick-Weitzel + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Ernesto Acosta +
+ + Ernesto Acosta + +
+
+ + 🐛 + {" "} + + 🔊 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Ewen +
+ + Ewen + +
+
+ + 🌍 + {" "} + + 🤔 + {" "} + + 💻 + +
+ + Bastien Luneteau +
+ + Bastien Luneteau + +
+
+ + 💻 + {" "} + + 🐛 + +
+ + Cécile Ricordeau +
+ + Cécile Ricordeau + +
+
+ + 🎨 + +
+ + Patryk Miś +
+ + Patryk Miś + +
+
+ + 🌍 + +
+ + Marcin Lewandowski +
+ + Marcin Lewandowski + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Sebastian Janik +
+ + Sebastian Janik + +
+
+ + 💻 + +
+ + Patryk Karczmarczyk +
+ + Patryk Karczmarczyk + +
+
+ + 💻 + +
+ + denis d +
+ + denis d + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Douglas Kastle +
+ + Douglas Kastle + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + cExplorer +
+ + cExplorer + +
+
+ + 🐛 + {" "} + + 🌍 + +
+ + ImaCrea +
+ + ImaCrea + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Jonas S +
+ + Jonas S + +
+
+ + 💻 + +
+ + LEFEBVRE Yann +
+ + LEFEBVRE Yann + +
+
+ + 🐛 + +
+ + Sebastian Späth +
+ + Sebastian Späth + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + rocky III +
+ + rocky III + +
+
+ + 🐛 + +
+ + Hermann Josef Eckl +
+ + Hermann Josef Eckl + +
+
+ + 🐛 + +
+ + Delhaye Cyrille +
+ + Delhaye Cyrille + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + João Leandro +
+ + João Leandro + +
+
+ + 🌍 + {" "} + + 🤔 + +
+ + Angelos Chouvardas +
+ + Angelos Chouvardas + +
+
+ + 🌍 + +
+ + Eivind +
+ + Eivind + +
+
+ + 🌍 + +
+ + forght +
+ + forght + +
+
+ + 🌍 + +
+ + glottis0q +
+ + glottis0q + +
+
+ + 🌍 + +
+ + ButterflyOfFire +
+ + ButterflyOfFire + +
+
+ + 🌍 + +
+ + Lucian I. Last +
+ + Lucian I. Last + +
+
+ + 🌍 + +
+ + LuuzViir +
+ + LuuzViir + +
+
+ + 🌍 + +
+ + CTHTC +
+ + CTHTC + +
+
+ + 🌍 + +
+ + Russian Retro +
+ + Russian Retro + +
+
+ + 🌍 + +
+ + Marek L'ach +
+ + Marek L'ach + +
+
+ + 🌍 + +
+ + GunChleoc +
+ + GunChleoc + +
+
+ + 🌍 + +
+ + GabiSnow +
+ + GabiSnow + +
+
+ + 🌍 + +
+ + bendaha +
+ + bendaha + +
+
+ + 🌍 + +
+ + Samuel Roland +
+ + Samuel Roland + +
+
+ + 🌍 + +
+ + Dimitri Regnier +
+ + Dimitri Regnier + +
+
+ + 🤔 + +
+ + irithys +
+ + irithys + +
+
+ + 🌍 + +
+ + Sergi +
+ + Sergi + +
+
+ + 🌍 + +
+ + ghose (XoseM) +
+ + ghose (XoseM) + +
+
+ + 🌍 + +
+ + Andreas Olsson +
+ + Andreas Olsson + +
+
+ + 🌍 + +
+ + leonfrom +
+ + leonfrom + +
+
+ + 🌍 + +
+ + agentcobra +
+ + agentcobra + +
+
+ + 🌍 + +
+ + Alessandro +
+ + Alessandro + +
+
+ + 🌍 + +
+ + liimee +
+ + liimee + +
+
+ + 🌍 + +
+ + Ahmed Sabouni +
+ + Ahmed Sabouni + +
+
+ + 🌍 + +
+ + KrzysztofDomanczyk +
+ + KrzysztofDomanczyk + +
+
+ + 💻 + +
+ + Guy Martin +
+ + Guy Martin + +
+
+ + 🐛 + {" "} + + 💻 + +
+ +{/* markdownlint-restore */} +{/* prettier-ignore-end */} + +{/* ALL-CONTRIBUTORS-LIST:END */} + +This project follows the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind welcome! + +## Contact + +You may reach us for help or ask any question you have on: + +- [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) + +Alternatively, you can follow us on social media platforms to get news about +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 + +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). + +[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/) + +[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/) + +## License + +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) + +Copyright © 2020-present, [Ad Aures](https://adaures.com/). diff --git a/docs/src/content/docs/ko/getting-started/auth.mdx b/docs/src/content/docs/ko/getting-started/auth.mdx new file mode 100644 index 00000000..d4dd4dd5 --- /dev/null +++ b/docs/src/content/docs/ko/getting-started/auth.mdx @@ -0,0 +1,84 @@ +--- +title: 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, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| 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 dashboards and analytics of podcast #\{id\}'s episodes. | +| episodes.create | Can create episodes for podcast #\{id\}. | +| episodes.edit | Can edit episodes of podcast #\{id\}. | +| episodes.delete | Can delete episodes of podcast #\{id\}. | +| episodes.manage-persons | Can manage episode persons of podcast #\{id\}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #\{id\}. | +| episodes.manage-publications | Can publish/unpublish episodes and posts of podcast #\{id\}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #\{id\}. | + +{/* AUTH-PODCAST-PERMISSIONS-LIST:END */} diff --git a/docs/src/content/docs/ko/getting-started/docker.mdx b/docs/src/content/docs/ko/getting-started/docker.mdx new file mode 100644 index 00000000..6141377f --- /dev/null +++ b/docs/src/content/docs/ko/getting-started/docker.mdx @@ -0,0 +1,157 @@ +--- +title: Official Docker images +--- + +Castopod pushes 3 Docker images to the Docker Hub during its automated build +process: + +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit +- [**`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 + +Additionally, Castopod requires a MySQL-compatible database. A Redis database +can be added as a cache handler. + +## Supported tags + +- `develop` [unstable], latest development branch build +- `beta` [stable], latest beta version build +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) + +## Example usage + +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: + + ```yml + version: "3.7" + + services: + app: + image: castopod/castopod:latest + container_name: "castopod-app" + volumes: + - castopod-media:/var/www/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + CP_BASEURL: "https://castopod.example.com" + CP_ANALYTICS_SALT: changeme + CP_CACHE_HANDLER: redis + CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme + networks: + - castopod-app + - castopod-db + ports: + - 8000:8000 + restart: unless-stopped + + mariadb: + image: mariadb:10.5 + container_name: "castopod-mariadb" + networks: + - castopod-db + volumes: + - castopod-db:/var/lib/mysql + environment: + MYSQL_ROOT_PASSWORD: changeme + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + restart: unless-stopped + + redis: + image: redis:7.0-alpine + container_name: "castopod-redis" + command: --requirepass changeme + volumes: + - castopod-cache:/data + networks: + - castopod-app + + volumes: + castopod-media: + castopod-db: + castopod-cache: + + networks: + castopod-app: + castopod-db: + ``` + + You have to adapt some variables to your needs (e.g. `CP_BASEURL`, + `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). + +3. Setup a reverse proxy for 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/): + + ``` + #castopod + castopod.example.com { + reverse_proxy localhost:8000 + } + ``` + +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! + +5. You're all set, start podcasting! 🎙️🚀 + +## Environment Variables + +- **castopod/castopod** and **castopod/app** + + | Variable name | Type (`default`) | Default | + | ------------------------------------- | ----------------------- | ---------------- | + | **`CP_BASEURL`** | string | `undefined` | + | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | + | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | + | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | + | **`CP_ANALYTICS_SALT`** | string | `undefined` | + | **`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_REDIS_HOST`** | ?string | `"localhost"` | + | **`CP_REDIS_PASSWORD`** | ?string | `null` | + | **`CP_REDIS_PORT`** | ?number | `6379` | + | **`CP_REDIS_DATABASE`** | ?number | `0` | + | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | + | **`CP_EMAIL_FROM`** | ?string | `undefined` | + | **`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_ENABLE_2FA`** | ?boolean | `undefined` | + | **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` | + | **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` | + | **`CP_MEDIA_S3_KEY`** | ?string | `undefined` | + | **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` | + | **`CP_MEDIA_S3_REGION`** | ?string | `undefined` | + | **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` | + | **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` | + | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` | + | **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` | + | **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` | + | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | + | **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | + +- **castopod/web-server** + + | Variable name | Type | Default | + | ---------------------- | --------------------- | ------- | + | **`CP_APP_HOSTNAME`** | ?string | `"app"` | + | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | diff --git a/docs/src/content/docs/ko/getting-started/install.mdx b/docs/src/content/docs/ko/getting-started/install.mdx new file mode 100644 index 00000000..d8888954 --- /dev/null +++ b/docs/src/content/docs/ko/getting-started/install.mdx @@ -0,0 +1,251 @@ +--- +title: How to install Castopod? +--- + +import { Aside } from "@astrojs/starlight/components"; + +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. + + + +## Requirements + +- PHP v8.1 or higher +- MySQL version 5.7 or higher or MariaDB version 10.2 or higher +- HTTPS support +- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's + incoming requests + +### PHP v8.1 or higher + +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. +- [exif](https://www.php.net/manual/en/exif.installation.php) + +Additionally, make sure that the following extensions are enabled in your PHP: + +- json (enabled by default - don't turn it off) +- xml (enabled by default - don't turn it off) +- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php) + +### MySQL compatible database + +> We recommend using [MariaDB](https://mariadb.org). + +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. + +#### Privileges + +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`. + +### (Optional) FFmpeg v4.1.8 or higher for Video Clips + +[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: + +- **FreeType 2** library for + [gd](https://www.php.net/manual/en/image.installation.php). + +### (Optional) Other recommendations + +- Redis for better cache performances. +- CDN for static files caching and better performances. +- e-mail gateway for lost passwords. + +## Install instructions + +### Pre-requisites + +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 haven’t 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): + + ```bash + * * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1 + ``` + + **Note** - If you do not add this cron task, the following Castopod features + will not work: + + - Importing a podcast from an existing RSS feed + - Broadcasting social activities to your followers in the fediverse + - Broadcasting episodes to open hubs using + [WebSub](https://en.wikipedia.org/wiki/WebSub) + - Generating video clips - + [requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips) + +### (recommended) Install Wizard + +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! + + + +### Using CLI + +1. Create a `.env` file in the package root based on the `.env.example` file. +2. Initialize the database using: + + ```sh + php spark install:init-database + ``` + +3. Create the superadmin user using: + + ```sh + php spark install:create-superadmin + ``` + +4. Head on to your admin gateway to start podcasting! + +### Email/SMTP setup + +Email configuration is required for some features to work properly (eg. +retrieving your forgotten password, sending instructions to premium subscribers, +…) + +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" +``` + +#### Email config options + +| 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"` | + +### Media storage + +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 + +If you prefer storing your media files on an S3 compatible storage, you may +specify it in your `.env`: + +```ini +# […] + +media.fileManager="s3" +media.s3.endpoint="your_s3_host" +media.s3.key="your_s3_key" +media.s3.secret="your_s3_secret" +media.s3.region="your_s3_region" +``` + +#### S3 config options + +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | + +## Community packages + +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. + +### Install with 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. + + diff --git a/docs/src/content/docs/ko/getting-started/security.mdx b/docs/src/content/docs/ko/getting-started/security.mdx new file mode 100644 index 00000000..c039493c --- /dev/null +++ b/docs/src/content/docs/ko/getting-started/security.mdx @@ -0,0 +1,24 @@ +--- +title: Security concerns +--- + +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). + +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): + +- `writable/` folder must be **readable** and **writable**. +- `public/media/` folder must be **readable** and **writable**. +- any other file must be set to **readonly**. + +For instance, if you are using Apache or NGINX with Ubuntu you may do the +following: + +```bash +sudo chown -R root:root /path/to/castopod +sudo chown -R www-data:www-data /path/to/castopod/writable +sudo chown -R www-data:www-data /path/to/castopod/public/media +``` diff --git a/docs/src/content/docs/ko/getting-started/update.mdx b/docs/src/content/docs/ko/getting-started/update.mdx new file mode 100644 index 00000000..f1a26974 --- /dev/null +++ b/docs/src/content/docs/ko/getting-started/update.mdx @@ -0,0 +1,108 @@ +--- +title: How to update Castopod? +--- + +import { Aside } from "@astrojs/starlight/components"; + +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 ⚡. + +## Update instructions + +0. ⚠️ Before any update, we highly recommend you backup your Castopod files and + database. + + - cf. + [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 + + - cf. + [Where can I find my 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 + + - ⚠️ 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/) + +3. On your server: + + - Remove all files except `.env` and `public/media` + - Copy the new files from the downloaded package into your server + + + +4. Update your database schema from your `Castopod Admin` > `About` page or by + running: + + ```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! + + + +## Fully Automated updates + +> Coming soon... 👀 + +## Frequently asked questions (FAQ) + +### Where can I find my Castopod version? + +Go to your Castopod admin panel, the version is displayed on the bottom left +corner. + +Alternatively, you can find the version in the `app > Config > Constants.php` +file. + +### I haven't updated my instance in a long time… What should I do? + +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. + +> You may want to backup your instance depending on how long you haven't updated +> Castopod. + +For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to +`v1.0.0-beta.1`: + +0. (highly recommended) Make a backup of your files and database. + +1. Download the latest release, overwrite your files whilst keeping `.env` and + `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`, + `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`. + +3. ✨ Enjoy your fresh instance, you're all done! + +### Should I make a backup before updating? + +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… diff --git a/docs/src/content/docs/ko/index.mdx b/docs/src/content/docs/ko/index.mdx new file mode 100644 index 00000000..3f1ec043 --- /dev/null +++ b/docs/src/content/docs/ko/index.mdx @@ -0,0 +1,1349 @@ +--- +title: Welcome 👋 +--- + +import { LinkCard } from "@astrojs/starlight/components"; + +Castopod is a free & open-source hosting platform made for podcasters who want +engage and interact with their audience. + +Castopod is easy to install and was built on top of +[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very +small footprint. + + + +## Features + +- 🌱  Free & open-source (AGPL v3 License) +- 🔐  Focused on data sovereignty: your content, audience, and analytics + belong to you, and you only +- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, + chapters, location, persons, soundbites, … +- 💬  Built-in social network: + - 🚀  Castopod is part of the Fediverse, a decentralized social network + - ❤️  Create posts, share, favourite, and comment on episodes +- 📈  Built-in analytics: + - ⚖️  GDPR / CCPA / LGPD compliant + - 🪙  Standard IABv2 audience measurement + - 🏡  On-premises analytics, no third party involved +- 📢  Built-in marketing tools: + - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) + - 📱  PWA: install as a standalone app + - 🎨  Customizable theme colors + - 🎬  Generate ready-to-share Video clips from episodes + - 🔉  Generate soundbites + - ▶️  Embeddable player, embed your episodes on any website +- 💸  Monetization: + - 🔗  Funding links + - 📲  listen-to-click ads + - 🤝  value4value / WebMonetization + - 💎  Premium podcasts +- 📡  Publish your episodes everywhere with RSS: + - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, + Google Podcasts, Deezer, Podcast Addict, Podfriend, … + - ⚡  Broadcast your episodes instantly with WebSub +- 📥  Podcast import: move your existing podcast into Castopod +- 📤  Move your podcast out of Castopod +- 🔀  Multi-tenant: host as many podcasts as you want +- 👥  Multi-user: add contributors and set roles +- 🌎  i18n support: translated in English, French, Polish, German, + Brazilian Portuguese & Spanish… with + [more to come](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. + +It is in fact one of the only media to have stayed this way for a long time. + +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. + +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized 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. + +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. + +## Comparison with other solutions + +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 you. + +### 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 it. + +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. + +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. + +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 journey. + +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. + +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! + +### 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 was initially built around music. And later on, as the project +evolved, the ability to host podcasts was introduced. + +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, …). + +So, you should probably use Funkwhale if you want to host your music, and use +Castopod if you want to host your podcasts. + +### Castopod vs other podcast hosts + +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! + +Each of these solutions differ from one another, you may compare with the +[list of features](#features). + +That being said, there are two main differences with other podcasting solutions: + +- 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 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. + +## Contributing + +Love Castopod and would like to help? Take a look at the following documentation +to get you started. + +### Code of conduct + +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 tolerated. + +### Contributing 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. + +## Contributors ✨ + +Thanks goes to these wonderful people +([emoji key](https://allcontributors.org/docs/en/emoji-key)): + +{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */} +{/* prettier-ignore-start */} +{/* markdownlint-disable */} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Yassine Doghri +
+ + Yassine Doghri + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 📖 + {" "} + + 👀 + {" "} + + 🚧 + {" "} + + 🖋 + {" "} + + 🎨 + {" "} + + ️️️️♿️ + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🧑‍🏫 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📆 + {" "} + + 📝 + +
+ + Benjamin Bellamy +
+ + Benjamin Bellamy + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 👀 + {" "} + + 🖋 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📝 + {" "} + + 📆 + {" "} + + 📢 + +
+ + Ola Hneini +
+ + Ola Hneini + +
+
+ + 💻 + {" "} + + 👀 + {" "} + + 📖 + {" "} + + 🚧 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Romain de Laage +
+ + Romain de Laage + +
+
+ + 💻 + {" "} + + 🚇 + {" "} + + 📖 + {" "} + + 🌍 + {" "} + + 🤔 + +
+ + Lyonel Bernard +
+ + Lyonel Bernard + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Christopher Lagonick-Weitzel +
+ + Christopher Lagonick-Weitzel + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Ernesto Acosta +
+ + Ernesto Acosta + +
+
+ + 🐛 + {" "} + + 🔊 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Bastien Luneteau +
+ + Bastien Luneteau + +
+
+ + 💻 + {" "} + + 🐛 + +
+ + Cécile Ricordeau +
+ + Cécile Ricordeau + +
+
+ + 🎨 + +
+ + Patryk Miś +
+ + Patryk Miś + +
+
+ + 🌍 + +
+ + Marcin Lewandowski +
+ + Marcin Lewandowski + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Sebastian Janik +
+ + Sebastian Janik + +
+
+ + 💻 + +
+ + Patryk Karczmarczyk +
+ + Patryk Karczmarczyk + +
+
+ + 💻 + +
+ + denis d +
+ + denis d + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Douglas Kastle +
+ + Douglas Kastle + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + cExplorer +
+ + cExplorer + +
+
+ + 🐛 + {" "} + + 🌍 + +
+ + ImaCrea +
+ + ImaCrea + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Jonas S +
+ + Jonas S + +
+
+ + 💻 + +
+ + LEFEBVRE Yann +
+ + LEFEBVRE Yann + +
+
+ + 🐛 + +
+ + Sebastian Späth +
+ + Sebastian Späth + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + rocky III +
+ + rocky III + +
+
+ + 🐛 + +
+ + Hermann Josef Eckl +
+ + Hermann Josef Eckl + +
+
+ + 🐛 + +
+ + Delhaye Cyrille +
+ + Delhaye Cyrille + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + João Leandro +
+ + João Leandro + +
+
+ + 🌍 + {" "} + + 🤔 + +
+ + Angelos Chouvardas +
+ + Angelos Chouvardas + +
+
+ + 🌍 + +
+ + Eivind +
+ + Eivind + +
+
+ + 🌍 + +
+ + Ewen +
+ + Ewen + +
+
+ + 🌍 + {" "} + + 🤔 + +
+ + forght +
+ + forght + +
+
+ + 🌍 + +
+ + glottis0q +
+ + glottis0q + +
+
+ + 🌍 + +
+ + ButterflyOfFire +
+ + ButterflyOfFire + +
+
+ + 🌍 + +
+ + Lucian I. Last +
+ + Lucian I. Last + +
+
+ + 🌍 + +
+ + LuuzViir +
+ + LuuzViir + +
+
+ + 🌍 + +
+ + CTHTC +
+ + CTHTC + +
+
+ + 🌍 + +
+ + Russian Retro +
+ + Russian Retro + +
+
+ + 🌍 + +
+ + Marek L'ach +
+ + Marek L'ach + +
+
+ + 🌍 + +
+ + GunChleoc +
+ + GunChleoc + +
+
+ + 🌍 + +
+ + GabiSnow +
+ + GabiSnow + +
+
+ + 🌍 + +
+ + bendaha +
+ + bendaha + +
+
+ + 🌍 + +
+ + Samuel Roland +
+ + Samuel Roland + +
+
+ + 🌍 + +
+ + Dimitri Regnier +
+ + Dimitri Regnier + +
+
+ + 🤔 + +
+ + irithys +
+ + irithys + +
+
+ + 🌍 + +
+ + Sergi +
+ + Sergi + +
+
+ + 🌍 + +
+ + ghose (XoseM) +
+ + ghose (XoseM) + +
+
+ + 🌍 + +
+ + Andreas Olsson +
+ + Andreas Olsson + +
+
+ + 🌍 + +
+ + leonfrom +
+ + leonfrom + +
+
+ + 🌍 + +
+ + agentcobra +
+ + agentcobra + +
+
+ + 🌍 + +
+ + Alessandro +
+ + Alessandro + +
+
+ + 🌍 + +
+ + liimee +
+ + liimee + +
+
+ + 🌍 + +
+ + Ahmed Sabouni +
+ + Ahmed Sabouni + +
+
+ + 🌍 + +
+ + KrzysztofDomanczyk +
+ + KrzysztofDomanczyk + +
+
+ + 💻 + +
+ +{/* markdownlint-restore */} +{/* prettier-ignore-end */} + +{/* ALL-CONTRIBUTORS-LIST:END */} + +This project follows the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind welcome! + +## Contact + +You may reach us for help or ask any question you have on: + +- [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) + +Alternatively, you can follow us on social media platforms to get news about +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 + +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). + +[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/) + +[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/) + +## License + +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) + +Copyright © 2020-present, [Ad Aures](https://adaures.com/). diff --git a/docs/src/content/docs/nl/getting-started/auth.mdx b/docs/src/content/docs/nl/getting-started/auth.mdx new file mode 100644 index 00000000..e5eb5a10 --- /dev/null +++ b/docs/src/content/docs/nl/getting-started/auth.mdx @@ -0,0 +1,85 @@ +--- +title: Authenticatie & Autorisatie +--- + +Castopod gebruikt voor de authenticatie en autorisatie `codeigniter/schild` met +een aantal aangepaste regels. Rollen en permissies zijn gedefinieerd op twee +niveaus: + +1. [globaal: serverbreed](#1-instance-wide-roles-and-permissions) +2. [per podcast](#2-per-podcast-roles-and-permissions) + +## 1. Globale rollen en rechten + +### Globale rollen + +{/* AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section */} + +| role | description | permissions | +| --------------- | ------------------------------------------ | ------------------------------------------------------------------------------------------ | +| Super beheerder | Heeft de volledige controle over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Beheerder | Beheert de inhoud van Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | Algemene gebruikers van Castopod. | admin.access | + +{/* AUTH-INSTANCE-ROLES-LIST:END */} + +### Globale rechten + +{/* AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section */} + +| permission | description | +| ----------------------- | -------------------------------------------------------------------- | +| admin.access | Kan toegang krijgen tot de beheeromgeving van Castopod. | +| admin.settings | Kan toegang krijgen tot de instellingen van Castopod. | +| users.manage | Kan Castopod-gebruikers beheren. | +| persons.manage | Kan personen beheren. | +| pages.manage | Kan pagina's beheren. | +| podcasts.view | Kan alle podcasts bekijken. | +| podcasts.create | Kan nieuwe podcast aanmaken. | +| podcasts.import | Kan podcasts importeren. | +| fediverse.manage-blocks | Kan fediverse actors/domains blokkeren voor interactie met Castopod. | + +{/* AUTH-INSTANCE-PERMISSIONS-LIST:END */} + +## 2. Per podcast rollen en permissies + +### Per podcast rollen + +{/* AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section */} + +| role | description | permissions | +| --------- | -------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Beheerder | Heeft de volledige controle over podcast #\{id\}. | \* | +| Redacteur | Beheert inhoud en publicaties van podcast #\{id\}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Auteur | Beheert de inhoud van podcast #\{id\} maar kan deze niet publiceren. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Gast | Algemene bijdrager van podcast #\{id\}. | view, episodes.view | + +{/* AUTH-PODCAST-ROLES-LIST:END */} + +### Per aflevering rollen + +{/* AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section */} + +| permission | description | +| ---------------------------- | ---------------------------------------------------------------------------------------- | +| view | Kan dashboard en analyses van podcast #\{id\} zien. | +| edit | Kan podcast #\{id\} wijzigen. | +| delete | Kan podcast #\{id\} verwijderen. | +| manage-import | Kan de geïmporteerde podcast #\{id\} synchroniseren. | +| manage-persons | Kan abonnementen van podcast #\{id\} beheren. | +| manage-subscriptions | Kan abonnementen van podcast #\{id\} beheren. | +| manage-contributors | Kan bijdragers van podcast #\{id\} beheren. | +| manage-platforms | Kan platform links van podcast #\{id\} instellen of verwijderen. | +| manage-publications | Kan podcast #\{id\} publiceren. | +| manage-notifications | Kan meldingen bekijken en markeren als gelezen voor podcast #\{id\}. | +| interact-as | Kan als podcast #\{id\} handelen om te favorieten, te delen of te reageren op berichten. | +| episodes.view | Kan dashboard en analyses van de afleveringen van podcast #\{id\} zien. | +| episodes.create | Kan afleveringen voor podcast #\{id\} aanmaken. | +| episodes.edit | Kan afleveringen van podcast #\{id\} wijzigen. | +| episodes.delete | Kan afleveringen van podcast #\{id\} verwijderen. | +| episodes.manage-persons | Kan aflevering personen van podcast #\{id\} beheren. | +| episodes.manage-clips | Kan videoclips of soundbites van podcast #\{id\} beheren. | +| episodes.manage-publications | Kan afleveringen en berichten van podcast #\{id\} publiceren/depubliceren. | +| episodes.manage-comments | Kan opmerkingen van aflevering van podcast van #\{id\} maken of verwijderen. | + +{/* AUTH-PODCAST-PERMISSIONS-LIST:END */} diff --git a/docs/src/content/docs/nl/getting-started/docker.mdx b/docs/src/content/docs/nl/getting-started/docker.mdx new file mode 100644 index 00000000..6141377f --- /dev/null +++ b/docs/src/content/docs/nl/getting-started/docker.mdx @@ -0,0 +1,157 @@ +--- +title: Official Docker images +--- + +Castopod pushes 3 Docker images to the Docker Hub during its automated build +process: + +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit +- [**`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 + +Additionally, Castopod requires a MySQL-compatible database. A Redis database +can be added as a cache handler. + +## Supported tags + +- `develop` [unstable], latest development branch build +- `beta` [stable], latest beta version build +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) + +## Example usage + +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: + + ```yml + version: "3.7" + + services: + app: + image: castopod/castopod:latest + container_name: "castopod-app" + volumes: + - castopod-media:/var/www/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + CP_BASEURL: "https://castopod.example.com" + CP_ANALYTICS_SALT: changeme + CP_CACHE_HANDLER: redis + CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme + networks: + - castopod-app + - castopod-db + ports: + - 8000:8000 + restart: unless-stopped + + mariadb: + image: mariadb:10.5 + container_name: "castopod-mariadb" + networks: + - castopod-db + volumes: + - castopod-db:/var/lib/mysql + environment: + MYSQL_ROOT_PASSWORD: changeme + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + restart: unless-stopped + + redis: + image: redis:7.0-alpine + container_name: "castopod-redis" + command: --requirepass changeme + volumes: + - castopod-cache:/data + networks: + - castopod-app + + volumes: + castopod-media: + castopod-db: + castopod-cache: + + networks: + castopod-app: + castopod-db: + ``` + + You have to adapt some variables to your needs (e.g. `CP_BASEURL`, + `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). + +3. Setup a reverse proxy for 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/): + + ``` + #castopod + castopod.example.com { + reverse_proxy localhost:8000 + } + ``` + +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! + +5. You're all set, start podcasting! 🎙️🚀 + +## Environment Variables + +- **castopod/castopod** and **castopod/app** + + | Variable name | Type (`default`) | Default | + | ------------------------------------- | ----------------------- | ---------------- | + | **`CP_BASEURL`** | string | `undefined` | + | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | + | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | + | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | + | **`CP_ANALYTICS_SALT`** | string | `undefined` | + | **`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_REDIS_HOST`** | ?string | `"localhost"` | + | **`CP_REDIS_PASSWORD`** | ?string | `null` | + | **`CP_REDIS_PORT`** | ?number | `6379` | + | **`CP_REDIS_DATABASE`** | ?number | `0` | + | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | + | **`CP_EMAIL_FROM`** | ?string | `undefined` | + | **`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_ENABLE_2FA`** | ?boolean | `undefined` | + | **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` | + | **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` | + | **`CP_MEDIA_S3_KEY`** | ?string | `undefined` | + | **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` | + | **`CP_MEDIA_S3_REGION`** | ?string | `undefined` | + | **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` | + | **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` | + | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` | + | **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` | + | **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` | + | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | + | **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | + +- **castopod/web-server** + + | Variable name | Type | Default | + | ---------------------- | --------------------- | ------- | + | **`CP_APP_HOSTNAME`** | ?string | `"app"` | + | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | diff --git a/docs/src/content/docs/nl/getting-started/install.mdx b/docs/src/content/docs/nl/getting-started/install.mdx new file mode 100644 index 00000000..d8888954 --- /dev/null +++ b/docs/src/content/docs/nl/getting-started/install.mdx @@ -0,0 +1,251 @@ +--- +title: How to install Castopod? +--- + +import { Aside } from "@astrojs/starlight/components"; + +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. + + + +## Requirements + +- PHP v8.1 or higher +- MySQL version 5.7 or higher or MariaDB version 10.2 or higher +- HTTPS support +- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's + incoming requests + +### PHP v8.1 or higher + +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. +- [exif](https://www.php.net/manual/en/exif.installation.php) + +Additionally, make sure that the following extensions are enabled in your PHP: + +- json (enabled by default - don't turn it off) +- xml (enabled by default - don't turn it off) +- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php) + +### MySQL compatible database + +> We recommend using [MariaDB](https://mariadb.org). + +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. + +#### Privileges + +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`. + +### (Optional) FFmpeg v4.1.8 or higher for Video Clips + +[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: + +- **FreeType 2** library for + [gd](https://www.php.net/manual/en/image.installation.php). + +### (Optional) Other recommendations + +- Redis for better cache performances. +- CDN for static files caching and better performances. +- e-mail gateway for lost passwords. + +## Install instructions + +### Pre-requisites + +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 haven’t 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): + + ```bash + * * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1 + ``` + + **Note** - If you do not add this cron task, the following Castopod features + will not work: + + - Importing a podcast from an existing RSS feed + - Broadcasting social activities to your followers in the fediverse + - Broadcasting episodes to open hubs using + [WebSub](https://en.wikipedia.org/wiki/WebSub) + - Generating video clips - + [requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips) + +### (recommended) Install Wizard + +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! + + + +### Using CLI + +1. Create a `.env` file in the package root based on the `.env.example` file. +2. Initialize the database using: + + ```sh + php spark install:init-database + ``` + +3. Create the superadmin user using: + + ```sh + php spark install:create-superadmin + ``` + +4. Head on to your admin gateway to start podcasting! + +### Email/SMTP setup + +Email configuration is required for some features to work properly (eg. +retrieving your forgotten password, sending instructions to premium subscribers, +…) + +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" +``` + +#### Email config options + +| 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"` | + +### Media storage + +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 + +If you prefer storing your media files on an S3 compatible storage, you may +specify it in your `.env`: + +```ini +# […] + +media.fileManager="s3" +media.s3.endpoint="your_s3_host" +media.s3.key="your_s3_key" +media.s3.secret="your_s3_secret" +media.s3.region="your_s3_region" +``` + +#### S3 config options + +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | + +## Community packages + +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. + +### Install with 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. + + diff --git a/docs/src/content/docs/nl/getting-started/security.mdx b/docs/src/content/docs/nl/getting-started/security.mdx new file mode 100644 index 00000000..c039493c --- /dev/null +++ b/docs/src/content/docs/nl/getting-started/security.mdx @@ -0,0 +1,24 @@ +--- +title: Security concerns +--- + +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). + +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): + +- `writable/` folder must be **readable** and **writable**. +- `public/media/` folder must be **readable** and **writable**. +- any other file must be set to **readonly**. + +For instance, if you are using Apache or NGINX with Ubuntu you may do the +following: + +```bash +sudo chown -R root:root /path/to/castopod +sudo chown -R www-data:www-data /path/to/castopod/writable +sudo chown -R www-data:www-data /path/to/castopod/public/media +``` diff --git a/docs/src/content/docs/nl/getting-started/update.mdx b/docs/src/content/docs/nl/getting-started/update.mdx new file mode 100644 index 00000000..f1a26974 --- /dev/null +++ b/docs/src/content/docs/nl/getting-started/update.mdx @@ -0,0 +1,108 @@ +--- +title: How to update Castopod? +--- + +import { Aside } from "@astrojs/starlight/components"; + +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 ⚡. + +## Update instructions + +0. ⚠️ Before any update, we highly recommend you backup your Castopod files and + database. + + - cf. + [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 + + - cf. + [Where can I find my 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 + + - ⚠️ 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/) + +3. On your server: + + - Remove all files except `.env` and `public/media` + - Copy the new files from the downloaded package into your server + + + +4. Update your database schema from your `Castopod Admin` > `About` page or by + running: + + ```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! + + + +## Fully Automated updates + +> Coming soon... 👀 + +## Frequently asked questions (FAQ) + +### Where can I find my Castopod version? + +Go to your Castopod admin panel, the version is displayed on the bottom left +corner. + +Alternatively, you can find the version in the `app > Config > Constants.php` +file. + +### I haven't updated my instance in a long time… What should I do? + +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. + +> You may want to backup your instance depending on how long you haven't updated +> Castopod. + +For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to +`v1.0.0-beta.1`: + +0. (highly recommended) Make a backup of your files and database. + +1. Download the latest release, overwrite your files whilst keeping `.env` and + `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`, + `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`. + +3. ✨ Enjoy your fresh instance, you're all done! + +### Should I make a backup before updating? + +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… diff --git a/docs/src/content/docs/nl/index.mdx b/docs/src/content/docs/nl/index.mdx new file mode 100644 index 00000000..3f1ec043 --- /dev/null +++ b/docs/src/content/docs/nl/index.mdx @@ -0,0 +1,1349 @@ +--- +title: Welcome 👋 +--- + +import { LinkCard } from "@astrojs/starlight/components"; + +Castopod is a free & open-source hosting platform made for podcasters who want +engage and interact with their audience. + +Castopod is easy to install and was built on top of +[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very +small footprint. + + + +## Features + +- 🌱  Free & open-source (AGPL v3 License) +- 🔐  Focused on data sovereignty: your content, audience, and analytics + belong to you, and you only +- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, + chapters, location, persons, soundbites, … +- 💬  Built-in social network: + - 🚀  Castopod is part of the Fediverse, a decentralized social network + - ❤️  Create posts, share, favourite, and comment on episodes +- 📈  Built-in analytics: + - ⚖️  GDPR / CCPA / LGPD compliant + - 🪙  Standard IABv2 audience measurement + - 🏡  On-premises analytics, no third party involved +- 📢  Built-in marketing tools: + - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) + - 📱  PWA: install as a standalone app + - 🎨  Customizable theme colors + - 🎬  Generate ready-to-share Video clips from episodes + - 🔉  Generate soundbites + - ▶️  Embeddable player, embed your episodes on any website +- 💸  Monetization: + - 🔗  Funding links + - 📲  listen-to-click ads + - 🤝  value4value / WebMonetization + - 💎  Premium podcasts +- 📡  Publish your episodes everywhere with RSS: + - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, + Google Podcasts, Deezer, Podcast Addict, Podfriend, … + - ⚡  Broadcast your episodes instantly with WebSub +- 📥  Podcast import: move your existing podcast into Castopod +- 📤  Move your podcast out of Castopod +- 🔀  Multi-tenant: host as many podcasts as you want +- 👥  Multi-user: add contributors and set roles +- 🌎  i18n support: translated in English, French, Polish, German, + Brazilian Portuguese & Spanish… with + [more to come](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. + +It is in fact one of the only media to have stayed this way for a long time. + +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. + +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized 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. + +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. + +## Comparison with other solutions + +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 you. + +### 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 it. + +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. + +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. + +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 journey. + +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. + +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! + +### 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 was initially built around music. And later on, as the project +evolved, the ability to host podcasts was introduced. + +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, …). + +So, you should probably use Funkwhale if you want to host your music, and use +Castopod if you want to host your podcasts. + +### Castopod vs other podcast hosts + +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! + +Each of these solutions differ from one another, you may compare with the +[list of features](#features). + +That being said, there are two main differences with other podcasting solutions: + +- 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 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. + +## Contributing + +Love Castopod and would like to help? Take a look at the following documentation +to get you started. + +### Code of conduct + +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 tolerated. + +### Contributing 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. + +## Contributors ✨ + +Thanks goes to these wonderful people +([emoji key](https://allcontributors.org/docs/en/emoji-key)): + +{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */} +{/* prettier-ignore-start */} +{/* markdownlint-disable */} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Yassine Doghri +
+ + Yassine Doghri + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 📖 + {" "} + + 👀 + {" "} + + 🚧 + {" "} + + 🖋 + {" "} + + 🎨 + {" "} + + ️️️️♿️ + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🧑‍🏫 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📆 + {" "} + + 📝 + +
+ + Benjamin Bellamy +
+ + Benjamin Bellamy + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 👀 + {" "} + + 🖋 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📝 + {" "} + + 📆 + {" "} + + 📢 + +
+ + Ola Hneini +
+ + Ola Hneini + +
+
+ + 💻 + {" "} + + 👀 + {" "} + + 📖 + {" "} + + 🚧 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Romain de Laage +
+ + Romain de Laage + +
+
+ + 💻 + {" "} + + 🚇 + {" "} + + 📖 + {" "} + + 🌍 + {" "} + + 🤔 + +
+ + Lyonel Bernard +
+ + Lyonel Bernard + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Christopher Lagonick-Weitzel +
+ + Christopher Lagonick-Weitzel + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Ernesto Acosta +
+ + Ernesto Acosta + +
+
+ + 🐛 + {" "} + + 🔊 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Bastien Luneteau +
+ + Bastien Luneteau + +
+
+ + 💻 + {" "} + + 🐛 + +
+ + Cécile Ricordeau +
+ + Cécile Ricordeau + +
+
+ + 🎨 + +
+ + Patryk Miś +
+ + Patryk Miś + +
+
+ + 🌍 + +
+ + Marcin Lewandowski +
+ + Marcin Lewandowski + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Sebastian Janik +
+ + Sebastian Janik + +
+
+ + 💻 + +
+ + Patryk Karczmarczyk +
+ + Patryk Karczmarczyk + +
+
+ + 💻 + +
+ + denis d +
+ + denis d + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Douglas Kastle +
+ + Douglas Kastle + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + cExplorer +
+ + cExplorer + +
+
+ + 🐛 + {" "} + + 🌍 + +
+ + ImaCrea +
+ + ImaCrea + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Jonas S +
+ + Jonas S + +
+
+ + 💻 + +
+ + LEFEBVRE Yann +
+ + LEFEBVRE Yann + +
+
+ + 🐛 + +
+ + Sebastian Späth +
+ + Sebastian Späth + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + rocky III +
+ + rocky III + +
+
+ + 🐛 + +
+ + Hermann Josef Eckl +
+ + Hermann Josef Eckl + +
+
+ + 🐛 + +
+ + Delhaye Cyrille +
+ + Delhaye Cyrille + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + João Leandro +
+ + João Leandro + +
+
+ + 🌍 + {" "} + + 🤔 + +
+ + Angelos Chouvardas +
+ + Angelos Chouvardas + +
+
+ + 🌍 + +
+ + Eivind +
+ + Eivind + +
+
+ + 🌍 + +
+ + Ewen +
+ + Ewen + +
+
+ + 🌍 + {" "} + + 🤔 + +
+ + forght +
+ + forght + +
+
+ + 🌍 + +
+ + glottis0q +
+ + glottis0q + +
+
+ + 🌍 + +
+ + ButterflyOfFire +
+ + ButterflyOfFire + +
+
+ + 🌍 + +
+ + Lucian I. Last +
+ + Lucian I. Last + +
+
+ + 🌍 + +
+ + LuuzViir +
+ + LuuzViir + +
+
+ + 🌍 + +
+ + CTHTC +
+ + CTHTC + +
+
+ + 🌍 + +
+ + Russian Retro +
+ + Russian Retro + +
+
+ + 🌍 + +
+ + Marek L'ach +
+ + Marek L'ach + +
+
+ + 🌍 + +
+ + GunChleoc +
+ + GunChleoc + +
+
+ + 🌍 + +
+ + GabiSnow +
+ + GabiSnow + +
+
+ + 🌍 + +
+ + bendaha +
+ + bendaha + +
+
+ + 🌍 + +
+ + Samuel Roland +
+ + Samuel Roland + +
+
+ + 🌍 + +
+ + Dimitri Regnier +
+ + Dimitri Regnier + +
+
+ + 🤔 + +
+ + irithys +
+ + irithys + +
+
+ + 🌍 + +
+ + Sergi +
+ + Sergi + +
+
+ + 🌍 + +
+ + ghose (XoseM) +
+ + ghose (XoseM) + +
+
+ + 🌍 + +
+ + Andreas Olsson +
+ + Andreas Olsson + +
+
+ + 🌍 + +
+ + leonfrom +
+ + leonfrom + +
+
+ + 🌍 + +
+ + agentcobra +
+ + agentcobra + +
+
+ + 🌍 + +
+ + Alessandro +
+ + Alessandro + +
+
+ + 🌍 + +
+ + liimee +
+ + liimee + +
+
+ + 🌍 + +
+ + Ahmed Sabouni +
+ + Ahmed Sabouni + +
+
+ + 🌍 + +
+ + KrzysztofDomanczyk +
+ + KrzysztofDomanczyk + +
+
+ + 💻 + +
+ +{/* markdownlint-restore */} +{/* prettier-ignore-end */} + +{/* ALL-CONTRIBUTORS-LIST:END */} + +This project follows the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind welcome! + +## Contact + +You may reach us for help or ask any question you have on: + +- [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) + +Alternatively, you can follow us on social media platforms to get news about +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 + +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). + +[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/) + +[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/) + +## License + +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) + +Copyright © 2020-present, [Ad Aures](https://adaures.com/). diff --git a/docs/src/nn-NO/getting-started/auth.md b/docs/src/content/docs/nn-no/getting-started/auth.mdx similarity index 51% rename from docs/src/nn-NO/getting-started/auth.md rename to docs/src/content/docs/nn-no/getting-started/auth.mdx index 7cd0073d..947c4ef7 100644 --- a/docs/src/nn-NO/getting-started/auth.md +++ b/docs/src/content/docs/nn-no/getting-started/auth.mdx @@ -1,10 +1,7 @@ --- title: Godkjenning & Autorisasjon -sidebarDepth: 3 --- -# Godkjenning & Autorisasjon - Castopod tek seg av godkjenning og autorisasjon med `codeigniter/shield` saman med nokre eigne reglar. Roller og løyve er definerte på to nivå: @@ -15,21 +12,21 @@ med nokre eigne reglar. Roller og løyve er definerte på to nivå: ### Roller på nettstaden - +{/* AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section */} -| rolle | skildring | løyve | +| role | description | permissions | | ----------- | -------------------------------- | ------------------------------------------------------------------------------------------ | | Superstyrar | Har full kontroll over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | | Leiar | Styrer innhaldet på Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | -| Podkastar | Vanlege Castopod-brukarar. | admin.tilgang | +| Podkastar | Vanlege Castopod-brukarar. | admin.access | - +{/* AUTH-INSTANCE-ROLES-LIST:END */} ### Løyve på nettstaden - +{/* AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section */} -| løyve | skildring | +| permission | description | | ----------------------- | ---------------------------------------------------------------------- | | admin.access | Kan bruka styringspanelet for Castopod. | | admin.settings | Kan få tilgang til innstillingane for Castopod. | @@ -41,47 +38,47 @@ med nokre eigne reglar. Roller og løyve er definerte på to nivå: | podcasts.import | Kan importera podkastar. | | fediverse.manage-blocks | Kan blokkera folk og domene på allheimen frå å samhandla med Castopod. | - +{/* AUTH-INSTANCE-PERMISSIONS-LIST:END */} ## 2. Roller og løyve pr. podkast ### Roller pr. podkast - +{/* AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section */} -| rolle | skildring | løyve | -| ------------- | ---------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Administrator | Har full kontroll over podkasten #{id}. | \* | -| Redaktør | Styrer innhald og publisering for podkasten #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| Skapar | Styrer innhald for podkasten #{id}, men kan ikkje publisera dei. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Gjest | Vanleg bidragsytar til podkasten #{id}. | view, episodes.view | +| role | description | permissions | +| ------------- | ------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Administrator | Har full kontroll over podkasten #\{id\}. | \* | +| Redaktør | Styrer innhald og publisering for podkasten #\{id\}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Skapar | Styrer innhald for podkasten #\{id\}, men kan ikkje publisera dei. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Gjest | Vanleg bidragsytar til podkasten #\{id\}. | view, episodes.view | - +{/* AUTH-PODCAST-ROLES-LIST:END */} ### Løyve pr. podkast - +{/* AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section */} -| løyve | description | -| ---------------------------- | ------------------------------------------------------------------ | -| view | Kan sjå styringspanelet og analysedata for podkasten #{id}. | -| edit | Kan redigera podkasten #{id}. | -| delete | Kan sletta podkasten #{id}. | -| manage-import | Kan synkronisera den importerte podkasten #{id}. | -| manage-persons | Kan handtera abonnement for podkasten #{id}. | -| manage-subscriptions | Kan handtera abonnement for podkasten #{id}. | -| manage-contributors | Kan handtera bidragsytarar for podkasten #{id}. | -| manage-platforms | Kan oppretta og fjerna plattformlenkjer for podkasten #{id}. | -| manage-publications | Kan publisera podkasten #{id}. | -| manage-notifications | Kan lesa og merka varsel som lesne for podkasten #{id}. | -| interact-as | Kan merka podkasten #{id} som favoritt, dela og svara på innlegg. | -| episodes.view | Kan sjå styringspanelet og analysedata for podkasten #{id}. | -| episodes.create | Kan laga epoisodar for podkasten #{id}. | -| episodes.edit | Kan redigera podkasten #{id}. | -| episodes.delete | Kan sletta podkasten #{id}. | -| episodes.manage-persons | Kan handtera abonnement for podkasten #{id}. | -| episodes.manage-clips | Kan handtera film- og lydklypp av podkasten #{id}. | -| episodes.manage-publications | Kan publisera podkasten #{id}. | -| episodes.manage-comments | Kan skriva og sletta kommentarar til episodane av podkasten #{id}. | +| permission | description | +| ---------------------------- | -------------------------------------------------------------------------- | +| view | Kan sjå styringspanelet og analysedata for podkasten #\{id\}. | +| edit | Kan redigera podkasten #\{id\}. | +| delete | Kan sletta podkasten #\{id\}. | +| manage-import | Kan synkronisera den importerte podkasten #\{id\}. | +| manage-persons | Kan handtera abonnement for podkasten #\{id\}. | +| manage-subscriptions | Kan handtera abonnement for podkasten #\{id\}. | +| manage-contributors | Kan handtera bidragsytarar for podkasten #\{id\}. | +| manage-platforms | Kan oppretta og fjerna plattformlenkjer for podkasten #\{id\}. | +| manage-publications | Kan publisera podkasten #\{id\}. | +| manage-notifications | Kan lesa og merka varsel som lesne for podkasten #\{id\}. | +| interact-as | Kan merka podkasten #\{id\} som favoritt, dela og svara på innlegg. | +| episodes.view | Kan sjå styringspanelet og analysedata for episodane av podkasten #\{id\}. | +| episodes.create | Kan laga epoisodar for podkasten #\{id\}. | +| episodes.edit | Kan redigera episodane av podkasten #\{id\}. | +| episodes.delete | Kan sletta episodar av podkasten #\{id\}. | +| episodes.manage-persons | Kan handtera bidragsytarar til episodar av podkasten #\{id\}. | +| episodes.manage-clips | Kan handtera film- og lydklypp av podkasten #\{id\}. | +| episodes.manage-publications | Kan publisera og avpublisera episodar og innlegg for podkasten #\{id\}. | +| episodes.manage-comments | Kan skriva og sletta kommentarar til episodane av podkasten #\{id\}. | - +{/* AUTH-PODCAST-PERMISSIONS-LIST:END */} diff --git a/docs/src/nn-NO/getting-started/docker.md b/docs/src/content/docs/nn-no/getting-started/docker.mdx similarity index 99% rename from docs/src/nn-NO/getting-started/docker.md rename to docs/src/content/docs/nn-no/getting-started/docker.mdx index 09af9d61..97782440 100644 --- a/docs/src/nn-NO/getting-started/docker.md +++ b/docs/src/content/docs/nn-no/getting-started/docker.mdx @@ -1,10 +1,7 @@ --- title: Offisielle Docker-bilete -sidebarDepth: 3 --- -# Offisielle Docker-bilete - Castopod plasserer 3 Docker-bilete på Docker Hub som del av den automatiserte byggjeprosessen: diff --git a/docs/src/nn-NO/getting-started/install.md b/docs/src/content/docs/nn-no/getting-started/install.mdx similarity index 81% rename from docs/src/nn-NO/getting-started/install.md rename to docs/src/content/docs/nn-no/getting-started/install.mdx index a42a42ba..16983097 100644 --- a/docs/src/nn-NO/getting-started/install.md +++ b/docs/src/content/docs/nn-no/getting-started/install.mdx @@ -1,22 +1,21 @@ --- -title: Installering -sidebarDepth: 3 +title: Korleis installerer eg Castopod? --- -# Korleis installerer eg Castopod? +import { Aside } from "@astrojs/starlight/components"; Det er meininga at Castopod skal vera lett å installera. Uansett om du bruker eige eller delt vevhotell, kan du installera på dei fleste maskiner som har PHP og MySQL. -::: tip Notat + ## Krav @@ -48,14 +47,6 @@ din: > Me tilrår [MariaDB](https://mariadb.org). -::: warning Åtvaring - -Castopod verkar berre med databasar som støttar MySQL 5.7 eller nyare. MySQL 5.6 -eller eldre vil ikkje fungera, ettersom den versjonen vart forelda 5. -februar 2021. - -::: - Du treng vertsnamnet til tenaren, databasenamnet, brukarnamnet og passordet til databasen for å fullføra installeringa. Viss du ikkje har desse, må du kontakta administratoren for tenarmaskina di. @@ -116,13 +107,13 @@ filmklypp. Desse utvidingane må vera installerte: 2. Fylg framgangsmåten på skjermen. 3. Start å podkasta! -::: info Notat + ### Med kommandolina @@ -227,12 +218,35 @@ meste som har med oppsett av eigen vevtenar å gjera. diff --git a/docs/src/nn-NO/getting-started/security.md b/docs/src/content/docs/nn-no/getting-started/security.mdx similarity index 95% rename from docs/src/nn-NO/getting-started/security.md rename to docs/src/content/docs/nn-no/getting-started/security.mdx index c584a183..f6004ab1 100644 --- a/docs/src/nn-NO/getting-started/security.md +++ b/docs/src/content/docs/nn-no/getting-started/security.mdx @@ -1,9 +1,7 @@ --- -title: Tryggleik +title: Tryggleiksspørsmål --- -# Tryggleiksspørsmål - Castopod er bygd på [CodeIgniter4](https://codeigniter.com/), som er eit PHP-rammeverk som oppmodar til [god tryggleikspraksis](https://codeigniter.com/user_guide/concepts/security.html). diff --git a/docs/src/nn-NO/getting-started/update.md b/docs/src/content/docs/nn-no/getting-started/update.mdx similarity index 95% rename from docs/src/nn-NO/getting-started/update.md rename to docs/src/content/docs/nn-no/getting-started/update.mdx index 6a929b1f..827107a5 100644 --- a/docs/src/nn-NO/getting-started/update.md +++ b/docs/src/content/docs/nn-no/getting-started/update.mdx @@ -1,9 +1,8 @@ --- -title: Oppdatering -sidebarDepth: 3 +title: Korleis oppdaterer eg Castopod? --- -# Korleis oppdaterer eg Castopod? +import { Aside } from "@astrojs/starlight/components"; Når du har installert Castopod, kan det vera lurt å oppdatera nettstaden din til siste versjonen for å få nye funksjonar, ✨, feilrettingar 🐛 og betre yting ⚡. @@ -35,12 +34,12 @@ siste versjonen for å få nye funksjonar, ✨, feilrettingar 🐛 og betre ytin - Slett alle filene utanom `.env` og `public/media` - Kopier dei nye filene frå den nedlasta programpakka over til tenaren din - ::: Hugs + 4. Oppdater databaseskjemaet ditt på `Castopod admin` > `Om`-sida, eller ved å køyra: @@ -53,7 +52,7 @@ siste versjonen for å få nye funksjonar, ✨, feilrettingar 🐛 og betre ytin `Opprydding` 6. ✨ No er du ferdig og kan bruka den flotte nye nettstaden din! -::: Hugs + ## Heilautomatiske oppdateringar diff --git a/docs/src/content/docs/nn-no/index.mdx b/docs/src/content/docs/nn-no/index.mdx new file mode 100644 index 00000000..f8f20400 --- /dev/null +++ b/docs/src/content/docs/nn-no/index.mdx @@ -0,0 +1,1409 @@ +--- +title: Velkomen 👋 +--- + +import { LinkCard } from "@astrojs/starlight/components"; + +Castopod er ei open og gratis løysing for dei som vil køyra si eiga +podkasting-plattform, og for podkastarar som vil engasjera og samhandla med +publikum. + +Castopod er lett å installera og er bygd på +[CodeIgniter4](https://codeigniter.com/), eit kraftig PHP-rammeverk med små +systemkrav. + + + +## Funksjonar + +- 🌱  Fri og open (AGPL v3-lisens) +- 🔐  Legg vekt på at du eig dine eigne data: innhaldet, publikum og + analysedata høyrer deg til, og berre deg +- 🪄  Podkasting 2.0-funksjonar: GUID, låsing, transkripsjonar, + finansiering, kapittel, plassering, personar, lydbetar, … +- 💬  Innebygd sosialt nettverk: + - 🚀  Castopod er ein del av fødiverset, som er eit desentralisert + sosialt nettverk + - ❤️  Skriv innlegg, del dei, favorittmerk dei, og kommenter episodane +- 📈  Innebygde analyseverkty: + - ⚖️  Fylgjer GDPR / CCPA / LGPD + - 🪙  Standard IABv2-publikumsmåling + - 🏡  Eigen analyse, heilt utan utanforståande tredjepartar +- 📢  Innebygd marknadsføring: + - ✅  Søkjemotorvenleg (open-graph meta-knaggar, JSON-LD, …) + - 📱  PWA: installer som frittståande app + - 🎨  Bruk eigne fargar + - 🎬  Lag og del filmklypp frå episodane + - 🔉  Lag lydbetar + - ▶️  Innbyggbar spelar, så du kan spela episodane dine på ein kvar + nettstad +- 💸  Ten pengar: + - 🔗  Donasjonslenker + - 📲  lytt-for-å-klikka-annonsar + - 🤝  value4value / WebMonetization + - 💎  Betalte podkastar +- 📡  Kringkast episodane dine kvar som helst med RSS: + - 📱  På alle indeksar og appar: Podcast Index, Apple Podcasts, Spotify, + Google Podcasts, Deezer, Podcast Addict, Podfriend, … + - ⚡  Kringkast episodane dine straks med WebSub +- 📥  Podkastimport: Flytt podkasten din til Castopod +- 📤  Flytt podkasten din bort frå Castopod +- 🔀  For fleire: Ver vertskap for så mange podkastar du vil +- 👥  Fleirbrukar: legg til bidragsytarar og lag roller for dei +- 🌎  i18n-støtte: Omsett til nynorsk, engelsk, fransk, polsk, tysk, + brasiliansk portugisisk & spansk… med + [fleire språk på veg](https://translate.castopod.org)! + +## Kvifor Castopod? + +Podkasting-økosystemet er desentralt av natur: Du kan laga podkasten din som ei +RSS-fil, leggja han ut på nettet, og få delt han overalt. + +Det er faktisk det einaste mediet som har vore slik i lang tid. + +Ettersom bruken av podkastar utviklar seg, er det fleire som startar med +podkasting; anten det er produsentar som leitar etter nye måtar å dela ideane +sine på, eller det er lyttarar som leitar etter betre podkastar å høyra på. + +Når podkasting no har vorte meir populært, er det fleire firma som prøver å +gjera det til eit kontrollert og sentralisert medium. + +Castopod vart laga som ein freistnad på å gje eit ope og framhaldande alternativ +til å leggja ut podkastane dine, med vekt på desentralisering slik at +podkastarar kan uttrykkja seg utan å binda seg til ei bestemt løysing. + +Prosjektet er støtta av brukarmiljøa bak open kjeldekode, særleg +[Allheimen](https://tanketom.no/teknologi/mastodon-og-the-fediverse) og +[Podcasting 2.0](https://podcastindex.org/)-rørslene. + +## Samanlikning med andre løysingar + +Me trur at ingen løysingar er perfekt for alle, det kjem an på kva du treng. +Difor får du her samanlikningar med andre verktøy, slik at du kan finna ut om +Castopod passar for deg. + +### Castopod og Wordpress + +Castopod blir ofte kalla "Wordpress for podkastar" fordi det er ein del +likskapar mellm dei to. Det er delvis sant. Faktum er at Castopod har henta +mykje inspirasjon frå Wordpress-økosystemet. Me såg kor lett Wordpress var å ta +i bruk, og kor mange nettstader og nettsamfunn som bruker det. + +Til liks med Wordpress er Castopod gratis og open programvare, laga med PHP og +ein MySQL-database, og pakka saman på ein slik måte at du lett kan installera +det på dei fleste vevtentarar. + +Worpress er ein flott måte å laga din eigen nettstad på, samt utvida han med +tillegg slik at han gjer det du ynskjer. Det er eit komplett +innhaldsstyringssystem for å laga kva som helst type nettstad. + +Castopod er derimot meint som ei løysing for dei som lagar podkastar, og legg +difor vekt på podkasting og ingenting anna. Du treng ingen programtillegg for å +starta på den vedunderlege podkastreisa di. + +På denne måten kan me laga program som passar spesielt til podkasting, alt frå å +laga podkastar til å publisera nye episodar til å kringkasta, marknadsføra og +analysera dei. + +Til slutt: Wordpress og Castopod kan leva side om side på nettstaden din om du +treng det, sidan dei har same systemkrava! + +### Castopod og Funkwhale + +Funkwhale er ein musikktenar du kan køyra sjølv på din eigen vevtenar. Akkurat +som Castopod er Funkwhale ein del av allheimen, som er eit sosialt nettverk +spreidd over mange nettstader som kan samhandla med kvarandre. + +Funkwhale vart fyrst laga for musikk. Seinare, etter kvart som prosjektet +utvikla seg, vart det mogleg å leggja ut podkastar òg. + +Til skilnad frå Funkwhale er Castopod utforma og utvikla berre for podkastar. +Det tyder at det er lettare å ta i bruk funksjonar tilknytt podkast-økosystemet, +slik som podkasting 2.0-funksjonar (transkripsjonar, kapittel, plasseringar, +personmerking …). + +Det tyder at du truleg bør bruka Funkwhale om du vil ha ein stad til musikken +din, og Castopod dersom du vil ha ein stad til podkastane dine. + +### Castopod og andre podkastvertar + +Det er mange løysingar for deg som vil ha ein eigen nettstad til podkastar. +Nokre av dei er verkeleg flotte, og +[mange av dei](https://podcastindex.org/apps) hoppar på podkastin 2.0-toget, +nett som Castopod! + +Kvar av desse løysingane er ulike, og du kan +[samanlikna kva funksjonar dei har](#features). + +Når det er sagt, er det to hovudskilnader mellom Castopod og andre +podkastløysingar: + +- Du kan køyra Castopod på di eiga tenarmaskin, og det er den einaste løysinga + som gjev deg full kontroll over det du lagar. Og fordi Castopod er open + kjeldekode, kan du endra løysinga slik du treng. + +- Castopod er den einaste løysinga no som både koplar til eit desentralt sosialt + nettverk med Activitypub og som har mange av podkasting 2.0-løysingane. Me tek + sikte på å kopla dei to tettare saman. + +## Bidra til Castopod + +Likar du Castopod og kunne tenkja deg å hjelpa til? Les denne dokumentasjonen +for å koma i gang. + +### Ordensreglar + +Castopod har laga retningsliner for åtferd som me ventar at prosjektdeltakarar +held seg til. Les gjerne +[CODE_OF_CONDUCT-retninglinene](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md) +så du veit kva slags åtferd me godtek og ikkje. + +### Korleis bidra + +Les gjerne [korleis du bidreg](../contributing/guidelines.md) for å læra korleis +me utviklar Castopod, korleis me føreslær rettingar og forbetringar, og korleis +me byggjer og prøver ut endringar i programmet. + +## Bidragsytarar ✨ + +Mange takk til dei flotte folka på +([emoji key](https://allcontributors.org/docs/en/emoji-key)): + +{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */} +{/* prettier-ignore-start */} +{/* markdownlint-disable */} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Yassine Doghri +
+ + Yassine Doghri + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 📖 + {" "} + + 👀 + {" "} + + 🚧 + {" "} + + 🖋 + {" "} + + 🎨 + {" "} + + ️️️️♿️ + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🧑‍🏫 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📆 + {" "} + + 📝 + +
+ + Benjamin Bellamy +
+ + Benjamin Bellamy + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 👀 + {" "} + + 🖋 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📝 + {" "} + + 📆 + {" "} + + 📢 + +
+ + Ola Hneini +
+ + Ola Hneini + +
+
+ + 💻 + {" "} + + 👀 + {" "} + + 📖 + {" "} + + 🚧 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Romain de Laage +
+ + Romain de Laage + +
+
+ + 💻 + {" "} + + 🚇 + {" "} + + 📖 + {" "} + + 🌍 + {" "} + + 🤔 + +
+ + Lyonel Bernard +
+ + Lyonel Bernard + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Christopher Lagonick-Weitzel +
+ + Christopher Lagonick-Weitzel + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Ernesto Acosta +
+ + Ernesto Acosta + +
+
+ + 🐛 + {" "} + + 🔊 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Ewen +
+ + Ewen + +
+
+ + 🌍 + {" "} + + 🤔 + {" "} + + 💻 + +
+ + Bastien Luneteau +
+ + Bastien Luneteau + +
+
+ + 💻 + {" "} + + 🐛 + +
+ + Cécile Ricordeau +
+ + Cécile Ricordeau + +
+
+ + 🎨 + +
+ + Patryk Miś +
+ + Patryk Miś + +
+
+ + 🌍 + +
+ + Marcin Lewandowski +
+ + Marcin Lewandowski + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Sebastian Janik +
+ + Sebastian Janik + +
+
+ + 💻 + +
+ + Patryk Karczmarczyk +
+ + Patryk Karczmarczyk + +
+
+ + 💻 + +
+ + denis d +
+ + denis d + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Douglas Kastle +
+ + Douglas Kastle + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + cExplorer +
+ + cExplorer + +
+
+ + 🐛 + {" "} + + 🌍 + +
+ + ImaCrea +
+ + ImaCrea + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Jonas S +
+ + Jonas S + +
+
+ + 💻 + +
+ + LEFEBVRE Yann +
+ + LEFEBVRE Yann + +
+
+ + 🐛 + +
+ + Sebastian Späth +
+ + Sebastian Späth + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + rocky III +
+ + rocky III + +
+
+ + 🐛 + +
+ + Hermann Josef Eckl +
+ + Hermann Josef Eckl + +
+
+ + 🐛 + +
+ + Delhaye Cyrille +
+ + Delhaye Cyrille + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + João Leandro +
+ + João Leandro + +
+
+ + 🌍 + {" "} + + 🤔 + +
+ + Angelos Chouvardas +
+ + Angelos Chouvardas + +
+
+ + 🌍 + +
+ + Eivind +
+ + Eivind + +
+
+ + 🌍 + +
+ + forght +
+ + forght + +
+
+ + 🌍 + +
+ + glottis0q +
+ + glottis0q + +
+
+ + 🌍 + +
+ + ButterflyOfFire +
+ + ButterflyOfFire + +
+
+ + 🌍 + +
+ + Lucian I. Last +
+ + Lucian I. Last + +
+
+ + 🌍 + +
+ + LuuzViir +
+ + LuuzViir + +
+
+ + 🌍 + +
+ + CTHTC +
+ + CTHTC + +
+
+ + 🌍 + +
+ + Russian Retro +
+ + Russian Retro + +
+
+ + 🌍 + +
+ + Marek L'ach +
+ + Marek L'ach + +
+
+ + 🌍 + +
+ + GunChleoc +
+ + GunChleoc + +
+
+ + 🌍 + +
+ + GabiSnow +
+ + GabiSnow + +
+
+ + 🌍 + +
+ + bendaha +
+ + bendaha + +
+
+ + 🌍 + +
+ + Samuel Roland +
+ + Samuel Roland + +
+
+ + 🌍 + +
+ + Dimitri Regnier +
+ + Dimitri Regnier + +
+
+ + 🤔 + +
+ + irithys +
+ + irithys + +
+
+ + 🌍 + +
+ + Sergi +
+ + Sergi + +
+
+ + 🌍 + +
+ + ghose (XoseM) +
+ + ghose (XoseM) + +
+
+ + 🌍 + +
+ + Andreas Olsson +
+ + Andreas Olsson + +
+
+ + 🌍 + +
+ + leonfrom +
+ + leonfrom + +
+
+ + 🌍 + +
+ + agentcobra +
+ + agentcobra + +
+
+ + 🌍 + +
+ + Alessandro +
+ + Alessandro + +
+
+ + 🌍 + +
+ + liimee +
+ + liimee + +
+
+ + 🌍 + +
+ + Ahmed Sabouni +
+ + Ahmed Sabouni + +
+
+ + 🌍 + +
+ + KrzysztofDomanczyk +
+ + KrzysztofDomanczyk + +
+
+ + 💻 + +
+ + Guy Martin +
+ + Guy Martin + +
+
+ + 🐛 + {" "} + + 💻 + +
+ +{/* markdownlint-restore */} +{/* prettier-ignore-end */} + +{/* ALL-CONTRIBUTORS-LIST:END */} + +Dette prosjektet fylgjer +[all-contributors](https://github.com/all-contributors/all-contributors)-spesifikasjonen. +Me er glade for alle slags bidrag! + +## Kontakt + +Du kan spørja om hjelp eller kva som helst andre spørsmål på: + +- [Discord](https://castopod.org/discord) (for å prata direkte med utviklarane + og brukarmiljøet) +- [Feilmeldinga](https://code.castopod.org/adaures/castopod/-/issues) (for å + føreslå nye funksjonar og melda feil) + +Alternativt kan du fylgja oss på sosiale media for å få nytt om Castopod: + +- [podlibre.social](https://podlibre.social/@Castopod) (Mastodon-nettstad) +- [Twitter](https://twitter.com/castopod) +- [LinkedIn](https://linkedin.com/company/castopod) +- [Facebook](https://www.facebook.com/castopod) + +## Sponsorar + +Utviklinga av Castopod er mogleg på grunn av bidrag frå sponsorar og +bidragsytarar. Viss du vil hjelpa til, bed me deg vurdera å +[sponsa utviklinga av Castopod](https://opencollective.com/castopod/contribute). + +[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/) + +[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/) + +## Lisens + +[GNU Affero General Public-lisensen v3.0](https://choosealicense.com/licenses/agpl-3.0/) + +Copyright © 2020-d.d., [Ad Aures](https://adaures.com/). diff --git a/docs/src/content/docs/oc/getting-started/auth.mdx b/docs/src/content/docs/oc/getting-started/auth.mdx new file mode 100644 index 00000000..d4dd4dd5 --- /dev/null +++ b/docs/src/content/docs/oc/getting-started/auth.mdx @@ -0,0 +1,84 @@ +--- +title: 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, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| 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 dashboards and analytics of podcast #\{id\}'s episodes. | +| episodes.create | Can create episodes for podcast #\{id\}. | +| episodes.edit | Can edit episodes of podcast #\{id\}. | +| episodes.delete | Can delete episodes of podcast #\{id\}. | +| episodes.manage-persons | Can manage episode persons of podcast #\{id\}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #\{id\}. | +| episodes.manage-publications | Can publish/unpublish episodes and posts of podcast #\{id\}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #\{id\}. | + +{/* AUTH-PODCAST-PERMISSIONS-LIST:END */} diff --git a/docs/src/content/docs/oc/getting-started/docker.mdx b/docs/src/content/docs/oc/getting-started/docker.mdx new file mode 100644 index 00000000..6141377f --- /dev/null +++ b/docs/src/content/docs/oc/getting-started/docker.mdx @@ -0,0 +1,157 @@ +--- +title: Official Docker images +--- + +Castopod pushes 3 Docker images to the Docker Hub during its automated build +process: + +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit +- [**`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 + +Additionally, Castopod requires a MySQL-compatible database. A Redis database +can be added as a cache handler. + +## Supported tags + +- `develop` [unstable], latest development branch build +- `beta` [stable], latest beta version build +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) + +## Example usage + +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: + + ```yml + version: "3.7" + + services: + app: + image: castopod/castopod:latest + container_name: "castopod-app" + volumes: + - castopod-media:/var/www/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + CP_BASEURL: "https://castopod.example.com" + CP_ANALYTICS_SALT: changeme + CP_CACHE_HANDLER: redis + CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme + networks: + - castopod-app + - castopod-db + ports: + - 8000:8000 + restart: unless-stopped + + mariadb: + image: mariadb:10.5 + container_name: "castopod-mariadb" + networks: + - castopod-db + volumes: + - castopod-db:/var/lib/mysql + environment: + MYSQL_ROOT_PASSWORD: changeme + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + restart: unless-stopped + + redis: + image: redis:7.0-alpine + container_name: "castopod-redis" + command: --requirepass changeme + volumes: + - castopod-cache:/data + networks: + - castopod-app + + volumes: + castopod-media: + castopod-db: + castopod-cache: + + networks: + castopod-app: + castopod-db: + ``` + + You have to adapt some variables to your needs (e.g. `CP_BASEURL`, + `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). + +3. Setup a reverse proxy for 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/): + + ``` + #castopod + castopod.example.com { + reverse_proxy localhost:8000 + } + ``` + +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! + +5. You're all set, start podcasting! 🎙️🚀 + +## Environment Variables + +- **castopod/castopod** and **castopod/app** + + | Variable name | Type (`default`) | Default | + | ------------------------------------- | ----------------------- | ---------------- | + | **`CP_BASEURL`** | string | `undefined` | + | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | + | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | + | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | + | **`CP_ANALYTICS_SALT`** | string | `undefined` | + | **`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_REDIS_HOST`** | ?string | `"localhost"` | + | **`CP_REDIS_PASSWORD`** | ?string | `null` | + | **`CP_REDIS_PORT`** | ?number | `6379` | + | **`CP_REDIS_DATABASE`** | ?number | `0` | + | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | + | **`CP_EMAIL_FROM`** | ?string | `undefined` | + | **`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_ENABLE_2FA`** | ?boolean | `undefined` | + | **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` | + | **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` | + | **`CP_MEDIA_S3_KEY`** | ?string | `undefined` | + | **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` | + | **`CP_MEDIA_S3_REGION`** | ?string | `undefined` | + | **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` | + | **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` | + | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` | + | **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` | + | **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` | + | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | + | **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | + +- **castopod/web-server** + + | Variable name | Type | Default | + | ---------------------- | --------------------- | ------- | + | **`CP_APP_HOSTNAME`** | ?string | `"app"` | + | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | diff --git a/docs/src/content/docs/oc/getting-started/install.mdx b/docs/src/content/docs/oc/getting-started/install.mdx new file mode 100644 index 00000000..d8888954 --- /dev/null +++ b/docs/src/content/docs/oc/getting-started/install.mdx @@ -0,0 +1,251 @@ +--- +title: How to install Castopod? +--- + +import { Aside } from "@astrojs/starlight/components"; + +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. + + + +## Requirements + +- PHP v8.1 or higher +- MySQL version 5.7 or higher or MariaDB version 10.2 or higher +- HTTPS support +- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's + incoming requests + +### PHP v8.1 or higher + +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. +- [exif](https://www.php.net/manual/en/exif.installation.php) + +Additionally, make sure that the following extensions are enabled in your PHP: + +- json (enabled by default - don't turn it off) +- xml (enabled by default - don't turn it off) +- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php) + +### MySQL compatible database + +> We recommend using [MariaDB](https://mariadb.org). + +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. + +#### Privileges + +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`. + +### (Optional) FFmpeg v4.1.8 or higher for Video Clips + +[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: + +- **FreeType 2** library for + [gd](https://www.php.net/manual/en/image.installation.php). + +### (Optional) Other recommendations + +- Redis for better cache performances. +- CDN for static files caching and better performances. +- e-mail gateway for lost passwords. + +## Install instructions + +### Pre-requisites + +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 haven’t 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): + + ```bash + * * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1 + ``` + + **Note** - If you do not add this cron task, the following Castopod features + will not work: + + - Importing a podcast from an existing RSS feed + - Broadcasting social activities to your followers in the fediverse + - Broadcasting episodes to open hubs using + [WebSub](https://en.wikipedia.org/wiki/WebSub) + - Generating video clips - + [requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips) + +### (recommended) Install Wizard + +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! + + + +### Using CLI + +1. Create a `.env` file in the package root based on the `.env.example` file. +2. Initialize the database using: + + ```sh + php spark install:init-database + ``` + +3. Create the superadmin user using: + + ```sh + php spark install:create-superadmin + ``` + +4. Head on to your admin gateway to start podcasting! + +### Email/SMTP setup + +Email configuration is required for some features to work properly (eg. +retrieving your forgotten password, sending instructions to premium subscribers, +…) + +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" +``` + +#### Email config options + +| 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"` | + +### Media storage + +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 + +If you prefer storing your media files on an S3 compatible storage, you may +specify it in your `.env`: + +```ini +# […] + +media.fileManager="s3" +media.s3.endpoint="your_s3_host" +media.s3.key="your_s3_key" +media.s3.secret="your_s3_secret" +media.s3.region="your_s3_region" +``` + +#### S3 config options + +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | + +## Community packages + +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. + +### Install with 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. + + diff --git a/docs/src/content/docs/oc/getting-started/security.mdx b/docs/src/content/docs/oc/getting-started/security.mdx new file mode 100644 index 00000000..c039493c --- /dev/null +++ b/docs/src/content/docs/oc/getting-started/security.mdx @@ -0,0 +1,24 @@ +--- +title: Security concerns +--- + +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). + +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): + +- `writable/` folder must be **readable** and **writable**. +- `public/media/` folder must be **readable** and **writable**. +- any other file must be set to **readonly**. + +For instance, if you are using Apache or NGINX with Ubuntu you may do the +following: + +```bash +sudo chown -R root:root /path/to/castopod +sudo chown -R www-data:www-data /path/to/castopod/writable +sudo chown -R www-data:www-data /path/to/castopod/public/media +``` diff --git a/docs/src/content/docs/oc/getting-started/update.mdx b/docs/src/content/docs/oc/getting-started/update.mdx new file mode 100644 index 00000000..f1a26974 --- /dev/null +++ b/docs/src/content/docs/oc/getting-started/update.mdx @@ -0,0 +1,108 @@ +--- +title: How to update Castopod? +--- + +import { Aside } from "@astrojs/starlight/components"; + +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 ⚡. + +## Update instructions + +0. ⚠️ Before any update, we highly recommend you backup your Castopod files and + database. + + - cf. + [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 + + - cf. + [Where can I find my 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 + + - ⚠️ 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/) + +3. On your server: + + - Remove all files except `.env` and `public/media` + - Copy the new files from the downloaded package into your server + + + +4. Update your database schema from your `Castopod Admin` > `About` page or by + running: + + ```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! + + + +## Fully Automated updates + +> Coming soon... 👀 + +## Frequently asked questions (FAQ) + +### Where can I find my Castopod version? + +Go to your Castopod admin panel, the version is displayed on the bottom left +corner. + +Alternatively, you can find the version in the `app > Config > Constants.php` +file. + +### I haven't updated my instance in a long time… What should I do? + +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. + +> You may want to backup your instance depending on how long you haven't updated +> Castopod. + +For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to +`v1.0.0-beta.1`: + +0. (highly recommended) Make a backup of your files and database. + +1. Download the latest release, overwrite your files whilst keeping `.env` and + `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`, + `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`. + +3. ✨ Enjoy your fresh instance, you're all done! + +### Should I make a backup before updating? + +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… diff --git a/docs/src/content/docs/oc/index.mdx b/docs/src/content/docs/oc/index.mdx new file mode 100644 index 00000000..3f1ec043 --- /dev/null +++ b/docs/src/content/docs/oc/index.mdx @@ -0,0 +1,1349 @@ +--- +title: Welcome 👋 +--- + +import { LinkCard } from "@astrojs/starlight/components"; + +Castopod is a free & open-source hosting platform made for podcasters who want +engage and interact with their audience. + +Castopod is easy to install and was built on top of +[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very +small footprint. + + + +## Features + +- 🌱  Free & open-source (AGPL v3 License) +- 🔐  Focused on data sovereignty: your content, audience, and analytics + belong to you, and you only +- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, + chapters, location, persons, soundbites, … +- 💬  Built-in social network: + - 🚀  Castopod is part of the Fediverse, a decentralized social network + - ❤️  Create posts, share, favourite, and comment on episodes +- 📈  Built-in analytics: + - ⚖️  GDPR / CCPA / LGPD compliant + - 🪙  Standard IABv2 audience measurement + - 🏡  On-premises analytics, no third party involved +- 📢  Built-in marketing tools: + - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) + - 📱  PWA: install as a standalone app + - 🎨  Customizable theme colors + - 🎬  Generate ready-to-share Video clips from episodes + - 🔉  Generate soundbites + - ▶️  Embeddable player, embed your episodes on any website +- 💸  Monetization: + - 🔗  Funding links + - 📲  listen-to-click ads + - 🤝  value4value / WebMonetization + - 💎  Premium podcasts +- 📡  Publish your episodes everywhere with RSS: + - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, + Google Podcasts, Deezer, Podcast Addict, Podfriend, … + - ⚡  Broadcast your episodes instantly with WebSub +- 📥  Podcast import: move your existing podcast into Castopod +- 📤  Move your podcast out of Castopod +- 🔀  Multi-tenant: host as many podcasts as you want +- 👥  Multi-user: add contributors and set roles +- 🌎  i18n support: translated in English, French, Polish, German, + Brazilian Portuguese & Spanish… with + [more to come](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. + +It is in fact one of the only media to have stayed this way for a long time. + +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. + +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized 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. + +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. + +## Comparison with other solutions + +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 you. + +### 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 it. + +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. + +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. + +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 journey. + +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. + +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! + +### 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 was initially built around music. And later on, as the project +evolved, the ability to host podcasts was introduced. + +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, …). + +So, you should probably use Funkwhale if you want to host your music, and use +Castopod if you want to host your podcasts. + +### Castopod vs other podcast hosts + +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! + +Each of these solutions differ from one another, you may compare with the +[list of features](#features). + +That being said, there are two main differences with other podcasting solutions: + +- 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 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. + +## Contributing + +Love Castopod and would like to help? Take a look at the following documentation +to get you started. + +### Code of conduct + +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 tolerated. + +### Contributing 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. + +## Contributors ✨ + +Thanks goes to these wonderful people +([emoji key](https://allcontributors.org/docs/en/emoji-key)): + +{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */} +{/* prettier-ignore-start */} +{/* markdownlint-disable */} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Yassine Doghri +
+ + Yassine Doghri + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 📖 + {" "} + + 👀 + {" "} + + 🚧 + {" "} + + 🖋 + {" "} + + 🎨 + {" "} + + ️️️️♿️ + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🧑‍🏫 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📆 + {" "} + + 📝 + +
+ + Benjamin Bellamy +
+ + Benjamin Bellamy + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 👀 + {" "} + + 🖋 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📝 + {" "} + + 📆 + {" "} + + 📢 + +
+ + Ola Hneini +
+ + Ola Hneini + +
+
+ + 💻 + {" "} + + 👀 + {" "} + + 📖 + {" "} + + 🚧 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Romain de Laage +
+ + Romain de Laage + +
+
+ + 💻 + {" "} + + 🚇 + {" "} + + 📖 + {" "} + + 🌍 + {" "} + + 🤔 + +
+ + Lyonel Bernard +
+ + Lyonel Bernard + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Christopher Lagonick-Weitzel +
+ + Christopher Lagonick-Weitzel + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Ernesto Acosta +
+ + Ernesto Acosta + +
+
+ + 🐛 + {" "} + + 🔊 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Bastien Luneteau +
+ + Bastien Luneteau + +
+
+ + 💻 + {" "} + + 🐛 + +
+ + Cécile Ricordeau +
+ + Cécile Ricordeau + +
+
+ + 🎨 + +
+ + Patryk Miś +
+ + Patryk Miś + +
+
+ + 🌍 + +
+ + Marcin Lewandowski +
+ + Marcin Lewandowski + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Sebastian Janik +
+ + Sebastian Janik + +
+
+ + 💻 + +
+ + Patryk Karczmarczyk +
+ + Patryk Karczmarczyk + +
+
+ + 💻 + +
+ + denis d +
+ + denis d + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Douglas Kastle +
+ + Douglas Kastle + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + cExplorer +
+ + cExplorer + +
+
+ + 🐛 + {" "} + + 🌍 + +
+ + ImaCrea +
+ + ImaCrea + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Jonas S +
+ + Jonas S + +
+
+ + 💻 + +
+ + LEFEBVRE Yann +
+ + LEFEBVRE Yann + +
+
+ + 🐛 + +
+ + Sebastian Späth +
+ + Sebastian Späth + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + rocky III +
+ + rocky III + +
+
+ + 🐛 + +
+ + Hermann Josef Eckl +
+ + Hermann Josef Eckl + +
+
+ + 🐛 + +
+ + Delhaye Cyrille +
+ + Delhaye Cyrille + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + João Leandro +
+ + João Leandro + +
+
+ + 🌍 + {" "} + + 🤔 + +
+ + Angelos Chouvardas +
+ + Angelos Chouvardas + +
+
+ + 🌍 + +
+ + Eivind +
+ + Eivind + +
+
+ + 🌍 + +
+ + Ewen +
+ + Ewen + +
+
+ + 🌍 + {" "} + + 🤔 + +
+ + forght +
+ + forght + +
+
+ + 🌍 + +
+ + glottis0q +
+ + glottis0q + +
+
+ + 🌍 + +
+ + ButterflyOfFire +
+ + ButterflyOfFire + +
+
+ + 🌍 + +
+ + Lucian I. Last +
+ + Lucian I. Last + +
+
+ + 🌍 + +
+ + LuuzViir +
+ + LuuzViir + +
+
+ + 🌍 + +
+ + CTHTC +
+ + CTHTC + +
+
+ + 🌍 + +
+ + Russian Retro +
+ + Russian Retro + +
+
+ + 🌍 + +
+ + Marek L'ach +
+ + Marek L'ach + +
+
+ + 🌍 + +
+ + GunChleoc +
+ + GunChleoc + +
+
+ + 🌍 + +
+ + GabiSnow +
+ + GabiSnow + +
+
+ + 🌍 + +
+ + bendaha +
+ + bendaha + +
+
+ + 🌍 + +
+ + Samuel Roland +
+ + Samuel Roland + +
+
+ + 🌍 + +
+ + Dimitri Regnier +
+ + Dimitri Regnier + +
+
+ + 🤔 + +
+ + irithys +
+ + irithys + +
+
+ + 🌍 + +
+ + Sergi +
+ + Sergi + +
+
+ + 🌍 + +
+ + ghose (XoseM) +
+ + ghose (XoseM) + +
+
+ + 🌍 + +
+ + Andreas Olsson +
+ + Andreas Olsson + +
+
+ + 🌍 + +
+ + leonfrom +
+ + leonfrom + +
+
+ + 🌍 + +
+ + agentcobra +
+ + agentcobra + +
+
+ + 🌍 + +
+ + Alessandro +
+ + Alessandro + +
+
+ + 🌍 + +
+ + liimee +
+ + liimee + +
+
+ + 🌍 + +
+ + Ahmed Sabouni +
+ + Ahmed Sabouni + +
+
+ + 🌍 + +
+ + KrzysztofDomanczyk +
+ + KrzysztofDomanczyk + +
+
+ + 💻 + +
+ +{/* markdownlint-restore */} +{/* prettier-ignore-end */} + +{/* ALL-CONTRIBUTORS-LIST:END */} + +This project follows the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind welcome! + +## Contact + +You may reach us for help or ask any question you have on: + +- [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) + +Alternatively, you can follow us on social media platforms to get news about +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 + +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). + +[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/) + +[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/) + +## License + +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) + +Copyright © 2020-present, [Ad Aures](https://adaures.com/). diff --git a/docs/src/ca/getting-started/auth.md b/docs/src/content/docs/pl/getting-started/auth.mdx similarity index 56% rename from docs/src/ca/getting-started/auth.md rename to docs/src/content/docs/pl/getting-started/auth.mdx index 4a873da4..771358bf 100644 --- a/docs/src/ca/getting-started/auth.md +++ b/docs/src/content/docs/pl/getting-started/auth.mdx @@ -1,10 +1,7 @@ --- -title: Autenticació i Autorització -sidebarDepth: 3 +title: Uwierzytelnianie & Autoryzacja --- -# Authentication & Authorization - Castopod handles authentication and authorization using `codeigniter/shield` coupled with custom rules. Roles and permissions are defined at two levels: @@ -15,7 +12,7 @@ coupled with custom rules. Roles and permissions are defined at two levels: ### Instance roles - +{/* AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section */} | role | description | permissions | | ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | @@ -23,11 +20,11 @@ coupled with custom rules. Roles and permissions are defined at two levels: | 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 | | ----------------------- | ------------------------------------------------------------------ | @@ -41,47 +38,47 @@ coupled with custom rules. Roles and permissions are defined at two levels: | 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, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| 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 | +| 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, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| 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}. | +| 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 dashboards and analytics of podcast #\{id\}'s episodes. | +| episodes.create | Can create episodes for podcast #\{id\}. | +| episodes.edit | Can edit episodes of podcast #\{id\}. | +| episodes.delete | Can delete episodes of podcast #\{id\}. | +| episodes.manage-persons | Can manage episode persons of podcast #\{id\}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #\{id\}. | +| episodes.manage-publications | Can publish/unpublish episodes and posts of podcast #\{id\}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #\{id\}. | - +{/* AUTH-PODCAST-PERMISSIONS-LIST:END */} diff --git a/docs/src/content/docs/pl/getting-started/docker.mdx b/docs/src/content/docs/pl/getting-started/docker.mdx new file mode 100644 index 00000000..6141377f --- /dev/null +++ b/docs/src/content/docs/pl/getting-started/docker.mdx @@ -0,0 +1,157 @@ +--- +title: Official Docker images +--- + +Castopod pushes 3 Docker images to the Docker Hub during its automated build +process: + +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit +- [**`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 + +Additionally, Castopod requires a MySQL-compatible database. A Redis database +can be added as a cache handler. + +## Supported tags + +- `develop` [unstable], latest development branch build +- `beta` [stable], latest beta version build +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) + +## Example usage + +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: + + ```yml + version: "3.7" + + services: + app: + image: castopod/castopod:latest + container_name: "castopod-app" + volumes: + - castopod-media:/var/www/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + CP_BASEURL: "https://castopod.example.com" + CP_ANALYTICS_SALT: changeme + CP_CACHE_HANDLER: redis + CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme + networks: + - castopod-app + - castopod-db + ports: + - 8000:8000 + restart: unless-stopped + + mariadb: + image: mariadb:10.5 + container_name: "castopod-mariadb" + networks: + - castopod-db + volumes: + - castopod-db:/var/lib/mysql + environment: + MYSQL_ROOT_PASSWORD: changeme + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + restart: unless-stopped + + redis: + image: redis:7.0-alpine + container_name: "castopod-redis" + command: --requirepass changeme + volumes: + - castopod-cache:/data + networks: + - castopod-app + + volumes: + castopod-media: + castopod-db: + castopod-cache: + + networks: + castopod-app: + castopod-db: + ``` + + You have to adapt some variables to your needs (e.g. `CP_BASEURL`, + `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). + +3. Setup a reverse proxy for 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/): + + ``` + #castopod + castopod.example.com { + reverse_proxy localhost:8000 + } + ``` + +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! + +5. You're all set, start podcasting! 🎙️🚀 + +## Environment Variables + +- **castopod/castopod** and **castopod/app** + + | Variable name | Type (`default`) | Default | + | ------------------------------------- | ----------------------- | ---------------- | + | **`CP_BASEURL`** | string | `undefined` | + | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | + | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | + | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | + | **`CP_ANALYTICS_SALT`** | string | `undefined` | + | **`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_REDIS_HOST`** | ?string | `"localhost"` | + | **`CP_REDIS_PASSWORD`** | ?string | `null` | + | **`CP_REDIS_PORT`** | ?number | `6379` | + | **`CP_REDIS_DATABASE`** | ?number | `0` | + | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | + | **`CP_EMAIL_FROM`** | ?string | `undefined` | + | **`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_ENABLE_2FA`** | ?boolean | `undefined` | + | **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` | + | **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` | + | **`CP_MEDIA_S3_KEY`** | ?string | `undefined` | + | **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` | + | **`CP_MEDIA_S3_REGION`** | ?string | `undefined` | + | **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` | + | **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` | + | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` | + | **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` | + | **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` | + | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | + | **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | + +- **castopod/web-server** + + | Variable name | Type | Default | + | ---------------------- | --------------------- | ------- | + | **`CP_APP_HOSTNAME`** | ?string | `"app"` | + | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | diff --git a/docs/src/content/docs/pl/getting-started/install.mdx b/docs/src/content/docs/pl/getting-started/install.mdx new file mode 100644 index 00000000..d8888954 --- /dev/null +++ b/docs/src/content/docs/pl/getting-started/install.mdx @@ -0,0 +1,251 @@ +--- +title: How to install Castopod? +--- + +import { Aside } from "@astrojs/starlight/components"; + +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. + + + +## Requirements + +- PHP v8.1 or higher +- MySQL version 5.7 or higher or MariaDB version 10.2 or higher +- HTTPS support +- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's + incoming requests + +### PHP v8.1 or higher + +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. +- [exif](https://www.php.net/manual/en/exif.installation.php) + +Additionally, make sure that the following extensions are enabled in your PHP: + +- json (enabled by default - don't turn it off) +- xml (enabled by default - don't turn it off) +- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php) + +### MySQL compatible database + +> We recommend using [MariaDB](https://mariadb.org). + +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. + +#### Privileges + +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`. + +### (Optional) FFmpeg v4.1.8 or higher for Video Clips + +[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: + +- **FreeType 2** library for + [gd](https://www.php.net/manual/en/image.installation.php). + +### (Optional) Other recommendations + +- Redis for better cache performances. +- CDN for static files caching and better performances. +- e-mail gateway for lost passwords. + +## Install instructions + +### Pre-requisites + +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 haven’t 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): + + ```bash + * * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1 + ``` + + **Note** - If you do not add this cron task, the following Castopod features + will not work: + + - Importing a podcast from an existing RSS feed + - Broadcasting social activities to your followers in the fediverse + - Broadcasting episodes to open hubs using + [WebSub](https://en.wikipedia.org/wiki/WebSub) + - Generating video clips - + [requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips) + +### (recommended) Install Wizard + +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! + + + +### Using CLI + +1. Create a `.env` file in the package root based on the `.env.example` file. +2. Initialize the database using: + + ```sh + php spark install:init-database + ``` + +3. Create the superadmin user using: + + ```sh + php spark install:create-superadmin + ``` + +4. Head on to your admin gateway to start podcasting! + +### Email/SMTP setup + +Email configuration is required for some features to work properly (eg. +retrieving your forgotten password, sending instructions to premium subscribers, +…) + +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" +``` + +#### Email config options + +| 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"` | + +### Media storage + +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 + +If you prefer storing your media files on an S3 compatible storage, you may +specify it in your `.env`: + +```ini +# […] + +media.fileManager="s3" +media.s3.endpoint="your_s3_host" +media.s3.key="your_s3_key" +media.s3.secret="your_s3_secret" +media.s3.region="your_s3_region" +``` + +#### S3 config options + +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | + +## Community packages + +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. + +### Install with 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. + + diff --git a/docs/src/content/docs/pl/getting-started/security.mdx b/docs/src/content/docs/pl/getting-started/security.mdx new file mode 100644 index 00000000..c039493c --- /dev/null +++ b/docs/src/content/docs/pl/getting-started/security.mdx @@ -0,0 +1,24 @@ +--- +title: Security concerns +--- + +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). + +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): + +- `writable/` folder must be **readable** and **writable**. +- `public/media/` folder must be **readable** and **writable**. +- any other file must be set to **readonly**. + +For instance, if you are using Apache or NGINX with Ubuntu you may do the +following: + +```bash +sudo chown -R root:root /path/to/castopod +sudo chown -R www-data:www-data /path/to/castopod/writable +sudo chown -R www-data:www-data /path/to/castopod/public/media +``` diff --git a/docs/src/it/getting-started/update.md b/docs/src/content/docs/pl/getting-started/update.mdx similarity index 96% rename from docs/src/it/getting-started/update.md rename to docs/src/content/docs/pl/getting-started/update.mdx index 76668ae3..d91f98c4 100644 --- a/docs/src/it/getting-started/update.md +++ b/docs/src/content/docs/pl/getting-started/update.mdx @@ -1,9 +1,8 @@ --- -title: Update -sidebarDepth: 3 +title: How to update Castopod? --- -# How to update Castopod? +import { Aside } from "@astrojs/starlight/components"; 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 @@ -36,12 +35,12 @@ improvements ⚡. - Remove all files except `.env` and `public/media` - Copy the new files from the downloaded package into your server - ::: info Note + 4. Update your database schema from your `Castopod Admin` > `About` page or by running: @@ -54,7 +53,7 @@ improvements ⚡. `Housekeeping` 6. ✨ Enjoy your fresh instance, you're all done! -::: info Note + ## Fully Automated updates diff --git a/docs/src/content/docs/pl/index.mdx b/docs/src/content/docs/pl/index.mdx new file mode 100644 index 00000000..3f1ec043 --- /dev/null +++ b/docs/src/content/docs/pl/index.mdx @@ -0,0 +1,1349 @@ +--- +title: Welcome 👋 +--- + +import { LinkCard } from "@astrojs/starlight/components"; + +Castopod is a free & open-source hosting platform made for podcasters who want +engage and interact with their audience. + +Castopod is easy to install and was built on top of +[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very +small footprint. + + + +## Features + +- 🌱  Free & open-source (AGPL v3 License) +- 🔐  Focused on data sovereignty: your content, audience, and analytics + belong to you, and you only +- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, + chapters, location, persons, soundbites, … +- 💬  Built-in social network: + - 🚀  Castopod is part of the Fediverse, a decentralized social network + - ❤️  Create posts, share, favourite, and comment on episodes +- 📈  Built-in analytics: + - ⚖️  GDPR / CCPA / LGPD compliant + - 🪙  Standard IABv2 audience measurement + - 🏡  On-premises analytics, no third party involved +- 📢  Built-in marketing tools: + - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) + - 📱  PWA: install as a standalone app + - 🎨  Customizable theme colors + - 🎬  Generate ready-to-share Video clips from episodes + - 🔉  Generate soundbites + - ▶️  Embeddable player, embed your episodes on any website +- 💸  Monetization: + - 🔗  Funding links + - 📲  listen-to-click ads + - 🤝  value4value / WebMonetization + - 💎  Premium podcasts +- 📡  Publish your episodes everywhere with RSS: + - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, + Google Podcasts, Deezer, Podcast Addict, Podfriend, … + - ⚡  Broadcast your episodes instantly with WebSub +- 📥  Podcast import: move your existing podcast into Castopod +- 📤  Move your podcast out of Castopod +- 🔀  Multi-tenant: host as many podcasts as you want +- 👥  Multi-user: add contributors and set roles +- 🌎  i18n support: translated in English, French, Polish, German, + Brazilian Portuguese & Spanish… with + [more to come](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. + +It is in fact one of the only media to have stayed this way for a long time. + +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. + +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized 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. + +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. + +## Comparison with other solutions + +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 you. + +### 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 it. + +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. + +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. + +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 journey. + +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. + +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! + +### 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 was initially built around music. And later on, as the project +evolved, the ability to host podcasts was introduced. + +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, …). + +So, you should probably use Funkwhale if you want to host your music, and use +Castopod if you want to host your podcasts. + +### Castopod vs other podcast hosts + +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! + +Each of these solutions differ from one another, you may compare with the +[list of features](#features). + +That being said, there are two main differences with other podcasting solutions: + +- 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 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. + +## Contributing + +Love Castopod and would like to help? Take a look at the following documentation +to get you started. + +### Code of conduct + +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 tolerated. + +### Contributing 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. + +## Contributors ✨ + +Thanks goes to these wonderful people +([emoji key](https://allcontributors.org/docs/en/emoji-key)): + +{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */} +{/* prettier-ignore-start */} +{/* markdownlint-disable */} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Yassine Doghri +
+ + Yassine Doghri + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 📖 + {" "} + + 👀 + {" "} + + 🚧 + {" "} + + 🖋 + {" "} + + 🎨 + {" "} + + ️️️️♿️ + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🧑‍🏫 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📆 + {" "} + + 📝 + +
+ + Benjamin Bellamy +
+ + Benjamin Bellamy + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 👀 + {" "} + + 🖋 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📝 + {" "} + + 📆 + {" "} + + 📢 + +
+ + Ola Hneini +
+ + Ola Hneini + +
+
+ + 💻 + {" "} + + 👀 + {" "} + + 📖 + {" "} + + 🚧 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Romain de Laage +
+ + Romain de Laage + +
+
+ + 💻 + {" "} + + 🚇 + {" "} + + 📖 + {" "} + + 🌍 + {" "} + + 🤔 + +
+ + Lyonel Bernard +
+ + Lyonel Bernard + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Christopher Lagonick-Weitzel +
+ + Christopher Lagonick-Weitzel + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Ernesto Acosta +
+ + Ernesto Acosta + +
+
+ + 🐛 + {" "} + + 🔊 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Bastien Luneteau +
+ + Bastien Luneteau + +
+
+ + 💻 + {" "} + + 🐛 + +
+ + Cécile Ricordeau +
+ + Cécile Ricordeau + +
+
+ + 🎨 + +
+ + Patryk Miś +
+ + Patryk Miś + +
+
+ + 🌍 + +
+ + Marcin Lewandowski +
+ + Marcin Lewandowski + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Sebastian Janik +
+ + Sebastian Janik + +
+
+ + 💻 + +
+ + Patryk Karczmarczyk +
+ + Patryk Karczmarczyk + +
+
+ + 💻 + +
+ + denis d +
+ + denis d + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Douglas Kastle +
+ + Douglas Kastle + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + cExplorer +
+ + cExplorer + +
+
+ + 🐛 + {" "} + + 🌍 + +
+ + ImaCrea +
+ + ImaCrea + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Jonas S +
+ + Jonas S + +
+
+ + 💻 + +
+ + LEFEBVRE Yann +
+ + LEFEBVRE Yann + +
+
+ + 🐛 + +
+ + Sebastian Späth +
+ + Sebastian Späth + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + rocky III +
+ + rocky III + +
+
+ + 🐛 + +
+ + Hermann Josef Eckl +
+ + Hermann Josef Eckl + +
+
+ + 🐛 + +
+ + Delhaye Cyrille +
+ + Delhaye Cyrille + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + João Leandro +
+ + João Leandro + +
+
+ + 🌍 + {" "} + + 🤔 + +
+ + Angelos Chouvardas +
+ + Angelos Chouvardas + +
+
+ + 🌍 + +
+ + Eivind +
+ + Eivind + +
+
+ + 🌍 + +
+ + Ewen +
+ + Ewen + +
+
+ + 🌍 + {" "} + + 🤔 + +
+ + forght +
+ + forght + +
+
+ + 🌍 + +
+ + glottis0q +
+ + glottis0q + +
+
+ + 🌍 + +
+ + ButterflyOfFire +
+ + ButterflyOfFire + +
+
+ + 🌍 + +
+ + Lucian I. Last +
+ + Lucian I. Last + +
+
+ + 🌍 + +
+ + LuuzViir +
+ + LuuzViir + +
+
+ + 🌍 + +
+ + CTHTC +
+ + CTHTC + +
+
+ + 🌍 + +
+ + Russian Retro +
+ + Russian Retro + +
+
+ + 🌍 + +
+ + Marek L'ach +
+ + Marek L'ach + +
+
+ + 🌍 + +
+ + GunChleoc +
+ + GunChleoc + +
+
+ + 🌍 + +
+ + GabiSnow +
+ + GabiSnow + +
+
+ + 🌍 + +
+ + bendaha +
+ + bendaha + +
+
+ + 🌍 + +
+ + Samuel Roland +
+ + Samuel Roland + +
+
+ + 🌍 + +
+ + Dimitri Regnier +
+ + Dimitri Regnier + +
+
+ + 🤔 + +
+ + irithys +
+ + irithys + +
+
+ + 🌍 + +
+ + Sergi +
+ + Sergi + +
+
+ + 🌍 + +
+ + ghose (XoseM) +
+ + ghose (XoseM) + +
+
+ + 🌍 + +
+ + Andreas Olsson +
+ + Andreas Olsson + +
+
+ + 🌍 + +
+ + leonfrom +
+ + leonfrom + +
+
+ + 🌍 + +
+ + agentcobra +
+ + agentcobra + +
+
+ + 🌍 + +
+ + Alessandro +
+ + Alessandro + +
+
+ + 🌍 + +
+ + liimee +
+ + liimee + +
+
+ + 🌍 + +
+ + Ahmed Sabouni +
+ + Ahmed Sabouni + +
+
+ + 🌍 + +
+ + KrzysztofDomanczyk +
+ + KrzysztofDomanczyk + +
+
+ + 💻 + +
+ +{/* markdownlint-restore */} +{/* prettier-ignore-end */} + +{/* ALL-CONTRIBUTORS-LIST:END */} + +This project follows the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind welcome! + +## Contact + +You may reach us for help or ask any question you have on: + +- [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) + +Alternatively, you can follow us on social media platforms to get news about +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 + +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). + +[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/) + +[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/) + +## License + +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) + +Copyright © 2020-present, [Ad Aures](https://adaures.com/). diff --git a/docs/src/content/docs/pt-br/getting-started/auth.mdx b/docs/src/content/docs/pt-br/getting-started/auth.mdx new file mode 100644 index 00000000..9dd47c1f --- /dev/null +++ b/docs/src/content/docs/pt-br/getting-started/auth.mdx @@ -0,0 +1,84 @@ +--- +title: 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 administrador | Tem controle completo sobre Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Gerente | Gerencia o conteúdo de Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | Usuários gerais do 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 | Pode acessar a área de administração do Castopod. | +| admin.settings | Pode acessar as configurações de Castopod. | +| users.manage | Pode gerenciar usuários do Castopod. | +| persons.manage | Pode gerenciar pessoas. | +| pages.manage | Pode gerenciar páginas. | +| podcasts.view | Pode ver todos os podcasts. | +| podcasts.create | Pode criar novos podcasts. | +| podcasts.import | Pode importar podcasts. | +| fediverse.manage-blocks | Pode bloquear ator/domínios distintos de interagir com 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 | +| ------------- | ---------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Administrador | Tem controle completo do podcast #\{id\}. | \* | +| Editor | Gerencia o conteúdo e as publicações do podcast #\{id\}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Autor | Gerencia o conteúdo do podcast #\{id\} mas não pode publicá-los. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Convidado | Contribuidor geral do 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 | Pode visualizar o painel de controle e análises do podcast #\{id\}. | +| edit | Pode editar o podcast #\{id\}. | +| delete | Pode deletar episódios do podcast #\{id\}. | +| manage-import | Pode sincronizar o podcast importado #\{id\}. | +| manage-persons | Pode gerenciar assinaturas do podcast #\{id\}. | +| manage-subscriptions | Pode gerenciar assinaturas do podcast #\{id\}. | +| manage-contributors | Pode gerenciar contribuidores do podcast #\{id\}. | +| manage-platforms | Pode definir/remover links de plataforma do podcast #\{id\}. | +| manage-publications | Pode publicar podcast #\{id\}. | +| manage-notifications | Pode ver e marcar notificações como lidas para o podcast #\{id\}. | +| interact-as | Pode interagir com o podcast #\{id\} para favorito, compartilhar ou responder às publicações. | +| episodes.view | Pode ver painéis e análises de episódios de podcast #\{id\}. | +| episodes.create | Pode criar episódios para o podcast #\{id\}. | +| episodes.edit | Pode editar episódios de podcast #\{id\}. | +| episodes.delete | Pode excluir episódios do podcast #\{id\}. | +| episodes.manage-persons | Pode gerenciar pessoas de episódios do podcast #\{id\}. | +| episodes.manage-clips | Pode gerenciar clipes de vídeo ou sons de episódios do podcast #\{id\}. | +| episodes.manage-publications | Pode publicar/remover a publicação de episódios e postagens de podcast #\{id\}. | +| episodes.manage-comments | Pode criar/remover comentários de episódio do podcast #\{id\}. | + +{/* AUTH-PODCAST-PERMISSIONS-LIST:END */} diff --git a/docs/src/content/docs/pt-br/getting-started/docker.mdx b/docs/src/content/docs/pt-br/getting-started/docker.mdx new file mode 100644 index 00000000..6141377f --- /dev/null +++ b/docs/src/content/docs/pt-br/getting-started/docker.mdx @@ -0,0 +1,157 @@ +--- +title: Official Docker images +--- + +Castopod pushes 3 Docker images to the Docker Hub during its automated build +process: + +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit +- [**`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 + +Additionally, Castopod requires a MySQL-compatible database. A Redis database +can be added as a cache handler. + +## Supported tags + +- `develop` [unstable], latest development branch build +- `beta` [stable], latest beta version build +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) + +## Example usage + +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: + + ```yml + version: "3.7" + + services: + app: + image: castopod/castopod:latest + container_name: "castopod-app" + volumes: + - castopod-media:/var/www/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + CP_BASEURL: "https://castopod.example.com" + CP_ANALYTICS_SALT: changeme + CP_CACHE_HANDLER: redis + CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme + networks: + - castopod-app + - castopod-db + ports: + - 8000:8000 + restart: unless-stopped + + mariadb: + image: mariadb:10.5 + container_name: "castopod-mariadb" + networks: + - castopod-db + volumes: + - castopod-db:/var/lib/mysql + environment: + MYSQL_ROOT_PASSWORD: changeme + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + restart: unless-stopped + + redis: + image: redis:7.0-alpine + container_name: "castopod-redis" + command: --requirepass changeme + volumes: + - castopod-cache:/data + networks: + - castopod-app + + volumes: + castopod-media: + castopod-db: + castopod-cache: + + networks: + castopod-app: + castopod-db: + ``` + + You have to adapt some variables to your needs (e.g. `CP_BASEURL`, + `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). + +3. Setup a reverse proxy for 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/): + + ``` + #castopod + castopod.example.com { + reverse_proxy localhost:8000 + } + ``` + +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! + +5. You're all set, start podcasting! 🎙️🚀 + +## Environment Variables + +- **castopod/castopod** and **castopod/app** + + | Variable name | Type (`default`) | Default | + | ------------------------------------- | ----------------------- | ---------------- | + | **`CP_BASEURL`** | string | `undefined` | + | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | + | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | + | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | + | **`CP_ANALYTICS_SALT`** | string | `undefined` | + | **`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_REDIS_HOST`** | ?string | `"localhost"` | + | **`CP_REDIS_PASSWORD`** | ?string | `null` | + | **`CP_REDIS_PORT`** | ?number | `6379` | + | **`CP_REDIS_DATABASE`** | ?number | `0` | + | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | + | **`CP_EMAIL_FROM`** | ?string | `undefined` | + | **`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_ENABLE_2FA`** | ?boolean | `undefined` | + | **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` | + | **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` | + | **`CP_MEDIA_S3_KEY`** | ?string | `undefined` | + | **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` | + | **`CP_MEDIA_S3_REGION`** | ?string | `undefined` | + | **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` | + | **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` | + | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` | + | **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` | + | **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` | + | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | + | **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | + +- **castopod/web-server** + + | Variable name | Type | Default | + | ---------------------- | --------------------- | ------- | + | **`CP_APP_HOSTNAME`** | ?string | `"app"` | + | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | diff --git a/docs/src/pt-BR/getting-started/install.md b/docs/src/content/docs/pt-br/getting-started/install.mdx similarity index 82% rename from docs/src/pt-BR/getting-started/install.md rename to docs/src/content/docs/pt-br/getting-started/install.mdx index 0cf1e1c0..886051db 100644 --- a/docs/src/pt-BR/getting-started/install.md +++ b/docs/src/content/docs/pt-br/getting-started/install.mdx @@ -1,22 +1,21 @@ --- -title: Instalação -sidebarDepth: 3 +title: Como instalar o Castopod? --- -# Como instalar o Castopod? +import { Aside } from "@astrojs/starlight/components"; Castopod foi pensado para ser fácil de instalar. Seja usando hospedagem dedicada ou compartilhada, você pode instalá-lo na maioria dos servidores web compatíveis com PHP-MySQL. -::: dica Nota + ## Requisitos @@ -48,14 +47,6 @@ seu PHP: > Recomendamos usar o [MariaDB](https://mariadb.org). -::: warning Aviso - -Castopod só funciona com bancos de dados MySQL 5.7 ou superior compatíveis. It -will break with the previous MySQL v5.6 for example as its end of life was on -February 5, 2021. - -::: - Você vai precisar do hostname do servidor, nome do banco de dados, nome do usuário e senha para concluir o processo de instalação. Se você não os tem, entre em contato com o administrador do servidor. @@ -118,13 +109,13 @@ want to generate Video Clips. As seguintes extensões devem ser instaladas: 2. Siga as instruções na sua tela. 3. Comece o podcast! -::: Nota de Informação + ### Using CLI @@ -231,13 +222,35 @@ self-hosting for you. diff --git a/docs/src/pt-BR/getting-started/security.md b/docs/src/content/docs/pt-br/getting-started/security.mdx similarity index 95% rename from docs/src/pt-BR/getting-started/security.md rename to docs/src/content/docs/pt-br/getting-started/security.mdx index c4104d9a..243df7cc 100644 --- a/docs/src/pt-BR/getting-started/security.md +++ b/docs/src/content/docs/pt-br/getting-started/security.mdx @@ -1,9 +1,7 @@ --- -title: Segurança +title: Questões de segurança --- -# Questões de segurança - Castopod é construído sobre [CodeIgniter4](https://codeigniter.com/), um framework PHP que encoraja [boas práticas de segurança](https://codeigniter.com/user_guide/concepts/security.html). diff --git a/docs/src/pt-BR/getting-started/update.md b/docs/src/content/docs/pt-br/getting-started/update.mdx similarity index 96% rename from docs/src/pt-BR/getting-started/update.md rename to docs/src/content/docs/pt-br/getting-started/update.mdx index 398b5c0f..9f577277 100644 --- a/docs/src/pt-BR/getting-started/update.md +++ b/docs/src/content/docs/pt-br/getting-started/update.mdx @@ -1,9 +1,8 @@ --- -title: Atualização -sidebarDepth: 3 +title: Como atualizar o Castopod? --- -# Como atualizar o Castopod? +import { Aside } from "@astrojs/starlight/components"; Depois de instalar o Castopod, você pode querer atualizar sua instância para a última versão para desfrutar das últimas funcionalidades ✨, correção de bugs 🐛 @@ -36,12 +35,12 @@ e melhorias de desempenho ⚡. - Remove all files except `.env` and `public/media` - Copy the new files from the downloaded package into your server - ::: info Note + 4. Update your database schema from your `Castopod Admin` > `About` page or by running: @@ -54,7 +53,7 @@ e melhorias de desempenho ⚡. `Housekeeping` 6. ✨ Enjoy your fresh instance, you're all done! -::: info Note + ## Fully Automated updates diff --git a/docs/src/content/docs/pt-br/index.mdx b/docs/src/content/docs/pt-br/index.mdx new file mode 100644 index 00000000..b9a2cc4d --- /dev/null +++ b/docs/src/content/docs/pt-br/index.mdx @@ -0,0 +1,1398 @@ +--- +title: Bem-vindo 👋 +description: + Castopod é uma plataforma de hospedagem de código livre & aberto feita para + podcasters que querem se envolver e interagir com seu público. +--- + +import { LinkCard } from "@astrojs/starlight/components"; + +Castopod é uma plataforma de hospedagem de código livre & aberto feita para +podcasters que querem se envolver e interagir com seu público. + +Castopod é fácil de instalar e foi construído em cima do +[CodeIgniter4](https://codeigniter.com/), um poderoso framework PHP com uma +pegada muito pequena. + + + +## Funcionalidades + +- 🌱  Livre & de código aberto (Licença AGPL v3) +- 🔐  Focado na soberania de dados: seu conteúdo, público e análises + pertence a você, e somente você +- 🪄  Recursos do podcasting 2.0: GUID, bloqueado, transcrições, + financiamento, capítulos, localização, pessoas, soundbites, … +- 💬  Rede social integrada: + - 🚀  Castopod é parte do Fediverso, uma rede social descentralizada + - ❤️  Crie publicações, compartilhe, favorite e comente em episódios +- 📈  Estatísticas integradas: + - ⚖️  Compatível com GDPR / CCPA / LGPD + - 🪙  Medição de audiência no padrão do IABv2 + - 🏡  Estatísticas feitas localmente, sem terceiros envolvidos +- 📢  Ferramentas de marketing integradas: + - ✅  Pronto para SEO (meta-tags de open-graph, JSON-LD, …) + - 📱  PWA: instalar como um aplicativo autônomo + - 🎨  Cores de tema personalizáveis + - 🎬  Gere clipes de vídeo prontos para compartilhar a partir dos + episódios + - 🔉  Gere clipes de áudio + - ▶️  Player incorporável, incorpore seus episódios em qualquer site +- 💸  Monetização: + - 🔗  Links de financiamento + - 📲  anúncios clique-para-ouvir + - 🤝  value4value / WebMonetization + - 💎  Premium podcasts +- 📡  Publique seus episódios em qualquer lugar com RSS: + - 📱  Em todos os agregadores e aplicativos: Podcast Index, Apple + Podcasts, Spotify, Google Podcasts, Deezer, Podcast Addict, Podfriend, … + - ⚡  Transmita seus episódios instantaneamente com WebSub +- 📥  Importação de Podcast: mova seu podcast existente para o Castopod +- 📤  Mova seu podcast para fora do Castopod +- 🔀  Multi-inquilino: hospede quantos podcasts você quiser +- 👥  Multi-usuário: adicione contribuidores e defina cargos +- 🌎  Suporte i18n: traduzido em inglês, francês, polonês, alemão, + português brasileiro e espanhol… com + [mais por vir](https://translate.castopod.org)! + +## Motivação + +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. + +It is in fact one of the only media to have stayed this way for a long time. + +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. + +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized 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. + +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. + +## Comparação com outras soluções + +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 you. + +### 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 it. + +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. + +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. + +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 journey. + +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. + +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! + +### 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 was initially built around music. And later on, as the project +evolved, the ability to host podcasts was introduced. + +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, …). + +So, you should probably use Funkwhale if you want to host your music, and use +Castopod if you want to host your podcasts. + +### Castopod vs outras hospedagens de podcast + +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! + +Each of these solutions differ from one another, you may compare with the +[list of features](#features). + +That being said, there are two main differences with other podcasting solutions: + +- Castopod pode ser auto-hospedado e é a única solução que permite manter o + controle total sobre o que você produz. Além disso, como é de código aberto, + você pode até personalizá-lo como desejar. + +- O Castopod é a única solução que atualmente integra uma rede social + descentralizada com o ActivityPub, bem como muitos dos recursos de podcasting + 2.0, na esperança de preencher a lacuna entre as duas. + +## Contribuir + +Love Castopod and would like to help? Take a look at the following documentation +to get you started. + +### Código de conduta + +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 tolerated. + +### Guia de contribuição + +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. + +## Contribuidores ✨ + +Thanks goes to these wonderful people +([emoji key](https://allcontributors.org/docs/en/emoji-key)): + +{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */} +{/* prettier-ignore-start */} +{/* markdownlint-disable */} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Yassine Doghri +
+ + Yassine Doghri + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 📖 + {" "} + + 👀 + {" "} + + 🚧 + {" "} + + 🖋 + {" "} + + 🎨 + {" "} + + ️️️️♿️ + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🧑‍🏫 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📆 + {" "} + + 📝 + +
+ + Benjamin Bellamy +
+ + Benjamin Bellamy + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 👀 + {" "} + + 🖋 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📝 + {" "} + + 📆 + {" "} + + 📢 + +
+ + Ola Hneini +
+ + Ola Hneini + +
+
+ + 💻 + {" "} + + 👀 + {" "} + + 📖 + {" "} + + 🚧 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Romain de Laage +
+ + Romain de Laage + +
+
+ + 💻 + {" "} + + 🚇 + {" "} + + 📖 + {" "} + + 🌍 + {" "} + + 🤔 + +
+ + Lyonel Bernard +
+ + Lyonel Bernard + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Christopher Lagonick-Weitzel +
+ + Christopher Lagonick-Weitzel + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Ernesto Acosta +
+ + Ernesto Acosta + +
+
+ + 🐛 + {" "} + + 🔊 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Ewen +
+ + Ewen + +
+
+ + 🌍 + {" "} + + 🤔 + {" "} + + 💻 + +
+ + Bastien Luneteau +
+ + Bastien Luneteau + +
+
+ + 💻 + {" "} + + 🐛 + +
+ + Cécile Ricordeau +
+ + Cécile Ricordeau + +
+
+ + 🎨 + +
+ + Patryk Miś +
+ + Patryk Miś + +
+
+ + 🌍 + +
+ + Marcin Lewandowski +
+ + Marcin Lewandowski + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Sebastian Janik +
+ + Sebastian Janik + +
+
+ + 💻 + +
+ + Patryk Karczmarczyk +
+ + Patryk Karczmarczyk + +
+
+ + 💻 + +
+ + denis d +
+ + denis d + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Douglas Kastle +
+ + Douglas Kastle + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + cExplorer +
+ + cExplorer + +
+
+ + 🐛 + {" "} + + 🌍 + +
+ + ImaCrea +
+ + ImaCrea + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Jonas S +
+ + Jonas S + +
+
+ + 💻 + +
+ + LEFEBVRE Yann +
+ + LEFEBVRE Yann + +
+
+ + 🐛 + +
+ + Sebastian Späth +
+ + Sebastian Späth + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + rocky III +
+ + rocky III + +
+
+ + 🐛 + +
+ + Hermann Josef Eckl +
+ + Hermann Josef Eckl + +
+
+ + 🐛 + +
+ + Delhaye Cyrille +
+ + Delhaye Cyrille + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + João Leandro +
+ + João Leandro + +
+
+ + 🌍 + {" "} + + 🤔 + +
+ + Angelos Chouvardas +
+ + Angelos Chouvardas + +
+
+ + 🌍 + +
+ + Eivind +
+ + Eivind + +
+
+ + 🌍 + +
+ + forght +
+ + forght + +
+
+ + 🌍 + +
+ + glottis0q +
+ + glottis0q + +
+
+ + 🌍 + +
+ + ButterflyOfFire +
+ + ButterflyOfFire + +
+
+ + 🌍 + +
+ + Lucian I. Last +
+ + Lucian I. Last + +
+
+ + 🌍 + +
+ + LuuzViir +
+ + LuuzViir + +
+
+ + 🌍 + +
+ + CTHTC +
+ + CTHTC + +
+
+ + 🌍 + +
+ + Russian Retro +
+ + Russian Retro + +
+
+ + 🌍 + +
+ + Marek L'ach +
+ + Marek L'ach + +
+
+ + 🌍 + +
+ + GunChleoc +
+ + GunChleoc + +
+
+ + 🌍 + +
+ + GabiSnow +
+ + GabiSnow + +
+
+ + 🌍 + +
+ + bendaha +
+ + bendaha + +
+
+ + 🌍 + +
+ + Samuel Roland +
+ + Samuel Roland + +
+
+ + 🌍 + +
+ + Dimitri Regnier +
+ + Dimitri Regnier + +
+
+ + 🤔 + +
+ + irithys +
+ + irithys + +
+
+ + 🌍 + +
+ + Sergi +
+ + Sergi + +
+
+ + 🌍 + +
+ + ghose (XoseM) +
+ + ghose (XoseM) + +
+
+ + 🌍 + +
+ + Andreas Olsson +
+ + Andreas Olsson + +
+
+ + 🌍 + +
+ + leonfrom +
+ + leonfrom + +
+
+ + 🌍 + +
+ + agentcobra +
+ + agentcobra + +
+
+ + 🌍 + +
+ + Alessandro +
+ + Alessandro + +
+
+ + 🌍 + +
+ + liimee +
+ + liimee + +
+
+ + 🌍 + +
+ + Ahmed Sabouni +
+ + Ahmed Sabouni + +
+
+ + 🌍 + +
+ + KrzysztofDomanczyk +
+ + KrzysztofDomanczyk + +
+
+ + 💻 + +
+ + Guy Martin +
+ + Guy Martin + +
+
+ + 🐛 + {" "} + + 💻 + +
+ +{/* markdownlint-restore */} +{/* prettier-ignore-end */} + +{/* ALL-CONTRIBUTORS-LIST:END */} + +This project follows the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind welcome! + +## Contato + +You may reach us for help or ask any question you have on: + +- [Discord](https://castopod.org/discord) (para interação direta com + desenvolvedores e a comunidade) +- [Rastreador de problemas](https://code.castopod.org/adaures/castopod/-/issues) + (para solicitações de recursos e relatos de bugs) + +Alternatively, you can follow us on social media platforms to get news about +Castopod: + +- [podlibre.social](https://podlibre.social/@Castopod) (instância do Mastodon) +- [Twitter](https://twitter.com/castopod) +- [LinkedIn](https://linkedin.com/company/castopod) +- [Facebook](https://www.facebook.com/castopod) + +## Apoiadores + +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). + + + +## Licença + +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) + +Copyright © 2020-present, [Ad Aures](https://adaures.com/). diff --git a/docs/src/content/docs/pt/getting-started/auth.mdx b/docs/src/content/docs/pt/getting-started/auth.mdx new file mode 100644 index 00000000..d4dd4dd5 --- /dev/null +++ b/docs/src/content/docs/pt/getting-started/auth.mdx @@ -0,0 +1,84 @@ +--- +title: 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, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| 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 dashboards and analytics of podcast #\{id\}'s episodes. | +| episodes.create | Can create episodes for podcast #\{id\}. | +| episodes.edit | Can edit episodes of podcast #\{id\}. | +| episodes.delete | Can delete episodes of podcast #\{id\}. | +| episodes.manage-persons | Can manage episode persons of podcast #\{id\}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #\{id\}. | +| episodes.manage-publications | Can publish/unpublish episodes and posts of podcast #\{id\}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #\{id\}. | + +{/* AUTH-PODCAST-PERMISSIONS-LIST:END */} diff --git a/docs/src/content/docs/pt/getting-started/docker.mdx b/docs/src/content/docs/pt/getting-started/docker.mdx new file mode 100644 index 00000000..6141377f --- /dev/null +++ b/docs/src/content/docs/pt/getting-started/docker.mdx @@ -0,0 +1,157 @@ +--- +title: Official Docker images +--- + +Castopod pushes 3 Docker images to the Docker Hub during its automated build +process: + +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit +- [**`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 + +Additionally, Castopod requires a MySQL-compatible database. A Redis database +can be added as a cache handler. + +## Supported tags + +- `develop` [unstable], latest development branch build +- `beta` [stable], latest beta version build +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) + +## Example usage + +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: + + ```yml + version: "3.7" + + services: + app: + image: castopod/castopod:latest + container_name: "castopod-app" + volumes: + - castopod-media:/var/www/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + CP_BASEURL: "https://castopod.example.com" + CP_ANALYTICS_SALT: changeme + CP_CACHE_HANDLER: redis + CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme + networks: + - castopod-app + - castopod-db + ports: + - 8000:8000 + restart: unless-stopped + + mariadb: + image: mariadb:10.5 + container_name: "castopod-mariadb" + networks: + - castopod-db + volumes: + - castopod-db:/var/lib/mysql + environment: + MYSQL_ROOT_PASSWORD: changeme + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + restart: unless-stopped + + redis: + image: redis:7.0-alpine + container_name: "castopod-redis" + command: --requirepass changeme + volumes: + - castopod-cache:/data + networks: + - castopod-app + + volumes: + castopod-media: + castopod-db: + castopod-cache: + + networks: + castopod-app: + castopod-db: + ``` + + You have to adapt some variables to your needs (e.g. `CP_BASEURL`, + `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). + +3. Setup a reverse proxy for 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/): + + ``` + #castopod + castopod.example.com { + reverse_proxy localhost:8000 + } + ``` + +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! + +5. You're all set, start podcasting! 🎙️🚀 + +## Environment Variables + +- **castopod/castopod** and **castopod/app** + + | Variable name | Type (`default`) | Default | + | ------------------------------------- | ----------------------- | ---------------- | + | **`CP_BASEURL`** | string | `undefined` | + | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | + | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | + | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | + | **`CP_ANALYTICS_SALT`** | string | `undefined` | + | **`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_REDIS_HOST`** | ?string | `"localhost"` | + | **`CP_REDIS_PASSWORD`** | ?string | `null` | + | **`CP_REDIS_PORT`** | ?number | `6379` | + | **`CP_REDIS_DATABASE`** | ?number | `0` | + | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | + | **`CP_EMAIL_FROM`** | ?string | `undefined` | + | **`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_ENABLE_2FA`** | ?boolean | `undefined` | + | **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` | + | **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` | + | **`CP_MEDIA_S3_KEY`** | ?string | `undefined` | + | **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` | + | **`CP_MEDIA_S3_REGION`** | ?string | `undefined` | + | **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` | + | **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` | + | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` | + | **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` | + | **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` | + | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | + | **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | + +- **castopod/web-server** + + | Variable name | Type | Default | + | ---------------------- | --------------------- | ------- | + | **`CP_APP_HOSTNAME`** | ?string | `"app"` | + | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | diff --git a/docs/src/pt/getting-started/install.md b/docs/src/content/docs/pt/getting-started/install.mdx similarity index 81% rename from docs/src/pt/getting-started/install.md rename to docs/src/content/docs/pt/getting-started/install.mdx index f47362af..c65647d9 100644 --- a/docs/src/pt/getting-started/install.md +++ b/docs/src/content/docs/pt/getting-started/install.mdx @@ -1,21 +1,20 @@ --- -title: Installation -sidebarDepth: 3 +title: How to install Castopod? --- -# How to install Castopod? +import { Aside } from "@astrojs/starlight/components"; 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. -::: tip Note + ## Requirements @@ -46,14 +45,6 @@ Additionally, make sure that the following extensions are enabled in your PHP: > We recommend using [MariaDB](https://mariadb.org). -::: warning Warning - -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. - -::: - 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. @@ -115,13 +106,13 @@ want to generate Video Clips. The following extensions must be installed: 2. Follow the instructions on your screen. 3. Start podcasting! -::: info Note + ### Using CLI @@ -228,13 +219,35 @@ self-hosting for you. diff --git a/docs/src/content/docs/pt/getting-started/security.mdx b/docs/src/content/docs/pt/getting-started/security.mdx new file mode 100644 index 00000000..c039493c --- /dev/null +++ b/docs/src/content/docs/pt/getting-started/security.mdx @@ -0,0 +1,24 @@ +--- +title: Security concerns +--- + +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). + +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): + +- `writable/` folder must be **readable** and **writable**. +- `public/media/` folder must be **readable** and **writable**. +- any other file must be set to **readonly**. + +For instance, if you are using Apache or NGINX with Ubuntu you may do the +following: + +```bash +sudo chown -R root:root /path/to/castopod +sudo chown -R www-data:www-data /path/to/castopod/writable +sudo chown -R www-data:www-data /path/to/castopod/public/media +``` diff --git a/docs/src/content/docs/pt/getting-started/update.mdx b/docs/src/content/docs/pt/getting-started/update.mdx new file mode 100644 index 00000000..f1a26974 --- /dev/null +++ b/docs/src/content/docs/pt/getting-started/update.mdx @@ -0,0 +1,108 @@ +--- +title: How to update Castopod? +--- + +import { Aside } from "@astrojs/starlight/components"; + +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 ⚡. + +## Update instructions + +0. ⚠️ Before any update, we highly recommend you backup your Castopod files and + database. + + - cf. + [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 + + - cf. + [Where can I find my 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 + + - ⚠️ 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/) + +3. On your server: + + - Remove all files except `.env` and `public/media` + - Copy the new files from the downloaded package into your server + + + +4. Update your database schema from your `Castopod Admin` > `About` page or by + running: + + ```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! + + + +## Fully Automated updates + +> Coming soon... 👀 + +## Frequently asked questions (FAQ) + +### Where can I find my Castopod version? + +Go to your Castopod admin panel, the version is displayed on the bottom left +corner. + +Alternatively, you can find the version in the `app > Config > Constants.php` +file. + +### I haven't updated my instance in a long time… What should I do? + +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. + +> You may want to backup your instance depending on how long you haven't updated +> Castopod. + +For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to +`v1.0.0-beta.1`: + +0. (highly recommended) Make a backup of your files and database. + +1. Download the latest release, overwrite your files whilst keeping `.env` and + `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`, + `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`. + +3. ✨ Enjoy your fresh instance, you're all done! + +### Should I make a backup before updating? + +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… diff --git a/docs/src/content/docs/pt/index.mdx b/docs/src/content/docs/pt/index.mdx new file mode 100644 index 00000000..3f1ec043 --- /dev/null +++ b/docs/src/content/docs/pt/index.mdx @@ -0,0 +1,1349 @@ +--- +title: Welcome 👋 +--- + +import { LinkCard } from "@astrojs/starlight/components"; + +Castopod is a free & open-source hosting platform made for podcasters who want +engage and interact with their audience. + +Castopod is easy to install and was built on top of +[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very +small footprint. + + + +## Features + +- 🌱  Free & open-source (AGPL v3 License) +- 🔐  Focused on data sovereignty: your content, audience, and analytics + belong to you, and you only +- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, + chapters, location, persons, soundbites, … +- 💬  Built-in social network: + - 🚀  Castopod is part of the Fediverse, a decentralized social network + - ❤️  Create posts, share, favourite, and comment on episodes +- 📈  Built-in analytics: + - ⚖️  GDPR / CCPA / LGPD compliant + - 🪙  Standard IABv2 audience measurement + - 🏡  On-premises analytics, no third party involved +- 📢  Built-in marketing tools: + - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) + - 📱  PWA: install as a standalone app + - 🎨  Customizable theme colors + - 🎬  Generate ready-to-share Video clips from episodes + - 🔉  Generate soundbites + - ▶️  Embeddable player, embed your episodes on any website +- 💸  Monetization: + - 🔗  Funding links + - 📲  listen-to-click ads + - 🤝  value4value / WebMonetization + - 💎  Premium podcasts +- 📡  Publish your episodes everywhere with RSS: + - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, + Google Podcasts, Deezer, Podcast Addict, Podfriend, … + - ⚡  Broadcast your episodes instantly with WebSub +- 📥  Podcast import: move your existing podcast into Castopod +- 📤  Move your podcast out of Castopod +- 🔀  Multi-tenant: host as many podcasts as you want +- 👥  Multi-user: add contributors and set roles +- 🌎  i18n support: translated in English, French, Polish, German, + Brazilian Portuguese & Spanish… with + [more to come](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. + +It is in fact one of the only media to have stayed this way for a long time. + +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. + +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized 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. + +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. + +## Comparison with other solutions + +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 you. + +### 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 it. + +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. + +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. + +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 journey. + +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. + +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! + +### 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 was initially built around music. And later on, as the project +evolved, the ability to host podcasts was introduced. + +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, …). + +So, you should probably use Funkwhale if you want to host your music, and use +Castopod if you want to host your podcasts. + +### Castopod vs other podcast hosts + +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! + +Each of these solutions differ from one another, you may compare with the +[list of features](#features). + +That being said, there are two main differences with other podcasting solutions: + +- 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 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. + +## Contributing + +Love Castopod and would like to help? Take a look at the following documentation +to get you started. + +### Code of conduct + +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 tolerated. + +### Contributing 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. + +## Contributors ✨ + +Thanks goes to these wonderful people +([emoji key](https://allcontributors.org/docs/en/emoji-key)): + +{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */} +{/* prettier-ignore-start */} +{/* markdownlint-disable */} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Yassine Doghri +
+ + Yassine Doghri + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 📖 + {" "} + + 👀 + {" "} + + 🚧 + {" "} + + 🖋 + {" "} + + 🎨 + {" "} + + ️️️️♿️ + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🧑‍🏫 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📆 + {" "} + + 📝 + +
+ + Benjamin Bellamy +
+ + Benjamin Bellamy + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 👀 + {" "} + + 🖋 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📝 + {" "} + + 📆 + {" "} + + 📢 + +
+ + Ola Hneini +
+ + Ola Hneini + +
+
+ + 💻 + {" "} + + 👀 + {" "} + + 📖 + {" "} + + 🚧 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Romain de Laage +
+ + Romain de Laage + +
+
+ + 💻 + {" "} + + 🚇 + {" "} + + 📖 + {" "} + + 🌍 + {" "} + + 🤔 + +
+ + Lyonel Bernard +
+ + Lyonel Bernard + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Christopher Lagonick-Weitzel +
+ + Christopher Lagonick-Weitzel + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Ernesto Acosta +
+ + Ernesto Acosta + +
+
+ + 🐛 + {" "} + + 🔊 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Bastien Luneteau +
+ + Bastien Luneteau + +
+
+ + 💻 + {" "} + + 🐛 + +
+ + Cécile Ricordeau +
+ + Cécile Ricordeau + +
+
+ + 🎨 + +
+ + Patryk Miś +
+ + Patryk Miś + +
+
+ + 🌍 + +
+ + Marcin Lewandowski +
+ + Marcin Lewandowski + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Sebastian Janik +
+ + Sebastian Janik + +
+
+ + 💻 + +
+ + Patryk Karczmarczyk +
+ + Patryk Karczmarczyk + +
+
+ + 💻 + +
+ + denis d +
+ + denis d + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Douglas Kastle +
+ + Douglas Kastle + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + cExplorer +
+ + cExplorer + +
+
+ + 🐛 + {" "} + + 🌍 + +
+ + ImaCrea +
+ + ImaCrea + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Jonas S +
+ + Jonas S + +
+
+ + 💻 + +
+ + LEFEBVRE Yann +
+ + LEFEBVRE Yann + +
+
+ + 🐛 + +
+ + Sebastian Späth +
+ + Sebastian Späth + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + rocky III +
+ + rocky III + +
+
+ + 🐛 + +
+ + Hermann Josef Eckl +
+ + Hermann Josef Eckl + +
+
+ + 🐛 + +
+ + Delhaye Cyrille +
+ + Delhaye Cyrille + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + João Leandro +
+ + João Leandro + +
+
+ + 🌍 + {" "} + + 🤔 + +
+ + Angelos Chouvardas +
+ + Angelos Chouvardas + +
+
+ + 🌍 + +
+ + Eivind +
+ + Eivind + +
+
+ + 🌍 + +
+ + Ewen +
+ + Ewen + +
+
+ + 🌍 + {" "} + + 🤔 + +
+ + forght +
+ + forght + +
+
+ + 🌍 + +
+ + glottis0q +
+ + glottis0q + +
+
+ + 🌍 + +
+ + ButterflyOfFire +
+ + ButterflyOfFire + +
+
+ + 🌍 + +
+ + Lucian I. Last +
+ + Lucian I. Last + +
+
+ + 🌍 + +
+ + LuuzViir +
+ + LuuzViir + +
+
+ + 🌍 + +
+ + CTHTC +
+ + CTHTC + +
+
+ + 🌍 + +
+ + Russian Retro +
+ + Russian Retro + +
+
+ + 🌍 + +
+ + Marek L'ach +
+ + Marek L'ach + +
+
+ + 🌍 + +
+ + GunChleoc +
+ + GunChleoc + +
+
+ + 🌍 + +
+ + GabiSnow +
+ + GabiSnow + +
+
+ + 🌍 + +
+ + bendaha +
+ + bendaha + +
+
+ + 🌍 + +
+ + Samuel Roland +
+ + Samuel Roland + +
+
+ + 🌍 + +
+ + Dimitri Regnier +
+ + Dimitri Regnier + +
+
+ + 🤔 + +
+ + irithys +
+ + irithys + +
+
+ + 🌍 + +
+ + Sergi +
+ + Sergi + +
+
+ + 🌍 + +
+ + ghose (XoseM) +
+ + ghose (XoseM) + +
+
+ + 🌍 + +
+ + Andreas Olsson +
+ + Andreas Olsson + +
+
+ + 🌍 + +
+ + leonfrom +
+ + leonfrom + +
+
+ + 🌍 + +
+ + agentcobra +
+ + agentcobra + +
+
+ + 🌍 + +
+ + Alessandro +
+ + Alessandro + +
+
+ + 🌍 + +
+ + liimee +
+ + liimee + +
+
+ + 🌍 + +
+ + Ahmed Sabouni +
+ + Ahmed Sabouni + +
+
+ + 🌍 + +
+ + KrzysztofDomanczyk +
+ + KrzysztofDomanczyk + +
+
+ + 💻 + +
+ +{/* markdownlint-restore */} +{/* prettier-ignore-end */} + +{/* ALL-CONTRIBUTORS-LIST:END */} + +This project follows the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind welcome! + +## Contact + +You may reach us for help or ask any question you have on: + +- [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) + +Alternatively, you can follow us on social media platforms to get news about +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 + +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). + +[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/) + +[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/) + +## License + +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) + +Copyright © 2020-present, [Ad Aures](https://adaures.com/). diff --git a/docs/src/content/docs/ro/getting-started/auth.mdx b/docs/src/content/docs/ro/getting-started/auth.mdx new file mode 100644 index 00000000..479cd351 --- /dev/null +++ b/docs/src/content/docs/ro/getting-started/auth.mdx @@ -0,0 +1,85 @@ +--- +title: Autentificare & Autorizare +--- + +Castopod folosește pentru autentificare și autorizare `codeigniter/shield` +cuplat la reguli personalizate. Rolurile și permisiunile sunt definite la două +niveluri: + +1. [întreaga instanță](#1-instance-wide-roles-and-permissions) +2. [per podcast](#2-per-podcast-roles-and-permissions) + +## 1. Gestionați roluri şi permisiuni pe întreaga instanță + +### Rolurile instanței + +{/* 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 */} + +### Permisiuni instanță + +{/* 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. Roluri și permisiuni per podcast + +### Roluri per podcast + +{/* 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, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| 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 */} + +### Permisiuni per podcast + +{/* 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 dashboards and analytics of podcast #\{id\}'s episodes. | +| episodes.create | Can create episodes for podcast #\{id\}. | +| episodes.edit | Can edit episodes of podcast #\{id\}. | +| episodes.delete | Can delete episodes of podcast #\{id\}. | +| episodes.manage-persons | Can manage episode persons of podcast #\{id\}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #\{id\}. | +| episodes.manage-publications | Can publish/unpublish episodes and posts of podcast #\{id\}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #\{id\}. | + +{/* AUTH-PODCAST-PERMISSIONS-LIST:END */} diff --git a/docs/src/ro/getting-started/docker.md b/docs/src/content/docs/ro/getting-started/docker.mdx similarity index 99% rename from docs/src/ro/getting-started/docker.md rename to docs/src/content/docs/ro/getting-started/docker.mdx index 48bb4a19..fc34f57f 100644 --- a/docs/src/ro/getting-started/docker.md +++ b/docs/src/content/docs/ro/getting-started/docker.mdx @@ -1,10 +1,7 @@ --- title: Imagini oficiale Docker -sidebarDepth: 3 --- -# Imagini oficiale Docker - Castopod dă push la 3 imagini Docker pe Docker Hub pe parcursul procesului de compilare automată diff --git a/docs/src/content/docs/ro/getting-started/install.mdx b/docs/src/content/docs/ro/getting-started/install.mdx new file mode 100644 index 00000000..d8888954 --- /dev/null +++ b/docs/src/content/docs/ro/getting-started/install.mdx @@ -0,0 +1,251 @@ +--- +title: How to install Castopod? +--- + +import { Aside } from "@astrojs/starlight/components"; + +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. + + + +## Requirements + +- PHP v8.1 or higher +- MySQL version 5.7 or higher or MariaDB version 10.2 or higher +- HTTPS support +- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's + incoming requests + +### PHP v8.1 or higher + +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. +- [exif](https://www.php.net/manual/en/exif.installation.php) + +Additionally, make sure that the following extensions are enabled in your PHP: + +- json (enabled by default - don't turn it off) +- xml (enabled by default - don't turn it off) +- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php) + +### MySQL compatible database + +> We recommend using [MariaDB](https://mariadb.org). + +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. + +#### Privileges + +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`. + +### (Optional) FFmpeg v4.1.8 or higher for Video Clips + +[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: + +- **FreeType 2** library for + [gd](https://www.php.net/manual/en/image.installation.php). + +### (Optional) Other recommendations + +- Redis for better cache performances. +- CDN for static files caching and better performances. +- e-mail gateway for lost passwords. + +## Install instructions + +### Pre-requisites + +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 haven’t 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): + + ```bash + * * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1 + ``` + + **Note** - If you do not add this cron task, the following Castopod features + will not work: + + - Importing a podcast from an existing RSS feed + - Broadcasting social activities to your followers in the fediverse + - Broadcasting episodes to open hubs using + [WebSub](https://en.wikipedia.org/wiki/WebSub) + - Generating video clips - + [requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips) + +### (recommended) Install Wizard + +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! + + + +### Using CLI + +1. Create a `.env` file in the package root based on the `.env.example` file. +2. Initialize the database using: + + ```sh + php spark install:init-database + ``` + +3. Create the superadmin user using: + + ```sh + php spark install:create-superadmin + ``` + +4. Head on to your admin gateway to start podcasting! + +### Email/SMTP setup + +Email configuration is required for some features to work properly (eg. +retrieving your forgotten password, sending instructions to premium subscribers, +…) + +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" +``` + +#### Email config options + +| 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"` | + +### Media storage + +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 + +If you prefer storing your media files on an S3 compatible storage, you may +specify it in your `.env`: + +```ini +# […] + +media.fileManager="s3" +media.s3.endpoint="your_s3_host" +media.s3.key="your_s3_key" +media.s3.secret="your_s3_secret" +media.s3.region="your_s3_region" +``` + +#### S3 config options + +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | + +## Community packages + +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. + +### Install with 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. + + diff --git a/docs/src/content/docs/ro/getting-started/security.mdx b/docs/src/content/docs/ro/getting-started/security.mdx new file mode 100644 index 00000000..c039493c --- /dev/null +++ b/docs/src/content/docs/ro/getting-started/security.mdx @@ -0,0 +1,24 @@ +--- +title: Security concerns +--- + +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). + +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): + +- `writable/` folder must be **readable** and **writable**. +- `public/media/` folder must be **readable** and **writable**. +- any other file must be set to **readonly**. + +For instance, if you are using Apache or NGINX with Ubuntu you may do the +following: + +```bash +sudo chown -R root:root /path/to/castopod +sudo chown -R www-data:www-data /path/to/castopod/writable +sudo chown -R www-data:www-data /path/to/castopod/public/media +``` diff --git a/docs/src/content/docs/ro/getting-started/update.mdx b/docs/src/content/docs/ro/getting-started/update.mdx new file mode 100644 index 00000000..f1a26974 --- /dev/null +++ b/docs/src/content/docs/ro/getting-started/update.mdx @@ -0,0 +1,108 @@ +--- +title: How to update Castopod? +--- + +import { Aside } from "@astrojs/starlight/components"; + +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 ⚡. + +## Update instructions + +0. ⚠️ Before any update, we highly recommend you backup your Castopod files and + database. + + - cf. + [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 + + - cf. + [Where can I find my 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 + + - ⚠️ 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/) + +3. On your server: + + - Remove all files except `.env` and `public/media` + - Copy the new files from the downloaded package into your server + + + +4. Update your database schema from your `Castopod Admin` > `About` page or by + running: + + ```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! + + + +## Fully Automated updates + +> Coming soon... 👀 + +## Frequently asked questions (FAQ) + +### Where can I find my Castopod version? + +Go to your Castopod admin panel, the version is displayed on the bottom left +corner. + +Alternatively, you can find the version in the `app > Config > Constants.php` +file. + +### I haven't updated my instance in a long time… What should I do? + +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. + +> You may want to backup your instance depending on how long you haven't updated +> Castopod. + +For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to +`v1.0.0-beta.1`: + +0. (highly recommended) Make a backup of your files and database. + +1. Download the latest release, overwrite your files whilst keeping `.env` and + `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`, + `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`. + +3. ✨ Enjoy your fresh instance, you're all done! + +### Should I make a backup before updating? + +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… diff --git a/docs/src/content/docs/ro/index.mdx b/docs/src/content/docs/ro/index.mdx new file mode 100644 index 00000000..3f1ec043 --- /dev/null +++ b/docs/src/content/docs/ro/index.mdx @@ -0,0 +1,1349 @@ +--- +title: Welcome 👋 +--- + +import { LinkCard } from "@astrojs/starlight/components"; + +Castopod is a free & open-source hosting platform made for podcasters who want +engage and interact with their audience. + +Castopod is easy to install and was built on top of +[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very +small footprint. + + + +## Features + +- 🌱  Free & open-source (AGPL v3 License) +- 🔐  Focused on data sovereignty: your content, audience, and analytics + belong to you, and you only +- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, + chapters, location, persons, soundbites, … +- 💬  Built-in social network: + - 🚀  Castopod is part of the Fediverse, a decentralized social network + - ❤️  Create posts, share, favourite, and comment on episodes +- 📈  Built-in analytics: + - ⚖️  GDPR / CCPA / LGPD compliant + - 🪙  Standard IABv2 audience measurement + - 🏡  On-premises analytics, no third party involved +- 📢  Built-in marketing tools: + - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) + - 📱  PWA: install as a standalone app + - 🎨  Customizable theme colors + - 🎬  Generate ready-to-share Video clips from episodes + - 🔉  Generate soundbites + - ▶️  Embeddable player, embed your episodes on any website +- 💸  Monetization: + - 🔗  Funding links + - 📲  listen-to-click ads + - 🤝  value4value / WebMonetization + - 💎  Premium podcasts +- 📡  Publish your episodes everywhere with RSS: + - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, + Google Podcasts, Deezer, Podcast Addict, Podfriend, … + - ⚡  Broadcast your episodes instantly with WebSub +- 📥  Podcast import: move your existing podcast into Castopod +- 📤  Move your podcast out of Castopod +- 🔀  Multi-tenant: host as many podcasts as you want +- 👥  Multi-user: add contributors and set roles +- 🌎  i18n support: translated in English, French, Polish, German, + Brazilian Portuguese & Spanish… with + [more to come](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. + +It is in fact one of the only media to have stayed this way for a long time. + +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. + +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized 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. + +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. + +## Comparison with other solutions + +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 you. + +### 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 it. + +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. + +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. + +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 journey. + +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. + +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! + +### 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 was initially built around music. And later on, as the project +evolved, the ability to host podcasts was introduced. + +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, …). + +So, you should probably use Funkwhale if you want to host your music, and use +Castopod if you want to host your podcasts. + +### Castopod vs other podcast hosts + +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! + +Each of these solutions differ from one another, you may compare with the +[list of features](#features). + +That being said, there are two main differences with other podcasting solutions: + +- 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 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. + +## Contributing + +Love Castopod and would like to help? Take a look at the following documentation +to get you started. + +### Code of conduct + +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 tolerated. + +### Contributing 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. + +## Contributors ✨ + +Thanks goes to these wonderful people +([emoji key](https://allcontributors.org/docs/en/emoji-key)): + +{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */} +{/* prettier-ignore-start */} +{/* markdownlint-disable */} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Yassine Doghri +
+ + Yassine Doghri + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 📖 + {" "} + + 👀 + {" "} + + 🚧 + {" "} + + 🖋 + {" "} + + 🎨 + {" "} + + ️️️️♿️ + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🧑‍🏫 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📆 + {" "} + + 📝 + +
+ + Benjamin Bellamy +
+ + Benjamin Bellamy + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 👀 + {" "} + + 🖋 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📝 + {" "} + + 📆 + {" "} + + 📢 + +
+ + Ola Hneini +
+ + Ola Hneini + +
+
+ + 💻 + {" "} + + 👀 + {" "} + + 📖 + {" "} + + 🚧 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Romain de Laage +
+ + Romain de Laage + +
+
+ + 💻 + {" "} + + 🚇 + {" "} + + 📖 + {" "} + + 🌍 + {" "} + + 🤔 + +
+ + Lyonel Bernard +
+ + Lyonel Bernard + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Christopher Lagonick-Weitzel +
+ + Christopher Lagonick-Weitzel + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Ernesto Acosta +
+ + Ernesto Acosta + +
+
+ + 🐛 + {" "} + + 🔊 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Bastien Luneteau +
+ + Bastien Luneteau + +
+
+ + 💻 + {" "} + + 🐛 + +
+ + Cécile Ricordeau +
+ + Cécile Ricordeau + +
+
+ + 🎨 + +
+ + Patryk Miś +
+ + Patryk Miś + +
+
+ + 🌍 + +
+ + Marcin Lewandowski +
+ + Marcin Lewandowski + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Sebastian Janik +
+ + Sebastian Janik + +
+
+ + 💻 + +
+ + Patryk Karczmarczyk +
+ + Patryk Karczmarczyk + +
+
+ + 💻 + +
+ + denis d +
+ + denis d + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Douglas Kastle +
+ + Douglas Kastle + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + cExplorer +
+ + cExplorer + +
+
+ + 🐛 + {" "} + + 🌍 + +
+ + ImaCrea +
+ + ImaCrea + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Jonas S +
+ + Jonas S + +
+
+ + 💻 + +
+ + LEFEBVRE Yann +
+ + LEFEBVRE Yann + +
+
+ + 🐛 + +
+ + Sebastian Späth +
+ + Sebastian Späth + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + rocky III +
+ + rocky III + +
+
+ + 🐛 + +
+ + Hermann Josef Eckl +
+ + Hermann Josef Eckl + +
+
+ + 🐛 + +
+ + Delhaye Cyrille +
+ + Delhaye Cyrille + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + João Leandro +
+ + João Leandro + +
+
+ + 🌍 + {" "} + + 🤔 + +
+ + Angelos Chouvardas +
+ + Angelos Chouvardas + +
+
+ + 🌍 + +
+ + Eivind +
+ + Eivind + +
+
+ + 🌍 + +
+ + Ewen +
+ + Ewen + +
+
+ + 🌍 + {" "} + + 🤔 + +
+ + forght +
+ + forght + +
+
+ + 🌍 + +
+ + glottis0q +
+ + glottis0q + +
+
+ + 🌍 + +
+ + ButterflyOfFire +
+ + ButterflyOfFire + +
+
+ + 🌍 + +
+ + Lucian I. Last +
+ + Lucian I. Last + +
+
+ + 🌍 + +
+ + LuuzViir +
+ + LuuzViir + +
+
+ + 🌍 + +
+ + CTHTC +
+ + CTHTC + +
+
+ + 🌍 + +
+ + Russian Retro +
+ + Russian Retro + +
+
+ + 🌍 + +
+ + Marek L'ach +
+ + Marek L'ach + +
+
+ + 🌍 + +
+ + GunChleoc +
+ + GunChleoc + +
+
+ + 🌍 + +
+ + GabiSnow +
+ + GabiSnow + +
+
+ + 🌍 + +
+ + bendaha +
+ + bendaha + +
+
+ + 🌍 + +
+ + Samuel Roland +
+ + Samuel Roland + +
+
+ + 🌍 + +
+ + Dimitri Regnier +
+ + Dimitri Regnier + +
+
+ + 🤔 + +
+ + irithys +
+ + irithys + +
+
+ + 🌍 + +
+ + Sergi +
+ + Sergi + +
+
+ + 🌍 + +
+ + ghose (XoseM) +
+ + ghose (XoseM) + +
+
+ + 🌍 + +
+ + Andreas Olsson +
+ + Andreas Olsson + +
+
+ + 🌍 + +
+ + leonfrom +
+ + leonfrom + +
+
+ + 🌍 + +
+ + agentcobra +
+ + agentcobra + +
+
+ + 🌍 + +
+ + Alessandro +
+ + Alessandro + +
+
+ + 🌍 + +
+ + liimee +
+ + liimee + +
+
+ + 🌍 + +
+ + Ahmed Sabouni +
+ + Ahmed Sabouni + +
+
+ + 🌍 + +
+ + KrzysztofDomanczyk +
+ + KrzysztofDomanczyk + +
+
+ + 💻 + +
+ +{/* markdownlint-restore */} +{/* prettier-ignore-end */} + +{/* ALL-CONTRIBUTORS-LIST:END */} + +This project follows the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind welcome! + +## Contact + +You may reach us for help or ask any question you have on: + +- [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) + +Alternatively, you can follow us on social media platforms to get news about +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 + +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). + +[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/) + +[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/) + +## License + +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) + +Copyright © 2020-present, [Ad Aures](https://adaures.com/). diff --git a/docs/src/content/docs/ru/getting-started/auth.mdx b/docs/src/content/docs/ru/getting-started/auth.mdx new file mode 100644 index 00000000..d4dd4dd5 --- /dev/null +++ b/docs/src/content/docs/ru/getting-started/auth.mdx @@ -0,0 +1,84 @@ +--- +title: 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, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| 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 dashboards and analytics of podcast #\{id\}'s episodes. | +| episodes.create | Can create episodes for podcast #\{id\}. | +| episodes.edit | Can edit episodes of podcast #\{id\}. | +| episodes.delete | Can delete episodes of podcast #\{id\}. | +| episodes.manage-persons | Can manage episode persons of podcast #\{id\}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #\{id\}. | +| episodes.manage-publications | Can publish/unpublish episodes and posts of podcast #\{id\}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #\{id\}. | + +{/* AUTH-PODCAST-PERMISSIONS-LIST:END */} diff --git a/docs/src/content/docs/ru/getting-started/docker.mdx b/docs/src/content/docs/ru/getting-started/docker.mdx new file mode 100644 index 00000000..6141377f --- /dev/null +++ b/docs/src/content/docs/ru/getting-started/docker.mdx @@ -0,0 +1,157 @@ +--- +title: Official Docker images +--- + +Castopod pushes 3 Docker images to the Docker Hub during its automated build +process: + +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit +- [**`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 + +Additionally, Castopod requires a MySQL-compatible database. A Redis database +can be added as a cache handler. + +## Supported tags + +- `develop` [unstable], latest development branch build +- `beta` [stable], latest beta version build +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) + +## Example usage + +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: + + ```yml + version: "3.7" + + services: + app: + image: castopod/castopod:latest + container_name: "castopod-app" + volumes: + - castopod-media:/var/www/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + CP_BASEURL: "https://castopod.example.com" + CP_ANALYTICS_SALT: changeme + CP_CACHE_HANDLER: redis + CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme + networks: + - castopod-app + - castopod-db + ports: + - 8000:8000 + restart: unless-stopped + + mariadb: + image: mariadb:10.5 + container_name: "castopod-mariadb" + networks: + - castopod-db + volumes: + - castopod-db:/var/lib/mysql + environment: + MYSQL_ROOT_PASSWORD: changeme + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + restart: unless-stopped + + redis: + image: redis:7.0-alpine + container_name: "castopod-redis" + command: --requirepass changeme + volumes: + - castopod-cache:/data + networks: + - castopod-app + + volumes: + castopod-media: + castopod-db: + castopod-cache: + + networks: + castopod-app: + castopod-db: + ``` + + You have to adapt some variables to your needs (e.g. `CP_BASEURL`, + `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). + +3. Setup a reverse proxy for 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/): + + ``` + #castopod + castopod.example.com { + reverse_proxy localhost:8000 + } + ``` + +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! + +5. You're all set, start podcasting! 🎙️🚀 + +## Environment Variables + +- **castopod/castopod** and **castopod/app** + + | Variable name | Type (`default`) | Default | + | ------------------------------------- | ----------------------- | ---------------- | + | **`CP_BASEURL`** | string | `undefined` | + | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | + | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | + | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | + | **`CP_ANALYTICS_SALT`** | string | `undefined` | + | **`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_REDIS_HOST`** | ?string | `"localhost"` | + | **`CP_REDIS_PASSWORD`** | ?string | `null` | + | **`CP_REDIS_PORT`** | ?number | `6379` | + | **`CP_REDIS_DATABASE`** | ?number | `0` | + | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | + | **`CP_EMAIL_FROM`** | ?string | `undefined` | + | **`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_ENABLE_2FA`** | ?boolean | `undefined` | + | **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` | + | **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` | + | **`CP_MEDIA_S3_KEY`** | ?string | `undefined` | + | **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` | + | **`CP_MEDIA_S3_REGION`** | ?string | `undefined` | + | **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` | + | **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` | + | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` | + | **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` | + | **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` | + | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | + | **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | + +- **castopod/web-server** + + | Variable name | Type | Default | + | ---------------------- | --------------------- | ------- | + | **`CP_APP_HOSTNAME`** | ?string | `"app"` | + | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | diff --git a/docs/src/ru/getting-started/install.md b/docs/src/content/docs/ru/getting-started/install.mdx similarity index 81% rename from docs/src/ru/getting-started/install.md rename to docs/src/content/docs/ru/getting-started/install.mdx index f47362af..c65647d9 100644 --- a/docs/src/ru/getting-started/install.md +++ b/docs/src/content/docs/ru/getting-started/install.mdx @@ -1,21 +1,20 @@ --- -title: Installation -sidebarDepth: 3 +title: How to install Castopod? --- -# How to install Castopod? +import { Aside } from "@astrojs/starlight/components"; 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. -::: tip Note + ## Requirements @@ -46,14 +45,6 @@ Additionally, make sure that the following extensions are enabled in your PHP: > We recommend using [MariaDB](https://mariadb.org). -::: warning Warning - -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. - -::: - 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. @@ -115,13 +106,13 @@ want to generate Video Clips. The following extensions must be installed: 2. Follow the instructions on your screen. 3. Start podcasting! -::: info Note + ### Using CLI @@ -228,13 +219,35 @@ self-hosting for you. diff --git a/docs/src/content/docs/ru/getting-started/security.mdx b/docs/src/content/docs/ru/getting-started/security.mdx new file mode 100644 index 00000000..c039493c --- /dev/null +++ b/docs/src/content/docs/ru/getting-started/security.mdx @@ -0,0 +1,24 @@ +--- +title: Security concerns +--- + +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). + +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): + +- `writable/` folder must be **readable** and **writable**. +- `public/media/` folder must be **readable** and **writable**. +- any other file must be set to **readonly**. + +For instance, if you are using Apache or NGINX with Ubuntu you may do the +following: + +```bash +sudo chown -R root:root /path/to/castopod +sudo chown -R www-data:www-data /path/to/castopod/writable +sudo chown -R www-data:www-data /path/to/castopod/public/media +``` diff --git a/docs/src/pl/getting-started/update.md b/docs/src/content/docs/ru/getting-started/update.mdx similarity index 96% rename from docs/src/pl/getting-started/update.md rename to docs/src/content/docs/ru/getting-started/update.mdx index 76668ae3..d91f98c4 100644 --- a/docs/src/pl/getting-started/update.md +++ b/docs/src/content/docs/ru/getting-started/update.mdx @@ -1,9 +1,8 @@ --- -title: Update -sidebarDepth: 3 +title: How to update Castopod? --- -# How to update Castopod? +import { Aside } from "@astrojs/starlight/components"; 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 @@ -36,12 +35,12 @@ improvements ⚡. - Remove all files except `.env` and `public/media` - Copy the new files from the downloaded package into your server - ::: info Note + 4. Update your database schema from your `Castopod Admin` > `About` page or by running: @@ -54,7 +53,7 @@ improvements ⚡. `Housekeeping` 6. ✨ Enjoy your fresh instance, you're all done! -::: info Note + ## Fully Automated updates diff --git a/docs/src/content/docs/ru/index.mdx b/docs/src/content/docs/ru/index.mdx new file mode 100644 index 00000000..3f1ec043 --- /dev/null +++ b/docs/src/content/docs/ru/index.mdx @@ -0,0 +1,1349 @@ +--- +title: Welcome 👋 +--- + +import { LinkCard } from "@astrojs/starlight/components"; + +Castopod is a free & open-source hosting platform made for podcasters who want +engage and interact with their audience. + +Castopod is easy to install and was built on top of +[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very +small footprint. + + + +## Features + +- 🌱  Free & open-source (AGPL v3 License) +- 🔐  Focused on data sovereignty: your content, audience, and analytics + belong to you, and you only +- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, + chapters, location, persons, soundbites, … +- 💬  Built-in social network: + - 🚀  Castopod is part of the Fediverse, a decentralized social network + - ❤️  Create posts, share, favourite, and comment on episodes +- 📈  Built-in analytics: + - ⚖️  GDPR / CCPA / LGPD compliant + - 🪙  Standard IABv2 audience measurement + - 🏡  On-premises analytics, no third party involved +- 📢  Built-in marketing tools: + - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) + - 📱  PWA: install as a standalone app + - 🎨  Customizable theme colors + - 🎬  Generate ready-to-share Video clips from episodes + - 🔉  Generate soundbites + - ▶️  Embeddable player, embed your episodes on any website +- 💸  Monetization: + - 🔗  Funding links + - 📲  listen-to-click ads + - 🤝  value4value / WebMonetization + - 💎  Premium podcasts +- 📡  Publish your episodes everywhere with RSS: + - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, + Google Podcasts, Deezer, Podcast Addict, Podfriend, … + - ⚡  Broadcast your episodes instantly with WebSub +- 📥  Podcast import: move your existing podcast into Castopod +- 📤  Move your podcast out of Castopod +- 🔀  Multi-tenant: host as many podcasts as you want +- 👥  Multi-user: add contributors and set roles +- 🌎  i18n support: translated in English, French, Polish, German, + Brazilian Portuguese & Spanish… with + [more to come](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. + +It is in fact one of the only media to have stayed this way for a long time. + +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. + +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized 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. + +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. + +## Comparison with other solutions + +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 you. + +### 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 it. + +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. + +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. + +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 journey. + +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. + +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! + +### 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 was initially built around music. And later on, as the project +evolved, the ability to host podcasts was introduced. + +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, …). + +So, you should probably use Funkwhale if you want to host your music, and use +Castopod if you want to host your podcasts. + +### Castopod vs other podcast hosts + +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! + +Each of these solutions differ from one another, you may compare with the +[list of features](#features). + +That being said, there are two main differences with other podcasting solutions: + +- 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 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. + +## Contributing + +Love Castopod and would like to help? Take a look at the following documentation +to get you started. + +### Code of conduct + +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 tolerated. + +### Contributing 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. + +## Contributors ✨ + +Thanks goes to these wonderful people +([emoji key](https://allcontributors.org/docs/en/emoji-key)): + +{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */} +{/* prettier-ignore-start */} +{/* markdownlint-disable */} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Yassine Doghri +
+ + Yassine Doghri + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 📖 + {" "} + + 👀 + {" "} + + 🚧 + {" "} + + 🖋 + {" "} + + 🎨 + {" "} + + ️️️️♿️ + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🧑‍🏫 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📆 + {" "} + + 📝 + +
+ + Benjamin Bellamy +
+ + Benjamin Bellamy + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 👀 + {" "} + + 🖋 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📝 + {" "} + + 📆 + {" "} + + 📢 + +
+ + Ola Hneini +
+ + Ola Hneini + +
+
+ + 💻 + {" "} + + 👀 + {" "} + + 📖 + {" "} + + 🚧 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Romain de Laage +
+ + Romain de Laage + +
+
+ + 💻 + {" "} + + 🚇 + {" "} + + 📖 + {" "} + + 🌍 + {" "} + + 🤔 + +
+ + Lyonel Bernard +
+ + Lyonel Bernard + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Christopher Lagonick-Weitzel +
+ + Christopher Lagonick-Weitzel + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Ernesto Acosta +
+ + Ernesto Acosta + +
+
+ + 🐛 + {" "} + + 🔊 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Bastien Luneteau +
+ + Bastien Luneteau + +
+
+ + 💻 + {" "} + + 🐛 + +
+ + Cécile Ricordeau +
+ + Cécile Ricordeau + +
+
+ + 🎨 + +
+ + Patryk Miś +
+ + Patryk Miś + +
+
+ + 🌍 + +
+ + Marcin Lewandowski +
+ + Marcin Lewandowski + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Sebastian Janik +
+ + Sebastian Janik + +
+
+ + 💻 + +
+ + Patryk Karczmarczyk +
+ + Patryk Karczmarczyk + +
+
+ + 💻 + +
+ + denis d +
+ + denis d + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Douglas Kastle +
+ + Douglas Kastle + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + cExplorer +
+ + cExplorer + +
+
+ + 🐛 + {" "} + + 🌍 + +
+ + ImaCrea +
+ + ImaCrea + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Jonas S +
+ + Jonas S + +
+
+ + 💻 + +
+ + LEFEBVRE Yann +
+ + LEFEBVRE Yann + +
+
+ + 🐛 + +
+ + Sebastian Späth +
+ + Sebastian Späth + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + rocky III +
+ + rocky III + +
+
+ + 🐛 + +
+ + Hermann Josef Eckl +
+ + Hermann Josef Eckl + +
+
+ + 🐛 + +
+ + Delhaye Cyrille +
+ + Delhaye Cyrille + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + João Leandro +
+ + João Leandro + +
+
+ + 🌍 + {" "} + + 🤔 + +
+ + Angelos Chouvardas +
+ + Angelos Chouvardas + +
+
+ + 🌍 + +
+ + Eivind +
+ + Eivind + +
+
+ + 🌍 + +
+ + Ewen +
+ + Ewen + +
+
+ + 🌍 + {" "} + + 🤔 + +
+ + forght +
+ + forght + +
+
+ + 🌍 + +
+ + glottis0q +
+ + glottis0q + +
+
+ + 🌍 + +
+ + ButterflyOfFire +
+ + ButterflyOfFire + +
+
+ + 🌍 + +
+ + Lucian I. Last +
+ + Lucian I. Last + +
+
+ + 🌍 + +
+ + LuuzViir +
+ + LuuzViir + +
+
+ + 🌍 + +
+ + CTHTC +
+ + CTHTC + +
+
+ + 🌍 + +
+ + Russian Retro +
+ + Russian Retro + +
+
+ + 🌍 + +
+ + Marek L'ach +
+ + Marek L'ach + +
+
+ + 🌍 + +
+ + GunChleoc +
+ + GunChleoc + +
+
+ + 🌍 + +
+ + GabiSnow +
+ + GabiSnow + +
+
+ + 🌍 + +
+ + bendaha +
+ + bendaha + +
+
+ + 🌍 + +
+ + Samuel Roland +
+ + Samuel Roland + +
+
+ + 🌍 + +
+ + Dimitri Regnier +
+ + Dimitri Regnier + +
+
+ + 🤔 + +
+ + irithys +
+ + irithys + +
+
+ + 🌍 + +
+ + Sergi +
+ + Sergi + +
+
+ + 🌍 + +
+ + ghose (XoseM) +
+ + ghose (XoseM) + +
+
+ + 🌍 + +
+ + Andreas Olsson +
+ + Andreas Olsson + +
+
+ + 🌍 + +
+ + leonfrom +
+ + leonfrom + +
+
+ + 🌍 + +
+ + agentcobra +
+ + agentcobra + +
+
+ + 🌍 + +
+ + Alessandro +
+ + Alessandro + +
+
+ + 🌍 + +
+ + liimee +
+ + liimee + +
+
+ + 🌍 + +
+ + Ahmed Sabouni +
+ + Ahmed Sabouni + +
+
+ + 🌍 + +
+ + KrzysztofDomanczyk +
+ + KrzysztofDomanczyk + +
+
+ + 💻 + +
+ +{/* markdownlint-restore */} +{/* prettier-ignore-end */} + +{/* ALL-CONTRIBUTORS-LIST:END */} + +This project follows the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind welcome! + +## Contact + +You may reach us for help or ask any question you have on: + +- [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) + +Alternatively, you can follow us on social media platforms to get news about +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 + +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). + +[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/) + +[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/) + +## License + +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) + +Copyright © 2020-present, [Ad Aures](https://adaures.com/). diff --git a/docs/src/content/docs/sk/getting-started/auth.mdx b/docs/src/content/docs/sk/getting-started/auth.mdx new file mode 100644 index 00000000..d4dd4dd5 --- /dev/null +++ b/docs/src/content/docs/sk/getting-started/auth.mdx @@ -0,0 +1,84 @@ +--- +title: 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, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| 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 dashboards and analytics of podcast #\{id\}'s episodes. | +| episodes.create | Can create episodes for podcast #\{id\}. | +| episodes.edit | Can edit episodes of podcast #\{id\}. | +| episodes.delete | Can delete episodes of podcast #\{id\}. | +| episodes.manage-persons | Can manage episode persons of podcast #\{id\}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #\{id\}. | +| episodes.manage-publications | Can publish/unpublish episodes and posts of podcast #\{id\}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #\{id\}. | + +{/* AUTH-PODCAST-PERMISSIONS-LIST:END */} diff --git a/docs/src/content/docs/sk/getting-started/docker.mdx b/docs/src/content/docs/sk/getting-started/docker.mdx new file mode 100644 index 00000000..6141377f --- /dev/null +++ b/docs/src/content/docs/sk/getting-started/docker.mdx @@ -0,0 +1,157 @@ +--- +title: Official Docker images +--- + +Castopod pushes 3 Docker images to the Docker Hub during its automated build +process: + +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit +- [**`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 + +Additionally, Castopod requires a MySQL-compatible database. A Redis database +can be added as a cache handler. + +## Supported tags + +- `develop` [unstable], latest development branch build +- `beta` [stable], latest beta version build +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) + +## Example usage + +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: + + ```yml + version: "3.7" + + services: + app: + image: castopod/castopod:latest + container_name: "castopod-app" + volumes: + - castopod-media:/var/www/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + CP_BASEURL: "https://castopod.example.com" + CP_ANALYTICS_SALT: changeme + CP_CACHE_HANDLER: redis + CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme + networks: + - castopod-app + - castopod-db + ports: + - 8000:8000 + restart: unless-stopped + + mariadb: + image: mariadb:10.5 + container_name: "castopod-mariadb" + networks: + - castopod-db + volumes: + - castopod-db:/var/lib/mysql + environment: + MYSQL_ROOT_PASSWORD: changeme + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + restart: unless-stopped + + redis: + image: redis:7.0-alpine + container_name: "castopod-redis" + command: --requirepass changeme + volumes: + - castopod-cache:/data + networks: + - castopod-app + + volumes: + castopod-media: + castopod-db: + castopod-cache: + + networks: + castopod-app: + castopod-db: + ``` + + You have to adapt some variables to your needs (e.g. `CP_BASEURL`, + `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). + +3. Setup a reverse proxy for 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/): + + ``` + #castopod + castopod.example.com { + reverse_proxy localhost:8000 + } + ``` + +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! + +5. You're all set, start podcasting! 🎙️🚀 + +## Environment Variables + +- **castopod/castopod** and **castopod/app** + + | Variable name | Type (`default`) | Default | + | ------------------------------------- | ----------------------- | ---------------- | + | **`CP_BASEURL`** | string | `undefined` | + | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | + | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | + | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | + | **`CP_ANALYTICS_SALT`** | string | `undefined` | + | **`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_REDIS_HOST`** | ?string | `"localhost"` | + | **`CP_REDIS_PASSWORD`** | ?string | `null` | + | **`CP_REDIS_PORT`** | ?number | `6379` | + | **`CP_REDIS_DATABASE`** | ?number | `0` | + | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | + | **`CP_EMAIL_FROM`** | ?string | `undefined` | + | **`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_ENABLE_2FA`** | ?boolean | `undefined` | + | **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` | + | **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` | + | **`CP_MEDIA_S3_KEY`** | ?string | `undefined` | + | **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` | + | **`CP_MEDIA_S3_REGION`** | ?string | `undefined` | + | **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` | + | **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` | + | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` | + | **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` | + | **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` | + | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | + | **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | + +- **castopod/web-server** + + | Variable name | Type | Default | + | ---------------------- | --------------------- | ------- | + | **`CP_APP_HOSTNAME`** | ?string | `"app"` | + | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | diff --git a/docs/src/content/docs/sk/getting-started/install.mdx b/docs/src/content/docs/sk/getting-started/install.mdx new file mode 100644 index 00000000..d8888954 --- /dev/null +++ b/docs/src/content/docs/sk/getting-started/install.mdx @@ -0,0 +1,251 @@ +--- +title: How to install Castopod? +--- + +import { Aside } from "@astrojs/starlight/components"; + +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. + + + +## Requirements + +- PHP v8.1 or higher +- MySQL version 5.7 or higher or MariaDB version 10.2 or higher +- HTTPS support +- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's + incoming requests + +### PHP v8.1 or higher + +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. +- [exif](https://www.php.net/manual/en/exif.installation.php) + +Additionally, make sure that the following extensions are enabled in your PHP: + +- json (enabled by default - don't turn it off) +- xml (enabled by default - don't turn it off) +- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php) + +### MySQL compatible database + +> We recommend using [MariaDB](https://mariadb.org). + +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. + +#### Privileges + +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`. + +### (Optional) FFmpeg v4.1.8 or higher for Video Clips + +[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: + +- **FreeType 2** library for + [gd](https://www.php.net/manual/en/image.installation.php). + +### (Optional) Other recommendations + +- Redis for better cache performances. +- CDN for static files caching and better performances. +- e-mail gateway for lost passwords. + +## Install instructions + +### Pre-requisites + +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 haven’t 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): + + ```bash + * * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1 + ``` + + **Note** - If you do not add this cron task, the following Castopod features + will not work: + + - Importing a podcast from an existing RSS feed + - Broadcasting social activities to your followers in the fediverse + - Broadcasting episodes to open hubs using + [WebSub](https://en.wikipedia.org/wiki/WebSub) + - Generating video clips - + [requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips) + +### (recommended) Install Wizard + +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! + + + +### Using CLI + +1. Create a `.env` file in the package root based on the `.env.example` file. +2. Initialize the database using: + + ```sh + php spark install:init-database + ``` + +3. Create the superadmin user using: + + ```sh + php spark install:create-superadmin + ``` + +4. Head on to your admin gateway to start podcasting! + +### Email/SMTP setup + +Email configuration is required for some features to work properly (eg. +retrieving your forgotten password, sending instructions to premium subscribers, +…) + +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" +``` + +#### Email config options + +| 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"` | + +### Media storage + +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 + +If you prefer storing your media files on an S3 compatible storage, you may +specify it in your `.env`: + +```ini +# […] + +media.fileManager="s3" +media.s3.endpoint="your_s3_host" +media.s3.key="your_s3_key" +media.s3.secret="your_s3_secret" +media.s3.region="your_s3_region" +``` + +#### S3 config options + +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | + +## Community packages + +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. + +### Install with 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. + + diff --git a/docs/src/content/docs/sk/getting-started/security.mdx b/docs/src/content/docs/sk/getting-started/security.mdx new file mode 100644 index 00000000..c039493c --- /dev/null +++ b/docs/src/content/docs/sk/getting-started/security.mdx @@ -0,0 +1,24 @@ +--- +title: Security concerns +--- + +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). + +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): + +- `writable/` folder must be **readable** and **writable**. +- `public/media/` folder must be **readable** and **writable**. +- any other file must be set to **readonly**. + +For instance, if you are using Apache or NGINX with Ubuntu you may do the +following: + +```bash +sudo chown -R root:root /path/to/castopod +sudo chown -R www-data:www-data /path/to/castopod/writable +sudo chown -R www-data:www-data /path/to/castopod/public/media +``` diff --git a/docs/src/content/docs/sk/getting-started/update.mdx b/docs/src/content/docs/sk/getting-started/update.mdx new file mode 100644 index 00000000..f1a26974 --- /dev/null +++ b/docs/src/content/docs/sk/getting-started/update.mdx @@ -0,0 +1,108 @@ +--- +title: How to update Castopod? +--- + +import { Aside } from "@astrojs/starlight/components"; + +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 ⚡. + +## Update instructions + +0. ⚠️ Before any update, we highly recommend you backup your Castopod files and + database. + + - cf. + [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 + + - cf. + [Where can I find my 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 + + - ⚠️ 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/) + +3. On your server: + + - Remove all files except `.env` and `public/media` + - Copy the new files from the downloaded package into your server + + + +4. Update your database schema from your `Castopod Admin` > `About` page or by + running: + + ```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! + + + +## Fully Automated updates + +> Coming soon... 👀 + +## Frequently asked questions (FAQ) + +### Where can I find my Castopod version? + +Go to your Castopod admin panel, the version is displayed on the bottom left +corner. + +Alternatively, you can find the version in the `app > Config > Constants.php` +file. + +### I haven't updated my instance in a long time… What should I do? + +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. + +> You may want to backup your instance depending on how long you haven't updated +> Castopod. + +For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to +`v1.0.0-beta.1`: + +0. (highly recommended) Make a backup of your files and database. + +1. Download the latest release, overwrite your files whilst keeping `.env` and + `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`, + `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`. + +3. ✨ Enjoy your fresh instance, you're all done! + +### Should I make a backup before updating? + +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… diff --git a/docs/src/content/docs/sk/index.mdx b/docs/src/content/docs/sk/index.mdx new file mode 100644 index 00000000..3f1ec043 --- /dev/null +++ b/docs/src/content/docs/sk/index.mdx @@ -0,0 +1,1349 @@ +--- +title: Welcome 👋 +--- + +import { LinkCard } from "@astrojs/starlight/components"; + +Castopod is a free & open-source hosting platform made for podcasters who want +engage and interact with their audience. + +Castopod is easy to install and was built on top of +[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very +small footprint. + + + +## Features + +- 🌱  Free & open-source (AGPL v3 License) +- 🔐  Focused on data sovereignty: your content, audience, and analytics + belong to you, and you only +- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, + chapters, location, persons, soundbites, … +- 💬  Built-in social network: + - 🚀  Castopod is part of the Fediverse, a decentralized social network + - ❤️  Create posts, share, favourite, and comment on episodes +- 📈  Built-in analytics: + - ⚖️  GDPR / CCPA / LGPD compliant + - 🪙  Standard IABv2 audience measurement + - 🏡  On-premises analytics, no third party involved +- 📢  Built-in marketing tools: + - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) + - 📱  PWA: install as a standalone app + - 🎨  Customizable theme colors + - 🎬  Generate ready-to-share Video clips from episodes + - 🔉  Generate soundbites + - ▶️  Embeddable player, embed your episodes on any website +- 💸  Monetization: + - 🔗  Funding links + - 📲  listen-to-click ads + - 🤝  value4value / WebMonetization + - 💎  Premium podcasts +- 📡  Publish your episodes everywhere with RSS: + - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, + Google Podcasts, Deezer, Podcast Addict, Podfriend, … + - ⚡  Broadcast your episodes instantly with WebSub +- 📥  Podcast import: move your existing podcast into Castopod +- 📤  Move your podcast out of Castopod +- 🔀  Multi-tenant: host as many podcasts as you want +- 👥  Multi-user: add contributors and set roles +- 🌎  i18n support: translated in English, French, Polish, German, + Brazilian Portuguese & Spanish… with + [more to come](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. + +It is in fact one of the only media to have stayed this way for a long time. + +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. + +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized 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. + +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. + +## Comparison with other solutions + +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 you. + +### 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 it. + +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. + +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. + +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 journey. + +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. + +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! + +### 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 was initially built around music. And later on, as the project +evolved, the ability to host podcasts was introduced. + +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, …). + +So, you should probably use Funkwhale if you want to host your music, and use +Castopod if you want to host your podcasts. + +### Castopod vs other podcast hosts + +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! + +Each of these solutions differ from one another, you may compare with the +[list of features](#features). + +That being said, there are two main differences with other podcasting solutions: + +- 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 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. + +## Contributing + +Love Castopod and would like to help? Take a look at the following documentation +to get you started. + +### Code of conduct + +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 tolerated. + +### Contributing 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. + +## Contributors ✨ + +Thanks goes to these wonderful people +([emoji key](https://allcontributors.org/docs/en/emoji-key)): + +{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */} +{/* prettier-ignore-start */} +{/* markdownlint-disable */} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Yassine Doghri +
+ + Yassine Doghri + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 📖 + {" "} + + 👀 + {" "} + + 🚧 + {" "} + + 🖋 + {" "} + + 🎨 + {" "} + + ️️️️♿️ + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🧑‍🏫 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📆 + {" "} + + 📝 + +
+ + Benjamin Bellamy +
+ + Benjamin Bellamy + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 👀 + {" "} + + 🖋 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📝 + {" "} + + 📆 + {" "} + + 📢 + +
+ + Ola Hneini +
+ + Ola Hneini + +
+
+ + 💻 + {" "} + + 👀 + {" "} + + 📖 + {" "} + + 🚧 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Romain de Laage +
+ + Romain de Laage + +
+
+ + 💻 + {" "} + + 🚇 + {" "} + + 📖 + {" "} + + 🌍 + {" "} + + 🤔 + +
+ + Lyonel Bernard +
+ + Lyonel Bernard + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Christopher Lagonick-Weitzel +
+ + Christopher Lagonick-Weitzel + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Ernesto Acosta +
+ + Ernesto Acosta + +
+
+ + 🐛 + {" "} + + 🔊 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Bastien Luneteau +
+ + Bastien Luneteau + +
+
+ + 💻 + {" "} + + 🐛 + +
+ + Cécile Ricordeau +
+ + Cécile Ricordeau + +
+
+ + 🎨 + +
+ + Patryk Miś +
+ + Patryk Miś + +
+
+ + 🌍 + +
+ + Marcin Lewandowski +
+ + Marcin Lewandowski + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Sebastian Janik +
+ + Sebastian Janik + +
+
+ + 💻 + +
+ + Patryk Karczmarczyk +
+ + Patryk Karczmarczyk + +
+
+ + 💻 + +
+ + denis d +
+ + denis d + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Douglas Kastle +
+ + Douglas Kastle + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + cExplorer +
+ + cExplorer + +
+
+ + 🐛 + {" "} + + 🌍 + +
+ + ImaCrea +
+ + ImaCrea + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Jonas S +
+ + Jonas S + +
+
+ + 💻 + +
+ + LEFEBVRE Yann +
+ + LEFEBVRE Yann + +
+
+ + 🐛 + +
+ + Sebastian Späth +
+ + Sebastian Späth + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + rocky III +
+ + rocky III + +
+
+ + 🐛 + +
+ + Hermann Josef Eckl +
+ + Hermann Josef Eckl + +
+
+ + 🐛 + +
+ + Delhaye Cyrille +
+ + Delhaye Cyrille + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + João Leandro +
+ + João Leandro + +
+
+ + 🌍 + {" "} + + 🤔 + +
+ + Angelos Chouvardas +
+ + Angelos Chouvardas + +
+
+ + 🌍 + +
+ + Eivind +
+ + Eivind + +
+
+ + 🌍 + +
+ + Ewen +
+ + Ewen + +
+
+ + 🌍 + {" "} + + 🤔 + +
+ + forght +
+ + forght + +
+
+ + 🌍 + +
+ + glottis0q +
+ + glottis0q + +
+
+ + 🌍 + +
+ + ButterflyOfFire +
+ + ButterflyOfFire + +
+
+ + 🌍 + +
+ + Lucian I. Last +
+ + Lucian I. Last + +
+
+ + 🌍 + +
+ + LuuzViir +
+ + LuuzViir + +
+
+ + 🌍 + +
+ + CTHTC +
+ + CTHTC + +
+
+ + 🌍 + +
+ + Russian Retro +
+ + Russian Retro + +
+
+ + 🌍 + +
+ + Marek L'ach +
+ + Marek L'ach + +
+
+ + 🌍 + +
+ + GunChleoc +
+ + GunChleoc + +
+
+ + 🌍 + +
+ + GabiSnow +
+ + GabiSnow + +
+
+ + 🌍 + +
+ + bendaha +
+ + bendaha + +
+
+ + 🌍 + +
+ + Samuel Roland +
+ + Samuel Roland + +
+
+ + 🌍 + +
+ + Dimitri Regnier +
+ + Dimitri Regnier + +
+
+ + 🤔 + +
+ + irithys +
+ + irithys + +
+
+ + 🌍 + +
+ + Sergi +
+ + Sergi + +
+
+ + 🌍 + +
+ + ghose (XoseM) +
+ + ghose (XoseM) + +
+
+ + 🌍 + +
+ + Andreas Olsson +
+ + Andreas Olsson + +
+
+ + 🌍 + +
+ + leonfrom +
+ + leonfrom + +
+
+ + 🌍 + +
+ + agentcobra +
+ + agentcobra + +
+
+ + 🌍 + +
+ + Alessandro +
+ + Alessandro + +
+
+ + 🌍 + +
+ + liimee +
+ + liimee + +
+
+ + 🌍 + +
+ + Ahmed Sabouni +
+ + Ahmed Sabouni + +
+
+ + 🌍 + +
+ + KrzysztofDomanczyk +
+ + KrzysztofDomanczyk + +
+
+ + 💻 + +
+ +{/* markdownlint-restore */} +{/* prettier-ignore-end */} + +{/* ALL-CONTRIBUTORS-LIST:END */} + +This project follows the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind welcome! + +## Contact + +You may reach us for help or ask any question you have on: + +- [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) + +Alternatively, you can follow us on social media platforms to get news about +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 + +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). + +[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/) + +[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/) + +## License + +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) + +Copyright © 2020-present, [Ad Aures](https://adaures.com/). diff --git a/docs/src/content/docs/sr-latn/getting-started/auth.mdx b/docs/src/content/docs/sr-latn/getting-started/auth.mdx new file mode 100644 index 00000000..57acf753 --- /dev/null +++ b/docs/src/content/docs/sr-latn/getting-started/auth.mdx @@ -0,0 +1,84 @@ +--- +title: Verifikacija i Odobravanje +--- + +Castopod upravlja verifikacijom i odobravanjem koristeći `codeigniter/shield` u +paru sa prilagođenim pravilima. Uloge i dozvole su definisane na dva nivoa: + +1. [po nalogu](#1-instance-wide-roles-and-permissions) +2. [po podkastu](#2-per-podcast-roles-and-permissions) + +## 1. Uloge i dozvole po nalogu + +### Uloge po nalogu + +{/* AUTH-INSTANCE-ROLES-LIST:START - Do not remove or modify this section */} + +| role | description | permissions | +| ------------------- | --------------------------------------- | ------------------------------------------------------------------------------------------ | +| Super administrator | Ima kompletnu kontrolu nad Castopod-om. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Menadžer | Upravlja sadržajem na Castopod-u. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podkaster | Opšti korisnici Castopod-a. | admin.access | + +{/* AUTH-INSTANCE-ROLES-LIST:END */} + +### Dozvole po nalogu + +{/* AUTH-INSTANCE-PERMISSIONS-LIST:START - Do not remove or modify this section */} + +| permission | description | +| ----------------------- | -------------------------------------------------------------- | +| admin.access | Može pristupiti administratorskom delu Castopod-a. | +| admin.settings | Može pristupiti podešavanjima Castopod-a. | +| users.manage | Može upravljati korisnicima Castopod-a. | +| persons.manage | Može upravljati osobama. | +| pages.manage | Može upravljati stranicama. | +| podcasts.view | Može videti sve podkaste. | +| podcasts.create | Može napraviti nove podkaste. | +| podcasts.import | Može uvesti nove podkaste. | +| fediverse.manage-blocks | Može blokirati interakciju Castopoda i fedivers naloga/domena. | + +{/* AUTH-INSTANCE-PERMISSIONS-LIST:END */} + +## 2. Uloge i dozvole po podkastu + +### Uloge po podkastu + +{/* AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section */} + +| role | description | permissions | +| ------------- | ------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Administrator | Ima kompletnu kontrolu nad podkastom #\{id\}. | \* | +| Urednik | Upravlja sadržajem i objavama podkasta #\{id\}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Autor | Upravlja sadržajem podkasta #\{id\} ali ne može da ga objavi. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Gost | Saradnik na podkastu #\{id\}. | view, episodes.view | + +{/* AUTH-PODCAST-ROLES-LIST:END */} + +### Dozvole po podkastu + +{/* AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section */} + +| permission | description | +| ---------------------------- | ---------------------------------------------------------------------------------------- | +| view | Može videti upravljačku tablu i analitiku podkasta #\{id\}. | +| edit | Može uređivati podkast #\{id\}. | +| delete | Može obrisati podkast #\{id\}. | +| manage-import | Može sinhronizovati uvezen podkast #\{id\}. | +| manage-persons | Može upravljati pretplatama na podkast #\{id\}. | +| manage-subscriptions | Može upravljati pretplatama na podkast #\{id\}. | +| manage-contributors | Može upravljati saradnicima na podkastu #\{id\}. | +| manage-platforms | Može ubaciti/izbaciti veze ka platformama podkasta #\{id\}. | +| manage-publications | Može objaviti podkast #\{id\}. | +| manage-notifications | Može videti obaveštenja i označiti ih kao pročitana za podkast #\{id\}. | +| interact-as | Može da komunicira kao podkast #\{id\} i deli, odgovara na i stavlja u omiljene postove. | +| episodes.view | Može videti upravljačku tablu i analitiku epizoda podkasta #\{id\}. | +| episodes.create | Može napraviti epizode podkasta #\{id\}. | +| episodes.edit | Može uređivati epizode podkasta #\{id\}. | +| episodes.delete | Može obrisati epizode podkasta #\{id\}. | +| episodes.manage-persons | Može upravljati osobama na epizodama podkasta #\{id\}. | +| episodes.manage-clips | Može upravljati video klipovima i zvučnim isečcima podkasta #\{id\}. | +| episodes.manage-publications | Može da objavi/poništi objavljivanje epizoda i postova podkasta #\{id\}. | +| episodes.manage-comments | Može dodati/obrisati komentar na epizodi podkasta #\{id\}. | + +{/* AUTH-PODCAST-PERMISSIONS-LIST:END */} diff --git a/docs/src/sr-Latn/getting-started/docker.md b/docs/src/content/docs/sr-latn/getting-started/docker.mdx similarity index 99% rename from docs/src/sr-Latn/getting-started/docker.md rename to docs/src/content/docs/sr-latn/getting-started/docker.mdx index edb10c1d..bd0bdea1 100644 --- a/docs/src/sr-Latn/getting-started/docker.md +++ b/docs/src/content/docs/sr-latn/getting-started/docker.mdx @@ -1,10 +1,7 @@ --- title: Zvanične Docker slike -sidebarDepth: 3 --- -# Zvanične Docker slike - Castopod gura 3 Docker slike u Docker Hub tokom njegovog automatizovanog procesa izrade: diff --git a/docs/src/sr-Latn/getting-started/install.md b/docs/src/content/docs/sr-latn/getting-started/install.mdx similarity index 83% rename from docs/src/sr-Latn/getting-started/install.md rename to docs/src/content/docs/sr-latn/getting-started/install.mdx index be94565a..9789a7fd 100644 --- a/docs/src/sr-Latn/getting-started/install.md +++ b/docs/src/content/docs/sr-latn/getting-started/install.mdx @@ -1,22 +1,21 @@ --- -title: Instalacija -sidebarDepth: 3 +title: Kako Instalirati Castopod? --- -# Kako Instalirati Castopod? +import { Aside } from "@astrojs/starlight/components"; Zamišljeno je da Castopod bude jednostavan za instalaciju. Bilo da se koristi namenski ili deljeni hosting, možete ga instalirati na većinu PHP-MySQL kompatibilnih veb servera. -::: savet Napomena + ## Uslovi @@ -47,13 +46,13 @@ Pored toga, uverite se da su sledeće ekstenzije omogućene u vašem PHP-u: > Preporučujemo korišćenje [MariaDB](https://mariadb.org). -::: upozorenje Upozorenje + Trebaće vam ime servera, ime baze podataka, korisničko ime i lozinka za završite proces instalacije. Ako ih nemate, obratite se svom administratoru servera. @@ -116,13 +115,13 @@ radio: `CREATE`, `ALTER`, `DELETE`, `EXECUTE`, `INDEX`, `INSERT`, `SELECT`, 2. Pratite uputstva na ekranu. 3. Počnite sa podkastingom! -::: info Napomena + ### Korišćenje CLI @@ -230,13 +229,35 @@ upravlja teškoćama samo-hostovanje za vas. diff --git a/docs/src/sr_Latn/getting-started/security.md b/docs/src/content/docs/sr-latn/getting-started/security.mdx similarity index 95% rename from docs/src/sr_Latn/getting-started/security.md rename to docs/src/content/docs/sr-latn/getting-started/security.mdx index d3f96a9d..180acd32 100644 --- a/docs/src/sr_Latn/getting-started/security.md +++ b/docs/src/content/docs/sr-latn/getting-started/security.mdx @@ -1,9 +1,7 @@ --- -title: Bezbednost +title: Bezbednosni interesi --- -# Bezbednosni interesi - Castopod je napravljen na [CodeIgniter4](https://codeigniter.com/), PHP okviru koji podstiče [dobre bezbednosne prakse](https://codeigniter.com/user_guide/concepts/security.html). diff --git a/docs/src/sr_Latn/getting-started/update.md b/docs/src/content/docs/sr-latn/getting-started/update.mdx similarity index 96% rename from docs/src/sr_Latn/getting-started/update.md rename to docs/src/content/docs/sr-latn/getting-started/update.mdx index 5ca69797..d1ceb313 100644 --- a/docs/src/sr_Latn/getting-started/update.md +++ b/docs/src/content/docs/sr-latn/getting-started/update.mdx @@ -1,9 +1,8 @@ --- -title: Ažuriranje -sidebarDepth: 3 +title: Kako da ažurirate Castopod? --- -# Kako da ažurirate Castopod? +import { Aside } from "@astrojs/starlight/components"; Nakon instalacije Castopod-a, možete poželeti da ažurirate svoju instancu na najnoviju verziju kako bi ste uživali u najnovijim opcijama ✨, sređenim @@ -36,12 +35,12 @@ bagovima 🐛 i unapređenim performansama ⚡. - Uklonite sve datoteke sem `.env` i `public/media` - Kopirajte nove datoteke iz preuzetog paketa na vaš server - ::: info Napomena + 4. Ažurirajte svoju šemu baze podataka iz vaše `Castopod Admin` > `About` stranice ili tako što ćete pokrenuti: @@ -53,7 +52,7 @@ bagovima 🐛 i unapređenim performansama ⚡. 5. Očistite keš iz `Castopod Admin` > `Settings` > `general` > `Housekeeping` 6. ✨ Uživajte u svežoj instanci, završili ste! -::: info Napomena + ## Potpuno automatsko ažuriranje diff --git a/docs/src/content/docs/sr-latn/index.mdx b/docs/src/content/docs/sr-latn/index.mdx new file mode 100644 index 00000000..baf59d03 --- /dev/null +++ b/docs/src/content/docs/sr-latn/index.mdx @@ -0,0 +1,1383 @@ +--- +title: Dobrodošli 👋 +--- + +import { LinkCard } from "@astrojs/starlight/components"; + +Castopod je besplatna platforma otvorenog koda napravljena za podkastere koji +žele interakciju sa svojom publikom. + +Castopod se lako instalira i napravljen je na +[CodeIgniter4](https://codeigniter.com/), moćnom PHP okviru sa jako malim +otiskom (footprint). + + + +## Funkcionalnosti + +- 🌱 Besplatan i otvorenog koda (AGPL v3 License) +- 🔐 Fokusiran an suverenitet podataka: vaš sadržaj, publika i analitika pripada + vama i samo vama +- 🪄  Podkasting 2.0 funkcionalnosti: GUID, zaključan, transkripti, + podrška, poglavlja, lokacija, posobe, zvučni isečci, … +- 💬  Ugrađena društvena mreža: + - 🚀  Castopod je deo Fediversa, decentralizovane društvene mreže + - ❤️  Napravite objave, delite, dodajte u omiljene i komentarišite + epizode +- 📈  Ugrađena analitika: + - ⚖️  U skladu sa GDPR / CCPA / LGPD + - 🪙  Merenje publike putem IABv2 standarda + - 🏡  Analitika na licu mesta, bez uključenosti trećih strana +- 📢  Ugrađeni marketinški alati: + - ✅  SEO spremno (open-graph meta-tags, JSON-LD, …) + - 📱  PWA: instalirajte kao samostojeću aplikaciju + - 🎨  Prilagodljive boje teme + - 🎬  Napravite video isečke iz epizoda koji su spremni za deljenje + - 🔉  Napravite audio isečke + - ▶️  Plejer koji možete koristiti na svom sajtu (embed) +- 💸  Monetizacija: + - 🔗  Linkovi za podršku publike + - 📲  Slušaj i klikni reklame + - 🤝  value4value / Veb Monetizacija + - 💎  Premijum podkasti +- 📡  Objavite svoje epizode svugde uz RSS: + - 📱  Na svim agregatorima i aplikacijama: Podcast Index, Apple Podcasts, + Spotify, Google Podcasts, Deezer, Podcast Addict, Podfriend, … + - ⚡  Emitujte svoje epizode instant uz WebSub +- 📥  Uvoz podkasta: prebacite svoj postojeći podkast na Castopod +- 📤  Prebacite svoj podkast sa Castopod-a +- 🔀  Mreža: hostujte koliko god želite podkasta +- 👥  Više korisnika: dodajte saradnike i odredite njihove uloge +- 🌎  i18n podrška: prevedeno na engleski, francuski, poljski, nemački, + brazilski portugalski, španski… + [još jezika uskoro](https://translate.castopod.org)! + +## Motivacija + +Ekosistem podcasta je po prirodi decentralizovan: možete kreirati svoj podkast +kao RSS datoteku, objavite je na vebu i deliti svuda na mreži. + +To je zapravo jedan od retkih medija koji je ostao decentralizovan ovako dugo. + +Kako se upotreba razvija, sve više ljudi ulazi u podkaste: ili kao kreatori koji +pronalaze nove načine da podele svoje ideje ili kao slušaoci u potrazi za boljim +sadržajem. + +Kako podkasting postaje sve više korišćen, neke kompanije pokušavaju da ga +promene ka kontrolisanijem i centralizovanijem mediju. + +Castopod je stvoren u nastojanju da pruži otvorenu i održivu alternativu za +hostovanje vaših podkasta, promovišući decentralizaciju kako bi se osiguralo da +podkasterska kreativnost može da se izrazi. + +Ovaj projekat gura zajednica otvorenog koda, ponajviše +[Fedivers](https://fediverse.party/en/fediverse/) i +[Podcasting 2.0](https://podcastindex.org/) pokreti. + +## Poređenje sa drugim rešenjima + +Verujemo da jedno rešenje nije dobro za sve, već da sve zavisi od vaših potreba. +Tako da evo poređenja sa drugim alatima kako bi ste mogli da procenite da li je +Castopod prava stvar za vas. + +### Castopod protiv Wordpress-a + +Castopod je često nazivan "Wordpress-om za podkaste" zbog sličnosti koje deli sa +ovom ploatformom. U neku ruku ovo je tačno. I zapravo, Castopod bio je u velikoj +meri inspirisan Wordpress ekosistemom, videvši lakoću usvajanja od zajednice i +broja veb lokacija koje rade na njemu. + +Isto kao i Wordpress, Castopod je besplatan i otvorenog koda, napravljen +koristeći PHP i MySQL baze podataka i spakovan na način koji vam omogućava +jednostavnu instalaciju na većini veb servera. + +Wordpress je odličan način na napravite veb stranicu i upotpunite je dodatcima +kako bi dobili ono što želite. To je potpuno razvijen CMS koji vam pomaže da +dobijete bilo koju vrstu veb stranica na mreži. + +S druge strane, Castopod treba da odgovori na posebne potrebe podkastera, +fokusirajući se na podkasting, i ništa drugo. Nisu vam potrebni nikakvi dodatci +kako bi ste krenuli na svoje podkastersko putovanje. + +Ovo omogućava optimizaciju procesa specifičnih za podcasting: u rasponu od +kreiranja vaših podkasta i objavljivanja novih epizoda sve do emitovanja, +marketinga i analitike. + +Konačno, u zavisnosti od vaših potreba, Wordpress i Castopod mogu čak i da +funkcionišu zajedno jer dele iste zahteve! + +### Castopod protiv Funkwhale-a + +Funkwhale je moderan besplatni muzički server otvorenog koda koji se samostalno +hostuje. Kao i Castopod, Funkwhale je deo Fedivers-a, decentralizovane društvene +mreže što omogućava kompatibilnost između njih. + +Funkwhale je u početku napravljen oko muzike. Kasnije, kako je projekat +napredovao, dodata je opcija hostovanja podkasta. + +Za razliku od Funkwhale-a, Castopod je dizajniran i napravljen isključivo oko +podkasta. Ovo omogućava lakšu implementaciju funkcionalnosti koje se odnose na +podkast ekosistem, kao što su podkasting 2.0 alati (transkripti, poglavlja, +lokacije, osobe, ...). + +Tako da bi ste verovatno trebali da koristite Funkwhale ukoliko želite da +hostujete svoju muziku a Castopod ukoliko želite da hostujete svoje podkaste. + +### Castopod protiv drugih podkast hosting-a + +Postoji mnogo različitih rešenja za hostovanje vaših podkasta, neka od njih su +stvarno fantastična i [ dosta njih](https://podcastindex.org/apps) se +priključuje Podcasting 2.0 trendu, isto kao i Castopod! + +Svako od ovih rešenja se razlikuje jedno od drugog, možete ih uporediti sa +[listom funkcionalnosti](#features). + +Imajući to u vidu, postoje dve glavne razlike u odnosu na druga rešenja za +podkasting: + +- Castopod može biti samostalno hostovan i jedino je rešenje koje vam omogućava + da zadržite punu kontrolu nad onim što proizvodite. Takođe, pošto je otvorenog + koda, možete ga čak prilagoditi kako želite. + +- Castopod je jedino rešenje koje trenutno uklapa decentralizovanu društvenu + mrežu sa ActivityPub-om kao i mnoge funkcionalnosti podkasting-a 2.0, nadajući + se da će ih tako približiti. + +## Doprinos + +Volite Catsopod i voleli bi ste da pomognete? Pogledajte dokumentaciju koja +sledi kako bi ste počeli. + +### Kodeks ponašanja + +Castopod je usvojio Kodeks ponašanja kojeg očekujemo da se učesnici u projektu +pridržavaju. Molimo da pročitate +[Uputstvo Kodeksa ponašanja](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md) +kako bi ste razumeli šta hoće a šta neće biti tolerisano. + +### Vodič za doprinos + +Pročitajte naše [uputstvo za doprinos](../contributing/guidelines.md) kako bi +ste bolje razumeli naš proces razvoja, kako da predložite popravke bagova i +unapređenja i kako da napravite i testirate svoje promene na Castopod-u. + +## Saradnici ✨ + +Veliko hvala ovim divnim ljudima +([ključ emotikona](https://allcontributors.org/docs/en/emoji-key)): + +{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */} +{/* prettier-ignore-start */} +{/* markdownlint-disable */} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Yassine Doghri +
+ + Yassine Doghri + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 📖 + {" "} + + 👀 + {" "} + + 🚧 + {" "} + + 🖋 + {" "} + + 🎨 + {" "} + + ️️️️♿️ + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🧑‍🏫 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📆 + {" "} + + 📝 + +
+ + Benjamin Bellamy +
+ + Benjamin Bellamy + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 👀 + {" "} + + 🖋 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📝 + {" "} + + 📆 + {" "} + + 📢 + +
+ + Ola Hneini +
+ + Ola Hneini + +
+
+ + 💻 + {" "} + + 👀 + {" "} + + 📖 + {" "} + + 🚧 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Romain de Laage +
+ + Romain de Laage + +
+
+ + 💻 + {" "} + + 🚇 + {" "} + + 📖 + {" "} + + 🌍 + {" "} + + 🤔 + +
+ + Lyonel Bernard +
+ + Lyonel Bernard + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Christopher Lagonick-Weitzel +
+ + Christopher Lagonick-Weitzel + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Ernesto Acosta +
+ + Ernesto Acosta + +
+
+ + 🐛 + {" "} + + 🔊 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Ewen +
+ + Ewen + +
+
+ + 🌍 + {" "} + + 🤔 + {" "} + + 💻 + +
+ + Bastien Luneteau +
+ + Bastien Luneteau + +
+
+ + 💻 + {" "} + + 🐛 + +
+ + Cécile Ricordeau +
+ + Cécile Ricordeau + +
+
+ + 🎨 + +
+ + Patryk Miś +
+ + Patryk Miś + +
+
+ + 🌍 + +
+ + Marcin Lewandowski +
+ + Marcin Lewandowski + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Sebastian Janik +
+ + Sebastian Janik + +
+
+ + 💻 + +
+ + Patryk Karczmarczyk +
+ + Patryk Karczmarczyk + +
+
+ + 💻 + +
+ + denis d +
+ + denis d + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Douglas Kastle +
+ + Douglas Kastle + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + cExplorer +
+ + cExplorer + +
+
+ + 🐛 + {" "} + + 🌍 + +
+ + ImaCrea +
+ + ImaCrea + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Jonas S +
+ + Jonas S + +
+
+ + 💻 + +
+ + LEFEBVRE Yann +
+ + LEFEBVRE Yann + +
+
+ + 🐛 + +
+ + Sebastian Späth +
+ + Sebastian Späth + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + rocky III +
+ + rocky III + +
+
+ + 🐛 + +
+ + Hermann Josef Eckl +
+ + Hermann Josef Eckl + +
+
+ + 🐛 + +
+ + Delhaye Cyrille +
+ + Delhaye Cyrille + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + João Leandro +
+ + João Leandro + +
+
+ + 🌍 + {" "} + + 🤔 + +
+ + Angelos Chouvardas +
+ + Angelos Chouvardas + +
+
+ + 🌍 + +
+ + Eivind +
+ + Eivind + +
+
+ + 🌍 + +
+ + forght +
+ + forght + +
+
+ + 🌍 + +
+ + glottis0q +
+ + glottis0q + +
+
+ + 🌍 + +
+ + glottis0q +
+ + glottis0q + +
+
+ + 🌍 + +
+ + Lucian I. Last +
+ + Lucian I. Last + +
+
+ + 🌍 + +
+ + LuuzViir +
+ + LuuzViir + +
+
+ + 🌍 + +
+ + CTHTC +
+ + CTHTC + +
+
+ + 🌍 + +
+ + Russian Retro +
+ + Russian Retro + +
+
+ + 🌍 + +
+ + Marek L'ach +
+ + Marek L'ach + +
+
+ + 🌍 + +
+ + GunChleoc +
+ + GunChleoc + +
+
+ + 🌍 + +
+ + GabiSnow +
+ + GabiSnow + +
+
+ + 🌍 + +
+ + bendaha +
+ + bendaha + +
+
+ + 🌍 + +
+ + Samuel Roland +
+ + Samuel Roland + +
+
+ + 🌍 + +
+ + Dimitri Regnier +
+ + Dimitri Regnier + +
+
+ + 🤔 + +
+ + irithys +
+ + irithys + +
+
+ + 🌍 + +
+ + Sergi +
+ + Sergi + +
+
+ + 🌍 + +
+ + ghose (XoseM) +
+ + ghose (XoseM) + +
+
+ + 🌍 + +
+ + Andreas Olsson +
+ + Andreas Olsson + +
+
+ + 🌍 + +
+ + leonfrom +
+ + leonfrom + +
+
+ + 🌍 + +
+ + agentcobra +
+ + agentcobra + +
+
+ + 🌍 + +
+ + Alessandro +
+ + Alessandro + +
+
+ + 🌍 + +
+ + liimee +
+ + liimee + +
+
+ + 🌍 + +
+ + Ahmed Sabouni +
+ + Ahmed Sabouni + +
+
+ + 🌍 + +
+ + KrzysztofDomanczyk +
+ + KrzysztofDomanczyk + +
+
+ + 💻 + +
+ + Guy Martin +
+ + Guy Martin + +
+
+ + 🐛 + {" "} + + 💻 + +
+ +{/* markdownlint-restore */} +{/* prettier-ignore-end */} + +{/* ALL-CONTRIBUTORS-LIST:END */} + +Ovaj projekat prati specifikaciju +[svih saradnika](https://github.com/all-contributors/all-contributors). +Doprinosi bilo koje vrste su dobrodošli! + +## Kontakt + +Možete nas kontaktirati za pomoć ili postaviti bilo koje pitanje koje imate na: + +- [Discord-u](https://castopod.org/discord) (za direktnu interakciju sa + programerima i zajednicom) +- [Listi pitanja](https://code.castopod.org/adaures/castopod/-/issues) (za + zahteve za funkcionalnostima i prijavu bagova) + +Takođe, možete nas pratiti na društvenim mrežama kako bi ste dobili najnovije +vesti o Castopod-u: + +- [podlibre.social](https://podlibre.social/@Castopod) (instanca Mastodon-a) +- [Twitter](https://twitter.com/castopod) +- [LinkedIn](https://linkedin.com/company/castopod) +- [Facebook](https://www.facebook.com/castopod) + +## Sponzori + +Tekući razvoj Castopod-a je omogućen uz podršku vas koji nas podržavate. Ukoliko +želite da pomognete, razmislite o +[sponzorisanju razvoja Castopod-a](https://opencollective.com/castopod/contribute). + +[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/) + +[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/) + +## Licenca + +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) + +Autorska prava © 2020-danas, [Ad Aures](https://adaures.com/). diff --git a/docs/src/content/docs/sv/getting-started/auth.mdx b/docs/src/content/docs/sv/getting-started/auth.mdx new file mode 100644 index 00000000..6f7f225f --- /dev/null +++ b/docs/src/content/docs/sv/getting-started/auth.mdx @@ -0,0 +1,84 @@ +--- +title: 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 administratör | Har fullständig kontroll över Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | +| Hanterare | Hanterar Castopods innehåll. | podcasts.create, podcasts.import, persons.manage, pages.manage | +| Podcaster | Generella användare av 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 | Kan komma åt Castopod admin-området. | +| admin.settings | Kan komma åt Castopod-inställningarna. | +| users.manage | Kan hantera Castopod-användare. | +| persons.manage | Kan hantera personer. | +| pages.manage | Kan hantera sidor. | +| podcasts.view | Kan se alla podcasts. | +| podcasts.create | Kan skapa nya podcasts. | +| podcasts.import | Kan importera podcasts. | +| fediverse.manage-blocks | Kan blockera fediverse skådespelare/domäner från att interagera med 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 | Har fullständig kontroll över podcast #\{id\}. | \* | +| Redigerare | Hanterar innehåll och publikationer i podcast #\{id\}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| Författare | Hanterar innehåll i podcast #\{id\} men kan inte publicera dem. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | +| Gäst | Generell bidragsgivare till podcasten #\{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 | Kan visa instrumentpanelen och analysen av podcast #\{id\}. | +| edit | Kan redigera podcast #\{id\}. | +| delete | Kan ta bort podcast #\{id\}. | +| manage-import | Kan synkronisera importerad podcast #\{id\}. | +| manage-persons | Kan hantera prenumerationer på podcast #\{id\}. | +| manage-subscriptions | Kan hantera prenumerationer på podcast #\{id\}. | +| manage-contributors | Kan hantera bidragsgivare för podcast #\{id\}. | +| manage-platforms | Kan sätta/ta bort plattformslänkar för podcast #\{id\}. | +| manage-publications | Kan publicera podcast #\{id\}. | +| manage-notifications | Can view and mark notifications as read for podcast #\{id\}. | +| interact-as | Kan interagera som podcasten #\{id\} för att favorita, dela eller svara på inlägg. | +| episodes.view | Kan visa instrumentpaneler och analyser av podcast #\{id\}s avsnitt. | +| episodes.create | Kan skapa avsnitt för podcast #\{id\}. | +| episodes.edit | Kan redigera avsnitt av podcast #\{id\}. | +| episodes.delete | Kan ta bort avsnitt av podcast #\{id\}. | +| episodes.manage-persons | Kan hantera avsnittpersoner i podcast #\{id\}. | +| episodes.manage-clips | Kan hantera videoklipp eller ljudklipp från podcasten #\{id\}. | +| episodes.manage-publications | Kan publicera/avpublicera avsnitt och inlägg i podcast #\{id\}. | +| episodes.manage-comments | Kan skapa/ta bort avsnitt kommentarer från podcasten #\{id\}. | + +{/* AUTH-PODCAST-PERMISSIONS-LIST:END */} diff --git a/docs/src/sv/getting-started/docker.md b/docs/src/content/docs/sv/getting-started/docker.mdx similarity index 99% rename from docs/src/sv/getting-started/docker.md rename to docs/src/content/docs/sv/getting-started/docker.mdx index cb478cf8..783803ff 100644 --- a/docs/src/sv/getting-started/docker.md +++ b/docs/src/content/docs/sv/getting-started/docker.mdx @@ -1,10 +1,7 @@ --- title: Officiella Docker images -sidebarDepth: 3 --- -# Officiella Docker images - Castopod pushes 3 Docker images to the Docker Hub during its automated build process: diff --git a/docs/src/sv/getting-started/install.md b/docs/src/content/docs/sv/getting-started/install.mdx similarity index 83% rename from docs/src/sv/getting-started/install.md rename to docs/src/content/docs/sv/getting-started/install.mdx index bef89df5..a9f98f9c 100644 --- a/docs/src/sv/getting-started/install.md +++ b/docs/src/content/docs/sv/getting-started/install.mdx @@ -1,22 +1,21 @@ --- -title: Installation -sidebarDepth: 3 +title: Hur man installerar Castopod? --- -# Hur man installerar Castopod? +import { Aside } from "@astrojs/starlight/components"; 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. -::: tips Anteckning + ## Krav @@ -47,13 +46,13 @@ Se dessutom till att följande tillägg är aktiverade i din PHP: > Vi rekommenderar att du använder [MariaDB](https://mariadb.org). -::: varning Varning + 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 @@ -116,13 +115,13 @@ generera videoklipp. Följande tillägg måste installeras: 2. Följ instruktionerna på din enhet. 3. Börja podcasting! -::: info Notering + ### Using CLI @@ -227,13 +226,35 @@ self-hosting for you. diff --git a/docs/src/sv/getting-started/security.md b/docs/src/content/docs/sv/getting-started/security.mdx similarity index 95% rename from docs/src/sv/getting-started/security.md rename to docs/src/content/docs/sv/getting-started/security.mdx index c1175eab..8ad8d8ec 100644 --- a/docs/src/sv/getting-started/security.md +++ b/docs/src/content/docs/sv/getting-started/security.mdx @@ -1,9 +1,7 @@ --- -title: Säkerhet +title: Säkerhetsfrågor --- -# Säkerhetsfrågor - Castopod är byggt ovanpå [CodeIgniter4](https://codeigniter.com/), ett PHP ramverk som uppmuntrar [goda säkerhetsmetoder](https://codeigniter.com/user_guide/concepts/security.html). diff --git a/docs/src/sv/getting-started/update.md b/docs/src/content/docs/sv/getting-started/update.mdx similarity index 96% rename from docs/src/sv/getting-started/update.md rename to docs/src/content/docs/sv/getting-started/update.mdx index 01acafef..fde95d61 100644 --- a/docs/src/sv/getting-started/update.md +++ b/docs/src/content/docs/sv/getting-started/update.mdx @@ -1,9 +1,8 @@ --- -title: Uppdatera -sidebarDepth: 3 +title: Hur uppdaterar man Castopod? --- -# Hur uppdaterar man Castopod? +import { Aside } from "@astrojs/starlight/components"; 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 @@ -36,12 +35,12 @@ prestanda förbättringar ⚡. - Ta bort alla filer utom `.env` och `publik/media` - Kopiera de nya filerna från det nedladdade paketet till din server - ::: info Notering + 4. Uppdatera ditt databasschema från din `Castopod Admin` > `Om` sida eller kör: @@ -53,7 +52,7 @@ prestanda förbättringar ⚡. `Hushållning` 6. ✨ Njut av din färska instans, du är alla klara! -::: info Notering + ## Helt automatiserade uppdateringar diff --git a/docs/src/content/docs/sv/index.mdx b/docs/src/content/docs/sv/index.mdx new file mode 100644 index 00000000..dbd74fec --- /dev/null +++ b/docs/src/content/docs/sv/index.mdx @@ -0,0 +1,1382 @@ +--- +title: Välkommen 👋 +--- + +import { LinkCard } from "@astrojs/starlight/components"; + +Castopod är en gratis hostingplattform med öppen källkod gjord för podcastare +som vill engagera och interagera med sin publik. + +Castopod är lätt att installera och byggdes ovanpå +[CodeIgniter4](https://codeigniter.com/), ett kraftfullt PHP-ramverk med ett +mycket litet fotavtryck. + + + +## Funktioner + +- 🌱  Gratis & öppen källkod (AGPL v3-licens) +- 🔐  Fokuserad på datasuveränitet: ditt innehåll, målgrupp och analys + tillhör dig, och du bara +- 🪄  Podcasting 2.0 funktioner: GUID, låst, avskrifter, finansiering, + kapitel, plats, personer, ljud, … +- 💬  Inbyggt socialt nätverk: + - 🚀  Castopod är en del av Fediverse, ett decentraliserat socialt + nätverk + - ❤️  Skapa inlägg, dela, favorit och kommentera avsnitt +- 📈  Inbyggd analys: + - ⚖️  GDPR / CCPA / LGPD kompatibel + - 🪙  Standard IABv2 målgruppsmätning + - 🏡  Lokalanalys, ingen tredje part involverad +- 📢  Inbyggda marknadsföringsverktyg: + - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) + - 📱  PWA: installera som en fristående app + - 🎨  Anpassningsbara temafärger + - 🎬  Generera att dela videoklipp från avsnitt + - 🔉  Generera ljudbitar + - ▶️  Inbäddbar spelare, bädda in dina avsnitt på valfri webbplats +- 💸  Monetization: + - 🔗  Finansierar länkar + - 📲  lista-att-klicka annonser + - 🤝  value4value / WebMonetization + - 💎  Premium podcasts +- 📡  Publicera dina avsnitt överallt med RSS: + - 📱  På alla index och appar: Podcast Index, Apple Podcasts, Spotify, + Google Podcasts, Deezer, Podcast Addict, Podfriend, … + - ⚡  Sänd dina avsnitt direkt med WebSub +- 📥  Podcast import: flytta din befintliga podcast till Castopod +- 📤  Flytta ut din podcast från Castopod +- 🔀  Flera hyresgäst: värd så många podcasts du vill +- 👥  Flera användare: lägg till bidragslämnare och ange roller +- 🌎  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. + +It is in fact one of the only media to have stayed this way for a long time. + +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. + +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized 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. + +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. + +## 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 you. + +### 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 it. + +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. + +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. + +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 journey. + +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. + +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! + +### 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 was initially built around music. And later on, as the project +evolved, the ability to host podcasts was introduced. + +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, …). + +So, you should probably use Funkwhale if you want to host your music, and use +Castopod if you want to host your podcasts. + +### 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! + +Each of these solutions differ from one another, you may compare with the +[list of features](#features). + +That being said, there are two main differences with other podcasting solutions: + +- 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 ä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å. + +## Hjälp till + +Love Castopod and would like to help? Take a look at the following documentation +to get you started. + +### 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 tolerated. + +### 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. + +## Alla bidragsgivare ✨ + +Thanks goes to these wonderful people +([emoji key](https://allcontributors.org/docs/en/emoji-key)): + +{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */} +{/* prettier-ignore-start */} +{/* markdownlint-disable */} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Yassine Doghri +
+ + Yassine Doghri + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 📖 + {" "} + + 👀 + {" "} + + 🚧 + {" "} + + 🖋 + {" "} + + 🎨 + {" "} + + ️️️️♿️ + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🧑‍🏫 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📆 + {" "} + + 📝 + +
+ + Benjamin Bellamy +
+ + Benjamin Bellamy + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 👀 + {" "} + + 🖋 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📝 + {" "} + + 📆 + {" "} + + 📢 + +
+ + Ola Hneini +
+ + Ola Hneini + +
+
+ + 💻 + {" "} + + 👀 + {" "} + + 📖 + {" "} + + 🚧 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Romain de Laage +
+ + Romain de Laage + +
+
+ + 💻 + {" "} + + 🚇 + {" "} + + 📖 + {" "} + + 🌍 + {" "} + + 🤔 + +
+ + Lyonel Bernard +
+ + Lyonel Bernard + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Christopher Lagonick-Weitzel +
+ + Christopher Lagonick-Weitzel + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Ernesto Acosta +
+ + Ernesto Acosta + +
+
+ + 🐛 + {" "} + + 🔊 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Ewen +
+ + Ewen + +
+
+ + 🌍 + {" "} + + 🤔 + {" "} + + 💻 + +
+ + Bastien Luneteau +
+ + Bastien Luneteau + +
+
+ + 💻 + {" "} + + 🐛 + +
+ + Cécile Ricordeau +
+ + Cécile Ricordeau + +
+
+ + 🎨 + +
+ + Patryk Miś +
+ + Patryk Miś + +
+
+ + 🌍 + +
+ + Marcin Lewandowski +
+ + Marcin Lewandowski + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Sebastian Janik +
+ + Sebastian Janik + +
+
+ + 💻 + +
+ + Patryk Karczmarczyk +
+ + Patryk Karczmarczyk + +
+
+ + 💻 + +
+ + denis d +
+ + denis d + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Douglas Kastle +
+ + Douglas Kastle + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + cExplorer +
+ + cExplorer + +
+
+ + 🐛 + {" "} + + 🌍 + +
+ + ImaCrea +
+ + ImaCrea + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Jonas S +
+ + Jonas S + +
+
+ + 💻 + +
+ + LEFEBVRE Yann +
+ + LEFEBVRE Yann + +
+
+ + 🐛 + +
+ + Sebastian Späth +
+ + Sebastian Späth + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + rocky III +
+ + rocky III + +
+
+ + 🐛 + +
+ + Hermann Josef Eckl +
+ + Hermann Josef Eckl + +
+
+ + 🐛 + +
+ + Delhaye Cyrille +
+ + Delhaye Cyrille + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + João Leandro +
+ + João Leandro + +
+
+ + 🌍 + {" "} + + 🤔 + +
+ + Angelos Chouvardas +
+ + Angelos Chouvardas + +
+
+ + 🌍 + +
+ + Eivind +
+ + Eivind + +
+
+ + 🌍 + +
+ + forght +
+ + forght + +
+
+ + 🌍 + +
+ + glottis0q +
+ + glottis0q + +
+
+ + 🌍 + +
+ + ButterflyOfFire +
+ + ButterflyOfFire + +
+
+ + 🌍 + +
+ + Lucian I. Last +
+ + Lucian I. Last + +
+
+ + 🌍 + +
+ + LuuzViir +
+ + LuuzViir + +
+
+ + 🌍 + +
+ + CTHTC +
+ + CTHTC + +
+
+ + 🌍 + +
+ + Russian Retro +
+ + Russian Retro + +
+
+ + 🌍 + +
+ + Marek L'ach +
+ + Marek L'ach + +
+
+ + 🌍 + +
+ + GunChleoc +
+ + GunChleoc + +
+
+ + 🌍 + +
+ + GabiSnow +
+ + GabiSnow + +
+
+ + 🌍 + +
+ + bendaha +
+ + bendaha + +
+
+ + 🌍 + +
+ + Samuel Roland +
+ + Samuel Roland + +
+
+ + 🌍 + +
+ + Dimitri Regnier +
+ + Dimitri Regnier + +
+
+ + 🤔 + +
+ + irithys +
+ + irithys + +
+
+ + 🌍 + +
+ + Sergi +
+ + Sergi + +
+
+ + 🌍 + +
+ + ghose (XoseM) +
+ + ghose (XoseM) + +
+
+ + 🌍 + +
+ + Andreas Olsson +
+ + Andreas Olsson + +
+
+ + 🌍 + +
+ + leonfrom +
+ + leonfrom + +
+
+ + 🌍 + +
+ + agentcobra +
+ + agentcobra + +
+
+ + 🌍 + +
+ + Alessandro +
+ + Alessandro + +
+
+ + 🌍 + +
+ + liimee +
+ + liimee + +
+
+ + 🌍 + +
+ + Ahmed Sabouni +
+ + Ahmed Sabouni + +
+
+ + 🌍 + +
+ + KrzysztofDomanczyk +
+ + KrzysztofDomanczyk + +
+
+ + 💻 + +
+ + Guy Martin +
+ + Guy Martin + +
+
+ + 🐛 + {" "} + + 💻 + +
+ +{/* markdownlint-restore */} +{/* prettier-ignore-end */} + +{/* ALL-CONTRIBUTORS-LIST:END */} + +This project follows the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind welcome! + +## Kontakt + +You may reach us for help or ask any question you have on: + +- [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: + +- [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) + +## 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). + +[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/) + +[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/) + +## Licens + +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) + +Copyright © 2020-present, [Ad Aures](https://adaures.com/). diff --git a/docs/src/content/docs/uk/getting-started/auth.mdx b/docs/src/content/docs/uk/getting-started/auth.mdx new file mode 100644 index 00000000..ee24a14c --- /dev/null +++ b/docs/src/content/docs/uk/getting-started/auth.mdx @@ -0,0 +1,84 @@ +--- +title: Аутентифікація & Авторизація +--- + +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, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| 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 dashboards and analytics of podcast #\{id\}'s episodes. | +| episodes.create | Can create episodes for podcast #\{id\}. | +| episodes.edit | Can edit episodes of podcast #\{id\}. | +| episodes.delete | Can delete episodes of podcast #\{id\}. | +| episodes.manage-persons | Can manage episode persons of podcast #\{id\}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #\{id\}. | +| episodes.manage-publications | Can publish/unpublish episodes and posts of podcast #\{id\}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #\{id\}. | + +{/* AUTH-PODCAST-PERMISSIONS-LIST:END */} diff --git a/docs/src/content/docs/uk/getting-started/docker.mdx b/docs/src/content/docs/uk/getting-started/docker.mdx new file mode 100644 index 00000000..6141377f --- /dev/null +++ b/docs/src/content/docs/uk/getting-started/docker.mdx @@ -0,0 +1,157 @@ +--- +title: Official Docker images +--- + +Castopod pushes 3 Docker images to the Docker Hub during its automated build +process: + +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit +- [**`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 + +Additionally, Castopod requires a MySQL-compatible database. A Redis database +can be added as a cache handler. + +## Supported tags + +- `develop` [unstable], latest development branch build +- `beta` [stable], latest beta version build +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) + +## Example usage + +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: + + ```yml + version: "3.7" + + services: + app: + image: castopod/castopod:latest + container_name: "castopod-app" + volumes: + - castopod-media:/var/www/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + CP_BASEURL: "https://castopod.example.com" + CP_ANALYTICS_SALT: changeme + CP_CACHE_HANDLER: redis + CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme + networks: + - castopod-app + - castopod-db + ports: + - 8000:8000 + restart: unless-stopped + + mariadb: + image: mariadb:10.5 + container_name: "castopod-mariadb" + networks: + - castopod-db + volumes: + - castopod-db:/var/lib/mysql + environment: + MYSQL_ROOT_PASSWORD: changeme + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + restart: unless-stopped + + redis: + image: redis:7.0-alpine + container_name: "castopod-redis" + command: --requirepass changeme + volumes: + - castopod-cache:/data + networks: + - castopod-app + + volumes: + castopod-media: + castopod-db: + castopod-cache: + + networks: + castopod-app: + castopod-db: + ``` + + You have to adapt some variables to your needs (e.g. `CP_BASEURL`, + `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). + +3. Setup a reverse proxy for 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/): + + ``` + #castopod + castopod.example.com { + reverse_proxy localhost:8000 + } + ``` + +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! + +5. You're all set, start podcasting! 🎙️🚀 + +## Environment Variables + +- **castopod/castopod** and **castopod/app** + + | Variable name | Type (`default`) | Default | + | ------------------------------------- | ----------------------- | ---------------- | + | **`CP_BASEURL`** | string | `undefined` | + | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | + | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | + | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | + | **`CP_ANALYTICS_SALT`** | string | `undefined` | + | **`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_REDIS_HOST`** | ?string | `"localhost"` | + | **`CP_REDIS_PASSWORD`** | ?string | `null` | + | **`CP_REDIS_PORT`** | ?number | `6379` | + | **`CP_REDIS_DATABASE`** | ?number | `0` | + | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | + | **`CP_EMAIL_FROM`** | ?string | `undefined` | + | **`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_ENABLE_2FA`** | ?boolean | `undefined` | + | **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` | + | **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` | + | **`CP_MEDIA_S3_KEY`** | ?string | `undefined` | + | **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` | + | **`CP_MEDIA_S3_REGION`** | ?string | `undefined` | + | **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` | + | **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` | + | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` | + | **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` | + | **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` | + | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | + | **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | + +- **castopod/web-server** + + | Variable name | Type | Default | + | ---------------------- | --------------------- | ------- | + | **`CP_APP_HOSTNAME`** | ?string | `"app"` | + | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | diff --git a/docs/src/sr_Latn/getting-started/install.md b/docs/src/content/docs/uk/getting-started/install.mdx similarity index 83% rename from docs/src/sr_Latn/getting-started/install.md rename to docs/src/content/docs/uk/getting-started/install.mdx index be94565a..9789a7fd 100644 --- a/docs/src/sr_Latn/getting-started/install.md +++ b/docs/src/content/docs/uk/getting-started/install.mdx @@ -1,22 +1,21 @@ --- -title: Instalacija -sidebarDepth: 3 +title: Kako Instalirati Castopod? --- -# Kako Instalirati Castopod? +import { Aside } from "@astrojs/starlight/components"; Zamišljeno je da Castopod bude jednostavan za instalaciju. Bilo da se koristi namenski ili deljeni hosting, možete ga instalirati na većinu PHP-MySQL kompatibilnih veb servera. -::: savet Napomena + ## Uslovi @@ -47,13 +46,13 @@ Pored toga, uverite se da su sledeće ekstenzije omogućene u vašem PHP-u: > Preporučujemo korišćenje [MariaDB](https://mariadb.org). -::: upozorenje Upozorenje + Trebaće vam ime servera, ime baze podataka, korisničko ime i lozinka za završite proces instalacije. Ako ih nemate, obratite se svom administratoru servera. @@ -116,13 +115,13 @@ radio: `CREATE`, `ALTER`, `DELETE`, `EXECUTE`, `INDEX`, `INSERT`, `SELECT`, 2. Pratite uputstva na ekranu. 3. Počnite sa podkastingom! -::: info Napomena + ### Korišćenje CLI @@ -230,13 +229,35 @@ upravlja teškoćama samo-hostovanje za vas. diff --git a/docs/src/content/docs/uk/getting-started/security.mdx b/docs/src/content/docs/uk/getting-started/security.mdx new file mode 100644 index 00000000..c039493c --- /dev/null +++ b/docs/src/content/docs/uk/getting-started/security.mdx @@ -0,0 +1,24 @@ +--- +title: Security concerns +--- + +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). + +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): + +- `writable/` folder must be **readable** and **writable**. +- `public/media/` folder must be **readable** and **writable**. +- any other file must be set to **readonly**. + +For instance, if you are using Apache or NGINX with Ubuntu you may do the +following: + +```bash +sudo chown -R root:root /path/to/castopod +sudo chown -R www-data:www-data /path/to/castopod/writable +sudo chown -R www-data:www-data /path/to/castopod/public/media +``` diff --git a/docs/src/content/docs/uk/getting-started/update.mdx b/docs/src/content/docs/uk/getting-started/update.mdx new file mode 100644 index 00000000..f1a26974 --- /dev/null +++ b/docs/src/content/docs/uk/getting-started/update.mdx @@ -0,0 +1,108 @@ +--- +title: How to update Castopod? +--- + +import { Aside } from "@astrojs/starlight/components"; + +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 ⚡. + +## Update instructions + +0. ⚠️ Before any update, we highly recommend you backup your Castopod files and + database. + + - cf. + [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 + + - cf. + [Where can I find my 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 + + - ⚠️ 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/) + +3. On your server: + + - Remove all files except `.env` and `public/media` + - Copy the new files from the downloaded package into your server + + + +4. Update your database schema from your `Castopod Admin` > `About` page or by + running: + + ```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! + + + +## Fully Automated updates + +> Coming soon... 👀 + +## Frequently asked questions (FAQ) + +### Where can I find my Castopod version? + +Go to your Castopod admin panel, the version is displayed on the bottom left +corner. + +Alternatively, you can find the version in the `app > Config > Constants.php` +file. + +### I haven't updated my instance in a long time… What should I do? + +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. + +> You may want to backup your instance depending on how long you haven't updated +> Castopod. + +For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to +`v1.0.0-beta.1`: + +0. (highly recommended) Make a backup of your files and database. + +1. Download the latest release, overwrite your files whilst keeping `.env` and + `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`, + `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`. + +3. ✨ Enjoy your fresh instance, you're all done! + +### Should I make a backup before updating? + +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… diff --git a/docs/src/content/docs/uk/index.mdx b/docs/src/content/docs/uk/index.mdx new file mode 100644 index 00000000..3f1ec043 --- /dev/null +++ b/docs/src/content/docs/uk/index.mdx @@ -0,0 +1,1349 @@ +--- +title: Welcome 👋 +--- + +import { LinkCard } from "@astrojs/starlight/components"; + +Castopod is a free & open-source hosting platform made for podcasters who want +engage and interact with their audience. + +Castopod is easy to install and was built on top of +[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very +small footprint. + + + +## Features + +- 🌱  Free & open-source (AGPL v3 License) +- 🔐  Focused on data sovereignty: your content, audience, and analytics + belong to you, and you only +- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, + chapters, location, persons, soundbites, … +- 💬  Built-in social network: + - 🚀  Castopod is part of the Fediverse, a decentralized social network + - ❤️  Create posts, share, favourite, and comment on episodes +- 📈  Built-in analytics: + - ⚖️  GDPR / CCPA / LGPD compliant + - 🪙  Standard IABv2 audience measurement + - 🏡  On-premises analytics, no third party involved +- 📢  Built-in marketing tools: + - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) + - 📱  PWA: install as a standalone app + - 🎨  Customizable theme colors + - 🎬  Generate ready-to-share Video clips from episodes + - 🔉  Generate soundbites + - ▶️  Embeddable player, embed your episodes on any website +- 💸  Monetization: + - 🔗  Funding links + - 📲  listen-to-click ads + - 🤝  value4value / WebMonetization + - 💎  Premium podcasts +- 📡  Publish your episodes everywhere with RSS: + - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, + Google Podcasts, Deezer, Podcast Addict, Podfriend, … + - ⚡  Broadcast your episodes instantly with WebSub +- 📥  Podcast import: move your existing podcast into Castopod +- 📤  Move your podcast out of Castopod +- 🔀  Multi-tenant: host as many podcasts as you want +- 👥  Multi-user: add contributors and set roles +- 🌎  i18n support: translated in English, French, Polish, German, + Brazilian Portuguese & Spanish… with + [more to come](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. + +It is in fact one of the only media to have stayed this way for a long time. + +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. + +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized 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. + +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. + +## Comparison with other solutions + +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 you. + +### 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 it. + +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. + +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. + +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 journey. + +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. + +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! + +### 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 was initially built around music. And later on, as the project +evolved, the ability to host podcasts was introduced. + +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, …). + +So, you should probably use Funkwhale if you want to host your music, and use +Castopod if you want to host your podcasts. + +### Castopod vs other podcast hosts + +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! + +Each of these solutions differ from one another, you may compare with the +[list of features](#features). + +That being said, there are two main differences with other podcasting solutions: + +- 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 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. + +## Contributing + +Love Castopod and would like to help? Take a look at the following documentation +to get you started. + +### Code of conduct + +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 tolerated. + +### Contributing 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. + +## Contributors ✨ + +Thanks goes to these wonderful people +([emoji key](https://allcontributors.org/docs/en/emoji-key)): + +{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */} +{/* prettier-ignore-start */} +{/* markdownlint-disable */} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Yassine Doghri +
+ + Yassine Doghri + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 📖 + {" "} + + 👀 + {" "} + + 🚧 + {" "} + + 🖋 + {" "} + + 🎨 + {" "} + + ️️️️♿️ + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🧑‍🏫 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📆 + {" "} + + 📝 + +
+ + Benjamin Bellamy +
+ + Benjamin Bellamy + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 👀 + {" "} + + 🖋 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📝 + {" "} + + 📆 + {" "} + + 📢 + +
+ + Ola Hneini +
+ + Ola Hneini + +
+
+ + 💻 + {" "} + + 👀 + {" "} + + 📖 + {" "} + + 🚧 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Romain de Laage +
+ + Romain de Laage + +
+
+ + 💻 + {" "} + + 🚇 + {" "} + + 📖 + {" "} + + 🌍 + {" "} + + 🤔 + +
+ + Lyonel Bernard +
+ + Lyonel Bernard + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Christopher Lagonick-Weitzel +
+ + Christopher Lagonick-Weitzel + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Ernesto Acosta +
+ + Ernesto Acosta + +
+
+ + 🐛 + {" "} + + 🔊 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Bastien Luneteau +
+ + Bastien Luneteau + +
+
+ + 💻 + {" "} + + 🐛 + +
+ + Cécile Ricordeau +
+ + Cécile Ricordeau + +
+
+ + 🎨 + +
+ + Patryk Miś +
+ + Patryk Miś + +
+
+ + 🌍 + +
+ + Marcin Lewandowski +
+ + Marcin Lewandowski + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Sebastian Janik +
+ + Sebastian Janik + +
+
+ + 💻 + +
+ + Patryk Karczmarczyk +
+ + Patryk Karczmarczyk + +
+
+ + 💻 + +
+ + denis d +
+ + denis d + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Douglas Kastle +
+ + Douglas Kastle + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + cExplorer +
+ + cExplorer + +
+
+ + 🐛 + {" "} + + 🌍 + +
+ + ImaCrea +
+ + ImaCrea + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Jonas S +
+ + Jonas S + +
+
+ + 💻 + +
+ + LEFEBVRE Yann +
+ + LEFEBVRE Yann + +
+
+ + 🐛 + +
+ + Sebastian Späth +
+ + Sebastian Späth + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + rocky III +
+ + rocky III + +
+
+ + 🐛 + +
+ + Hermann Josef Eckl +
+ + Hermann Josef Eckl + +
+
+ + 🐛 + +
+ + Delhaye Cyrille +
+ + Delhaye Cyrille + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + João Leandro +
+ + João Leandro + +
+
+ + 🌍 + {" "} + + 🤔 + +
+ + Angelos Chouvardas +
+ + Angelos Chouvardas + +
+
+ + 🌍 + +
+ + Eivind +
+ + Eivind + +
+
+ + 🌍 + +
+ + Ewen +
+ + Ewen + +
+
+ + 🌍 + {" "} + + 🤔 + +
+ + forght +
+ + forght + +
+
+ + 🌍 + +
+ + glottis0q +
+ + glottis0q + +
+
+ + 🌍 + +
+ + ButterflyOfFire +
+ + ButterflyOfFire + +
+
+ + 🌍 + +
+ + Lucian I. Last +
+ + Lucian I. Last + +
+
+ + 🌍 + +
+ + LuuzViir +
+ + LuuzViir + +
+
+ + 🌍 + +
+ + CTHTC +
+ + CTHTC + +
+
+ + 🌍 + +
+ + Russian Retro +
+ + Russian Retro + +
+
+ + 🌍 + +
+ + Marek L'ach +
+ + Marek L'ach + +
+
+ + 🌍 + +
+ + GunChleoc +
+ + GunChleoc + +
+
+ + 🌍 + +
+ + GabiSnow +
+ + GabiSnow + +
+
+ + 🌍 + +
+ + bendaha +
+ + bendaha + +
+
+ + 🌍 + +
+ + Samuel Roland +
+ + Samuel Roland + +
+
+ + 🌍 + +
+ + Dimitri Regnier +
+ + Dimitri Regnier + +
+
+ + 🤔 + +
+ + irithys +
+ + irithys + +
+
+ + 🌍 + +
+ + Sergi +
+ + Sergi + +
+
+ + 🌍 + +
+ + ghose (XoseM) +
+ + ghose (XoseM) + +
+
+ + 🌍 + +
+ + Andreas Olsson +
+ + Andreas Olsson + +
+
+ + 🌍 + +
+ + leonfrom +
+ + leonfrom + +
+
+ + 🌍 + +
+ + agentcobra +
+ + agentcobra + +
+
+ + 🌍 + +
+ + Alessandro +
+ + Alessandro + +
+
+ + 🌍 + +
+ + liimee +
+ + liimee + +
+
+ + 🌍 + +
+ + Ahmed Sabouni +
+ + Ahmed Sabouni + +
+
+ + 🌍 + +
+ + KrzysztofDomanczyk +
+ + KrzysztofDomanczyk + +
+
+ + 💻 + +
+ +{/* markdownlint-restore */} +{/* prettier-ignore-end */} + +{/* ALL-CONTRIBUTORS-LIST:END */} + +This project follows the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind welcome! + +## Contact + +You may reach us for help or ask any question you have on: + +- [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) + +Alternatively, you can follow us on social media platforms to get news about +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 + +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). + +[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/) + +[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/) + +## License + +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) + +Copyright © 2020-present, [Ad Aures](https://adaures.com/). diff --git a/docs/src/content/docs/zh-hans/getting-started/auth.mdx b/docs/src/content/docs/zh-hans/getting-started/auth.mdx new file mode 100644 index 00000000..cae37622 --- /dev/null +++ b/docs/src/content/docs/zh-hans/getting-started/auth.mdx @@ -0,0 +1,84 @@ +--- +title: 验证 & 授权 +--- + +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 */} + +| role | description | permissions | +| ---------- | ---------------------------- | ------------------------------------------------------------------------------------------ | +| 超级管理员 | 拥有对 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 */} + +| permission | description | +| ----------------------- | ------------------------------------------- | +| 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 */} + +| role | description | permissions | +| ------ | ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 管理员 | 完全控制播客 #\{id\}。 | \* | +| 编辑 | 管理播客 #\{id\} 的内容和出版物。 | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| 作者 | 管理播客 #\{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 */} + +| permission | description | +| ---------------------------- | ----------------------------------------------------- | +| view | 可以查看播客 #\{id\} 的仪表板和分析。 | +| edit | 可以编辑播客 #\{id\}。 | +| delete | 可以删除播客 #\{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 */} diff --git a/docs/src/zh-Hans/getting-started/docker.md b/docs/src/content/docs/zh-hans/getting-started/docker.mdx similarity index 99% rename from docs/src/zh-Hans/getting-started/docker.md rename to docs/src/content/docs/zh-hans/getting-started/docker.mdx index 2ffa2369..0e6a6227 100644 --- a/docs/src/zh-Hans/getting-started/docker.md +++ b/docs/src/content/docs/zh-hans/getting-started/docker.mdx @@ -1,10 +1,7 @@ --- title: 官方 Docker 镜像 -sidebarDepth: 3 --- -# 官方 Docker 镜像 - Castopod 在其自动构建期间会将 3 个 Docker 映像推送到 Docker Hub : - [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod);一个使 diff --git a/docs/src/zh-Hans/getting-started/install.md b/docs/src/content/docs/zh-hans/getting-started/install.mdx similarity index 82% rename from docs/src/zh-Hans/getting-started/install.md rename to docs/src/content/docs/zh-hans/getting-started/install.mdx index abd5fc8b..d3e7e614 100644 --- a/docs/src/zh-Hans/getting-started/install.md +++ b/docs/src/content/docs/zh-hans/getting-started/install.mdx @@ -1,21 +1,20 @@ --- -title: 安装 -sidebarDepth: 3 +title: 如何安装 Castopod ? --- -# 如何安装 Castopod ? +import { Aside } from "@astrojs/starlight/components"; Castopod 的安装非常简单。 你能在大多数兼容的 PHP-MySQL 的服务器上安装 Castopod, 无论是专用还是 共享主机。 -::: 注意 + ## 要求 @@ -45,12 +44,12 @@ PHP version 8.1 or higher is required, with the following extensions installed: > 我们建议使用 [MariaDB](https://mariadb.org)。 -::: 警告 + 你需要填写服务器主机名、数据库名称、用户名和密码才能完成安装过程。 如果没有这 些,请与你的服务器管理员联系。 @@ -106,12 +105,12 @@ Castopod 仅适用于受支持的 MySQL 5.7 或更高版本的兼容数据库。 2. 请按照屏幕上的说明进行操作。 3. 开始播客! -::: 注意 + ### Using CLI @@ -212,13 +211,35 @@ media.s3.region="your_s3_region" diff --git a/docs/src/zh-Hans/getting-started/security.md b/docs/src/content/docs/zh-hans/getting-started/security.mdx similarity index 96% rename from docs/src/zh-Hans/getting-started/security.md rename to docs/src/content/docs/zh-hans/getting-started/security.mdx index 15a51f92..78c367e6 100644 --- a/docs/src/zh-Hans/getting-started/security.md +++ b/docs/src/content/docs/zh-hans/getting-started/security.mdx @@ -1,9 +1,7 @@ --- -title: 安全性 +title: 安全问题 --- -# 安全问题 - Castopod 构建于 [CodeIgniter4](https://codeigniter.com/), PHP 框架上,鼓励 [更好的安全实践](https://codeigniter.com/user_guide/concepts/security.html)。 diff --git a/docs/src/zh-Hans/getting-started/update.md b/docs/src/content/docs/zh-hans/getting-started/update.mdx similarity index 96% rename from docs/src/zh-Hans/getting-started/update.md rename to docs/src/content/docs/zh-hans/getting-started/update.mdx index ab003891..2fd3569a 100644 --- a/docs/src/zh-Hans/getting-started/update.md +++ b/docs/src/content/docs/zh-hans/getting-started/update.mdx @@ -1,9 +1,8 @@ --- -title: 更新 -sidebarDepth: 3 +title: 如何更新 Castopod ? --- -# 如何更新 Castopod ? +import { Aside } from "@astrojs/starlight/components"; 安装 Castopod 后,你可能希望将实例更新到最新版本 版本以享受最新功能 ✨, 修复错误 🐛 和性能提升 ⚡。 @@ -31,12 +30,12 @@ sidebarDepth: 3 - 删除除 `.env` 文件和 `public/media` 目录之外的所有文件 - 将下载软件包中的新文件复制到你的服务器中 - ::: 注意 + 4. 从你的 `后台管理` > 更新你的数据库架构 `关于` 页或开始: @@ -47,7 +46,7 @@ sidebarDepth: 3 5. 从 `Castopod 管理页面` > `设置` > `通常` > `维护` 清理你的缓存 6. ✨ 享受你的新实例, 你已经更新完毕! -::: 注意 + ## 全自动更新 diff --git a/docs/src/content/docs/zh-hans/index.mdx b/docs/src/content/docs/zh-hans/index.mdx new file mode 100644 index 00000000..d14369b0 --- /dev/null +++ b/docs/src/content/docs/zh-hans/index.mdx @@ -0,0 +1,1354 @@ +--- +title: 欢迎 👋 +--- + +import { LinkCard } from "@astrojs/starlight/components"; + +Castopod 是一个免费的开源播客托管平台,为那些想要和听众接触与互动的播客们制作 +的。 + +Castopod 易于安装,并使用 [CodeIgniter4](https://codeigniter.com/) 构建, 这是一 +个强大的 PHP 框架,并且占用极小。 + + + +## 功能特色 + +- 🌱  免费与开源(AGPL v3 许可证) +- 🔐  专注于数据主权:你的内容、受众和分析属于你,而且只属于你 +- 🪄  播客 2.0 功能:GUID,锁定,报表,资金,章节,位置信息,人员,原声摘要 + ... +- 💬  内置社交网络: + - 🚀  Castopod 是联邦宇宙的一部分,联邦宇宙是一个去中心化的社交网络 + - ❤️  创建帖子、分享、收藏和评论剧集。 +- 📈  内置分析: + - ⚖️  符合 GDPR / CCPA / LGPD 标准 + - 🪙  标准 IABv2 受众测量 + - 🏡  本地分析,不涉及第三方 +- 📢  内置营销工具: + - ✅  SEO 开箱即用(open-graph meta-tags,JSON-LD 等) + - 📱  PWA:作为独立应用安装 + - 🎨  自定义的主题颜色 + - 🎬  从单个剧集生成随时可以共享的视频素材 + - 🔉  生成原声摘要 + - ▶️  嵌入式播放器,将你的剧集嵌入任何网站 +- 💸  货币: + - 🔗  资金链接 + - 📲  点击收听广告 + - 🤝  value4value / 网络货币化 + - 💎  高级版播客 +- 📡  使用 RSS 将你的剧集发布到任何地方: + - 📱  支持众多索引和应用程序:Podcast Index,Apple + Podcasts,Spotify,Google Podcasts,Deezer,Podcast Addict,Podfriend... + - ⚡  使用 WebSub 即时广播你的剧集 +- 📥  播客导入:将现有播客移至 Castopod +- 📤  也支持将播客移出 Castopod +- 🔀  多租户:根据需要托管任意数量的播客 +- 👥  多用户:添加贡献者并设置角色 +- 🌎  i18n 支持:翻译成英语,法语,波兰语,德语,巴西葡萄牙语和西班牙语 + ...[还有更多](https://translate.castopod.org)! + +## 创作动机 + +播客生态系统本质上是去中心化的:你可以创建自己的播客 RSS 文件,将其发布到网络上 +并在线共享。 + +事实上,它是唯一长期保持这种状态的媒体之一。 + +随着习惯的发展,越来越多的人开始接触播客:允许创作者寻找新的方式来分享他们的想 +法,或是让听众获得更好的内容。 + +随着播客的使用越来越广泛,一些公司正试图控制播客与集中化。 + +Castopod 的创建旨在提供一种开放且可持续的替代方案来托管你的播客,促进权力下放, +确保播客可以用创造力表达自己。 + +此项目由开源社区推动的,特别是 +由[联邦宇宙](https://fediverse.party/en/fediverse/) 和 +[播客 2.0](https://podcastindex.org/) 推动。 + +## 与其他解决方案的对比 + +我们相信此解决方案不一定适合所有人,它只取决于你是否需要。 因此,下面是与其他解 +决方案的比较,可帮助判断 Castopod 是否适合你。 + +### Castopod 对比 Wordpress + +Castopod 经常被称为 “播客中的 Wordpress”,因为两者有很多相似之处。 在某些方面, +确实如此。 实际上,Castopod 受到 WordPress 生态的极大启发,看到了采用社区的易用 +性以及运行它的网站数量。 + +就像 Wordpress 一样,Castopod 是免费 & 开源的,PHP 构建并使用 MySQL 数据库,可以 +在大多数 Web 服务器上轻松安装。 + +Wordpress 是创建你的网站,并使用插件扩展以获得想要内容的好办法。 这是一个成熟的 +CMS,可以帮助你在线访问任何类型的网站。 + +另一方面,Castopod 旨在专门满足播客的需求,专注于播客,而不是其他。 你不需要任何 +插件即可轻松开始播客之旅。 + +还拥有对播客的独特优化:从播客的创建和新剧集的发布一直到广播,营销和分析。 + +最后,根据你的需要,Wordpress 和 Castopod 甚至可以共存,因为他们有相同的配置环 +境! + +### Castopod 对比 Funkwhale + +Funkwhale 是一个自托管、现代界面、免费开源的音乐服务器。 就像 Castopod 一 +样,Funkwhale 也位于联邦宇宙中,这是一个去中心化的社交网络,允许两者的互联。 + +Funkwhale 最初是围绕音乐制作的。 后来,随着项目的发展,引入了托管播客的能力。 + +与 Funkwhale 不同,Castopod 是只围绕播客设计和构建的。 这样可以更简单地实现与播 +客相关的生态系统,例如播客 2.0 功能(报表、 章节、地点、人员…)。 + +因此,如果你想托管你的音乐库,你可能应该使用 Funkwhale,如果您想主持一个播客,请 +使用 Castopod。 + +### Castopod 与其他播客 + +有许多非常棒地解决方案可供你托管播客,并 +且[很多](https://podcastindex.org/apps)正在搭上播客 2.0 的便车,就像 Castopod 一 +样! + +这些解决方案各不相同,你可以对比 [功能列表](#features)。 + +话虽如此,Castopod 与其他播客解决方案有两个主要区别: + +- Castopod 是自托管的,唯一允许你控制所有数据的方案。 并且,由于是开源的,甚至可 + 以按自己的想法修改。 + +- Castopod 是目前唯一一个同时集成去中心化的,带有 ActivePub 的社交网络以及很多播 + 客 2.0 功能集成的解决方案,希望弥合两者之间的差距。 + +## 贡献 + +喜欢 Castopod 并且想帮忙吗? 请查看以下文档以帮助你入门。 请查看以下文档以帮助你 +入门。 + +### 行为准则 + +Castopod 已经通过了一项行为准则,并希望所有的参与者都能够遵循本行为准则。 请阅 +读[行为准则](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md) +以便了解哪些行为被允许,哪些行为不会被容忍。 + +### 贡献指南 + +阅读我们的 [贡献指南](../contributing/guidelines.md) ,了解我们的开发过程。 提出 +错 误修正和改进想法,以及如何构建和测试 Castopod 。 + +## 贡献者 ✨ + +感谢这些了不起的人([表情符号键](https://allcontributors.org/docs/en/emoji-key)): + +{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */} +{/* prettier-ignore-start */} +{/* markdownlint-disable */} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Yassine Doghri +
+ + Yassine Doghri + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 📖 + {" "} + + 👀 + {" "} + + 🚧 + {" "} + + 🖋 + {" "} + + 🎨 + {" "} + + ️️️️♿️ + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🧑‍🏫 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📆 + {" "} + + 📝 + +
+ + Benjamin Bellamy +
+ + Benjamin Bellamy + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 👀 + {" "} + + 🖋 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📝 + {" "} + + 📆 + {" "} + + 📢 + +
+ + Ola Hneini +
+ + Ola Hneini + +
+
+ + 💻 + {" "} + + 👀 + {" "} + + 📖 + {" "} + + 🚧 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Romain de Laage +
+ + Romain de Laage + +
+
+ + 💻 + {" "} + + 🚇 + {" "} + + 📖 + {" "} + + 🌍 + {" "} + + 🤔 + +
+ + Lyonel Bernard +
+ + Lyonel Bernard + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Christopher Lagonick-Weitzel +
+ + Christopher Lagonick-Weitzel + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Ernesto Acosta +
+ + Ernesto Acosta + +
+
+ + 🐛 + {" "} + + 🔊 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Ewen +
+ + Ewen + +
+
+ + 🌍 + {" "} + + 🤔 + {" "} + + 💻 + +
+ + Bastien Luneteau +
+ + Bastien Luneteau + +
+
+ + 💻 + {" "} + + 🐛 + +
+ + Cécile Ricordeau +
+ + Cécile Ricordeau + +
+
+ + 🎨 + +
+ + Patryk Miś +
+ + Patryk Miś + +
+
+ + 🌍 + +
+ + Marcin Lewandowski +
+ + Marcin Lewandowski + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Sebastian Janik +
+ + Sebastian Janik + +
+
+ + 💻 + +
+ + Patryk Karczmarczyk +
+ + Patryk Karczmarczyk + +
+
+ + 💻 + +
+ + denis d +
+ + denis d + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Douglas Kastle +
+ + Douglas Kastle + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + cExplorer +
+ + cExplorer + +
+
+ + 🐛 + {" "} + + 🌍 + +
+ + ImaCrea +
+ + ImaCrea + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Jonas S +
+ + Jonas S + +
+
+ + 💻 + +
+ + LEFEBVRE Yann +
+ + LEFEBVRE Yann + +
+
+ + 🐛 + +
+ + Sebastian Späth +
+ + Sebastian Späth + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + rocky III +
+ + rocky III + +
+
+ + 🐛 + +
+ + Hermann Josef Eckl +
+ + Hermann Josef Eckl + +
+
+ + 🐛 + +
+ + Delhaye Cyrille +
+ + Delhaye Cyrille + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + João Leandro +
+ + João Leandro + +
+
+ + 🌍 + {" "} + + 🤔 + +
+ + Angelos Chouvardas +
+ + Angelos Chouvardas + +
+
+ + 🌍 + +
+ + Eivind +
+ + Eivind + +
+
+ + 🌍 + +
+ + forght +
+ + forght + +
+
+ + 🌍 + +
+ + glottis0q +
+ + glottis0q + +
+
+ + 🌍 + +
+ + ButterflyOfFire +
+ + ButterflyOfFire + +
+
+ + 🌍 + +
+ + Lucian I. Last +
+ + Lucian I. Last + +
+
+ + 🌍 + +
+ + LuuzViir +
+ + LuuzViir + +
+
+ + 🌍 + +
+ + CTHTC +
+ + CTHTC + +
+
+ + 🌍 + +
+ + Russian Retro +
+ + Russian Retro + +
+
+ + 🌍 + +
+ + Marek L'ach +
+ + Marek L'ach + +
+
+ + 🌍 + +
+ + GunChleoc +
+ + GunChleoc + +
+
+ + 🌍 + +
+ + GabiSnow +
+ + GabiSnow + +
+
+ + 🌍 + +
+ + bendaha +
+ + bendaha + +
+
+ + 🌍 + +
+ + Samuel Roland +
+ + Samuel Roland + +
+
+ + 🌍 + +
+ + Dimitri Regnier +
+ + Dimitri Regnier + +
+
+ + 🤔 + +
+ + irithys +
+ + irithys + +
+
+ + 🌍 + +
+ + Sergi +
+ + Sergi + +
+
+ + 🌍 + +
+ + ghose (XoseM) +
+ + ghose (XoseM) + +
+
+ + 🌍 + +
+ + Andreas Olsson +
+ + Andreas Olsson + +
+
+ + 🌍 + +
+ + leonfrom +
+ + leonfrom + +
+
+ + 🌍 + +
+ + agentcobra +
+ + agentcobra + +
+
+ + 🌍 + +
+ + Alessandro +
+ + Alessandro + +
+
+ + 🌍 + +
+ + liimee +
+ + liimee + +
+
+ + 🌍 + +
+ + Ahmed Sabouni +
+ + Ahmed Sabouni + +
+
+ + 🌍 + +
+ + KrzysztofDomanczyk +
+ + KrzysztofDomanczyk + +
+
+ + 💻 + +
+ + Guy Martin +
+ + Guy Martin + +
+
+ + 🐛 + {" "} + + 💻 + +
+ +{/* markdownlint-restore */} +{/* prettier-ignore-end */} + +{/* ALL-CONTRIBUTORS-LIST:END */} + +此项目遵循 [所有贡献者](https://github.com/all-contributors/all-contributors) 规 +范。 欢迎任何形式的贡献! + +## 联系 + +你可以联系我们寻求帮助或提出任何问题: + +- [Discord](https://castopod.org/discord) (用于与开发人员和社区直接互动) +- [问题跟踪器](https://code.castopod.org/adaures/castopod/-/issues)(用于功能请 + 求和错误报告) + +或者,你可以在社交媒体上关注我们,以获取有关 Castopod 的新闻: + +- [podlibre.social](https://podlibre.social/@Castopod) (Mastodon 实例) +- [推特](https://twitter.com/castopod) +- [领英](https://linkedin.com/company/castopod) +- [脸书](https://www.facebook.com/castopod) + +## 赞助商 + +Castopod 的发展离不开赞助商的支持。 如果你想要帮助我们,请考 +虑[赞助 Castopod 的开发](https://opencollective.com/castopod/contribute). + +[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/) + +[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/) + +## 许可证 + +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) + +版权 ©️ 2020至今, [Audes](https://adaures.com/)。 diff --git a/docs/src/zh-Hant/getting-started/auth.md b/docs/src/content/docs/zh-hant/getting-started/auth.mdx similarity index 50% rename from docs/src/zh-Hant/getting-started/auth.md rename to docs/src/content/docs/zh-hant/getting-started/auth.mdx index 90e50e53..7d5daeeb 100644 --- a/docs/src/zh-Hant/getting-started/auth.md +++ b/docs/src/content/docs/zh-hant/getting-started/auth.mdx @@ -1,10 +1,7 @@ --- title: 認證 & 授權 -sidebarDepth: 3 --- -# 認證 & 授權 - Castopod 使用 `codeigniter/shield` 處理身分認證和授權 與自定義規則。 腳色和權限 在定義為兩個層級: @@ -15,21 +12,21 @@ Castopod 使用 `codeigniter/shield` 處理身分認證和授權 與自定義規 ### 實例腳色 - +{/* 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 */} ### 實例權限 - +{/* 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. | @@ -41,47 +38,47 @@ Castopod 使用 `codeigniter/shield` 處理身分認證和授權 與自定義規 | podcasts.import | Can import podcasts. | | fediverse.manage-blocks | Can block fediverse actors/domains from interacting with Castopod. | - +{/* AUTH-INSTANCE-PERMISSIONS-LIST:END */} ## 2. 每個播客腳色與權限 ### 每個播客腳色 - +{/* AUTH-PODCAST-ROLES-LIST:START - Do not remove or modify this section */} -| 腳色 | 說明 | 權限 | -| ------ | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 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, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| 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 | +| 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, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | +| 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 */} ### 每個播客權限 - +{/* AUTH-PODCAST-PERMISSIONS-LIST:START - Do not remove or modify this section */} -| 權限 | 說明 | -| ---------------------------- | ------------------------------------------------------------------------ | -| 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}. | +| 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 dashboards and analytics of podcast #\{id\}'s episodes. | +| episodes.create | Can create episodes for podcast #\{id\}. | +| episodes.edit | Can edit episodes of podcast #\{id\}. | +| episodes.delete | Can delete episodes of podcast #\{id\}. | +| episodes.manage-persons | Can manage episode persons of podcast #\{id\}. | +| episodes.manage-clips | Can manage video clips or soundbites of podcast #\{id\}. | +| episodes.manage-publications | Can publish/unpublish episodes and posts of podcast #\{id\}. | +| episodes.manage-comments | Can create/remove episode comments of podcast #\{id\}. | - +{/* AUTH-PODCAST-PERMISSIONS-LIST:END */} diff --git a/docs/src/content/docs/zh-hant/getting-started/docker.mdx b/docs/src/content/docs/zh-hant/getting-started/docker.mdx new file mode 100644 index 00000000..6141377f --- /dev/null +++ b/docs/src/content/docs/zh-hant/getting-started/docker.mdx @@ -0,0 +1,157 @@ +--- +title: Official Docker images +--- + +Castopod pushes 3 Docker images to the Docker Hub during its automated build +process: + +- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all + in one castopod image using nginx unit +- [**`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 + +Additionally, Castopod requires a MySQL-compatible database. A Redis database +can be added as a cache handler. + +## Supported tags + +- `develop` [unstable], latest development branch build +- `beta` [stable], latest beta version build +- `latest` [stable], latest version build +- `1.x.x` [stable], specific version build (since `1.0.0`) + +## Example usage + +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: + + ```yml + version: "3.7" + + services: + app: + image: castopod/castopod:latest + container_name: "castopod-app" + volumes: + - castopod-media:/var/www/castopod/public/media + environment: + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + CP_BASEURL: "https://castopod.example.com" + CP_ANALYTICS_SALT: changeme + CP_CACHE_HANDLER: redis + CP_REDIS_HOST: redis + CP_REDIS_PASSWORD: changeme + networks: + - castopod-app + - castopod-db + ports: + - 8000:8000 + restart: unless-stopped + + mariadb: + image: mariadb:10.5 + container_name: "castopod-mariadb" + networks: + - castopod-db + volumes: + - castopod-db:/var/lib/mysql + environment: + MYSQL_ROOT_PASSWORD: changeme + MYSQL_DATABASE: castopod + MYSQL_USER: castopod + MYSQL_PASSWORD: changeme + restart: unless-stopped + + redis: + image: redis:7.0-alpine + container_name: "castopod-redis" + command: --requirepass changeme + volumes: + - castopod-cache:/data + networks: + - castopod-app + + volumes: + castopod-media: + castopod-db: + castopod-cache: + + networks: + castopod-app: + castopod-db: + ``` + + You have to adapt some variables to your needs (e.g. `CP_BASEURL`, + `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). + +3. Setup a reverse proxy for 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/): + + ``` + #castopod + castopod.example.com { + reverse_proxy localhost:8000 + } + ``` + +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! + +5. You're all set, start podcasting! 🎙️🚀 + +## Environment Variables + +- **castopod/castopod** and **castopod/app** + + | Variable name | Type (`default`) | Default | + | ------------------------------------- | ----------------------- | ---------------- | + | **`CP_BASEURL`** | string | `undefined` | + | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | + | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | + | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | + | **`CP_ANALYTICS_SALT`** | string | `undefined` | + | **`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_REDIS_HOST`** | ?string | `"localhost"` | + | **`CP_REDIS_PASSWORD`** | ?string | `null` | + | **`CP_REDIS_PORT`** | ?number | `6379` | + | **`CP_REDIS_DATABASE`** | ?number | `0` | + | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | + | **`CP_EMAIL_FROM`** | ?string | `undefined` | + | **`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_ENABLE_2FA`** | ?boolean | `undefined` | + | **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` | + | **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` | + | **`CP_MEDIA_S3_KEY`** | ?string | `undefined` | + | **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` | + | **`CP_MEDIA_S3_REGION`** | ?string | `undefined` | + | **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` | + | **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` | + | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` | + | **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` | + | **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` | + | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | + | **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | + +- **castopod/web-server** + + | Variable name | Type | Default | + | ---------------------- | --------------------- | ------- | + | **`CP_APP_HOSTNAME`** | ?string | `"app"` | + | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | + | **`CP_TIMEOUT`** | ?number | `900` | diff --git a/docs/src/content/docs/zh-hant/getting-started/install.mdx b/docs/src/content/docs/zh-hant/getting-started/install.mdx new file mode 100644 index 00000000..d8888954 --- /dev/null +++ b/docs/src/content/docs/zh-hant/getting-started/install.mdx @@ -0,0 +1,251 @@ +--- +title: How to install Castopod? +--- + +import { Aside } from "@astrojs/starlight/components"; + +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. + + + +## Requirements + +- PHP v8.1 or higher +- MySQL version 5.7 or higher or MariaDB version 10.2 or higher +- HTTPS support +- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's + incoming requests + +### PHP v8.1 or higher + +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. +- [exif](https://www.php.net/manual/en/exif.installation.php) + +Additionally, make sure that the following extensions are enabled in your PHP: + +- json (enabled by default - don't turn it off) +- xml (enabled by default - don't turn it off) +- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php) + +### MySQL compatible database + +> We recommend using [MariaDB](https://mariadb.org). + +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. + +#### Privileges + +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`. + +### (Optional) FFmpeg v4.1.8 or higher for Video Clips + +[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: + +- **FreeType 2** library for + [gd](https://www.php.net/manual/en/image.installation.php). + +### (Optional) Other recommendations + +- Redis for better cache performances. +- CDN for static files caching and better performances. +- e-mail gateway for lost passwords. + +## Install instructions + +### Pre-requisites + +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 haven’t 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): + + ```bash + * * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1 + ``` + + **Note** - If you do not add this cron task, the following Castopod features + will not work: + + - Importing a podcast from an existing RSS feed + - Broadcasting social activities to your followers in the fediverse + - Broadcasting episodes to open hubs using + [WebSub](https://en.wikipedia.org/wiki/WebSub) + - Generating video clips - + [requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips) + +### (recommended) Install Wizard + +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! + + + +### Using CLI + +1. Create a `.env` file in the package root based on the `.env.example` file. +2. Initialize the database using: + + ```sh + php spark install:init-database + ``` + +3. Create the superadmin user using: + + ```sh + php spark install:create-superadmin + ``` + +4. Head on to your admin gateway to start podcasting! + +### Email/SMTP setup + +Email configuration is required for some features to work properly (eg. +retrieving your forgotten password, sending instructions to premium subscribers, +…) + +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" +``` + +#### Email config options + +| 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"` | + +### Media storage + +By default, files are saved to the `public/media` folder using the file system. +If you need to relocate the `media` folder to a different location, you can +specify it in your `.env` file as shown below: + +```ini +# […] + +media.root="media" +media.storage="/mnt/storage" +``` + +In this example, the files will be saved to the /mnt/storage/media folder. Make +sure to also update your web server configuration to reflect this change. + +### S3 + +If you prefer storing your media files on an S3 compatible storage, you may +specify it in your `.env`: + +```ini +# […] + +media.fileManager="s3" +media.s3.endpoint="your_s3_host" +media.s3.key="your_s3_key" +media.s3.secret="your_s3_secret" +media.s3.region="your_s3_region" +``` + +#### S3 config options + +| Variable name | Type | Default | +| ----------------------- | ------- | ----------- | +| **`endpoint`** | string | `undefined` | +| **`key`** | string | `undefined` | +| **`secret`** | string | `undefined` | +| **`region`** | string | `undefined` | +| **`bucket`** | string | `castopod` | +| **`protocol`** | number | `undefined` | +| **`pathStyleEndpoint`** | boolean | `false` | +| **`keyPrefix`** | string | `undefined` | + +## Community packages + +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. + +### Install with 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. + + diff --git a/docs/src/content/docs/zh-hant/getting-started/security.mdx b/docs/src/content/docs/zh-hant/getting-started/security.mdx new file mode 100644 index 00000000..c039493c --- /dev/null +++ b/docs/src/content/docs/zh-hant/getting-started/security.mdx @@ -0,0 +1,24 @@ +--- +title: Security concerns +--- + +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). + +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): + +- `writable/` folder must be **readable** and **writable**. +- `public/media/` folder must be **readable** and **writable**. +- any other file must be set to **readonly**. + +For instance, if you are using Apache or NGINX with Ubuntu you may do the +following: + +```bash +sudo chown -R root:root /path/to/castopod +sudo chown -R www-data:www-data /path/to/castopod/writable +sudo chown -R www-data:www-data /path/to/castopod/public/media +``` diff --git a/docs/src/content/docs/zh-hant/getting-started/update.mdx b/docs/src/content/docs/zh-hant/getting-started/update.mdx new file mode 100644 index 00000000..f1a26974 --- /dev/null +++ b/docs/src/content/docs/zh-hant/getting-started/update.mdx @@ -0,0 +1,108 @@ +--- +title: How to update Castopod? +--- + +import { Aside } from "@astrojs/starlight/components"; + +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 ⚡. + +## Update instructions + +0. ⚠️ Before any update, we highly recommend you backup your Castopod files and + database. + + - cf. + [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 + + - cf. + [Where can I find my 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 + + - ⚠️ 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/) + +3. On your server: + + - Remove all files except `.env` and `public/media` + - Copy the new files from the downloaded package into your server + + + +4. Update your database schema from your `Castopod Admin` > `About` page or by + running: + + ```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! + + + +## Fully Automated updates + +> Coming soon... 👀 + +## Frequently asked questions (FAQ) + +### Where can I find my Castopod version? + +Go to your Castopod admin panel, the version is displayed on the bottom left +corner. + +Alternatively, you can find the version in the `app > Config > Constants.php` +file. + +### I haven't updated my instance in a long time… What should I do? + +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. + +> You may want to backup your instance depending on how long you haven't updated +> Castopod. + +For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to +`v1.0.0-beta.1`: + +0. (highly recommended) Make a backup of your files and database. + +1. Download the latest release, overwrite your files whilst keeping `.env` and + `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`, + `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`. + +3. ✨ Enjoy your fresh instance, you're all done! + +### Should I make a backup before updating? + +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… diff --git a/docs/src/content/docs/zh-hant/index.mdx b/docs/src/content/docs/zh-hant/index.mdx new file mode 100644 index 00000000..c3769fc2 --- /dev/null +++ b/docs/src/content/docs/zh-hant/index.mdx @@ -0,0 +1,1381 @@ +--- +title: Welcome 👋 +--- + +import { LinkCard } from "@astrojs/starlight/components"; + +Castopod is a free & open-source hosting platform made for podcasters who want +engage and interact with their audience. + +Castopod is easy to install and was built on top of +[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very +small footprint. + + + +## Features + +- 🌱  Free & open-source (AGPL v3 License) +- 🔐  Focused on data sovereignty: your content, audience, and analytics + belong to you, and you only +- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, + chapters, location, persons, soundbites, … +- 💬  Built-in social network: + - 🚀  Castopod is part of the Fediverse, a decentralized social network + - ❤️  Create posts, share, favourite, and comment on episodes +- 📈  Built-in analytics: + - ⚖️  GDPR / CCPA / LGPD compliant + - 🪙  Standard IABv2 audience measurement + - 🏡  On-premises analytics, no third party involved +- 📢  Built-in marketing tools: + - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) + - 📱  PWA: install as a standalone app + - 🎨  Customizable theme colors + - 🎬  Generate ready-to-share Video clips from episodes + - 🔉  Generate soundbites + - ▶️  Embeddable player, embed your episodes on any website +- 💸  Monetization: + - 🔗  Funding links + - 📲  listen-to-click ads + - 🤝  value4value / WebMonetization + - 💎  Premium podcasts +- 📡  Publish your episodes everywhere with RSS: + - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, + Google Podcasts, Deezer, Podcast Addict, Podfriend, … + - ⚡  Broadcast your episodes instantly with WebSub +- 📥  Podcast import: move your existing podcast into Castopod +- 📤  Move your podcast out of Castopod +- 🔀  Multi-tenant: host as many podcasts as you want +- 👥  Multi-user: add contributors and set roles +- 🌎  i18n support: translated in English, French, Polish, German, + Brazilian Portuguese & Spanish… with + [more to come](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. + +It is in fact one of the only media to have stayed this way for a long time. + +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. + +With podcasting becoming more widely used, some companies are trying to shift it +towards a more controlled and centralized 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. + +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. + +## Comparison with other solutions + +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 you. + +### 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 it. + +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. + +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. + +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 journey. + +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. + +Finally, depending on your needs, Wordpress and Castopod can even live side by +side as they share the same requirements! + +### 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 was initially built around music. And later on, as the project +evolved, the ability to host podcasts was introduced. + +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, …). + +So, you should probably use Funkwhale if you want to host your music, and use +Castopod if you want to host your podcasts. + +### Castopod vs other podcast hosts + +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! + +Each of these solutions differ from one another, you may compare with the +[list of features](#features). + +That being said, there are two main differences with other podcasting solutions: + +- 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 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. + +## Contributing + +Love Castopod and would like to help? Take a look at the following documentation +to get you started. + +### Code of conduct + +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 tolerated. + +### Contributing 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. + +## Contributors ✨ + +Thanks goes to these wonderful people +([emoji key](https://allcontributors.org/docs/en/emoji-key)): + +{/* ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section */} +{/* prettier-ignore-start */} +{/* markdownlint-disable */} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + Yassine Doghri +
+ + Yassine Doghri + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 📖 + {" "} + + 👀 + {" "} + + 🚧 + {" "} + + 🖋 + {" "} + + 🎨 + {" "} + + ️️️️♿️ + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🧑‍🏫 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📆 + {" "} + + 📝 + +
+ + Benjamin Bellamy +
+ + Benjamin Bellamy + +
+
+ + 💻 + {" "} + + 🐛 + {" "} + + 👀 + {" "} + + 🖋 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🚇 + {" "} + + 🤔 + {" "} + + 📝 + {" "} + + 📆 + {" "} + + 📢 + +
+ + Ola Hneini +
+ + Ola Hneini + +
+
+ + 💻 + {" "} + + 👀 + {" "} + + 📖 + {" "} + + 🚧 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Romain de Laage +
+ + Romain de Laage + +
+
+ + 💻 + {" "} + + 🚇 + {" "} + + 📖 + {" "} + + 🌍 + {" "} + + 🤔 + +
+ + Lyonel Bernard +
+ + Lyonel Bernard + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Christopher Lagonick-Weitzel +
+ + Christopher Lagonick-Weitzel + +
+
+ + 🐛 + {" "} + + 💬 + {" "} + + 🔊 + {" "} + + 🤔 + +
+ + Ernesto Acosta +
+ + Ernesto Acosta + +
+
+ + 🐛 + {" "} + + 🔊 + {" "} + + 🌍 + {" "} + + 💬 + {" "} + + 🤔 + +
+ + Ewen +
+ + Ewen + +
+
+ + 🌍 + {" "} + + 🤔 + {" "} + + 💻 + +
+ + Bastien Luneteau +
+ + Bastien Luneteau + +
+
+ + 💻 + {" "} + + 🐛 + +
+ + Cécile Ricordeau +
+ + Cécile Ricordeau + +
+
+ + 🎨 + +
+ + Patryk Miś +
+ + Patryk Miś + +
+
+ + 🌍 + +
+ + Marcin Lewandowski +
+ + Marcin Lewandowski + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Sebastian Janik +
+ + Sebastian Janik + +
+
+ + 💻 + +
+ + Patryk Karczmarczyk +
+ + Patryk Karczmarczyk + +
+
+ + 💻 + +
+ + denis d +
+ + denis d + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Douglas Kastle +
+ + Douglas Kastle + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + cExplorer +
+ + cExplorer + +
+
+ + 🐛 + {" "} + + 🌍 + +
+ + ImaCrea +
+ + ImaCrea + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + Jonas S +
+ + Jonas S + +
+
+ + 💻 + +
+ + LEFEBVRE Yann +
+ + LEFEBVRE Yann + +
+
+ + 🐛 + +
+ + Sebastian Späth +
+ + Sebastian Späth + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + rocky III +
+ + rocky III + +
+
+ + 🐛 + +
+ + Hermann Josef Eckl +
+ + Hermann Josef Eckl + +
+
+ + 🐛 + +
+ + Delhaye Cyrille +
+ + Delhaye Cyrille + +
+
+ + 🐛 + {" "} + + 🤔 + +
+ + João Leandro +
+ + João Leandro + +
+
+ + 🌍 + {" "} + + 🤔 + +
+ + Angelos Chouvardas +
+ + Angelos Chouvardas + +
+
+ + 🌍 + +
+ + Eivind +
+ + Eivind + +
+
+ + 🌍 + +
+ + forght +
+ + forght + +
+
+ + 🌍 + +
+ + glottis0q +
+ + glottis0q + +
+
+ + 🌍 + +
+ + ButterflyOfFire +
+ + ButterflyOfFire + +
+
+ + 🌍 + +
+ + Lucian I. Last +
+ + Lucian I. Last + +
+
+ + 🌍 + +
+ + LuuzViir +
+ + LuuzViir + +
+
+ + 🌍 + +
+ + CTHTC +
+ + CTHTC + +
+
+ + 🌍 + +
+ + Russian Retro +
+ + Russian Retro + +
+
+ + 🌍 + +
+ + Marek L'ach +
+ + Marek L'ach + +
+
+ + 🌍 + +
+ + GunChleoc +
+ + GunChleoc + +
+
+ + 🌍 + +
+ + GabiSnow +
+ + GabiSnow + +
+
+ + 🌍 + +
+ + bendaha +
+ + bendaha + +
+
+ + 🌍 + +
+ + Samuel Roland +
+ + Samuel Roland + +
+
+ + 🌍 + +
+ + Dimitri Regnier +
+ + Dimitri Regnier + +
+
+ + 🤔 + +
+ + irithys +
+ + irithys + +
+
+ + 🌍 + +
+ + Sergi +
+ + Sergi + +
+
+ + 🌍 + +
+ + ghose (XoseM) +
+ + ghose (XoseM) + +
+
+ + 🌍 + +
+ + Andreas Olsson +
+ + Andreas Olsson + +
+
+ + 🌍 + +
+ + leonfrom +
+ + leonfrom + +
+
+ + 🌍 + +
+ + agentcobra +
+ + agentcobra + +
+
+ + 🌍 + +
+ + Alessandro +
+ + Alessandro + +
+
+ + 🌍 + +
+ + liimee +
+ + liimee + +
+
+ + 🌍 + +
+ + Ahmed Sabouni +
+ + Ahmed Sabouni + +
+
+ + 🌍 + +
+ + KrzysztofDomanczyk +
+ + KrzysztofDomanczyk + +
+
+ + 💻 + +
+ + Guy Martin +
+ + Guy Martin + +
+
+ + 🐛 + {" "} + + 💻 + +
+ +{/* markdownlint-restore */} +{/* prettier-ignore-end */} + +{/* ALL-CONTRIBUTORS-LIST:END */} + +This project follows the +[all-contributors](https://github.com/all-contributors/all-contributors) +specification. Contributions of any kind welcome! + +## Contact + +You may reach us for help or ask any question you have on: + +- [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) + +Alternatively, you can follow us on social media platforms to get news about +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 + +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). + +[![Ad Aures Logo](../../../assets/images/sponsors/adaures.svg)](https://adaures.com/) + +[![NLnet Logo](../../../assets/images/sponsors/nlnet.svg)](https://nlnet.nl/) + +## License + +[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) + +Copyright © 2020-present, [Ad Aures](https://adaures.com/). diff --git a/docs/src/contributing/_category_.json b/docs/src/contributing/_category_.json deleted file mode 100644 index e12f1ce5..00000000 --- a/docs/src/contributing/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Contributing", - "position": 3 -} diff --git a/docs/src/contributing/guidelines.md b/docs/src/contributing/guidelines.md deleted file mode 100644 index c47c8c5f..00000000 --- a/docs/src/contributing/guidelines.md +++ /dev/null @@ -1,178 +0,0 @@ ---- -title: Guidelines ---- - -# Contributing to Castopod - -Love Castopod and want to help? Thanks so much, there's something to do for -everybody! - -::: tip Note - -Castopod follows the [all contributors](https://allcontributors.org/) -specification in an effort to **recognize any kind of contribution**, not just -code! - -If you've made a contribution and do not appear in the -[contributors](../index.md#contributors-✨) list, please -[let us know](../index.md#contact) so we can correct our mistake! 🙂 - -::: - -Please take a moment to review this document in order to make the contribution -process easy and effective for everyone involved. - -Following these guidelines helps to communicate that you respect the time of the -developers managing and developing this open source project. In return, they -should reciprocate that respect in addressing your issue or assessing patches -and features. - -## Translating Castopod - -We use [Crowdin](https://translate.castopod.org/) to manage translation files -for [Castopod](https://code.castopod.org/), the -[documentation](https://docs.castopod.org/) and the -[landing](https://castopod.org/) websites. - -Whether you'd like to correct a translation error, validate new translations or -include your language to Castopod, head into the -[crowdin project](https://translate.castopod.org/) to get started. - -::: info Note - -To prevent degrading user experience, new languages are included to Castopod -when they reach a certain threshold (~90%). - -// TODO: ease acceptance criteria (to public pages?) - -::: - -## Using the issue tracker - -The [issue tracker](https://code.castopod.org/adaures/castopod/-/issues) is the -preferred channel for [bug reports](#bug-reports), -[features requests](#feature-requests) and -[submitting pull requests](#pull-requests). - -## ⚠️ Security issues and vulnerabilities - -If you encounter any security issue or vulnerability in the Castopod source, -please contact us directly by email at -[security@castopod.org](mailto:security@castopod.org) - -## Bug reports - -A bug is a _demonstrable problem_ that is caused by the code in the repository. -Good bug reports are extremely helpful - thank you! - -Guidelines for bug reports: - -1. **Use the issue search** — check if the issue has already been - reported. - -2. **Check if the issue has been fixed** — try to reproduce it using the - latest `main` branch in the repository. - -3. **Isolate the problem** — ideally create a - [reduced test case](https://css-tricks.com/reduced-test-cases/) and a live - example. - -A good bug report shouldn't leave others needing to chase you up for more -information. Please try to be as detailed as possible in your report. What is -your environment? What steps will reproduce the issue? What browser(s) and OS -experience the problem? What would you expect to be the outcome? All these -details will help people to fix any potential bugs. - -> [Issue templates](https://docs.gitlab.com/ee/user/project/description_templates.html#using-the-templates) -> have been created for this project. You may use them to help you follow those -> guidelines. - -## Feature requests - -Feature requests are welcome. But take a moment to find out whether your idea -fits with the scope and aims of the project. It's up to _you_ to make a strong -case to convince the project's developers of the merits of this feature. Please -provide as much detail and context as possible. - -## Pull requests - -Good pull requests - patches, improvements, new features - are a fantastic help. -They should remain focused in scope and avoid containing unrelated commits. - -**Please ask first** before embarking on any significant pull request (e.g. -implementing features, refactoring code, porting to a different language), -otherwise you risk spending a lot of time working on something that the -project's developers might not want to merge into the project. - -Please adhere to the coding conventions used throughout a project (indentation, -accurate comments, etc.) and any other requirements (such as test coverage). - -Adhering to the following process is the best way to get your work included in -the project: - -1. [Fork](https://docs.gitlab.com/ee/gitlab-basics/fork-project.html) the - project, clone your fork, and configure the remotes: - -```bash -# Clone your fork of the repo into the current directory -git clone https://code.castopod.org//castopod.git - -# Navigate to the newly cloned directory -cd castopod - -# Assign the original repo to a remote called "upstream" -git remote add upstream https://code.castopod.org/adaures/castopod.git -``` - -2. If you cloned a while ago, get the latest changes from upstream: - -```bash -git checkout main -git pull upstream main -``` - -3. Create a new topic branch (off the `main` branch) to contain your feature, - change, or fix: - -```bash -git checkout -b -``` - -4. Commit your changes in logical chunks. Please adhere to these - [git commit message guidelines](https://conventionalcommits.org/) or your - code is unlikely be merged into the main project. Use Git's - [interactive rebase](https://help.github.com/articles/about-git-rebase/) - feature to tidy up your commits before making them public. - -5. Locally merge (or rebase) the upstream dev branch into your topic branch: - -```bash -git pull [--rebase] upstream main -``` - -6. Push your topic branch up to your fork: - -```bash -git push origin -``` - -7. [Open a Pull Request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html#new-merge-request-from-a-fork) - with a clear title and description. - -**IMPORTANT**: By submitting a patch, you agree to allow the project owners to -license your work under the terms of the -[GNU AGPLv3](https://code.castopod.org/adaures/castopod/-/blob/main/LICENSE). - -## Collaborating guidelines - -There are few basic rules to ensure high quality of the project: - -- Before merging, a PR requires at least two approvals from the collaborators - unless it's an architectural change, a large feature, etc. If it is, then at - least 50% of the core team have to agree to merge it, with every team member - having a full veto right. (i.e. every single one can block any PR) -- A PR should remain open for at least two days before merging (does not apply - for trivial contributions like fixing a typo). This way everyone has enough - time to look into it. - -You are always welcome to discuss and propose improvements to this guideline. diff --git a/docs/src/da/index.md b/docs/src/da/index.md deleted file mode 100644 index 7f012c6c..00000000 --- a/docs/src/da/index.md +++ /dev/null @@ -1,300 +0,0 @@ ---- -sidebarDepth: 2 ---- - -# Welcome 👋 - -[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] - -Castopod is a free & open-source hosting platform made for podcasters who want -engage and interact with their audience. - -Castopod is easy to install and was built on top of -[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very -small footprint. - -
- Install -
- -## Features - -- 🌱  Free & open-source (AGPL v3 License) -- 🔐  Focused on data sovereignty: your content, audience, and analytics - belong to you, and you only -- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, - chapters, location, persons, soundbites, … -- 💬  Built-in social network: - - 🚀  Castopod is part of the Fediverse, a decentralized social network - - ❤️  Create posts, share, favourite, and comment on episodes -- 📈  Built-in analytics: - - ⚖️  GDPR / CCPA / LGPD compliant - - 🪙  Standard IABv2 audience measurement - - 🏡  On-premises analytics, no third party involved -- 📢  Built-in marketing tools: - - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) - - 📱  PWA: install as a standalone app - - 🎨  Customizable theme colors - - 🎬  Generate ready-to-share Video clips from episodes - - 🔉  Generate soundbites - - ▶️  Embeddable player, embed your episodes on any website -- 💸  Monetization: - - 🔗  Funding links - - 📲  listen-to-click ads - - 🤝  value4value / WebMonetization - - 💎  Premium podcasts -- 📡  Publish your episodes everywhere with RSS: - - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, - Google Podcasts, Deezer, Podcast Addict, Podfriend, … - - ⚡  Broadcast your episodes instantly with WebSub -- 📥  Podcast import: move your existing podcast into Castopod -- 📤  Move your podcast out of Castopod -- 🔀  Multi-tenant: host as many podcasts as you want -- 👥  Multi-user: add contributors and set roles -- 🌎  i18n support: translated in English, French, Polish, German, - Brazilian Portuguese & Spanish… with - [more to come](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. - -It is in fact one of the only media to have stayed this way for a long time. - -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. - -With podcasting becoming more widely used, some companies are trying to shift it -towards a more controlled and centralized 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. - -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. - -## Comparison with other solutions - -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 you. - -### 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 it. - -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. - -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. - -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 journey. - -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. - -Finally, depending on your needs, Wordpress and Castopod can even live side by -side as they share the same requirements! - -### 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 was initially built around music. And later on, as the project -evolved, the ability to host podcasts was introduced. - -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, …). - -So, you should probably use Funkwhale if you want to host your music, and use -Castopod if you want to host your podcasts. - -### Castopod vs other podcast hosts - -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! - -Each of these solutions differ from one another, you may compare with the -[list of features](#features). - -That being said, there are two main differences with other podcasting solutions: - -- 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 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. - -## Contributing - -Love Castopod and would like to help? Take a look at the following documentation -to get you started. - -### Code of conduct - -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 tolerated. - -### Contributing 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. - -## Contributors ✨ - -Thanks goes to these wonderful people -([emoji key](https://allcontributors.org/docs/en/emoji-key)): - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Ewen
Ewen

🌍 🤔 💻
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
KrzysztofDomanczyk
KrzysztofDomanczyk

💻
Guy Martin
Guy Martin

🐛 💻
- - - - - - -This project follows the -[all-contributors](https://github.com/all-contributors/all-contributors) -specification. Contributions of any kind welcome! - -## Contact - -You may reach us for help or ask any question you have on: - -- [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) - -Alternatively, you can follow us on social media platforms to get news about -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 - -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). - -
- Ad Aures Logo - NLnet Logo -
- -## License - -[GNU Affero General Public License v3.0](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 - -[release]: https://code.castopod.org/adaures/castopod/-/releases -[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md -[contributions]: https://code.castopod.org/adaures/castopod/-/issues -[semantic-release]: https://github.com/semantic-release/semantic-release -[discord]: https://castopod.org/discord -[stars]: https://github.com/ad-aures/castopod/stargazers -[crowdin]: https://translate.castopod.org/project/castopod diff --git a/docs/src/de/getting-started/_category_.json b/docs/src/de/getting-started/_category_.json deleted file mode 100644 index 877a378f..00000000 --- a/docs/src/de/getting-started/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Getting Started", - "position": 2 -} diff --git a/docs/src/de/getting-started/auth.md b/docs/src/de/getting-started/auth.md deleted file mode 100644 index 1f029437..00000000 --- a/docs/src/de/getting-started/auth.md +++ /dev/null @@ -1,88 +0,0 @@ ---- -title: Authentifizierung & Autorisierung -sidebarDepth: 3 ---- - -# Authentifizierung & Autorisierung - -Castopod behandelt Authentifizierung und Autorisierung mit `codeigniter/shield` -kombiniert mit eigenen Regeln. Rollen und Berechtigungen sind auf zwei Ebenen -definiert: - -1. [instanzweit](#1-instance-wide-roles-and-permissions) -2. [je Podcast](#2-per-podcast-roles-and-permissions) - -## 1. Instanzweite Rollen und Berechtigungen - -### Instanz Rollen - - - -| Rolle | Beschreibung | Berechtigungen | -| ------------------- | --------------------------------------------- | ------------------------------------------------------------------------------------------ | -| Super-Administrator | Hat die vollständige Kontrolle über Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Manager | Verwaltet Castopods Inhalt. | podcasts.create, podcasts.import, persons.manage, pages.manage | -| Podcaster | Generelle Benutzer von Castopod. | admin.access | - - - -### Instanz Berechtigungen - - - -| Berechtigung | Beschreibung | -| ----------------------- | ---------------------------------------------------------------------------- | -| admin.access | Kann auf den Castopod Adminbereich zugreifen. | -| admin.settings | Kann auf die Castopod Einstellungen zugreifen. | -| users.manage | Kann Castopod Benutzer verwalten. | -| persons.manage | Kann Personen verwalten. | -| pages.manage | Kann Seiten verwalten. | -| podcasts.view | Kann alle Podcasts einsehen. | -| podcasts.create | Kann neue Podcasts erstellen. | -| podcasts.import | Kann Podcasts importieren. | -| fediverse.manage-blocks | Kann Fediverse Akteure/Domains davon abhalten, mit Castopod zu interagieren. | - - - -## 2. Pro Podcast Rollen und Berechtigungen - -### Pro Podcast Rollen - - - -| Rolle | Beschreibung | Berechtigungen | -| ------------- | --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Administrator | Hat vollständige Kontrolle über Podcast #{id}. | \* | -| Editor | Verwaltet Inhalte und Veröffentlichungen von Podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| Autor | Verwaltet Inhalte von Podcast #{id}, kann diese aber nicht veröffentlichen. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Gast | Allgemeiner Mitwirkender des Podcasts #{id}. | view, episodes.view | - - - -### Pro Podcast Berechtigung - - - -| Berechtigung | Beschreibung | -| ---------------------------- | ------------------------------------------------------------------------------------------------ | -| view | Kann Dashboard und Analysen des Podcasts #{id} einsehen. | -| edit | Kann Podcast #{id} bearbeiten. | -| delete | Kann Podcast #{id} löschen. | -| manage-import | Kann importierten Podcast #{id} synchronisieren. | -| manage-persons | Kann Mitwirkende des Podcasts #{id} verwalten. | -| manage-subscriptions | Kann Abonnements des Podcast #{id} verwalten. | -| manage-contributors | Kann Mitwirkende des Podcasts #{id} verwalten. | -| manage-platforms | Kann Plattform-Links des Podcast #{id} setzen/entfernen. | -| manage-publications | Kann Podcast #{id} veröffentlichen. | -| manage-notifications | Kann Benachrichtigungen des Podcasts #{id} einsehen und als gelesen markieren. | -| interact-as | Kann als Podcast #{id} interagieren, um Beiträge zu favorisieren, zu teilen oder zu beantworten. | -| episodes.view | Kann Dashboard und Analysen des Podcasts #{id} einsehen. | -| episodes.create | Kann Folgen für Podcast #{id} erstellen. | -| episodes.edit | Kann Podcast #{id} bearbeiten. | -| episodes.delete | Kann Podcast #{id} löschen. | -| episodes.manage-persons | Kann Abonnements des Podcast #{id} verwalten. | -| episodes.manage-clips | Kann Videoclips und Soundbites des Podcasts #{id} verwalten. | -| episodes.manage-publications | Kann Podcast #{id} veröffentlichen. | -| episodes.manage-comments | Du kannst Episodenkommentare von Podcast #{id} erstellen/entfernen. | - - diff --git a/docs/src/de/index.md b/docs/src/de/index.md deleted file mode 100644 index 92062c7a..00000000 --- a/docs/src/de/index.md +++ /dev/null @@ -1,301 +0,0 @@ ---- -sidebarDepth: 2 ---- - -# Willkommen 👋 - -[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] - -Castopod ist eine freie & Open-Source-Hosting-Plattform für Podcastende, die ihr -Publikum einbinden und mit ihnen interagieren möchten. - -Castopod ist einfach zu installieren und wurde auf -[CodeIgniter4](https://codeigniter.com/) aufgebaut, ein mächtiges PHP Framework, -mit einem sehr kleinen Fußabdruck. - - - -## Merkmale - -- 🌱 Kostenlos & Open-Source (AGPL v3 Lizenz) -- 🔐  Fokussiert auf die Datensouveränität: Ihre Inhalte, Ihr Publikum und - Analysen gehören zu Ihnen, und nur Ihnen  -- 🪄  Podcasting 2.0 Features: GUID, gesperrt, Transkripte, Finanzierung, - Kapitel, Standort, Personen, Soundbites, … -- 💬  Integriertes soziales Netzwerk: - - 🚀  Castopod ist Teil des Fediversums, einem dezentralen sozialen - Netzwerk - - ❤️  Erstelle Beiträge, teile, favorisiere und kommentiere Episoden -- 📈  Integrierte Analyse: - - ⚖️  GDPR / CCPA / LGPD konform - - 🪙  Standard IABv2 Zuschauermessung - - 🏡  On-premises Analytik, kein Dritter beteiligt -- 📢  Integrierte Marketing-Tools: - - ✅  SEO bereit (open-graph Meta-Tags, JSON-LD, …) - - 📱  PWA: als eigenständige App installieren - - 🎨  Anpassbare Theme-Farben - - 🎬  Generiere Videoclips aus Episoden fertig zum Teilen - - 🔉  Soundbites erstellen - - ▶️  Embeddable Player, binde deine Episoden auf jeder Webseite ein -- 💸  Monetarisierung: - - 🔗  Funding links - - 📲  listen-to-click ads - - 🤝  value4value / WebMonetization - - 💎  Premium podcasts -- 📡  Publish your episodes everywhere with RSS: - - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, - Google Podcasts, Deezer, Podcast Addict, Podfriend, … - - ⚡  Broadcast your episodes instantly with WebSub -- 📥  Podcast import: move your existing podcast into Castopod -- 📤  Move your podcast out of Castopod -- 🔀  Multi-tenant: host as many podcasts as you want -- 👥  Multi-user: add contributors and set roles -- 🌎  i18n support: translated in English, French, Polish, German, - Brazilian Portuguese & Spanish… with - [more to come](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. - -It is in fact one of the only media to have stayed this way for a long time. - -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. - -With podcasting becoming more widely used, some companies are trying to shift it -towards a more controlled and centralized 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. - -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. - -## Vergleiche mit anderen Lösungen - -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 you. - -### 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 it. - -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. - -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. - -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 journey. - -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. - -Finally, depending on your needs, Wordpress and Castopod can even live side by -side as they share the same requirements! - -### Castopod vs Funkwale - -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 was initially built around music. And later on, as the project -evolved, the ability to host podcasts was introduced. - -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, …). - -So, you should probably use Funkwhale if you want to host your music, and use -Castopod if you want to host your podcasts. - -### Castopod vs other podcast hosts - -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! - -Each of these solutions differ from one another, you may compare with the -[list of features](#features). - -That being said, there are two main differences with other podcasting solutions: - -- 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 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. - -## Contributing - -Love Castopod and would like to help? Take a look at the following documentation -to get you started. - -### Code of conduct - -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 tolerated. - -### Contributing 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. - -## Contributors ✨ - -Thanks goes to these wonderful people -([emoji key](https://allcontributors.org/docs/en/emoji-key)): - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Ewen
Ewen

🌍 🤔 💻
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
KrzysztofDomanczyk
KrzysztofDomanczyk

💻
Guy Martin
Guy Martin

🐛 💻
- - - - - - -This project follows the -[all-contributors](https://github.com/all-contributors/all-contributors) -specification. Contributions of any kind welcome! - -## Contact - -You may reach us for help or ask any question you have on: - -- [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) - -Alternatively, you can follow us on social media platforms to get news about -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 - -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). - -
- Ad Aures Logo - NLnet Logo -
- -## License - -[GNU Affero General Public License v3.0](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 - -[release]: https://code.castopod.org/adaures/castopod/-/releases -[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md -[contributions]: https://code.castopod.org/adaures/castopod/-/issues -[semantic-release]: https://github.com/semantic-release/semantic-release -[discord]: https://castopod.org/discord -[stars]: https://github.com/ad-aures/castopod/stargazers -[crowdin]: https://translate.castopod.org/project/castopod diff --git a/docs/src/el/getting-started/_category_.json b/docs/src/el/getting-started/_category_.json deleted file mode 100644 index 877a378f..00000000 --- a/docs/src/el/getting-started/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Getting Started", - "position": 2 -} diff --git a/docs/src/el/getting-started/auth.md b/docs/src/el/getting-started/auth.md deleted file mode 100644 index e041016b..00000000 --- a/docs/src/el/getting-started/auth.md +++ /dev/null @@ -1,88 +0,0 @@ ---- -title: Authentication & Authorization -sidebarDepth: 3 ---- - -# Ταυτοποίηση & εξουσιοδότηση - -Ο Castopod χειρίζεται τον έλεγχο ταυτότητας και την έγκριση χρησιμοποιώντας -`codeigniter/shield` σε συνδυασμό με προσαρμοσμένους κανόνες. Οι ρόλοι και τα -δικαιώματα καθορίζονται σε δύο επίπεδα: - -1. [ευρεία παρουσία](#1-instance-wide-roles-and-permissions) -2. [ανά podcast](#2-per-podcast-roles-and-permissions) - -## 1. Διαχείριση ρόλων και δικαιωμάτων - -### Ρόλοι εμφάνισης - - - -| ρόλος | περιγραφή | δικαιώματα | -| ---------------- | ------------------------------------- | ------------------------------------------------------------------------------------------ | -| Υπερδιαχειριστής | Έχει πλήρη έλεγχο του Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Διαχειριστής | Διαχείριση περιεχομένου του Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | -| Podcaster | Γενικοί χρήστες του Castopod. | admin.access | - - - -### Instance permissions - - - -| 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. | - - - -## 2. Per podcast roles and permissions - -### Per podcast roles - - - -| 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, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| 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 | - - - -### Per podcast permissions - - - -| 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}. | - - diff --git a/docs/src/el/index.md b/docs/src/el/index.md deleted file mode 100644 index bc25620f..00000000 --- a/docs/src/el/index.md +++ /dev/null @@ -1,301 +0,0 @@ ---- -sidebarDepth: 2 ---- - -# Καλώς Ήλθατε 👋 - -[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] - -Το Castopod είναι μια δωρεάν & ανοικτού κώδικα πλατφόρμα φιλοξενίας podcast που -κατασκευάζεται για podcasters που θέλουν να συμμετάσχουν και να αλληλεπιδράσουν -με το κοινό τους. - -Το Castopod είναι εύκολο στην εγκατάσταση και χτίστηκε με το -[CodeIgniter4](https://codeigniter.com/), ένα ισχυρό PHP framework με ένα πολύ -μικρό αποτύπωμα. - - - -## Χαρακτηριστικά - -- 🌱  Δωρεάν & open-source (AGPL v3 License) -- 🔐  Εστιάζει στην κυριαρχία των δεδομένων: το περιεχόμενο, το κοινό και - τα αναλυτικά στοιχεία ανήκουν σε εσάς μόνο -- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, - chapters, location, persons, soundbites, … -- 💬  Ενσωματωμένο κοινωνικό δίκτυο: - - 🚀  Castopod is part of the Fediverse, a decentralized social network - - ❤️  Create posts, share, favourite, and comment on episodes -- 📈  Built-in analytics: - - ⚖️  GDPR / CCPA / LGPD compliant - - 🪙  Standard IABv2 audience measurement - - 🏡  On-premises analytics, no third party involved -- 📢  Built-in marketing tools: - - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) - - 📱  PWA: install as a standalone app - - 🎨  Customizable theme colors - - 🎬  Generate ready-to-share Video clips from episodes - - 🔉  Generate soundbites - - ▶️  Embeddable player, embed your episodes on any website -- 💸  Monetization: - - 🔗  Funding links - - 📲  listen-to-click ads - - 🤝  value4value / WebMonetization - - 💎  Premium podcasts -- 📡  Publish your episodes everywhere with RSS: - - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, - Google Podcasts, Deezer, Podcast Addict, Podfriend, … - - ⚡  Broadcast your episodes instantly with WebSub -- 📥  Podcast import: move your existing podcast into Castopod -- 📤  Move your podcast out of Castopod -- 🔀  Multi-tenant: host as many podcasts as you want -- 👥  Multi-user: add contributors and set roles -- 🌎  i18n support: translated in English, French, Polish, German, - Brazilian Portuguese & Spanish… with - [more to come](https://translate.castopod.org)! - -## Κίνητρα - -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. - -It is in fact one of the only media to have stayed this way for a long time. - -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. - -With podcasting becoming more widely used, some companies are trying to shift it -towards a more controlled and centralized 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. - -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. - -## Comparison with other solutions - -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 you. - -### 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 it. - -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. - -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. - -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 journey. - -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. - -Finally, depending on your needs, Wordpress and Castopod can even live side by -side as they share the same requirements! - -### 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 was initially built around music. And later on, as the project -evolved, the ability to host podcasts was introduced. - -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, …). - -So, you should probably use Funkwhale if you want to host your music, and use -Castopod if you want to host your podcasts. - -### Castopod vs other podcast hosts - -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! - -Each of these solutions differ from one another, you may compare with the -[list of features](#features). - -That being said, there are two main differences with other podcasting solutions: - -- 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 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. - -## Contributing - -Love Castopod and would like to help? Take a look at the following documentation -to get you started. - -### Code of conduct - -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 tolerated. - -### Contributing 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. - -## Contributors ✨ - -Thanks goes to these wonderful people -([emoji key](https://allcontributors.org/docs/en/emoji-key)): - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Ewen
Ewen

🌍 🤔 💻
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
KrzysztofDomanczyk
KrzysztofDomanczyk

💻
Guy Martin
Guy Martin

🐛 💻
- - - - - - -This project follows the -[all-contributors](https://github.com/all-contributors/all-contributors) -specification. Contributions of any kind welcome! - -## Contact - -You may reach us for help or ask any question you have on: - -- [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) - -Alternatively, you can follow us on social media platforms to get news about -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 - -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). - -
- Ad Aures Logo - NLnet Logo -
- -## License - -[GNU Affero General Public License v3.0](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 - -[release]: https://code.castopod.org/adaures/castopod/-/releases -[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md -[contributions]: https://code.castopod.org/adaures/castopod/-/issues -[semantic-release]: https://github.com/semantic-release/semantic-release -[discord]: https://castopod.org/discord -[stars]: https://github.com/ad-aures/castopod/stargazers -[crowdin]: https://translate.castopod.org/project/castopod diff --git a/docs/src/env.d.ts b/docs/src/env.d.ts new file mode 100644 index 00000000..6811d7c2 --- /dev/null +++ b/docs/src/env.d.ts @@ -0,0 +1,3 @@ +// eslint-disable-next-line @typescript-eslint/triple-slash-reference +/// +/// diff --git a/docs/src/es/getting-started/_category_.json b/docs/src/es/getting-started/_category_.json deleted file mode 100644 index 877a378f..00000000 --- a/docs/src/es/getting-started/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Getting Started", - "position": 2 -} diff --git a/docs/src/es/index.md b/docs/src/es/index.md deleted file mode 100644 index d948f885..00000000 --- a/docs/src/es/index.md +++ /dev/null @@ -1,308 +0,0 @@ ---- -sidebarDepth: 2 ---- - -# Bienvenid@ 👋 - -[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] - -Castopod es una plataforma gratuita y de código abierto para hospedar podcasts -hecha para podcasters que quieren involucrar e interactuar más con su audiencia. - -Castopod es fácil de instalar y se ha desarrollado sobre -[CodeIgniter4](https://codeigniter.com/), un potente y muy ligero framework PHP. - - - -## Características - -- 🌱  Gratis & de código abierto (licencia AGPL v3). -- 🔐  Centrado en la soberanía de los datos: tu contenido, tu audiencia, y - tus estadísticas te pertenecen a ti y solo a ti. -- 🪄  Funciones de Podcasting 2.0: GUID (interfaz gráfica de usuario), - protección y bloqueo del podcast, transcripciones, monetización, episodios, - geo-localización, personas, fragmentos de audio, … -- 💬  Integración con redes sociales: - - 🚀  Castopod es parte del Fediverso, una red social descentralizada - - ❤️  Se puede crear mensajes, compartir, agregar a favoritos y comentar - en episodios -- 📈  Análisis estadísticos integrados: - - ⚖️  Compatible con GDPR / CCPA / LGPD - - 🪙  Medida de audiencia con el estándar IABv2 - - 🏡  Estadísticas sin terceras partes involucradas -- 📢  Herramientas de marketing incorporadas: - - ✅  Listo para SEO (meta-etiquetas de open-graph, JSON-LD, …) - - 📱  PWA: instalable como una aplicación independiente - - 🎨  Personalizar los colores del tema - - 🎬  Generar recortes de vídeo listos para compartir, a partir de tus - episodios - - 🔉  Generar fragmentos de audio (Soundbites) para la promoción de tus - episodios. - - ▶️  Reproductor incrustable, con el que insertar tus episodios en - cualquier sitio web! -- 💸  Monetización: - - 🔗  Enlaces de financiación - - 📲  Anuncios publicitarios del tipo click-para-escuchar - - 🤝  value4value / WebMonetization (criptomonedas para creadores de - contenido). - - 💎  Premium podcasts -- 📡  Publica tus episodios en todas partes con RSS: - - 📱  En todos los directorios y aplicaciones: Podcast Index, Apple - Podcasts, Spotify, Google Podcasts, Deezer, Podcast Addict, Podfriend, … - - ⚡  Emite tus episodios al instante con WebSub. -- 📥  Importación de podcasts: mueve tu podcast existente en otro servicio - a tu servidor Castopod. -- 📤  Mueve tu podcast fuera de Castopod. -- 🔀  Multi-podcast: aloja tantos podcasts como quieras en una misma - instancia/panel de CASTOPOD. -- 👥  Multi-usuario: añade colaboradores y define roles. -- 🌎  Soporte multilingüe i18n: traducido al Inglés, Francés, Polaco, - Alemán, Portugués brasileño, Español, Noruego, … ¡y - [más por venir](https://translate.castopod.org)! - -## Motivación - -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. - -It is in fact one of the only media to have stayed this way for a long time. - -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. - -With podcasting becoming more widely used, some companies are trying to shift it -towards a more controlled and centralized 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. - -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. - -## Comparación con otras soluciones - -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 you. - -### 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 it. - -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. - -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. - -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 journey. - -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. - -Finally, depending on your needs, Wordpress and Castopod can even live side by -side as they share the same requirements! - -### 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 was initially built around music. And later on, as the project -evolved, the ability to host podcasts was introduced. - -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, …). - -So, you should probably use Funkwhale if you want to host your music, and use -Castopod if you want to host your podcasts. - -### Castopod vs. otras plataformas de podcast - -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! - -Each of these solutions differ from one another, you may compare with the -[list of features](#features). - -That being said, there are two main differences with other podcasting solutions: - -- Castopod puede ser auto-hospedado en tu propio servidor y es la única solución - que te permite mantener un control completo sobre los contenidos que produces. - También, como es de código abierto, puedes incluso personalizarlo como desees - y necesites. - -- Castopod es la única solución que hasta el momento integra tanto una red - social descentralizada con ActivityPub así como muchas de las características - del podcasting 2.0, con la esperanza de cerrar la brecha entre ambos. - -## Cómo colaborar - -Love Castopod and would like to help? Take a look at the following documentation -to get you started. - -### Código de conducta - -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 tolerated. - -### Guía para colaborar - -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. - -## Colaboradores ✨ - -Thanks goes to these wonderful people -([emoji key](https://allcontributors.org/docs/en/emoji-key)): - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Ewen
Ewen

🌍 🤔 💻
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
KrzysztofDomanczyk
KrzysztofDomanczyk

💻
Guy Martin
Guy Martin

🐛 💻
- - - - - - -This project follows the -[all-contributors](https://github.com/all-contributors/all-contributors) -specification. Contributions of any kind welcome! - -## Contacto - -You may reach us for help or ask any question you have on: - -- [Discord](https://castopod.org/discord) (para interacción directa con - desarrolladores y la comunidad) -- [Seguimiento de incidencias](https://code.castopod.org/adaures/castopod/-/issues) - (para informar de errores y solicitar nuevas funcionalidades) - -Alternatively, you can follow us on social media platforms to get news about -Castopod: - -- [podlibre.social](https://podlibre.social/@castopod) (instancia de Mastodon) -- [[Twitter](https://twitter.com/castopod)](https://twitter.com/castopod) -- [[LinkedIn](https://linkedin.com/company/ad-aures)](https://linkedin.com/company/castopod) -- [Facebook (próximamente?)](https://www.facebook.com/castopod) - -## Patrocinadores - -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). - -
- Logo de Ad Aures - Logo de NLnet -
- -## Licencia - -[GNU Affero General Public License v3.0](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 - -[release]: https://code.castopod.org/adaures/castopod/-/releases -[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md -[contributions]: https://code.castopod.org/adaures/castopod/-/issues -[semantic-release]: https://github.com/semantic-release/semantic-release -[discord]: https://castopod.org/discord -[stars]: https://github.com/ad-aures/castopod/stargazers -[crowdin]: https://translate.castopod.org/project/castopod diff --git a/docs/src/eu/getting-started/security.md b/docs/src/eu/getting-started/security.md deleted file mode 100644 index e205698d..00000000 --- a/docs/src/eu/getting-started/security.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: Security ---- - -# Security concerns - -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). - -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): - -- `writable/` folder must be **readable** and **writable**. -- `public/media/` folder must be **readable** and **writable**. -- any other file must be set to **readonly**. - -For instance, if you are using Apache or NGINX with Ubuntu you may do the -following: - -```bash -sudo chown -R root:root /path/to/castopod -sudo chown -R www-data:www-data /path/to/castopod/writable -sudo chown -R www-data:www-data /path/to/castopod/public/media -``` diff --git a/docs/src/eu/index.md b/docs/src/eu/index.md deleted file mode 100644 index b63ff645..00000000 --- a/docs/src/eu/index.md +++ /dev/null @@ -1,300 +0,0 @@ ---- -sidebarDepth: 2 ---- - -# Welcome 👋 - -[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] - -Castopod is a free & open-source hosting platform made for podcasters who want -engage and interact with their audience. - -Castopod is easy to install and was built on top of -[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very -small footprint. - -
- Install -
- -## Features - -- 🌱  Free & open-source (AGPL v3 License) -- 🔐  Focused on data sovereignty: your content, audience, and analytics - belong to you, and you only -- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, - chapters, location, persons, soundbites, … -- 💬  Built-in social network: - - 🚀  Castopod is part of the Fediverse, a decentralized social network - - ❤️  Create posts, share, favourite, and comment on episodes -- 📈  Built-in analytics: - - ⚖️  GDPR / CCPA / LGPD compliant - - 🪙  Standard IABv2 audience measurement - - 🏡  On-premises analytics, no third party involved -- 📢  Built-in marketing tools: - - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) - - 📱  PWA: install as a standalone app - - 🎨  Customizable theme colors - - 🎬  Generate ready-to-share Video clips from episodes - - 🔉  Generate soundbites - - ▶️  Embeddable player, embed your episodes on any website -- 💸  Monetization: - - 🔗  Funding links - - 📲  listen-to-click ads - - 🤝  value4value / WebMonetization - - 💎  Premium podcasts -- 📡  Publish your episodes everywhere with RSS: - - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, - Google Podcasts, Deezer, Podcast Addict, Podfriend, … - - ⚡  Broadcast your episodes instantly with WebSub -- 📥  Podcast import: move your existing podcast into Castopod -- 📤  Move your podcast out of Castopod -- 🔀  Multi-tenant: host as many podcasts as you want -- 👥  Multi-user: add contributors and set roles -- 🌎  i18n support: translated in English, French, Polish, German, - Brazilian Portuguese & Spanish… with - [more to come](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. - -It is in fact one of the only media to have stayed this way for a long time. - -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. - -With podcasting becoming more widely used, some companies are trying to shift it -towards a more controlled and centralized 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. - -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. - -## Comparison with other solutions - -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 you. - -### 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 it. - -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. - -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. - -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 journey. - -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. - -Finally, depending on your needs, Wordpress and Castopod can even live side by -side as they share the same requirements! - -### 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 was initially built around music. And later on, as the project -evolved, the ability to host podcasts was introduced. - -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, …). - -So, you should probably use Funkwhale if you want to host your music, and use -Castopod if you want to host your podcasts. - -### Castopod vs other podcast hosts - -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! - -Each of these solutions differ from one another, you may compare with the -[list of features](#features). - -That being said, there are two main differences with other podcasting solutions: - -- 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 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. - -## Contributing - -Love Castopod and would like to help? Take a look at the following documentation -to get you started. - -### Code of conduct - -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 tolerated. - -### Contributing 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. - -## Contributors ✨ - -Thanks goes to these wonderful people -([emoji key](https://allcontributors.org/docs/en/emoji-key)): - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Ewen
Ewen

🌍 🤔 💻
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
KrzysztofDomanczyk
KrzysztofDomanczyk

💻
Guy Martin
Guy Martin

🐛 💻
- - - - - - -This project follows the -[all-contributors](https://github.com/all-contributors/all-contributors) -specification. Contributions of any kind welcome! - -## Contact - -You may reach us for help or ask any question you have on: - -- [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) - -Alternatively, you can follow us on social media platforms to get news about -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 - -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). - -
- Ad Aures Logo - NLnet Logo -
- -## License - -[GNU Affero General Public License v3.0](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 - -[release]: https://code.castopod.org/adaures/castopod/-/releases -[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md -[contributions]: https://code.castopod.org/adaures/castopod/-/issues -[semantic-release]: https://github.com/semantic-release/semantic-release -[discord]: https://castopod.org/discord -[stars]: https://github.com/ad-aures/castopod/stargazers -[crowdin]: https://translate.castopod.org/project/castopod diff --git a/docs/src/fa/getting-started/docker.md b/docs/src/fa/getting-started/docker.md deleted file mode 100644 index 12f01619..00000000 --- a/docs/src/fa/getting-started/docker.md +++ /dev/null @@ -1,160 +0,0 @@ ---- -title: Official Docker images -sidebarDepth: 3 ---- - -# Official Docker images - -Castopod pushes 3 Docker images to the Docker Hub during its automated build -process: - -- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all - in one castopod image using nginx unit -- [**`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 - -Additionally, Castopod requires a MySQL-compatible database. A Redis database -can be added as a cache handler. - -## Supported tags - -- `develop` [unstable], latest development branch build -- `beta` [stable], latest beta version build -- `latest` [stable], latest version build -- `1.x.x` [stable], specific version build (since `1.0.0`) - -## Example usage - -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: - - ```yml - version: "3.7" - - services: - app: - image: castopod/castopod:latest - container_name: "castopod-app" - volumes: - - castopod-media:/var/www/castopod/public/media - environment: - MYSQL_DATABASE: castopod - MYSQL_USER: castopod - MYSQL_PASSWORD: changeme - CP_BASEURL: "https://castopod.example.com" - CP_ANALYTICS_SALT: changeme - CP_CACHE_HANDLER: redis - CP_REDIS_HOST: redis - CP_REDIS_PASSWORD: changeme - networks: - - castopod-app - - castopod-db - ports: - - 8000:8000 - restart: unless-stopped - - mariadb: - image: mariadb:10.5 - container_name: "castopod-mariadb" - networks: - - castopod-db - volumes: - - castopod-db:/var/lib/mysql - environment: - MYSQL_ROOT_PASSWORD: changeme - MYSQL_DATABASE: castopod - MYSQL_USER: castopod - MYSQL_PASSWORD: changeme - restart: unless-stopped - - redis: - image: redis:7.0-alpine - container_name: "castopod-redis" - command: --requirepass changeme - volumes: - - castopod-cache:/data - networks: - - castopod-app - - volumes: - castopod-media: - castopod-db: - castopod-cache: - - networks: - castopod-app: - castopod-db: - ``` - - You have to adapt some variables to your needs (e.g. `CP_BASEURL`, - `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). - -3. Setup a reverse proxy for 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/): - - ``` - #castopod - castopod.example.com { - reverse_proxy localhost:8000 - } - ``` - -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! - -5. You're all set, start podcasting! 🎙️🚀 - -## Environment Variables - -- **castopod/castopod** and **castopod/app** - - | Variable name | Type (`default`) | Default | - | ------------------------------------- | ----------------------- | ---------------- | - | **`CP_BASEURL`** | string | `undefined` | - | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | - | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | - | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | - | **`CP_ANALYTICS_SALT`** | string | `undefined` | - | **`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_REDIS_HOST`** | ?string | `"localhost"` | - | **`CP_REDIS_PASSWORD`** | ?string | `null` | - | **`CP_REDIS_PORT`** | ?number | `6379` | - | **`CP_REDIS_DATABASE`** | ?number | `0` | - | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | - | **`CP_EMAIL_FROM`** | ?string | `undefined` | - | **`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_ENABLE_2FA`** | ?boolean | `undefined` | - | **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` | - | **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` | - | **`CP_MEDIA_S3_KEY`** | ?string | `undefined` | - | **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` | - | **`CP_MEDIA_S3_REGION`** | ?string | `undefined` | - | **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` | - | **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` | - | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` | - | **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` | - | **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` | - | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | - | **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` | - | **`CP_TIMEOUT`** | ?number | `900` | - -- **castopod/web-server** - - | Variable name | Type | Default | - | ---------------------- | --------------------- | ------- | - | **`CP_APP_HOSTNAME`** | ?string | `"app"` | - | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | - | **`CP_TIMEOUT`** | ?number | `900` | diff --git a/docs/src/fa/getting-started/install.md b/docs/src/fa/getting-started/install.md deleted file mode 100644 index cdea18ec..00000000 --- a/docs/src/fa/getting-started/install.md +++ /dev/null @@ -1,238 +0,0 @@ ---- -title: Installation -sidebarDepth: 3 ---- - -# How to install 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. - -::: tip Note - -We've released official Docker images for Castopod! - -If you prefer using Docker, you may skip this and go straight to the -[docker documentation](./docker.md) for Castopod. - -::: - -## Requirements - -- PHP v8.1 or higher -- MySQL version 5.7 or higher or MariaDB version 10.2 or higher -- HTTPS support -- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's - incoming requests - -### PHP v8.1 or higher - -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. -- [exif](https://www.php.net/manual/en/exif.installation.php) - -Additionally, make sure that the following extensions are enabled in your PHP: - -- json (enabled by default - don't turn it off) -- xml (enabled by default - don't turn it off) -- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php) - -### MySQL compatible database - -> We recommend using [MariaDB](https://mariadb.org). - -::: warning Warning - -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. - -::: - -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. - -#### Privileges - -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`. - -### (Optional) FFmpeg v4.1.8 or higher for Video Clips - -[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: - -- **FreeType 2** library for - [gd](https://www.php.net/manual/en/image.installation.php). - -### (Optional) Other recommendations - -- Redis for better cache performances. -- CDN for static files caching and better performances. -- e-mail gateway for lost passwords. - -## Install instructions - -### Pre-requisites - -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 haven’t 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): - - ```bash - * * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1 - ``` - - **Note** - If you do not add this cron task, the following Castopod features - will not work: - - - Importing a podcast from an existing RSS feed - - Broadcasting social activities to your followers in the fediverse - - Broadcasting episodes to open hubs using - [WebSub](https://en.wikipedia.org/wiki/WebSub) - - Generating video clips - - [requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips) - -### (recommended) Install Wizard - -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! - -::: info Note - -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. - -::: - -### Using CLI - -1. Create a `.env` file in the package root based on the `.env.example` file. -2. Initialize the database using: - - ```sh - php spark install:init-database - ``` - -3. Create the superadmin user using: - - ```sh - php spark install:create-superadmin - ``` - -4. Head on to your admin gateway to start podcasting! - -### Email/SMTP setup - -Email configuration is required for some features to work properly (eg. -retrieving your forgotten password, sending instructions to premium subscribers, -…) - -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" -``` - -#### Email config options - -| 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"` | - -### Media storage - -By default, files are saved to the `public/media` folder using the file system. -If you need to relocate the `media` folder to a different location, you can -specify it in your `.env` file as shown below: - -```ini -# […] - -media.root="media" -media.storage="/mnt/storage" -``` - -In this example, the files will be saved to the /mnt/storage/media folder. Make -sure to also update your web server configuration to reflect this change. - -### S3 - -If you prefer storing your media files on an S3 compatible storage, you may -specify it in your `.env`: - -```ini -# […] - -media.fileManager="s3" -media.s3.endpoint="your_s3_host" -media.s3.key="your_s3_key" -media.s3.secret="your_s3_secret" -media.s3.region="your_s3_region" -``` - -#### S3 config options - -| Variable name | Type | Default | -| ----------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`pathStyleEndpoint`** | boolean | `false` | -| **`keyPrefix`** | string | `undefined` | - -## Community packages - -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. - -### Install with 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. - -
- - - Install Castopod with YunoHost - - -Github -Repo - -
diff --git a/docs/src/fa/getting-started/security.md b/docs/src/fa/getting-started/security.md deleted file mode 100644 index e205698d..00000000 --- a/docs/src/fa/getting-started/security.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: Security ---- - -# Security concerns - -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). - -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): - -- `writable/` folder must be **readable** and **writable**. -- `public/media/` folder must be **readable** and **writable**. -- any other file must be set to **readonly**. - -For instance, if you are using Apache or NGINX with Ubuntu you may do the -following: - -```bash -sudo chown -R root:root /path/to/castopod -sudo chown -R www-data:www-data /path/to/castopod/writable -sudo chown -R www-data:www-data /path/to/castopod/public/media -``` diff --git a/docs/src/fa/getting-started/update.md b/docs/src/fa/getting-started/update.md deleted file mode 100644 index 98e019fb..00000000 --- a/docs/src/fa/getting-started/update.md +++ /dev/null @@ -1,109 +0,0 @@ ---- -title: Update -sidebarDepth: 3 ---- - -# How to update 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 ⚡. - -## Update instructions - -0. ⚠️ Before any update, we highly recommend you backup your Castopod files and - database. - - - cf. - [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 - - - cf. - [Where can I find my 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 - - - ⚠️ 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/) - -3. On your server: - - - Remove all files except `.env` and `public/media` - - Copy the new files from the downloaded package into your server - - ::: info Note - - You may need to reset files permissions as during the install process. - Check [Security Concerns](./security.md). - - ::: - -4. Update your database schema from your `Castopod Admin` > `About` page or by - running: - - ```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! - -::: info Note - -Releases may come with additional update instructions (see -[releases page](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) - -::: - -## Fully Automated updates - -> Coming soon... 👀 - -## Frequently asked questions (FAQ) - -### Where can I find my Castopod version? - -Go to your Castopod admin panel, the version is displayed on the bottom left -corner. - -Alternatively, you can find the version in the `app > Config > Constants.php` -file. - -### I haven't updated my instance in a long time… What should I do? - -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. - -> You may want to backup your instance depending on how long you haven't updated -> Castopod. - -For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to -`v1.0.0-beta.1`: - -0. (highly recommended) Make a backup of your files and database. - -1. Download the latest release, overwrite your files whilst keeping `.env` and - `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`, - `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`. - -3. ✨ Enjoy your fresh instance, you're all done! - -### Should I make a backup before updating? - -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… diff --git a/docs/src/fa/index.md b/docs/src/fa/index.md deleted file mode 100644 index 7f012c6c..00000000 --- a/docs/src/fa/index.md +++ /dev/null @@ -1,300 +0,0 @@ ---- -sidebarDepth: 2 ---- - -# Welcome 👋 - -[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] - -Castopod is a free & open-source hosting platform made for podcasters who want -engage and interact with their audience. - -Castopod is easy to install and was built on top of -[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very -small footprint. - -
- Install -
- -## Features - -- 🌱  Free & open-source (AGPL v3 License) -- 🔐  Focused on data sovereignty: your content, audience, and analytics - belong to you, and you only -- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, - chapters, location, persons, soundbites, … -- 💬  Built-in social network: - - 🚀  Castopod is part of the Fediverse, a decentralized social network - - ❤️  Create posts, share, favourite, and comment on episodes -- 📈  Built-in analytics: - - ⚖️  GDPR / CCPA / LGPD compliant - - 🪙  Standard IABv2 audience measurement - - 🏡  On-premises analytics, no third party involved -- 📢  Built-in marketing tools: - - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) - - 📱  PWA: install as a standalone app - - 🎨  Customizable theme colors - - 🎬  Generate ready-to-share Video clips from episodes - - 🔉  Generate soundbites - - ▶️  Embeddable player, embed your episodes on any website -- 💸  Monetization: - - 🔗  Funding links - - 📲  listen-to-click ads - - 🤝  value4value / WebMonetization - - 💎  Premium podcasts -- 📡  Publish your episodes everywhere with RSS: - - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, - Google Podcasts, Deezer, Podcast Addict, Podfriend, … - - ⚡  Broadcast your episodes instantly with WebSub -- 📥  Podcast import: move your existing podcast into Castopod -- 📤  Move your podcast out of Castopod -- 🔀  Multi-tenant: host as many podcasts as you want -- 👥  Multi-user: add contributors and set roles -- 🌎  i18n support: translated in English, French, Polish, German, - Brazilian Portuguese & Spanish… with - [more to come](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. - -It is in fact one of the only media to have stayed this way for a long time. - -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. - -With podcasting becoming more widely used, some companies are trying to shift it -towards a more controlled and centralized 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. - -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. - -## Comparison with other solutions - -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 you. - -### 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 it. - -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. - -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. - -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 journey. - -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. - -Finally, depending on your needs, Wordpress and Castopod can even live side by -side as they share the same requirements! - -### 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 was initially built around music. And later on, as the project -evolved, the ability to host podcasts was introduced. - -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, …). - -So, you should probably use Funkwhale if you want to host your music, and use -Castopod if you want to host your podcasts. - -### Castopod vs other podcast hosts - -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! - -Each of these solutions differ from one another, you may compare with the -[list of features](#features). - -That being said, there are two main differences with other podcasting solutions: - -- 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 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. - -## Contributing - -Love Castopod and would like to help? Take a look at the following documentation -to get you started. - -### Code of conduct - -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 tolerated. - -### Contributing 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. - -## Contributors ✨ - -Thanks goes to these wonderful people -([emoji key](https://allcontributors.org/docs/en/emoji-key)): - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Ewen
Ewen

🌍 🤔 💻
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
KrzysztofDomanczyk
KrzysztofDomanczyk

💻
Guy Martin
Guy Martin

🐛 💻
- - - - - - -This project follows the -[all-contributors](https://github.com/all-contributors/all-contributors) -specification. Contributions of any kind welcome! - -## Contact - -You may reach us for help or ask any question you have on: - -- [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) - -Alternatively, you can follow us on social media platforms to get news about -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 - -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). - -
- Ad Aures Logo - NLnet Logo -
- -## License - -[GNU Affero General Public License v3.0](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 - -[release]: https://code.castopod.org/adaures/castopod/-/releases -[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md -[contributions]: https://code.castopod.org/adaures/castopod/-/issues -[semantic-release]: https://github.com/semantic-release/semantic-release -[discord]: https://castopod.org/discord -[stars]: https://github.com/ad-aures/castopod/stargazers -[crowdin]: https://translate.castopod.org/project/castopod diff --git a/docs/src/fr/getting-started/_category_.json b/docs/src/fr/getting-started/_category_.json deleted file mode 100644 index 877a378f..00000000 --- a/docs/src/fr/getting-started/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Getting Started", - "position": 2 -} diff --git a/docs/src/fr/getting-started/auth.md b/docs/src/fr/getting-started/auth.md deleted file mode 100644 index 711f7f53..00000000 --- a/docs/src/fr/getting-started/auth.md +++ /dev/null @@ -1,88 +0,0 @@ ---- -title: Authentification et Autorisation -sidebarDepth: 3 ---- - -# Authentification et Autorisation - -Castopod gère l'authentification et l'autorisation à l'aide de -`codeigniter/shield` associés à des règles personnalisées. Les rôles et les -autorisations sont définis sur deux niveaux : - -1. [à l'échelle de l'instance](#1-instance-wide-roles-and-permissions) -2. [par podcast](#2-per-podcast-roles-and-permissions) - -## 1. Rôles et autorisations à l'échelle de l'instance - -### Rôles dans l’instance - - - -| rôle | description | permissions | -| ------------ | ----------------------------------- | ------------------------------------------------------------------------------------------ | -| Super admin | A un contrôle complet sur Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Gestionnaire | Gère le contenu de Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | -| Podcasteur | Utilisateurs généraux de Castopod. | admin.access | - - - -### Autorisations dans l'instance - - - -| autorisation | description | -| ----------------------- | -------------------------------------------------------------------------------------- | -| admin.access | Peut accéder à la zone d'administration Castopod. | -| admin.settings | Peut accéder aux paramètres de Castopod. | -| users.manage | Peut gérer les utilisateurs de Castopod. | -| persons.manage | Permet de gérer les personnes. | -| pages.manage | Permet de gérer les pages. | -| podcasts.view | Peut voir tous les podcasts. | -| podcasts.create | Peut créer de nouveaux podcasts. | -| podcasts.import | Peut importer des podcasts. | -| fediverse.manage-blocks | Permet de bloquer les intéractions d'acteurs et de domaines du fédivers avec Castopod. | - - - -## 2. Rôles et autorisations par podcast - -### Rôles par podcast - - - -| rôle | description | permissions | -| ------- | --------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | A un contrôle total sur le podcast #{id}. | \* | -| Éditeur | Gère le contenu et les publications du podcast #{id}. | view, edit, manage-import, manage-people, manage-platforms, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-people, episodes.manage-clips, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| Auteur | Gère le contenu du podcast #{id} , mais ne peut pas le publier. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Invité | Contributeur général du podcast #{id}. | view, episodes.view | - - - -### Permissions par podcast - - - -| autorisation | description | -| ---------------------------- | ----------------------------------------------------------------------------------------- | -| voir | Visualisation du tableau de bord et de l'analyse du podcast #{id}. | -| edit | Peut éditer le podcast #{id}. | -| delete | Peut supprimer le podcast #{id}. | -| manage-import | Peut synchroniser le podcast importé #{id}. | -| manage-persons | Permet de gérer les abonnements au podcast #{id}. | -| manage-subscriptions | Permet de gérer les abonnements au podcast #{id}. | -| manage-contributors | Permet de gérer les contributeurs du podcast #{id}. | -| manage-platforms | Peut configurer/supprimer les liens de la plateforme du podcast #{id}. | -| manage-publications | Peut publier le podcast #{id}. | -| manage-publications | Peut afficher et marquer les notifications comme lues pour le podcast #{id}. | -| interact-as | Peut interagir en tant que podcast #{id} pour ajouter, partager ou répondre aux messages. | -| episodes.view | Peut voir le tableau de bord et les analyses du podcast #{id}. | -| episodes.create | Peut créer des épisodes pour le podcast #{id}. | -| episodes.create | Peut éditer le podcast #{id}. | -| supprimer les épisodes | Peut supprimer le podcast #{id}. | -| episodes.manage-persons | Permet de gérer les abonnements au podcast #{id}. | -| episodes.manage-clips | Permet de gérer les clips vidéo ou les parties sonores du podcast #{id}. | -| episodes.manage-publications | Peut publier le podcast #{id}. | -| episodes.manage-comments | Peut créer/supprimer les commentaires de l'épisode du podcast #{id}. | - - diff --git a/docs/src/fr/index.md b/docs/src/fr/index.md deleted file mode 100644 index c84a8387..00000000 --- a/docs/src/fr/index.md +++ /dev/null @@ -1,304 +0,0 @@ ---- -sidebarDepth: 2 ---- - -# Bienvenue 👋 - -[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] - -Castopod est une plateforme d’hébergement gratuite & open-source conçue pour les -podcasteurs qui veulent échanger et interagir avec leur public. - -Castopod est facile à installer et a été conçu avec -[CodeIgniter4](https://codeigniter.com/), un framework PHP puissant de très -petite taille. - - - -## Fonctionnalités - -- 🌱  Libre, gratuit & open-source (Licence AGPL v3) -- 🔐  focalisé sur la souveraineté des données : votre contenu, votre - audience et vos statiistiques vous appartiennent, et à vous seulement -- 🪄 Fonctionnalités du Podcasting 2.0 : GUID, verrouillage, - transcriptions, financement, chapitres, géo-localisation, intervenants, - extraits sonores, … -- 💬  Réseau social intégré : - - 🚀  Castopod fait partie du Fédivers, un réseau social décentralisé - - ❤️  Créer des publications, partager, mettre en favori et commenter des - épisodes -- 📈  Statistiques intégrées : - - ⚖️  Conforme GDPR / CCPA / LGPD - - 🪙 Mesure d'audience IABv2 - - 🏡  Statistiques intégrées, aucune tierce partie intermédiaire -- 📢  Outils de marketing intégrés : - - ✅  Prêt pour le SEO (méta-tags open-graph, JSON-LD…) - - 📱  PWA: installez comme application autonome - - 🎨  Couleurs de thèmes personnalisables - - 🎬  Générez des clips vidéo prêts à partager à partir d'épisodes - - 🔉  Générez des extraits sonores - - ▶️  Intégrer vos épisodes dans n'importe quel site web -- 💸  Monétisation: - - 🔗  Liens de financement - - 📲  publicité “listen-to-click” - - 🤝  value4value / WebMonetization - - 💎  Podcasts premium -- 📡 Publiez vos épisodes partout avec RSS : - - 📱  Sur tous les index et toutes les applications : Podcast Index, - Podcasts Apple, Spotify, Google Podcasts, Deezer, Podcast Addict, Podfriend… - - ⚡ Diffusez instantanément vos épisodes avec WebSub -- 📥  Importation de Podcast : déménagez votre podcast existant vers - Castopod -- 📤  Déplacez votre podcast chez un autre hébergeur -- 🔀  Multi-locataire : hébergez autant de podcasts que vous le souhaitez -- 👥  Multi-utilisateur : ajoutez des contributeurs et définissez leurs - rôles -- 🌎  support de i18n : traduit en anglais, français, polonais, allemand, - portugais, brésilien & espagnol… et - [plus à l'avenir](https://translate.castopod.org)! - -## Pourquoi Castopod ? - -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. - -It is in fact one of the only media to have stayed this way for a long time. - -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. - -With podcasting becoming more widely used, some companies are trying to shift it -towards a more controlled and centralized 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. - -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. - -## Comparaison avec d'autres solutions - -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 you. - -### 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 it. - -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. - -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. - -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 journey. - -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. - -Finally, depending on your needs, Wordpress and Castopod can even live side by -side as they share the same requirements! - -### 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 was initially built around music. And later on, as the project -evolved, the ability to host podcasts was introduced. - -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, …). - -So, you should probably use Funkwhale if you want to host your music, and use -Castopod if you want to host your podcasts. - -### Castopod vs Autres hébergeurs de podcasts - -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! - -Each of these solutions differ from one another, you may compare with the -[list of features](#features). - -That being said, there are two main differences with other podcasting solutions: - -- Castopod peut être auto-hébergé et est la seule solution qui vous permet de - garder le contrôle total sur ce que vous produisez. D'autre part, comme il est - open-source, vous avez le pouvoir de le modifier comme vous le souhaitez. - -- Castopod est la seule solution qui intègre aujourd'hui à la fois un réseau - social décentralisé avec ActivityPub et des fonctionnalités de « Podcasting - 2.0 », réduisant ainsi l'écart entre les deux. - -## Contribuer - -Love Castopod and would like to help? Take a look at the following documentation -to get you started. - -### Code de conduite - -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 tolerated. - -### Guide de contribution - -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. - -## Contributeurs ✨ - -Thanks goes to these wonderful people -([emoji key](https://allcontributors.org/docs/en/emoji-key)): - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Ewen
Ewen

🌍 🤔 💻
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
KrzysztofDomanczyk
KrzysztofDomanczyk

💻
Guy Martin
Guy Martin

🐛 💻
- - - - - - -This project follows the -[all-contributors](https://github.com/all-contributors/all-contributors) -specification. Contributions of any kind welcome! - -## Contact - -You may reach us for help or ask any question you have on: - -- [Discord](https://castopod.org/discord) (pour dialoguer en temps réel avec les - développeurs et la communauté) -- [Suivi de problèmes](https://code.castopod.org/adaures/castopod/-/issues) - (pour toute demande de nouvelle fonctionnalité ou rapport de bug) - -Alternatively, you can follow us on social media platforms to get news about -Castopod: - -- [podlibre.social](https://podlibre.social/@Castopod) (Instance Mastodon) -- [Twitter](https://twitter.com/castopod) -- [LinkedIn](https://linkedin.com/company/castopod) -- [Facebook](https://www.facebook.com/castopod) - -## Sponsors - -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). - -
- Logo d'Ad Aures - Logo de NLnet -
- -## Licence - -[GNU Affero General Public License v3.0](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 - -[release]: https://code.castopod.org/adaures/castopod/-/releases -[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md -[contributions]: https://code.castopod.org/adaures/castopod/-/issues -[semantic-release]: https://github.com/semantic-release/semantic-release -[discord]: https://castopod.org/discord -[stars]: https://github.com/ad-aures/castopod/stargazers -[crowdin]: https://translate.castopod.org/project/castopod diff --git a/docs/src/fr2/getting-started/auth.md b/docs/src/fr2/getting-started/auth.md deleted file mode 100644 index ff5d59c0..00000000 --- a/docs/src/fr2/getting-started/auth.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -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 - - - -| 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 | - - - -### Instance permissions - - - -| 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. | - - - -## 2. Per podcast roles and permissions - -### Per podcast roles - - - -| 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, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| 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 | - - - -### Per podcast permissions - - - -| 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}. | - - diff --git a/docs/src/fr2/getting-started/docker.md b/docs/src/fr2/getting-started/docker.md deleted file mode 100644 index 12f01619..00000000 --- a/docs/src/fr2/getting-started/docker.md +++ /dev/null @@ -1,160 +0,0 @@ ---- -title: Official Docker images -sidebarDepth: 3 ---- - -# Official Docker images - -Castopod pushes 3 Docker images to the Docker Hub during its automated build -process: - -- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all - in one castopod image using nginx unit -- [**`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 - -Additionally, Castopod requires a MySQL-compatible database. A Redis database -can be added as a cache handler. - -## Supported tags - -- `develop` [unstable], latest development branch build -- `beta` [stable], latest beta version build -- `latest` [stable], latest version build -- `1.x.x` [stable], specific version build (since `1.0.0`) - -## Example usage - -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: - - ```yml - version: "3.7" - - services: - app: - image: castopod/castopod:latest - container_name: "castopod-app" - volumes: - - castopod-media:/var/www/castopod/public/media - environment: - MYSQL_DATABASE: castopod - MYSQL_USER: castopod - MYSQL_PASSWORD: changeme - CP_BASEURL: "https://castopod.example.com" - CP_ANALYTICS_SALT: changeme - CP_CACHE_HANDLER: redis - CP_REDIS_HOST: redis - CP_REDIS_PASSWORD: changeme - networks: - - castopod-app - - castopod-db - ports: - - 8000:8000 - restart: unless-stopped - - mariadb: - image: mariadb:10.5 - container_name: "castopod-mariadb" - networks: - - castopod-db - volumes: - - castopod-db:/var/lib/mysql - environment: - MYSQL_ROOT_PASSWORD: changeme - MYSQL_DATABASE: castopod - MYSQL_USER: castopod - MYSQL_PASSWORD: changeme - restart: unless-stopped - - redis: - image: redis:7.0-alpine - container_name: "castopod-redis" - command: --requirepass changeme - volumes: - - castopod-cache:/data - networks: - - castopod-app - - volumes: - castopod-media: - castopod-db: - castopod-cache: - - networks: - castopod-app: - castopod-db: - ``` - - You have to adapt some variables to your needs (e.g. `CP_BASEURL`, - `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). - -3. Setup a reverse proxy for 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/): - - ``` - #castopod - castopod.example.com { - reverse_proxy localhost:8000 - } - ``` - -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! - -5. You're all set, start podcasting! 🎙️🚀 - -## Environment Variables - -- **castopod/castopod** and **castopod/app** - - | Variable name | Type (`default`) | Default | - | ------------------------------------- | ----------------------- | ---------------- | - | **`CP_BASEURL`** | string | `undefined` | - | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | - | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | - | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | - | **`CP_ANALYTICS_SALT`** | string | `undefined` | - | **`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_REDIS_HOST`** | ?string | `"localhost"` | - | **`CP_REDIS_PASSWORD`** | ?string | `null` | - | **`CP_REDIS_PORT`** | ?number | `6379` | - | **`CP_REDIS_DATABASE`** | ?number | `0` | - | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | - | **`CP_EMAIL_FROM`** | ?string | `undefined` | - | **`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_ENABLE_2FA`** | ?boolean | `undefined` | - | **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` | - | **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` | - | **`CP_MEDIA_S3_KEY`** | ?string | `undefined` | - | **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` | - | **`CP_MEDIA_S3_REGION`** | ?string | `undefined` | - | **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` | - | **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` | - | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` | - | **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` | - | **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` | - | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | - | **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` | - | **`CP_TIMEOUT`** | ?number | `900` | - -- **castopod/web-server** - - | Variable name | Type | Default | - | ---------------------- | --------------------- | ------- | - | **`CP_APP_HOSTNAME`** | ?string | `"app"` | - | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | - | **`CP_TIMEOUT`** | ?number | `900` | diff --git a/docs/src/fr2/getting-started/install.md b/docs/src/fr2/getting-started/install.md deleted file mode 100644 index cdea18ec..00000000 --- a/docs/src/fr2/getting-started/install.md +++ /dev/null @@ -1,238 +0,0 @@ ---- -title: Installation -sidebarDepth: 3 ---- - -# How to install 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. - -::: tip Note - -We've released official Docker images for Castopod! - -If you prefer using Docker, you may skip this and go straight to the -[docker documentation](./docker.md) for Castopod. - -::: - -## Requirements - -- PHP v8.1 or higher -- MySQL version 5.7 or higher or MariaDB version 10.2 or higher -- HTTPS support -- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's - incoming requests - -### PHP v8.1 or higher - -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. -- [exif](https://www.php.net/manual/en/exif.installation.php) - -Additionally, make sure that the following extensions are enabled in your PHP: - -- json (enabled by default - don't turn it off) -- xml (enabled by default - don't turn it off) -- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php) - -### MySQL compatible database - -> We recommend using [MariaDB](https://mariadb.org). - -::: warning Warning - -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. - -::: - -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. - -#### Privileges - -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`. - -### (Optional) FFmpeg v4.1.8 or higher for Video Clips - -[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: - -- **FreeType 2** library for - [gd](https://www.php.net/manual/en/image.installation.php). - -### (Optional) Other recommendations - -- Redis for better cache performances. -- CDN for static files caching and better performances. -- e-mail gateway for lost passwords. - -## Install instructions - -### Pre-requisites - -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 haven’t 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): - - ```bash - * * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1 - ``` - - **Note** - If you do not add this cron task, the following Castopod features - will not work: - - - Importing a podcast from an existing RSS feed - - Broadcasting social activities to your followers in the fediverse - - Broadcasting episodes to open hubs using - [WebSub](https://en.wikipedia.org/wiki/WebSub) - - Generating video clips - - [requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips) - -### (recommended) Install Wizard - -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! - -::: info Note - -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. - -::: - -### Using CLI - -1. Create a `.env` file in the package root based on the `.env.example` file. -2. Initialize the database using: - - ```sh - php spark install:init-database - ``` - -3. Create the superadmin user using: - - ```sh - php spark install:create-superadmin - ``` - -4. Head on to your admin gateway to start podcasting! - -### Email/SMTP setup - -Email configuration is required for some features to work properly (eg. -retrieving your forgotten password, sending instructions to premium subscribers, -…) - -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" -``` - -#### Email config options - -| 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"` | - -### Media storage - -By default, files are saved to the `public/media` folder using the file system. -If you need to relocate the `media` folder to a different location, you can -specify it in your `.env` file as shown below: - -```ini -# […] - -media.root="media" -media.storage="/mnt/storage" -``` - -In this example, the files will be saved to the /mnt/storage/media folder. Make -sure to also update your web server configuration to reflect this change. - -### S3 - -If you prefer storing your media files on an S3 compatible storage, you may -specify it in your `.env`: - -```ini -# […] - -media.fileManager="s3" -media.s3.endpoint="your_s3_host" -media.s3.key="your_s3_key" -media.s3.secret="your_s3_secret" -media.s3.region="your_s3_region" -``` - -#### S3 config options - -| Variable name | Type | Default | -| ----------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`pathStyleEndpoint`** | boolean | `false` | -| **`keyPrefix`** | string | `undefined` | - -## Community packages - -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. - -### Install with 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. - -
- - - Install Castopod with YunoHost - - -Github -Repo - -
diff --git a/docs/src/fr2/getting-started/security.md b/docs/src/fr2/getting-started/security.md deleted file mode 100644 index e205698d..00000000 --- a/docs/src/fr2/getting-started/security.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: Security ---- - -# Security concerns - -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). - -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): - -- `writable/` folder must be **readable** and **writable**. -- `public/media/` folder must be **readable** and **writable**. -- any other file must be set to **readonly**. - -For instance, if you are using Apache or NGINX with Ubuntu you may do the -following: - -```bash -sudo chown -R root:root /path/to/castopod -sudo chown -R www-data:www-data /path/to/castopod/writable -sudo chown -R www-data:www-data /path/to/castopod/public/media -``` diff --git a/docs/src/fr2/getting-started/update.md b/docs/src/fr2/getting-started/update.md deleted file mode 100644 index 98e019fb..00000000 --- a/docs/src/fr2/getting-started/update.md +++ /dev/null @@ -1,109 +0,0 @@ ---- -title: Update -sidebarDepth: 3 ---- - -# How to update 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 ⚡. - -## Update instructions - -0. ⚠️ Before any update, we highly recommend you backup your Castopod files and - database. - - - cf. - [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 - - - cf. - [Where can I find my 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 - - - ⚠️ 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/) - -3. On your server: - - - Remove all files except `.env` and `public/media` - - Copy the new files from the downloaded package into your server - - ::: info Note - - You may need to reset files permissions as during the install process. - Check [Security Concerns](./security.md). - - ::: - -4. Update your database schema from your `Castopod Admin` > `About` page or by - running: - - ```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! - -::: info Note - -Releases may come with additional update instructions (see -[releases page](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) - -::: - -## Fully Automated updates - -> Coming soon... 👀 - -## Frequently asked questions (FAQ) - -### Where can I find my Castopod version? - -Go to your Castopod admin panel, the version is displayed on the bottom left -corner. - -Alternatively, you can find the version in the `app > Config > Constants.php` -file. - -### I haven't updated my instance in a long time… What should I do? - -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. - -> You may want to backup your instance depending on how long you haven't updated -> Castopod. - -For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to -`v1.0.0-beta.1`: - -0. (highly recommended) Make a backup of your files and database. - -1. Download the latest release, overwrite your files whilst keeping `.env` and - `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`, - `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`. - -3. ✨ Enjoy your fresh instance, you're all done! - -### Should I make a backup before updating? - -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… diff --git a/docs/src/fr2/index.md b/docs/src/fr2/index.md deleted file mode 100644 index 7f012c6c..00000000 --- a/docs/src/fr2/index.md +++ /dev/null @@ -1,300 +0,0 @@ ---- -sidebarDepth: 2 ---- - -# Welcome 👋 - -[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] - -Castopod is a free & open-source hosting platform made for podcasters who want -engage and interact with their audience. - -Castopod is easy to install and was built on top of -[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very -small footprint. - -
- Install -
- -## Features - -- 🌱  Free & open-source (AGPL v3 License) -- 🔐  Focused on data sovereignty: your content, audience, and analytics - belong to you, and you only -- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, - chapters, location, persons, soundbites, … -- 💬  Built-in social network: - - 🚀  Castopod is part of the Fediverse, a decentralized social network - - ❤️  Create posts, share, favourite, and comment on episodes -- 📈  Built-in analytics: - - ⚖️  GDPR / CCPA / LGPD compliant - - 🪙  Standard IABv2 audience measurement - - 🏡  On-premises analytics, no third party involved -- 📢  Built-in marketing tools: - - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) - - 📱  PWA: install as a standalone app - - 🎨  Customizable theme colors - - 🎬  Generate ready-to-share Video clips from episodes - - 🔉  Generate soundbites - - ▶️  Embeddable player, embed your episodes on any website -- 💸  Monetization: - - 🔗  Funding links - - 📲  listen-to-click ads - - 🤝  value4value / WebMonetization - - 💎  Premium podcasts -- 📡  Publish your episodes everywhere with RSS: - - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, - Google Podcasts, Deezer, Podcast Addict, Podfriend, … - - ⚡  Broadcast your episodes instantly with WebSub -- 📥  Podcast import: move your existing podcast into Castopod -- 📤  Move your podcast out of Castopod -- 🔀  Multi-tenant: host as many podcasts as you want -- 👥  Multi-user: add contributors and set roles -- 🌎  i18n support: translated in English, French, Polish, German, - Brazilian Portuguese & Spanish… with - [more to come](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. - -It is in fact one of the only media to have stayed this way for a long time. - -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. - -With podcasting becoming more widely used, some companies are trying to shift it -towards a more controlled and centralized 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. - -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. - -## Comparison with other solutions - -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 you. - -### 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 it. - -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. - -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. - -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 journey. - -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. - -Finally, depending on your needs, Wordpress and Castopod can even live side by -side as they share the same requirements! - -### 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 was initially built around music. And later on, as the project -evolved, the ability to host podcasts was introduced. - -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, …). - -So, you should probably use Funkwhale if you want to host your music, and use -Castopod if you want to host your podcasts. - -### Castopod vs other podcast hosts - -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! - -Each of these solutions differ from one another, you may compare with the -[list of features](#features). - -That being said, there are two main differences with other podcasting solutions: - -- 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 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. - -## Contributing - -Love Castopod and would like to help? Take a look at the following documentation -to get you started. - -### Code of conduct - -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 tolerated. - -### Contributing 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. - -## Contributors ✨ - -Thanks goes to these wonderful people -([emoji key](https://allcontributors.org/docs/en/emoji-key)): - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Ewen
Ewen

🌍 🤔 💻
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
KrzysztofDomanczyk
KrzysztofDomanczyk

💻
Guy Martin
Guy Martin

🐛 💻
- - - - - - -This project follows the -[all-contributors](https://github.com/all-contributors/all-contributors) -specification. Contributions of any kind welcome! - -## Contact - -You may reach us for help or ask any question you have on: - -- [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) - -Alternatively, you can follow us on social media platforms to get news about -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 - -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). - -
- Ad Aures Logo - NLnet Logo -
- -## License - -[GNU Affero General Public License v3.0](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 - -[release]: https://code.castopod.org/adaures/castopod/-/releases -[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md -[contributions]: https://code.castopod.org/adaures/castopod/-/issues -[semantic-release]: https://github.com/semantic-release/semantic-release -[discord]: https://castopod.org/discord -[stars]: https://github.com/ad-aures/castopod/stargazers -[crowdin]: https://translate.castopod.org/project/castopod diff --git a/docs/src/fr_CA/getting-started/auth.md b/docs/src/fr_CA/getting-started/auth.md deleted file mode 100644 index ff5d59c0..00000000 --- a/docs/src/fr_CA/getting-started/auth.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -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 - - - -| 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 | - - - -### Instance permissions - - - -| 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. | - - - -## 2. Per podcast roles and permissions - -### Per podcast roles - - - -| 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, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| 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 | - - - -### Per podcast permissions - - - -| 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}. | - - diff --git a/docs/src/fr_CA/getting-started/docker.md b/docs/src/fr_CA/getting-started/docker.md deleted file mode 100644 index 12f01619..00000000 --- a/docs/src/fr_CA/getting-started/docker.md +++ /dev/null @@ -1,160 +0,0 @@ ---- -title: Official Docker images -sidebarDepth: 3 ---- - -# Official Docker images - -Castopod pushes 3 Docker images to the Docker Hub during its automated build -process: - -- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all - in one castopod image using nginx unit -- [**`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 - -Additionally, Castopod requires a MySQL-compatible database. A Redis database -can be added as a cache handler. - -## Supported tags - -- `develop` [unstable], latest development branch build -- `beta` [stable], latest beta version build -- `latest` [stable], latest version build -- `1.x.x` [stable], specific version build (since `1.0.0`) - -## Example usage - -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: - - ```yml - version: "3.7" - - services: - app: - image: castopod/castopod:latest - container_name: "castopod-app" - volumes: - - castopod-media:/var/www/castopod/public/media - environment: - MYSQL_DATABASE: castopod - MYSQL_USER: castopod - MYSQL_PASSWORD: changeme - CP_BASEURL: "https://castopod.example.com" - CP_ANALYTICS_SALT: changeme - CP_CACHE_HANDLER: redis - CP_REDIS_HOST: redis - CP_REDIS_PASSWORD: changeme - networks: - - castopod-app - - castopod-db - ports: - - 8000:8000 - restart: unless-stopped - - mariadb: - image: mariadb:10.5 - container_name: "castopod-mariadb" - networks: - - castopod-db - volumes: - - castopod-db:/var/lib/mysql - environment: - MYSQL_ROOT_PASSWORD: changeme - MYSQL_DATABASE: castopod - MYSQL_USER: castopod - MYSQL_PASSWORD: changeme - restart: unless-stopped - - redis: - image: redis:7.0-alpine - container_name: "castopod-redis" - command: --requirepass changeme - volumes: - - castopod-cache:/data - networks: - - castopod-app - - volumes: - castopod-media: - castopod-db: - castopod-cache: - - networks: - castopod-app: - castopod-db: - ``` - - You have to adapt some variables to your needs (e.g. `CP_BASEURL`, - `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). - -3. Setup a reverse proxy for 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/): - - ``` - #castopod - castopod.example.com { - reverse_proxy localhost:8000 - } - ``` - -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! - -5. You're all set, start podcasting! 🎙️🚀 - -## Environment Variables - -- **castopod/castopod** and **castopod/app** - - | Variable name | Type (`default`) | Default | - | ------------------------------------- | ----------------------- | ---------------- | - | **`CP_BASEURL`** | string | `undefined` | - | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | - | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | - | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | - | **`CP_ANALYTICS_SALT`** | string | `undefined` | - | **`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_REDIS_HOST`** | ?string | `"localhost"` | - | **`CP_REDIS_PASSWORD`** | ?string | `null` | - | **`CP_REDIS_PORT`** | ?number | `6379` | - | **`CP_REDIS_DATABASE`** | ?number | `0` | - | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | - | **`CP_EMAIL_FROM`** | ?string | `undefined` | - | **`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_ENABLE_2FA`** | ?boolean | `undefined` | - | **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` | - | **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` | - | **`CP_MEDIA_S3_KEY`** | ?string | `undefined` | - | **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` | - | **`CP_MEDIA_S3_REGION`** | ?string | `undefined` | - | **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` | - | **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` | - | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` | - | **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` | - | **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` | - | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | - | **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` | - | **`CP_TIMEOUT`** | ?number | `900` | - -- **castopod/web-server** - - | Variable name | Type | Default | - | ---------------------- | --------------------- | ------- | - | **`CP_APP_HOSTNAME`** | ?string | `"app"` | - | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | - | **`CP_TIMEOUT`** | ?number | `900` | diff --git a/docs/src/fr_CA/getting-started/install.md b/docs/src/fr_CA/getting-started/install.md deleted file mode 100644 index cdea18ec..00000000 --- a/docs/src/fr_CA/getting-started/install.md +++ /dev/null @@ -1,238 +0,0 @@ ---- -title: Installation -sidebarDepth: 3 ---- - -# How to install 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. - -::: tip Note - -We've released official Docker images for Castopod! - -If you prefer using Docker, you may skip this and go straight to the -[docker documentation](./docker.md) for Castopod. - -::: - -## Requirements - -- PHP v8.1 or higher -- MySQL version 5.7 or higher or MariaDB version 10.2 or higher -- HTTPS support -- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's - incoming requests - -### PHP v8.1 or higher - -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. -- [exif](https://www.php.net/manual/en/exif.installation.php) - -Additionally, make sure that the following extensions are enabled in your PHP: - -- json (enabled by default - don't turn it off) -- xml (enabled by default - don't turn it off) -- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php) - -### MySQL compatible database - -> We recommend using [MariaDB](https://mariadb.org). - -::: warning Warning - -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. - -::: - -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. - -#### Privileges - -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`. - -### (Optional) FFmpeg v4.1.8 or higher for Video Clips - -[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: - -- **FreeType 2** library for - [gd](https://www.php.net/manual/en/image.installation.php). - -### (Optional) Other recommendations - -- Redis for better cache performances. -- CDN for static files caching and better performances. -- e-mail gateway for lost passwords. - -## Install instructions - -### Pre-requisites - -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 haven’t 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): - - ```bash - * * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1 - ``` - - **Note** - If you do not add this cron task, the following Castopod features - will not work: - - - Importing a podcast from an existing RSS feed - - Broadcasting social activities to your followers in the fediverse - - Broadcasting episodes to open hubs using - [WebSub](https://en.wikipedia.org/wiki/WebSub) - - Generating video clips - - [requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips) - -### (recommended) Install Wizard - -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! - -::: info Note - -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. - -::: - -### Using CLI - -1. Create a `.env` file in the package root based on the `.env.example` file. -2. Initialize the database using: - - ```sh - php spark install:init-database - ``` - -3. Create the superadmin user using: - - ```sh - php spark install:create-superadmin - ``` - -4. Head on to your admin gateway to start podcasting! - -### Email/SMTP setup - -Email configuration is required for some features to work properly (eg. -retrieving your forgotten password, sending instructions to premium subscribers, -…) - -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" -``` - -#### Email config options - -| 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"` | - -### Media storage - -By default, files are saved to the `public/media` folder using the file system. -If you need to relocate the `media` folder to a different location, you can -specify it in your `.env` file as shown below: - -```ini -# […] - -media.root="media" -media.storage="/mnt/storage" -``` - -In this example, the files will be saved to the /mnt/storage/media folder. Make -sure to also update your web server configuration to reflect this change. - -### S3 - -If you prefer storing your media files on an S3 compatible storage, you may -specify it in your `.env`: - -```ini -# […] - -media.fileManager="s3" -media.s3.endpoint="your_s3_host" -media.s3.key="your_s3_key" -media.s3.secret="your_s3_secret" -media.s3.region="your_s3_region" -``` - -#### S3 config options - -| Variable name | Type | Default | -| ----------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`pathStyleEndpoint`** | boolean | `false` | -| **`keyPrefix`** | string | `undefined` | - -## Community packages - -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. - -### Install with 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. - -
- - - Install Castopod with YunoHost - - -Github -Repo - -
diff --git a/docs/src/fr_CA/getting-started/security.md b/docs/src/fr_CA/getting-started/security.md deleted file mode 100644 index e205698d..00000000 --- a/docs/src/fr_CA/getting-started/security.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: Security ---- - -# Security concerns - -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). - -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): - -- `writable/` folder must be **readable** and **writable**. -- `public/media/` folder must be **readable** and **writable**. -- any other file must be set to **readonly**. - -For instance, if you are using Apache or NGINX with Ubuntu you may do the -following: - -```bash -sudo chown -R root:root /path/to/castopod -sudo chown -R www-data:www-data /path/to/castopod/writable -sudo chown -R www-data:www-data /path/to/castopod/public/media -``` diff --git a/docs/src/fr_CA/getting-started/update.md b/docs/src/fr_CA/getting-started/update.md deleted file mode 100644 index 98e019fb..00000000 --- a/docs/src/fr_CA/getting-started/update.md +++ /dev/null @@ -1,109 +0,0 @@ ---- -title: Update -sidebarDepth: 3 ---- - -# How to update 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 ⚡. - -## Update instructions - -0. ⚠️ Before any update, we highly recommend you backup your Castopod files and - database. - - - cf. - [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 - - - cf. - [Where can I find my 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 - - - ⚠️ 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/) - -3. On your server: - - - Remove all files except `.env` and `public/media` - - Copy the new files from the downloaded package into your server - - ::: info Note - - You may need to reset files permissions as during the install process. - Check [Security Concerns](./security.md). - - ::: - -4. Update your database schema from your `Castopod Admin` > `About` page or by - running: - - ```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! - -::: info Note - -Releases may come with additional update instructions (see -[releases page](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) - -::: - -## Fully Automated updates - -> Coming soon... 👀 - -## Frequently asked questions (FAQ) - -### Where can I find my Castopod version? - -Go to your Castopod admin panel, the version is displayed on the bottom left -corner. - -Alternatively, you can find the version in the `app > Config > Constants.php` -file. - -### I haven't updated my instance in a long time… What should I do? - -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. - -> You may want to backup your instance depending on how long you haven't updated -> Castopod. - -For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to -`v1.0.0-beta.1`: - -0. (highly recommended) Make a backup of your files and database. - -1. Download the latest release, overwrite your files whilst keeping `.env` and - `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`, - `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`. - -3. ✨ Enjoy your fresh instance, you're all done! - -### Should I make a backup before updating? - -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… diff --git a/docs/src/fr_CA/index.md b/docs/src/fr_CA/index.md deleted file mode 100644 index 7f012c6c..00000000 --- a/docs/src/fr_CA/index.md +++ /dev/null @@ -1,300 +0,0 @@ ---- -sidebarDepth: 2 ---- - -# Welcome 👋 - -[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] - -Castopod is a free & open-source hosting platform made for podcasters who want -engage and interact with their audience. - -Castopod is easy to install and was built on top of -[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very -small footprint. - -
- Install -
- -## Features - -- 🌱  Free & open-source (AGPL v3 License) -- 🔐  Focused on data sovereignty: your content, audience, and analytics - belong to you, and you only -- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, - chapters, location, persons, soundbites, … -- 💬  Built-in social network: - - 🚀  Castopod is part of the Fediverse, a decentralized social network - - ❤️  Create posts, share, favourite, and comment on episodes -- 📈  Built-in analytics: - - ⚖️  GDPR / CCPA / LGPD compliant - - 🪙  Standard IABv2 audience measurement - - 🏡  On-premises analytics, no third party involved -- 📢  Built-in marketing tools: - - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) - - 📱  PWA: install as a standalone app - - 🎨  Customizable theme colors - - 🎬  Generate ready-to-share Video clips from episodes - - 🔉  Generate soundbites - - ▶️  Embeddable player, embed your episodes on any website -- 💸  Monetization: - - 🔗  Funding links - - 📲  listen-to-click ads - - 🤝  value4value / WebMonetization - - 💎  Premium podcasts -- 📡  Publish your episodes everywhere with RSS: - - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, - Google Podcasts, Deezer, Podcast Addict, Podfriend, … - - ⚡  Broadcast your episodes instantly with WebSub -- 📥  Podcast import: move your existing podcast into Castopod -- 📤  Move your podcast out of Castopod -- 🔀  Multi-tenant: host as many podcasts as you want -- 👥  Multi-user: add contributors and set roles -- 🌎  i18n support: translated in English, French, Polish, German, - Brazilian Portuguese & Spanish… with - [more to come](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. - -It is in fact one of the only media to have stayed this way for a long time. - -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. - -With podcasting becoming more widely used, some companies are trying to shift it -towards a more controlled and centralized 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. - -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. - -## Comparison with other solutions - -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 you. - -### 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 it. - -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. - -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. - -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 journey. - -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. - -Finally, depending on your needs, Wordpress and Castopod can even live side by -side as they share the same requirements! - -### 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 was initially built around music. And later on, as the project -evolved, the ability to host podcasts was introduced. - -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, …). - -So, you should probably use Funkwhale if you want to host your music, and use -Castopod if you want to host your podcasts. - -### Castopod vs other podcast hosts - -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! - -Each of these solutions differ from one another, you may compare with the -[list of features](#features). - -That being said, there are two main differences with other podcasting solutions: - -- 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 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. - -## Contributing - -Love Castopod and would like to help? Take a look at the following documentation -to get you started. - -### Code of conduct - -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 tolerated. - -### Contributing 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. - -## Contributors ✨ - -Thanks goes to these wonderful people -([emoji key](https://allcontributors.org/docs/en/emoji-key)): - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Ewen
Ewen

🌍 🤔 💻
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
KrzysztofDomanczyk
KrzysztofDomanczyk

💻
Guy Martin
Guy Martin

🐛 💻
- - - - - - -This project follows the -[all-contributors](https://github.com/all-contributors/all-contributors) -specification. Contributions of any kind welcome! - -## Contact - -You may reach us for help or ask any question you have on: - -- [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) - -Alternatively, you can follow us on social media platforms to get news about -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 - -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). - -
- Ad Aures Logo - NLnet Logo -
- -## License - -[GNU Affero General Public License v3.0](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 - -[release]: https://code.castopod.org/adaures/castopod/-/releases -[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md -[contributions]: https://code.castopod.org/adaures/castopod/-/issues -[semantic-release]: https://github.com/semantic-release/semantic-release -[discord]: https://castopod.org/discord -[stars]: https://github.com/ad-aures/castopod/stargazers -[crowdin]: https://translate.castopod.org/project/castopod diff --git a/docs/src/fr_trad/getting-started/auth.md b/docs/src/fr_trad/getting-started/auth.md deleted file mode 100644 index ff5d59c0..00000000 --- a/docs/src/fr_trad/getting-started/auth.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -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 - - - -| 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 | - - - -### Instance permissions - - - -| 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. | - - - -## 2. Per podcast roles and permissions - -### Per podcast roles - - - -| 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, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| 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 | - - - -### Per podcast permissions - - - -| 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}. | - - diff --git a/docs/src/fr_trad/getting-started/docker.md b/docs/src/fr_trad/getting-started/docker.md deleted file mode 100644 index c6e6cb7e..00000000 --- a/docs/src/fr_trad/getting-started/docker.md +++ /dev/null @@ -1,177 +0,0 @@ ---- -title: Official Docker images -sidebarDepth: 3 ---- - -# Official Docker images - -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. - -## Supported tags - -- `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 - -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: - - ```yml - version: "3.7" - - services: - app: - image: castopod/app:latest - container_name: "castopod-app" - volumes: - - castopod-media:/opt/castopod/public/media - environment: - MYSQL_DATABASE: castopod - MYSQL_USER: castopod - MYSQL_PASSWORD: changeme - CP_BASEURL: "http://castopod.example.com" - CP_ANALYTICS_SALT: changeme - CP_CACHE_HANDLER: redis - CP_REDIS_HOST: redis - networks: - - castopod-app - - castopod-db - restart: unless-stopped - - web-server: - image: castopod/web-server:latest - container_name: "castopod-web-server" - volumes: - - castopod-media:/var/www/html/media - networks: - - castopod-app - ports: - - 8080:80 - restart: unless-stopped - - mariadb: - image: mariadb:10.5 - container_name: "castopod-mariadb" - networks: - - castopod-db - volumes: - - castopod-db:/var/lib/mysql - environment: - MYSQL_ROOT_PASSWORD: changeme - MYSQL_DATABASE: castopod - MYSQL_USER: castopod - MYSQL_PASSWORD: changeme - restart: unless-stopped - - redis: - image: redis:7.0-alpine - container_name: "castopod-redis" - volumes: - - castopod-cache:/data - networks: - - castopod-app - - # this container is optional - # add this if you want to use the videoclips feature - video-clipper: - 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: - castopod-cache: - - networks: - castopod-app: - castopod-db: - ``` - - You have to adapt some variables to your needs (e.g. `CP_BASEURL`, - `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). - -3. Setup a reverse proxy for 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/): - - ``` - #castopod - castopod.example.com { - reverse_proxy localhost:8080 - } - ``` - -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! - -5. You're all set, start podcasting! 🎙️🚀 - -## 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 | - | ---------------------------- | ----------------------- | ---------------- | - | **`CP_BASEURL`** | string | `undefined` | - | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | - | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | - | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | - | **`CP_ANALYTICS_SALT`** | string | `undefined` | - | **`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_REDIS_HOST`** | ?string | `"localhost"` | - | **`CP_REDIS_PASSWORD`** | ?string | `null` | - | **`CP_REDIS_PORT`** | ?number | `6379` | - | **`CP_REDIS_DATABASE`** | ?number | `0` | - | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | - | **`CP_EMAIL_FROM`** | ?string | `undefined` | - | **`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"` | - -- **castopod/web-server** - - | Variable name | Type | Default | - | --------------------- | ------- | ------- | - | **`CP_APP_HOSTNAME`** | ?string | `"app"` | diff --git a/docs/src/fr_trad/getting-started/install.md b/docs/src/fr_trad/getting-started/install.md deleted file mode 100644 index c68be846..00000000 --- a/docs/src/fr_trad/getting-started/install.md +++ /dev/null @@ -1,185 +0,0 @@ ---- -title: Installation -sidebarDepth: 3 ---- - -# How to install 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. - -::: tip Note - -We've released official Docker images for Castopod! - -If you prefer using Docker, you may skip this and go straight to the -[docker documentation](./docker.md) for Castopod. - -::: - -## Requirements - -- PHP v8.1 or higher -- MySQL version 5.7 or higher or MariaDB version 10.2 or higher -- HTTPS support - -### PHP v8.1 or higher - -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. -- [exif](https://www.php.net/manual/en/exif.installation.php) - -Additionally, make sure that the following extensions are enabled in your PHP: - -- json (enabled by default - don't turn it off) -- xml (enabled by default - don't turn it off) -- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php) - -### MySQL compatible database - -> We recommend using [MariaDB](https://mariadb.org). - -::: warning Warning - -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. - -::: - -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. - -#### Privileges - -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`. - -### (Optional) FFmpeg v4.1.8 or higher for Video Clips - -[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: - -- **FreeType 2** library for - [gd](https://www.php.net/manual/en/image.installation.php). - -### (Optional) Other recommendations - -- Redis for better cache performances. -- CDN for static files caching and better performances. -- e-mail gateway for lost passwords. - -## Install instructions - -### Pre-requisites - -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 haven’t 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): - - - For social features to work properly, this task is used to broadcast social - activities to your followers on the 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 - [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)): - - ```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. - -### (recommended) Install Wizard - -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! - -::: info Note - -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. - -::: - -### Email/SMTP setup - -Email configuration is required for some features to work properly (eg. -retrieving your forgotten password, sending instructions to premium subscribers, -…) - -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" -``` - -#### Email config options - -| 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"` | - -## Community packages - -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. - -### Install with 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. - -
- - - Install Castopod with YunoHost - - -Github -Repo - -
diff --git a/docs/src/fr_trad/getting-started/security.md b/docs/src/fr_trad/getting-started/security.md deleted file mode 100644 index e205698d..00000000 --- a/docs/src/fr_trad/getting-started/security.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: Security ---- - -# Security concerns - -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). - -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): - -- `writable/` folder must be **readable** and **writable**. -- `public/media/` folder must be **readable** and **writable**. -- any other file must be set to **readonly**. - -For instance, if you are using Apache or NGINX with Ubuntu you may do the -following: - -```bash -sudo chown -R root:root /path/to/castopod -sudo chown -R www-data:www-data /path/to/castopod/writable -sudo chown -R www-data:www-data /path/to/castopod/public/media -``` diff --git a/docs/src/fr_trad/getting-started/update.md b/docs/src/fr_trad/getting-started/update.md deleted file mode 100644 index 98e019fb..00000000 --- a/docs/src/fr_trad/getting-started/update.md +++ /dev/null @@ -1,109 +0,0 @@ ---- -title: Update -sidebarDepth: 3 ---- - -# How to update 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 ⚡. - -## Update instructions - -0. ⚠️ Before any update, we highly recommend you backup your Castopod files and - database. - - - cf. - [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 - - - cf. - [Where can I find my 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 - - - ⚠️ 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/) - -3. On your server: - - - Remove all files except `.env` and `public/media` - - Copy the new files from the downloaded package into your server - - ::: info Note - - You may need to reset files permissions as during the install process. - Check [Security Concerns](./security.md). - - ::: - -4. Update your database schema from your `Castopod Admin` > `About` page or by - running: - - ```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! - -::: info Note - -Releases may come with additional update instructions (see -[releases page](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) - -::: - -## Fully Automated updates - -> Coming soon... 👀 - -## Frequently asked questions (FAQ) - -### Where can I find my Castopod version? - -Go to your Castopod admin panel, the version is displayed on the bottom left -corner. - -Alternatively, you can find the version in the `app > Config > Constants.php` -file. - -### I haven't updated my instance in a long time… What should I do? - -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. - -> You may want to backup your instance depending on how long you haven't updated -> Castopod. - -For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to -`v1.0.0-beta.1`: - -0. (highly recommended) Make a backup of your files and database. - -1. Download the latest release, overwrite your files whilst keeping `.env` and - `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`, - `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`. - -3. ✨ Enjoy your fresh instance, you're all done! - -### Should I make a backup before updating? - -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… diff --git a/docs/src/fr_trad/index.md b/docs/src/fr_trad/index.md deleted file mode 100644 index f01279e8..00000000 --- a/docs/src/fr_trad/index.md +++ /dev/null @@ -1,303 +0,0 @@ ---- -sidebarDepth: 2 ---- - -# Welcome 👋 - -[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] - -Castopod is a free & open-source hosting platform made for podcasters who want -engage and interact with their audience. - -Castopod is easy to install and was built on top of -[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very -small footprint. - -::: info Status - -Castopod is currently in **beta** but already quite stable and used by -podcasters around the world! - -::: - -
- Install -
- -## Features - -- 🌱  Free & open-source (AGPL v3 License) -- 🔐  Focused on data sovereignty: your content, audience, and analytics - belong to you, and you only -- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, - chapters, location, persons, soundbites, … -- 💬  Built-in social network: - - 🚀  Castopod is part of the Fediverse, a decentralized social network - - ❤️  Create posts, share, favourite, and comment on episodes -- 📈  Built-in analytics: - - ⚖️  GDPR / CCPA / LGPD compliant - - 🪙  Standard IABv2 audience measurement - - 🏡  On-premises analytics, no third party involved -- 📢  Built-in marketing tools: - - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) - - 📱  PWA: install as a standalone app - - 🎨  Customizable theme colors - - 🎬  Generate ready-to-share Video clips from episodes - - 🔉  Generate soundbites - - ▶️  Embeddable player, embed your episodes on any website -- 💸  Monetization: - - 🔗  Funding links - - 📲  listen-to-click ads - - 🤝  value4value / WebMonetization - - 💎  Premium podcasts -- 📡  Publish your episodes everywhere with RSS: - - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, - Google Podcasts, Deezer, Podcast Addict, Podfriend, … - - ⚡  Broadcast your episodes instantly with WebSub -- 📥  Podcast import: move your existing podcast into Castopod -- 📤  Move your podcast out of Castopod -- 🔀  Multi-tenant: host as many podcasts as you want -- 👥  Multi-user: add contributors and set roles -- 🌎  i18n support: translated in English, French, Polish, German, - Brazilian Portuguese & Spanish… with - [more to come](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. - -It is in fact one of the only media to have stayed this way for a long time. - -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. - -With podcasting becoming more widely used, some companies are trying to shift it -towards a more controlled and centralized 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. - -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. - -## Comparison with other solutions - -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 you. - -### 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 it. - -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. - -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. - -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 journey. - -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. - -Finally, depending on your needs, Wordpress and Castopod can even live side by -side as they share the same requirements! - -### 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 was initially built around music. And later on, as the project -evolved, the ability to host podcasts was introduced. - -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, …). - -So, you should probably use Funkwhale if you want to host your music, and use -Castopod if you want to host your podcasts. - -### Castopod vs other podcast hosts - -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! - -Each of these solutions differ from one another, you may compare with the -[list of features](#features). - -That being said, there are two main differences with other podcasting solutions: - -- 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 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. - -## Contributing - -Love Castopod and would like to help? Take a look at the following documentation -to get you started. - -### Code of conduct - -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 tolerated. - -### Contributing 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. - -## Contributors ✨ - -Thanks goes to these wonderful people -([emoji key](https://allcontributors.org/docs/en/emoji-key)): - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
Ewen
Ewen

🌍 🤔
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
- - - - - - -This project follows the -[all-contributors](https://github.com/all-contributors/all-contributors) -specification. Contributions of any kind welcome! - -## Contact - -You may reach us for help or ask any question you have on: - -- [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) - -Alternatively, you can follow us on social media platforms to get news about -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 - -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). - -
- Ad Aures Logo - NLnet Logo -
- -## License - -[GNU Affero General Public License v3.0](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 - -[release]: https://code.castopod.org/adaures/castopod/-/releases -[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md -[contributions]: https://code.castopod.org/adaures/castopod/-/issues -[semantic-release]: https://github.com/semantic-release/semantic-release -[discord]: https://castopod.org/discord -[stars]: https://github.com/ad-aures/castopod/stargazers -[crowdin]: https://translate.castopod.org/project/castopod diff --git a/docs/src/gd/getting-started/auth.md b/docs/src/gd/getting-started/auth.md deleted file mode 100644 index ff5d59c0..00000000 --- a/docs/src/gd/getting-started/auth.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -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 - - - -| 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 | - - - -### Instance permissions - - - -| 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. | - - - -## 2. Per podcast roles and permissions - -### Per podcast roles - - - -| 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, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| 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 | - - - -### Per podcast permissions - - - -| 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}. | - - diff --git a/docs/src/gd/getting-started/docker.md b/docs/src/gd/getting-started/docker.md deleted file mode 100644 index 12f01619..00000000 --- a/docs/src/gd/getting-started/docker.md +++ /dev/null @@ -1,160 +0,0 @@ ---- -title: Official Docker images -sidebarDepth: 3 ---- - -# Official Docker images - -Castopod pushes 3 Docker images to the Docker Hub during its automated build -process: - -- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all - in one castopod image using nginx unit -- [**`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 - -Additionally, Castopod requires a MySQL-compatible database. A Redis database -can be added as a cache handler. - -## Supported tags - -- `develop` [unstable], latest development branch build -- `beta` [stable], latest beta version build -- `latest` [stable], latest version build -- `1.x.x` [stable], specific version build (since `1.0.0`) - -## Example usage - -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: - - ```yml - version: "3.7" - - services: - app: - image: castopod/castopod:latest - container_name: "castopod-app" - volumes: - - castopod-media:/var/www/castopod/public/media - environment: - MYSQL_DATABASE: castopod - MYSQL_USER: castopod - MYSQL_PASSWORD: changeme - CP_BASEURL: "https://castopod.example.com" - CP_ANALYTICS_SALT: changeme - CP_CACHE_HANDLER: redis - CP_REDIS_HOST: redis - CP_REDIS_PASSWORD: changeme - networks: - - castopod-app - - castopod-db - ports: - - 8000:8000 - restart: unless-stopped - - mariadb: - image: mariadb:10.5 - container_name: "castopod-mariadb" - networks: - - castopod-db - volumes: - - castopod-db:/var/lib/mysql - environment: - MYSQL_ROOT_PASSWORD: changeme - MYSQL_DATABASE: castopod - MYSQL_USER: castopod - MYSQL_PASSWORD: changeme - restart: unless-stopped - - redis: - image: redis:7.0-alpine - container_name: "castopod-redis" - command: --requirepass changeme - volumes: - - castopod-cache:/data - networks: - - castopod-app - - volumes: - castopod-media: - castopod-db: - castopod-cache: - - networks: - castopod-app: - castopod-db: - ``` - - You have to adapt some variables to your needs (e.g. `CP_BASEURL`, - `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). - -3. Setup a reverse proxy for 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/): - - ``` - #castopod - castopod.example.com { - reverse_proxy localhost:8000 - } - ``` - -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! - -5. You're all set, start podcasting! 🎙️🚀 - -## Environment Variables - -- **castopod/castopod** and **castopod/app** - - | Variable name | Type (`default`) | Default | - | ------------------------------------- | ----------------------- | ---------------- | - | **`CP_BASEURL`** | string | `undefined` | - | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | - | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | - | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | - | **`CP_ANALYTICS_SALT`** | string | `undefined` | - | **`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_REDIS_HOST`** | ?string | `"localhost"` | - | **`CP_REDIS_PASSWORD`** | ?string | `null` | - | **`CP_REDIS_PORT`** | ?number | `6379` | - | **`CP_REDIS_DATABASE`** | ?number | `0` | - | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | - | **`CP_EMAIL_FROM`** | ?string | `undefined` | - | **`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_ENABLE_2FA`** | ?boolean | `undefined` | - | **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` | - | **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` | - | **`CP_MEDIA_S3_KEY`** | ?string | `undefined` | - | **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` | - | **`CP_MEDIA_S3_REGION`** | ?string | `undefined` | - | **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` | - | **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` | - | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` | - | **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` | - | **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` | - | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | - | **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` | - | **`CP_TIMEOUT`** | ?number | `900` | - -- **castopod/web-server** - - | Variable name | Type | Default | - | ---------------------- | --------------------- | ------- | - | **`CP_APP_HOSTNAME`** | ?string | `"app"` | - | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | - | **`CP_TIMEOUT`** | ?number | `900` | diff --git a/docs/src/gd/getting-started/install.md b/docs/src/gd/getting-started/install.md deleted file mode 100644 index cdea18ec..00000000 --- a/docs/src/gd/getting-started/install.md +++ /dev/null @@ -1,238 +0,0 @@ ---- -title: Installation -sidebarDepth: 3 ---- - -# How to install 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. - -::: tip Note - -We've released official Docker images for Castopod! - -If you prefer using Docker, you may skip this and go straight to the -[docker documentation](./docker.md) for Castopod. - -::: - -## Requirements - -- PHP v8.1 or higher -- MySQL version 5.7 or higher or MariaDB version 10.2 or higher -- HTTPS support -- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's - incoming requests - -### PHP v8.1 or higher - -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. -- [exif](https://www.php.net/manual/en/exif.installation.php) - -Additionally, make sure that the following extensions are enabled in your PHP: - -- json (enabled by default - don't turn it off) -- xml (enabled by default - don't turn it off) -- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php) - -### MySQL compatible database - -> We recommend using [MariaDB](https://mariadb.org). - -::: warning Warning - -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. - -::: - -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. - -#### Privileges - -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`. - -### (Optional) FFmpeg v4.1.8 or higher for Video Clips - -[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: - -- **FreeType 2** library for - [gd](https://www.php.net/manual/en/image.installation.php). - -### (Optional) Other recommendations - -- Redis for better cache performances. -- CDN for static files caching and better performances. -- e-mail gateway for lost passwords. - -## Install instructions - -### Pre-requisites - -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 haven’t 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): - - ```bash - * * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1 - ``` - - **Note** - If you do not add this cron task, the following Castopod features - will not work: - - - Importing a podcast from an existing RSS feed - - Broadcasting social activities to your followers in the fediverse - - Broadcasting episodes to open hubs using - [WebSub](https://en.wikipedia.org/wiki/WebSub) - - Generating video clips - - [requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips) - -### (recommended) Install Wizard - -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! - -::: info Note - -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. - -::: - -### Using CLI - -1. Create a `.env` file in the package root based on the `.env.example` file. -2. Initialize the database using: - - ```sh - php spark install:init-database - ``` - -3. Create the superadmin user using: - - ```sh - php spark install:create-superadmin - ``` - -4. Head on to your admin gateway to start podcasting! - -### Email/SMTP setup - -Email configuration is required for some features to work properly (eg. -retrieving your forgotten password, sending instructions to premium subscribers, -…) - -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" -``` - -#### Email config options - -| 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"` | - -### Media storage - -By default, files are saved to the `public/media` folder using the file system. -If you need to relocate the `media` folder to a different location, you can -specify it in your `.env` file as shown below: - -```ini -# […] - -media.root="media" -media.storage="/mnt/storage" -``` - -In this example, the files will be saved to the /mnt/storage/media folder. Make -sure to also update your web server configuration to reflect this change. - -### S3 - -If you prefer storing your media files on an S3 compatible storage, you may -specify it in your `.env`: - -```ini -# […] - -media.fileManager="s3" -media.s3.endpoint="your_s3_host" -media.s3.key="your_s3_key" -media.s3.secret="your_s3_secret" -media.s3.region="your_s3_region" -``` - -#### S3 config options - -| Variable name | Type | Default | -| ----------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`pathStyleEndpoint`** | boolean | `false` | -| **`keyPrefix`** | string | `undefined` | - -## Community packages - -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. - -### Install with 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. - -
- - - Install Castopod with YunoHost - - -Github -Repo - -
diff --git a/docs/src/gd/getting-started/security.md b/docs/src/gd/getting-started/security.md deleted file mode 100644 index e205698d..00000000 --- a/docs/src/gd/getting-started/security.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: Security ---- - -# Security concerns - -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). - -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): - -- `writable/` folder must be **readable** and **writable**. -- `public/media/` folder must be **readable** and **writable**. -- any other file must be set to **readonly**. - -For instance, if you are using Apache or NGINX with Ubuntu you may do the -following: - -```bash -sudo chown -R root:root /path/to/castopod -sudo chown -R www-data:www-data /path/to/castopod/writable -sudo chown -R www-data:www-data /path/to/castopod/public/media -``` diff --git a/docs/src/gd/getting-started/update.md b/docs/src/gd/getting-started/update.md deleted file mode 100644 index 98e019fb..00000000 --- a/docs/src/gd/getting-started/update.md +++ /dev/null @@ -1,109 +0,0 @@ ---- -title: Update -sidebarDepth: 3 ---- - -# How to update 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 ⚡. - -## Update instructions - -0. ⚠️ Before any update, we highly recommend you backup your Castopod files and - database. - - - cf. - [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 - - - cf. - [Where can I find my 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 - - - ⚠️ 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/) - -3. On your server: - - - Remove all files except `.env` and `public/media` - - Copy the new files from the downloaded package into your server - - ::: info Note - - You may need to reset files permissions as during the install process. - Check [Security Concerns](./security.md). - - ::: - -4. Update your database schema from your `Castopod Admin` > `About` page or by - running: - - ```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! - -::: info Note - -Releases may come with additional update instructions (see -[releases page](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) - -::: - -## Fully Automated updates - -> Coming soon... 👀 - -## Frequently asked questions (FAQ) - -### Where can I find my Castopod version? - -Go to your Castopod admin panel, the version is displayed on the bottom left -corner. - -Alternatively, you can find the version in the `app > Config > Constants.php` -file. - -### I haven't updated my instance in a long time… What should I do? - -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. - -> You may want to backup your instance depending on how long you haven't updated -> Castopod. - -For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to -`v1.0.0-beta.1`: - -0. (highly recommended) Make a backup of your files and database. - -1. Download the latest release, overwrite your files whilst keeping `.env` and - `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`, - `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`. - -3. ✨ Enjoy your fresh instance, you're all done! - -### Should I make a backup before updating? - -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… diff --git a/docs/src/gd/index.md b/docs/src/gd/index.md deleted file mode 100644 index 7f012c6c..00000000 --- a/docs/src/gd/index.md +++ /dev/null @@ -1,300 +0,0 @@ ---- -sidebarDepth: 2 ---- - -# Welcome 👋 - -[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] - -Castopod is a free & open-source hosting platform made for podcasters who want -engage and interact with their audience. - -Castopod is easy to install and was built on top of -[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very -small footprint. - -
- Install -
- -## Features - -- 🌱  Free & open-source (AGPL v3 License) -- 🔐  Focused on data sovereignty: your content, audience, and analytics - belong to you, and you only -- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, - chapters, location, persons, soundbites, … -- 💬  Built-in social network: - - 🚀  Castopod is part of the Fediverse, a decentralized social network - - ❤️  Create posts, share, favourite, and comment on episodes -- 📈  Built-in analytics: - - ⚖️  GDPR / CCPA / LGPD compliant - - 🪙  Standard IABv2 audience measurement - - 🏡  On-premises analytics, no third party involved -- 📢  Built-in marketing tools: - - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) - - 📱  PWA: install as a standalone app - - 🎨  Customizable theme colors - - 🎬  Generate ready-to-share Video clips from episodes - - 🔉  Generate soundbites - - ▶️  Embeddable player, embed your episodes on any website -- 💸  Monetization: - - 🔗  Funding links - - 📲  listen-to-click ads - - 🤝  value4value / WebMonetization - - 💎  Premium podcasts -- 📡  Publish your episodes everywhere with RSS: - - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, - Google Podcasts, Deezer, Podcast Addict, Podfriend, … - - ⚡  Broadcast your episodes instantly with WebSub -- 📥  Podcast import: move your existing podcast into Castopod -- 📤  Move your podcast out of Castopod -- 🔀  Multi-tenant: host as many podcasts as you want -- 👥  Multi-user: add contributors and set roles -- 🌎  i18n support: translated in English, French, Polish, German, - Brazilian Portuguese & Spanish… with - [more to come](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. - -It is in fact one of the only media to have stayed this way for a long time. - -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. - -With podcasting becoming more widely used, some companies are trying to shift it -towards a more controlled and centralized 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. - -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. - -## Comparison with other solutions - -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 you. - -### 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 it. - -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. - -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. - -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 journey. - -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. - -Finally, depending on your needs, Wordpress and Castopod can even live side by -side as they share the same requirements! - -### 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 was initially built around music. And later on, as the project -evolved, the ability to host podcasts was introduced. - -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, …). - -So, you should probably use Funkwhale if you want to host your music, and use -Castopod if you want to host your podcasts. - -### Castopod vs other podcast hosts - -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! - -Each of these solutions differ from one another, you may compare with the -[list of features](#features). - -That being said, there are two main differences with other podcasting solutions: - -- 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 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. - -## Contributing - -Love Castopod and would like to help? Take a look at the following documentation -to get you started. - -### Code of conduct - -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 tolerated. - -### Contributing 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. - -## Contributors ✨ - -Thanks goes to these wonderful people -([emoji key](https://allcontributors.org/docs/en/emoji-key)): - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Ewen
Ewen

🌍 🤔 💻
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
KrzysztofDomanczyk
KrzysztofDomanczyk

💻
Guy Martin
Guy Martin

🐛 💻
- - - - - - -This project follows the -[all-contributors](https://github.com/all-contributors/all-contributors) -specification. Contributions of any kind welcome! - -## Contact - -You may reach us for help or ask any question you have on: - -- [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) - -Alternatively, you can follow us on social media platforms to get news about -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 - -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). - -
- Ad Aures Logo - NLnet Logo -
- -## License - -[GNU Affero General Public License v3.0](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 - -[release]: https://code.castopod.org/adaures/castopod/-/releases -[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md -[contributions]: https://code.castopod.org/adaures/castopod/-/issues -[semantic-release]: https://github.com/semantic-release/semantic-release -[discord]: https://castopod.org/discord -[stars]: https://github.com/ad-aures/castopod/stargazers -[crowdin]: https://translate.castopod.org/project/castopod diff --git a/docs/src/getting-started/_category_.json b/docs/src/getting-started/_category_.json deleted file mode 100644 index 877a378f..00000000 --- a/docs/src/getting-started/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Getting Started", - "position": 2 -} diff --git a/docs/src/getting-started/auth.md b/docs/src/getting-started/auth.md deleted file mode 100644 index ff5d59c0..00000000 --- a/docs/src/getting-started/auth.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -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 - - - -| 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 | - - - -### Instance permissions - - - -| 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. | - - - -## 2. Per podcast roles and permissions - -### Per podcast roles - - - -| 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, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| 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 | - - - -### Per podcast permissions - - - -| 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}. | - - diff --git a/docs/src/getting-started/install.md b/docs/src/getting-started/install.md deleted file mode 100644 index cdea18ec..00000000 --- a/docs/src/getting-started/install.md +++ /dev/null @@ -1,238 +0,0 @@ ---- -title: Installation -sidebarDepth: 3 ---- - -# How to install 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. - -::: tip Note - -We've released official Docker images for Castopod! - -If you prefer using Docker, you may skip this and go straight to the -[docker documentation](./docker.md) for Castopod. - -::: - -## Requirements - -- PHP v8.1 or higher -- MySQL version 5.7 or higher or MariaDB version 10.2 or higher -- HTTPS support -- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's - incoming requests - -### PHP v8.1 or higher - -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. -- [exif](https://www.php.net/manual/en/exif.installation.php) - -Additionally, make sure that the following extensions are enabled in your PHP: - -- json (enabled by default - don't turn it off) -- xml (enabled by default - don't turn it off) -- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php) - -### MySQL compatible database - -> We recommend using [MariaDB](https://mariadb.org). - -::: warning Warning - -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. - -::: - -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. - -#### Privileges - -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`. - -### (Optional) FFmpeg v4.1.8 or higher for Video Clips - -[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: - -- **FreeType 2** library for - [gd](https://www.php.net/manual/en/image.installation.php). - -### (Optional) Other recommendations - -- Redis for better cache performances. -- CDN for static files caching and better performances. -- e-mail gateway for lost passwords. - -## Install instructions - -### Pre-requisites - -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 haven’t 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): - - ```bash - * * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1 - ``` - - **Note** - If you do not add this cron task, the following Castopod features - will not work: - - - Importing a podcast from an existing RSS feed - - Broadcasting social activities to your followers in the fediverse - - Broadcasting episodes to open hubs using - [WebSub](https://en.wikipedia.org/wiki/WebSub) - - Generating video clips - - [requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips) - -### (recommended) Install Wizard - -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! - -::: info Note - -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. - -::: - -### Using CLI - -1. Create a `.env` file in the package root based on the `.env.example` file. -2. Initialize the database using: - - ```sh - php spark install:init-database - ``` - -3. Create the superadmin user using: - - ```sh - php spark install:create-superadmin - ``` - -4. Head on to your admin gateway to start podcasting! - -### Email/SMTP setup - -Email configuration is required for some features to work properly (eg. -retrieving your forgotten password, sending instructions to premium subscribers, -…) - -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" -``` - -#### Email config options - -| 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"` | - -### Media storage - -By default, files are saved to the `public/media` folder using the file system. -If you need to relocate the `media` folder to a different location, you can -specify it in your `.env` file as shown below: - -```ini -# […] - -media.root="media" -media.storage="/mnt/storage" -``` - -In this example, the files will be saved to the /mnt/storage/media folder. Make -sure to also update your web server configuration to reflect this change. - -### S3 - -If you prefer storing your media files on an S3 compatible storage, you may -specify it in your `.env`: - -```ini -# […] - -media.fileManager="s3" -media.s3.endpoint="your_s3_host" -media.s3.key="your_s3_key" -media.s3.secret="your_s3_secret" -media.s3.region="your_s3_region" -``` - -#### S3 config options - -| Variable name | Type | Default | -| ----------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`pathStyleEndpoint`** | boolean | `false` | -| **`keyPrefix`** | string | `undefined` | - -## Community packages - -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. - -### Install with 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. - -
- - - Install Castopod with YunoHost - - -Github -Repo - -
diff --git a/docs/src/getting-started/security.md b/docs/src/getting-started/security.md deleted file mode 100644 index e205698d..00000000 --- a/docs/src/getting-started/security.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: Security ---- - -# Security concerns - -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). - -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): - -- `writable/` folder must be **readable** and **writable**. -- `public/media/` folder must be **readable** and **writable**. -- any other file must be set to **readonly**. - -For instance, if you are using Apache or NGINX with Ubuntu you may do the -following: - -```bash -sudo chown -R root:root /path/to/castopod -sudo chown -R www-data:www-data /path/to/castopod/writable -sudo chown -R www-data:www-data /path/to/castopod/public/media -``` diff --git a/docs/src/getting-started/update.md b/docs/src/getting-started/update.md deleted file mode 100644 index 98e019fb..00000000 --- a/docs/src/getting-started/update.md +++ /dev/null @@ -1,109 +0,0 @@ ---- -title: Update -sidebarDepth: 3 ---- - -# How to update 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 ⚡. - -## Update instructions - -0. ⚠️ Before any update, we highly recommend you backup your Castopod files and - database. - - - cf. - [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 - - - cf. - [Where can I find my 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 - - - ⚠️ 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/) - -3. On your server: - - - Remove all files except `.env` and `public/media` - - Copy the new files from the downloaded package into your server - - ::: info Note - - You may need to reset files permissions as during the install process. - Check [Security Concerns](./security.md). - - ::: - -4. Update your database schema from your `Castopod Admin` > `About` page or by - running: - - ```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! - -::: info Note - -Releases may come with additional update instructions (see -[releases page](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) - -::: - -## Fully Automated updates - -> Coming soon... 👀 - -## Frequently asked questions (FAQ) - -### Where can I find my Castopod version? - -Go to your Castopod admin panel, the version is displayed on the bottom left -corner. - -Alternatively, you can find the version in the `app > Config > Constants.php` -file. - -### I haven't updated my instance in a long time… What should I do? - -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. - -> You may want to backup your instance depending on how long you haven't updated -> Castopod. - -For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to -`v1.0.0-beta.1`: - -0. (highly recommended) Make a backup of your files and database. - -1. Download the latest release, overwrite your files whilst keeping `.env` and - `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`, - `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`. - -3. ✨ Enjoy your fresh instance, you're all done! - -### Should I make a backup before updating? - -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… diff --git a/docs/src/gl/getting-started/auth.md b/docs/src/gl/getting-started/auth.md deleted file mode 100644 index ff5d59c0..00000000 --- a/docs/src/gl/getting-started/auth.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -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 - - - -| 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 | - - - -### Instance permissions - - - -| 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. | - - - -## 2. Per podcast roles and permissions - -### Per podcast roles - - - -| 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, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| 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 | - - - -### Per podcast permissions - - - -| 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}. | - - diff --git a/docs/src/gl/getting-started/docker.md b/docs/src/gl/getting-started/docker.md deleted file mode 100644 index 12f01619..00000000 --- a/docs/src/gl/getting-started/docker.md +++ /dev/null @@ -1,160 +0,0 @@ ---- -title: Official Docker images -sidebarDepth: 3 ---- - -# Official Docker images - -Castopod pushes 3 Docker images to the Docker Hub during its automated build -process: - -- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all - in one castopod image using nginx unit -- [**`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 - -Additionally, Castopod requires a MySQL-compatible database. A Redis database -can be added as a cache handler. - -## Supported tags - -- `develop` [unstable], latest development branch build -- `beta` [stable], latest beta version build -- `latest` [stable], latest version build -- `1.x.x` [stable], specific version build (since `1.0.0`) - -## Example usage - -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: - - ```yml - version: "3.7" - - services: - app: - image: castopod/castopod:latest - container_name: "castopod-app" - volumes: - - castopod-media:/var/www/castopod/public/media - environment: - MYSQL_DATABASE: castopod - MYSQL_USER: castopod - MYSQL_PASSWORD: changeme - CP_BASEURL: "https://castopod.example.com" - CP_ANALYTICS_SALT: changeme - CP_CACHE_HANDLER: redis - CP_REDIS_HOST: redis - CP_REDIS_PASSWORD: changeme - networks: - - castopod-app - - castopod-db - ports: - - 8000:8000 - restart: unless-stopped - - mariadb: - image: mariadb:10.5 - container_name: "castopod-mariadb" - networks: - - castopod-db - volumes: - - castopod-db:/var/lib/mysql - environment: - MYSQL_ROOT_PASSWORD: changeme - MYSQL_DATABASE: castopod - MYSQL_USER: castopod - MYSQL_PASSWORD: changeme - restart: unless-stopped - - redis: - image: redis:7.0-alpine - container_name: "castopod-redis" - command: --requirepass changeme - volumes: - - castopod-cache:/data - networks: - - castopod-app - - volumes: - castopod-media: - castopod-db: - castopod-cache: - - networks: - castopod-app: - castopod-db: - ``` - - You have to adapt some variables to your needs (e.g. `CP_BASEURL`, - `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). - -3. Setup a reverse proxy for 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/): - - ``` - #castopod - castopod.example.com { - reverse_proxy localhost:8000 - } - ``` - -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! - -5. You're all set, start podcasting! 🎙️🚀 - -## Environment Variables - -- **castopod/castopod** and **castopod/app** - - | Variable name | Type (`default`) | Default | - | ------------------------------------- | ----------------------- | ---------------- | - | **`CP_BASEURL`** | string | `undefined` | - | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | - | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | - | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | - | **`CP_ANALYTICS_SALT`** | string | `undefined` | - | **`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_REDIS_HOST`** | ?string | `"localhost"` | - | **`CP_REDIS_PASSWORD`** | ?string | `null` | - | **`CP_REDIS_PORT`** | ?number | `6379` | - | **`CP_REDIS_DATABASE`** | ?number | `0` | - | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | - | **`CP_EMAIL_FROM`** | ?string | `undefined` | - | **`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_ENABLE_2FA`** | ?boolean | `undefined` | - | **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` | - | **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` | - | **`CP_MEDIA_S3_KEY`** | ?string | `undefined` | - | **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` | - | **`CP_MEDIA_S3_REGION`** | ?string | `undefined` | - | **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` | - | **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` | - | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` | - | **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` | - | **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` | - | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | - | **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` | - | **`CP_TIMEOUT`** | ?number | `900` | - -- **castopod/web-server** - - | Variable name | Type | Default | - | ---------------------- | --------------------- | ------- | - | **`CP_APP_HOSTNAME`** | ?string | `"app"` | - | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | - | **`CP_TIMEOUT`** | ?number | `900` | diff --git a/docs/src/gl/getting-started/install.md b/docs/src/gl/getting-started/install.md deleted file mode 100644 index cdea18ec..00000000 --- a/docs/src/gl/getting-started/install.md +++ /dev/null @@ -1,238 +0,0 @@ ---- -title: Installation -sidebarDepth: 3 ---- - -# How to install 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. - -::: tip Note - -We've released official Docker images for Castopod! - -If you prefer using Docker, you may skip this and go straight to the -[docker documentation](./docker.md) for Castopod. - -::: - -## Requirements - -- PHP v8.1 or higher -- MySQL version 5.7 or higher or MariaDB version 10.2 or higher -- HTTPS support -- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's - incoming requests - -### PHP v8.1 or higher - -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. -- [exif](https://www.php.net/manual/en/exif.installation.php) - -Additionally, make sure that the following extensions are enabled in your PHP: - -- json (enabled by default - don't turn it off) -- xml (enabled by default - don't turn it off) -- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php) - -### MySQL compatible database - -> We recommend using [MariaDB](https://mariadb.org). - -::: warning Warning - -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. - -::: - -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. - -#### Privileges - -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`. - -### (Optional) FFmpeg v4.1.8 or higher for Video Clips - -[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: - -- **FreeType 2** library for - [gd](https://www.php.net/manual/en/image.installation.php). - -### (Optional) Other recommendations - -- Redis for better cache performances. -- CDN for static files caching and better performances. -- e-mail gateway for lost passwords. - -## Install instructions - -### Pre-requisites - -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 haven’t 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): - - ```bash - * * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1 - ``` - - **Note** - If you do not add this cron task, the following Castopod features - will not work: - - - Importing a podcast from an existing RSS feed - - Broadcasting social activities to your followers in the fediverse - - Broadcasting episodes to open hubs using - [WebSub](https://en.wikipedia.org/wiki/WebSub) - - Generating video clips - - [requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips) - -### (recommended) Install Wizard - -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! - -::: info Note - -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. - -::: - -### Using CLI - -1. Create a `.env` file in the package root based on the `.env.example` file. -2. Initialize the database using: - - ```sh - php spark install:init-database - ``` - -3. Create the superadmin user using: - - ```sh - php spark install:create-superadmin - ``` - -4. Head on to your admin gateway to start podcasting! - -### Email/SMTP setup - -Email configuration is required for some features to work properly (eg. -retrieving your forgotten password, sending instructions to premium subscribers, -…) - -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" -``` - -#### Email config options - -| 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"` | - -### Media storage - -By default, files are saved to the `public/media` folder using the file system. -If you need to relocate the `media` folder to a different location, you can -specify it in your `.env` file as shown below: - -```ini -# […] - -media.root="media" -media.storage="/mnt/storage" -``` - -In this example, the files will be saved to the /mnt/storage/media folder. Make -sure to also update your web server configuration to reflect this change. - -### S3 - -If you prefer storing your media files on an S3 compatible storage, you may -specify it in your `.env`: - -```ini -# […] - -media.fileManager="s3" -media.s3.endpoint="your_s3_host" -media.s3.key="your_s3_key" -media.s3.secret="your_s3_secret" -media.s3.region="your_s3_region" -``` - -#### S3 config options - -| Variable name | Type | Default | -| ----------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`pathStyleEndpoint`** | boolean | `false` | -| **`keyPrefix`** | string | `undefined` | - -## Community packages - -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. - -### Install with 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. - -
- - - Install Castopod with YunoHost - - -Github -Repo - -
diff --git a/docs/src/gl/getting-started/security.md b/docs/src/gl/getting-started/security.md deleted file mode 100644 index e205698d..00000000 --- a/docs/src/gl/getting-started/security.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: Security ---- - -# Security concerns - -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). - -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): - -- `writable/` folder must be **readable** and **writable**. -- `public/media/` folder must be **readable** and **writable**. -- any other file must be set to **readonly**. - -For instance, if you are using Apache or NGINX with Ubuntu you may do the -following: - -```bash -sudo chown -R root:root /path/to/castopod -sudo chown -R www-data:www-data /path/to/castopod/writable -sudo chown -R www-data:www-data /path/to/castopod/public/media -``` diff --git a/docs/src/gl/getting-started/update.md b/docs/src/gl/getting-started/update.md deleted file mode 100644 index 98e019fb..00000000 --- a/docs/src/gl/getting-started/update.md +++ /dev/null @@ -1,109 +0,0 @@ ---- -title: Update -sidebarDepth: 3 ---- - -# How to update 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 ⚡. - -## Update instructions - -0. ⚠️ Before any update, we highly recommend you backup your Castopod files and - database. - - - cf. - [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 - - - cf. - [Where can I find my 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 - - - ⚠️ 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/) - -3. On your server: - - - Remove all files except `.env` and `public/media` - - Copy the new files from the downloaded package into your server - - ::: info Note - - You may need to reset files permissions as during the install process. - Check [Security Concerns](./security.md). - - ::: - -4. Update your database schema from your `Castopod Admin` > `About` page or by - running: - - ```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! - -::: info Note - -Releases may come with additional update instructions (see -[releases page](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) - -::: - -## Fully Automated updates - -> Coming soon... 👀 - -## Frequently asked questions (FAQ) - -### Where can I find my Castopod version? - -Go to your Castopod admin panel, the version is displayed on the bottom left -corner. - -Alternatively, you can find the version in the `app > Config > Constants.php` -file. - -### I haven't updated my instance in a long time… What should I do? - -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. - -> You may want to backup your instance depending on how long you haven't updated -> Castopod. - -For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to -`v1.0.0-beta.1`: - -0. (highly recommended) Make a backup of your files and database. - -1. Download the latest release, overwrite your files whilst keeping `.env` and - `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`, - `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`. - -3. ✨ Enjoy your fresh instance, you're all done! - -### Should I make a backup before updating? - -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… diff --git a/docs/src/gl/index.md b/docs/src/gl/index.md deleted file mode 100644 index 7f012c6c..00000000 --- a/docs/src/gl/index.md +++ /dev/null @@ -1,300 +0,0 @@ ---- -sidebarDepth: 2 ---- - -# Welcome 👋 - -[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] - -Castopod is a free & open-source hosting platform made for podcasters who want -engage and interact with their audience. - -Castopod is easy to install and was built on top of -[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very -small footprint. - -
- Install -
- -## Features - -- 🌱  Free & open-source (AGPL v3 License) -- 🔐  Focused on data sovereignty: your content, audience, and analytics - belong to you, and you only -- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, - chapters, location, persons, soundbites, … -- 💬  Built-in social network: - - 🚀  Castopod is part of the Fediverse, a decentralized social network - - ❤️  Create posts, share, favourite, and comment on episodes -- 📈  Built-in analytics: - - ⚖️  GDPR / CCPA / LGPD compliant - - 🪙  Standard IABv2 audience measurement - - 🏡  On-premises analytics, no third party involved -- 📢  Built-in marketing tools: - - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) - - 📱  PWA: install as a standalone app - - 🎨  Customizable theme colors - - 🎬  Generate ready-to-share Video clips from episodes - - 🔉  Generate soundbites - - ▶️  Embeddable player, embed your episodes on any website -- 💸  Monetization: - - 🔗  Funding links - - 📲  listen-to-click ads - - 🤝  value4value / WebMonetization - - 💎  Premium podcasts -- 📡  Publish your episodes everywhere with RSS: - - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, - Google Podcasts, Deezer, Podcast Addict, Podfriend, … - - ⚡  Broadcast your episodes instantly with WebSub -- 📥  Podcast import: move your existing podcast into Castopod -- 📤  Move your podcast out of Castopod -- 🔀  Multi-tenant: host as many podcasts as you want -- 👥  Multi-user: add contributors and set roles -- 🌎  i18n support: translated in English, French, Polish, German, - Brazilian Portuguese & Spanish… with - [more to come](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. - -It is in fact one of the only media to have stayed this way for a long time. - -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. - -With podcasting becoming more widely used, some companies are trying to shift it -towards a more controlled and centralized 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. - -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. - -## Comparison with other solutions - -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 you. - -### 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 it. - -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. - -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. - -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 journey. - -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. - -Finally, depending on your needs, Wordpress and Castopod can even live side by -side as they share the same requirements! - -### 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 was initially built around music. And later on, as the project -evolved, the ability to host podcasts was introduced. - -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, …). - -So, you should probably use Funkwhale if you want to host your music, and use -Castopod if you want to host your podcasts. - -### Castopod vs other podcast hosts - -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! - -Each of these solutions differ from one another, you may compare with the -[list of features](#features). - -That being said, there are two main differences with other podcasting solutions: - -- 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 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. - -## Contributing - -Love Castopod and would like to help? Take a look at the following documentation -to get you started. - -### Code of conduct - -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 tolerated. - -### Contributing 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. - -## Contributors ✨ - -Thanks goes to these wonderful people -([emoji key](https://allcontributors.org/docs/en/emoji-key)): - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Ewen
Ewen

🌍 🤔 💻
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
KrzysztofDomanczyk
KrzysztofDomanczyk

💻
Guy Martin
Guy Martin

🐛 💻
- - - - - - -This project follows the -[all-contributors](https://github.com/all-contributors/all-contributors) -specification. Contributions of any kind welcome! - -## Contact - -You may reach us for help or ask any question you have on: - -- [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) - -Alternatively, you can follow us on social media platforms to get news about -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 - -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). - -
- Ad Aures Logo - NLnet Logo -
- -## License - -[GNU Affero General Public License v3.0](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 - -[release]: https://code.castopod.org/adaures/castopod/-/releases -[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md -[contributions]: https://code.castopod.org/adaures/castopod/-/issues -[semantic-release]: https://github.com/semantic-release/semantic-release -[discord]: https://castopod.org/discord -[stars]: https://github.com/ad-aures/castopod/stargazers -[crowdin]: https://translate.castopod.org/project/castopod diff --git a/docs/src/id/getting-started/_category_.json b/docs/src/id/getting-started/_category_.json deleted file mode 100644 index 877a378f..00000000 --- a/docs/src/id/getting-started/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Getting Started", - "position": 2 -} diff --git a/docs/src/id/getting-started/auth.md b/docs/src/id/getting-started/auth.md deleted file mode 100644 index ff5d59c0..00000000 --- a/docs/src/id/getting-started/auth.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -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 - - - -| 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 | - - - -### Instance permissions - - - -| 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. | - - - -## 2. Per podcast roles and permissions - -### Per podcast roles - - - -| 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, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| 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 | - - - -### Per podcast permissions - - - -| 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}. | - - diff --git a/docs/src/id/getting-started/docker.md b/docs/src/id/getting-started/docker.md deleted file mode 100644 index 12f01619..00000000 --- a/docs/src/id/getting-started/docker.md +++ /dev/null @@ -1,160 +0,0 @@ ---- -title: Official Docker images -sidebarDepth: 3 ---- - -# Official Docker images - -Castopod pushes 3 Docker images to the Docker Hub during its automated build -process: - -- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all - in one castopod image using nginx unit -- [**`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 - -Additionally, Castopod requires a MySQL-compatible database. A Redis database -can be added as a cache handler. - -## Supported tags - -- `develop` [unstable], latest development branch build -- `beta` [stable], latest beta version build -- `latest` [stable], latest version build -- `1.x.x` [stable], specific version build (since `1.0.0`) - -## Example usage - -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: - - ```yml - version: "3.7" - - services: - app: - image: castopod/castopod:latest - container_name: "castopod-app" - volumes: - - castopod-media:/var/www/castopod/public/media - environment: - MYSQL_DATABASE: castopod - MYSQL_USER: castopod - MYSQL_PASSWORD: changeme - CP_BASEURL: "https://castopod.example.com" - CP_ANALYTICS_SALT: changeme - CP_CACHE_HANDLER: redis - CP_REDIS_HOST: redis - CP_REDIS_PASSWORD: changeme - networks: - - castopod-app - - castopod-db - ports: - - 8000:8000 - restart: unless-stopped - - mariadb: - image: mariadb:10.5 - container_name: "castopod-mariadb" - networks: - - castopod-db - volumes: - - castopod-db:/var/lib/mysql - environment: - MYSQL_ROOT_PASSWORD: changeme - MYSQL_DATABASE: castopod - MYSQL_USER: castopod - MYSQL_PASSWORD: changeme - restart: unless-stopped - - redis: - image: redis:7.0-alpine - container_name: "castopod-redis" - command: --requirepass changeme - volumes: - - castopod-cache:/data - networks: - - castopod-app - - volumes: - castopod-media: - castopod-db: - castopod-cache: - - networks: - castopod-app: - castopod-db: - ``` - - You have to adapt some variables to your needs (e.g. `CP_BASEURL`, - `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). - -3. Setup a reverse proxy for 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/): - - ``` - #castopod - castopod.example.com { - reverse_proxy localhost:8000 - } - ``` - -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! - -5. You're all set, start podcasting! 🎙️🚀 - -## Environment Variables - -- **castopod/castopod** and **castopod/app** - - | Variable name | Type (`default`) | Default | - | ------------------------------------- | ----------------------- | ---------------- | - | **`CP_BASEURL`** | string | `undefined` | - | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | - | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | - | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | - | **`CP_ANALYTICS_SALT`** | string | `undefined` | - | **`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_REDIS_HOST`** | ?string | `"localhost"` | - | **`CP_REDIS_PASSWORD`** | ?string | `null` | - | **`CP_REDIS_PORT`** | ?number | `6379` | - | **`CP_REDIS_DATABASE`** | ?number | `0` | - | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | - | **`CP_EMAIL_FROM`** | ?string | `undefined` | - | **`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_ENABLE_2FA`** | ?boolean | `undefined` | - | **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` | - | **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` | - | **`CP_MEDIA_S3_KEY`** | ?string | `undefined` | - | **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` | - | **`CP_MEDIA_S3_REGION`** | ?string | `undefined` | - | **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` | - | **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` | - | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` | - | **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` | - | **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` | - | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | - | **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` | - | **`CP_TIMEOUT`** | ?number | `900` | - -- **castopod/web-server** - - | Variable name | Type | Default | - | ---------------------- | --------------------- | ------- | - | **`CP_APP_HOSTNAME`** | ?string | `"app"` | - | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | - | **`CP_TIMEOUT`** | ?number | `900` | diff --git a/docs/src/id/getting-started/install.md b/docs/src/id/getting-started/install.md deleted file mode 100644 index cdea18ec..00000000 --- a/docs/src/id/getting-started/install.md +++ /dev/null @@ -1,238 +0,0 @@ ---- -title: Installation -sidebarDepth: 3 ---- - -# How to install 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. - -::: tip Note - -We've released official Docker images for Castopod! - -If you prefer using Docker, you may skip this and go straight to the -[docker documentation](./docker.md) for Castopod. - -::: - -## Requirements - -- PHP v8.1 or higher -- MySQL version 5.7 or higher or MariaDB version 10.2 or higher -- HTTPS support -- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's - incoming requests - -### PHP v8.1 or higher - -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. -- [exif](https://www.php.net/manual/en/exif.installation.php) - -Additionally, make sure that the following extensions are enabled in your PHP: - -- json (enabled by default - don't turn it off) -- xml (enabled by default - don't turn it off) -- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php) - -### MySQL compatible database - -> We recommend using [MariaDB](https://mariadb.org). - -::: warning Warning - -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. - -::: - -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. - -#### Privileges - -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`. - -### (Optional) FFmpeg v4.1.8 or higher for Video Clips - -[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: - -- **FreeType 2** library for - [gd](https://www.php.net/manual/en/image.installation.php). - -### (Optional) Other recommendations - -- Redis for better cache performances. -- CDN for static files caching and better performances. -- e-mail gateway for lost passwords. - -## Install instructions - -### Pre-requisites - -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 haven’t 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): - - ```bash - * * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1 - ``` - - **Note** - If you do not add this cron task, the following Castopod features - will not work: - - - Importing a podcast from an existing RSS feed - - Broadcasting social activities to your followers in the fediverse - - Broadcasting episodes to open hubs using - [WebSub](https://en.wikipedia.org/wiki/WebSub) - - Generating video clips - - [requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips) - -### (recommended) Install Wizard - -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! - -::: info Note - -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. - -::: - -### Using CLI - -1. Create a `.env` file in the package root based on the `.env.example` file. -2. Initialize the database using: - - ```sh - php spark install:init-database - ``` - -3. Create the superadmin user using: - - ```sh - php spark install:create-superadmin - ``` - -4. Head on to your admin gateway to start podcasting! - -### Email/SMTP setup - -Email configuration is required for some features to work properly (eg. -retrieving your forgotten password, sending instructions to premium subscribers, -…) - -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" -``` - -#### Email config options - -| 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"` | - -### Media storage - -By default, files are saved to the `public/media` folder using the file system. -If you need to relocate the `media` folder to a different location, you can -specify it in your `.env` file as shown below: - -```ini -# […] - -media.root="media" -media.storage="/mnt/storage" -``` - -In this example, the files will be saved to the /mnt/storage/media folder. Make -sure to also update your web server configuration to reflect this change. - -### S3 - -If you prefer storing your media files on an S3 compatible storage, you may -specify it in your `.env`: - -```ini -# […] - -media.fileManager="s3" -media.s3.endpoint="your_s3_host" -media.s3.key="your_s3_key" -media.s3.secret="your_s3_secret" -media.s3.region="your_s3_region" -``` - -#### S3 config options - -| Variable name | Type | Default | -| ----------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`pathStyleEndpoint`** | boolean | `false` | -| **`keyPrefix`** | string | `undefined` | - -## Community packages - -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. - -### Install with 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. - -
- - - Install Castopod with YunoHost - - -Github -Repo - -
diff --git a/docs/src/id/getting-started/security.md b/docs/src/id/getting-started/security.md deleted file mode 100644 index e205698d..00000000 --- a/docs/src/id/getting-started/security.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: Security ---- - -# Security concerns - -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). - -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): - -- `writable/` folder must be **readable** and **writable**. -- `public/media/` folder must be **readable** and **writable**. -- any other file must be set to **readonly**. - -For instance, if you are using Apache or NGINX with Ubuntu you may do the -following: - -```bash -sudo chown -R root:root /path/to/castopod -sudo chown -R www-data:www-data /path/to/castopod/writable -sudo chown -R www-data:www-data /path/to/castopod/public/media -``` diff --git a/docs/src/id/getting-started/update.md b/docs/src/id/getting-started/update.md deleted file mode 100644 index 98e019fb..00000000 --- a/docs/src/id/getting-started/update.md +++ /dev/null @@ -1,109 +0,0 @@ ---- -title: Update -sidebarDepth: 3 ---- - -# How to update 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 ⚡. - -## Update instructions - -0. ⚠️ Before any update, we highly recommend you backup your Castopod files and - database. - - - cf. - [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 - - - cf. - [Where can I find my 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 - - - ⚠️ 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/) - -3. On your server: - - - Remove all files except `.env` and `public/media` - - Copy the new files from the downloaded package into your server - - ::: info Note - - You may need to reset files permissions as during the install process. - Check [Security Concerns](./security.md). - - ::: - -4. Update your database schema from your `Castopod Admin` > `About` page or by - running: - - ```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! - -::: info Note - -Releases may come with additional update instructions (see -[releases page](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) - -::: - -## Fully Automated updates - -> Coming soon... 👀 - -## Frequently asked questions (FAQ) - -### Where can I find my Castopod version? - -Go to your Castopod admin panel, the version is displayed on the bottom left -corner. - -Alternatively, you can find the version in the `app > Config > Constants.php` -file. - -### I haven't updated my instance in a long time… What should I do? - -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. - -> You may want to backup your instance depending on how long you haven't updated -> Castopod. - -For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to -`v1.0.0-beta.1`: - -0. (highly recommended) Make a backup of your files and database. - -1. Download the latest release, overwrite your files whilst keeping `.env` and - `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`, - `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`. - -3. ✨ Enjoy your fresh instance, you're all done! - -### Should I make a backup before updating? - -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… diff --git a/docs/src/id/index.md b/docs/src/id/index.md deleted file mode 100644 index 70dbeb5e..00000000 --- a/docs/src/id/index.md +++ /dev/null @@ -1,301 +0,0 @@ ---- -sidebarDepth: 2 ---- - -# Selamat Datang 👋 - -[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] - -Castopod adalah platform hosting yang gratis & sumber terbuka untuk pembuat -siniar yang ingin berinteraksi dengan pendengar mereka. - -Castopod is easy to install and was built on top of -[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very -small footprint. - -
- Pasang -
- -## Fitur-fitur - -- 🌱  Gratis & sumber terbuka (Lisensi AGPL v3) -- 🔐  Focused on data sovereignty: your content, audience, and analytics - belong to you, and you only -- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, - chapters, location, persons, soundbites, … -- 💬  Jaringan sosial bawaan: - - 🚀  Castopod termasuk bagian dari Fediverse, jaringan sosial - terdesentralisasi - - ❤️  Create posts, share, favourite, and comment on episodes -- 📈  Analitik bawaan: - - ⚖️  Sesuai dengan GDPR / CCPA / LGPD - - 🪙  Standard IABv2 audience measurement - - 🏡  On-premises analytics, no third party involved -- 📢  Built-in marketing tools: - - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) - - 📱  PWA: install as a standalone app - - 🎨  Customizable theme colors - - 🎬  Generate ready-to-share Video clips from episodes - - 🔉  Generate soundbites - - ▶️  Embeddable player, embed your episodes on any website -- 💸  Monetization: - - 🔗  Funding links - - 📲  listen-to-click ads - - 🤝  value4value / WebMonetization - - 💎  Premium podcasts -- 📡  Terbitkan episode-episode Anda dimana pun dengan RSS: - - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, - Google Podcasts, Deezer, Podcast Addict, Podfriend, … - - ⚡  Broadcast your episodes instantly with WebSub -- 📥  Podcast import: move your existing podcast into Castopod -- 📤  Move your podcast out of Castopod -- 🔀  Multi-tenant: host as many podcasts as you want -- 👥  Multi-user: add contributors and set roles -- 🌎  i18n support: translated in English, French, Polish, German, - Brazilian Portuguese & Spanish… with - [more to come](https://translate.castopod.org)! - -## Motivasi - -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. - -It is in fact one of the only media to have stayed this way for a long time. - -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. - -With podcasting becoming more widely used, some companies are trying to shift it -towards a more controlled and centralized 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. - -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. - -## Perbandingan dengan solusi lain - -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 you. - -### 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 it. - -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. - -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. - -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 journey. - -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. - -Finally, depending on your needs, Wordpress and Castopod can even live side by -side as they share the same requirements! - -### 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 was initially built around music. And later on, as the project -evolved, the ability to host podcasts was introduced. - -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, …). - -So, you should probably use Funkwhale if you want to host your music, and use -Castopod if you want to host your podcasts. - -### Castopod vs other podcast hosts - -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! - -Each of these solutions differ from one another, you may compare with the -[list of features](#features). - -That being said, there are two main differences with other podcasting solutions: - -- 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 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. - -## Berkontribusi - -Love Castopod and would like to help? Take a look at the following documentation -to get you started. - -### Code of conduct - -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 tolerated. - -### Panduan berkontribusi - -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. - -## Kontributor-kontributor ✨ - -Thanks goes to these wonderful people -([emoji key](https://allcontributors.org/docs/en/emoji-key)): - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Ewen
Ewen

🌍 🤔 💻
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
KrzysztofDomanczyk
KrzysztofDomanczyk

💻
Guy Martin
Guy Martin

🐛 💻
- - - - - - -This project follows the -[all-contributors](https://github.com/all-contributors/all-contributors) -specification. Contributions of any kind welcome! - -## Kontak - -You may reach us for help or ask any question you have on: - -- [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) - -Alternatively, you can follow us on social media platforms to get news about -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) - -## Sponsor-sponsor - -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). - -
- Logo Ad Aures - Logo NLnet -
- -## Lisensi - -[GNU Affero General Public License v3.0](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 - -[release]: https://code.castopod.org/adaures/castopod/-/releases -[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md -[contributions]: https://code.castopod.org/adaures/castopod/-/issues -[semantic-release]: https://github.com/semantic-release/semantic-release -[discord]: https://castopod.org/discord -[stars]: https://github.com/ad-aures/castopod/stargazers -[crowdin]: https://translate.castopod.org/project/castopod diff --git a/docs/src/index.md b/docs/src/index.md deleted file mode 100644 index 054b856b..00000000 --- a/docs/src/index.md +++ /dev/null @@ -1,307 +0,0 @@ ---- -sidebarDepth: 2 ---- - -# Welcome 👋 - -[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] - -Castopod is a free & open-source hosting platform made for podcasters who want -engage and interact with their audience. - -Castopod is easy to install and was built on top of -[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very -small footprint. - -
- Install -
- -## Features - -- 🌱  Free & open-source (AGPL v3 License) -- 🔐  Focused on data sovereignty: your content, audience, and analytics - belong to you, and you only -- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, - chapters, location, persons, soundbites, … -- 💬  Built-in social network: - - 🚀  Castopod is part of the Fediverse, a decentralized social network - - ❤️  Create posts, share, favourite, and comment on episodes -- 📈  Built-in analytics: - - ⚖️  GDPR / CCPA / LGPD compliant - - 🪙  Standard IABv2 audience measurement - - 🏡  On-premises analytics, no third party involved -- 📢  Built-in marketing tools: - - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) - - 📱  PWA: install as a standalone app - - 🎨  Customizable theme colors - - 🎬  Generate ready-to-share Video clips from episodes - - 🔉  Generate soundbites - - ▶️  Embeddable player, embed your episodes on any website -- 💸  Monetization: - - 🔗  Funding links - - 📲  listen-to-click ads - - 🤝  value4value / WebMonetization - - 💎  Premium podcasts -- 📡  Publish your episodes everywhere with RSS: - - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, - Google Podcasts, Deezer, Podcast Addict, Podfriend, … - - ⚡  Broadcast your episodes instantly with WebSub -- 📥  Podcast import: move your existing podcast into Castopod -- 📤  Move your podcast out of Castopod -- 🔀  Multi-tenant: host as many podcasts as you want -- 👥  Multi-user: add contributors and set roles -- 🌎  i18n support: translated in English, French, Polish, German, - Brazilian Portuguese & Spanish… with - [more to come](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. - -It is in fact one of the only media to have stayed this way for a long time. - -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. - -With podcasting becoming more widely used, some companies are trying to shift it -towards a more controlled and centralized 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. - -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. - -## Comparison with other solutions - -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 you. - -### 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 it. - -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. - -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. - -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 journey. - -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. - -Finally, depending on your needs, Wordpress and Castopod can even live side by -side as they share the same requirements! - -### 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 was initially built around music. And later on, as the project -evolved, the ability to host podcasts was introduced. - -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, …). - -So, you should probably use Funkwhale if you want to host your music, and use -Castopod if you want to host your podcasts. - -### Castopod vs other podcast hosts - -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! - -Each of these solutions differ from one another, you may compare with the -[list of features](#features). - -That being said, there are two main differences with other podcasting solutions: - -- 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 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. - -## Contributing - -Love Castopod and would like to help? Take a look at the following documentation -to get you started. - -### Code of conduct - -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 tolerated. - -### Contributing 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. - -## Contributors ✨ - -Thanks goes to these wonderful people -([emoji key](https://allcontributors.org/docs/en/emoji-key)): - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Ewen
Ewen

🌍 🤔 💻
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
KrzysztofDomanczyk
KrzysztofDomanczyk

💻
Guy Martin
Guy Martin

🐛 💻
- - - - - - -This project follows the -[all-contributors](https://github.com/all-contributors/all-contributors) -specification. Contributions of any kind welcome! - -## Contact - -You may reach us for help or ask any question you have on: - -- [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) - -Alternatively, you can follow us on social media platforms to get news about -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 - -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). - -
- Ad Aures Logo - NLnet Logo -
- -## License - -[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) - -Copyright © 2020-present, [Ad Aures](https://adaures.com/). - -[release]: https://code.castopod.org/adaures/castopod/-/releases -[release-badge]: - https://img.shields.io/gitlab/v/release/2?color=brightgreen&gitlab_url=https%3A%2F%2Fcode.castopod.org%2F&include_prereleases&label=release -[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md -[license-badge]: - https://img.shields.io/github/license/ad-aures/castopod?color=blue -[contributions]: https://code.castopod.org/adaures/castopod/-/issues -[contributions-badge]: - https://img.shields.io/badge/contributions-welcome-brightgreen.svg -[semantic-release]: https://github.com/semantic-release/semantic-release -[semantic-release-badge]: - https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg -[discord]: https://castopod.org/discord -[discord-badge]: https://img.shields.io/badge/chat-on%20discord-7389D8 -[stars]: https://github.com/ad-aures/castopod/stargazers -[stars-badge]: - https://img.shields.io/github/stars/ad-aures/castopod?style=social -[crowdin]: https://translate.castopod.org/project/castopod -[crowdin-badge]: https://badges.crowdin.net/castopod/localized.svg diff --git a/docs/src/it/getting-started/_category_.json b/docs/src/it/getting-started/_category_.json deleted file mode 100644 index 877a378f..00000000 --- a/docs/src/it/getting-started/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Getting Started", - "position": 2 -} diff --git a/docs/src/it/getting-started/auth.md b/docs/src/it/getting-started/auth.md deleted file mode 100644 index 18fb8027..00000000 --- a/docs/src/it/getting-started/auth.md +++ /dev/null @@ -1,88 +0,0 @@ ---- -title: Autenticazione & Autorizzazione -sidebarDepth: 3 ---- - -# Autenticazione & Autorizzazione - -Castopod gestisce l'autenticazione e l'autorizzazione utilizzando -`codeigniter/shield` abbinato a regole personalizzate. Ruoli e permessi sono -definiti a due livelli: - -1. [intera istanza](#1-instance-wide-roles-and-permissions) -2. [per podcast](#2-per-podcast-roles-and-permissions) - -## 1. Ruoli e permessi per l'intera istanza - -### Ruoli dell'istanza - - - -| ruolo | descrizione | permessi | -| ----------- | ---------------------------------- | ------------------------------------------------------------------------------------------ | -| Super admin | Ha il pieno controllo su Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Manager | Gestisce il contenuto di Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | -| Podcaster | Utenti generali di Castopod. | admin.access | - - - -### Permessi istanza - - - -| permesso | descrizione | -| ----------------------- | ------------------------------------------------------------------------- | -| admin.access | Può accedere alla zona di amministrazione di Castopod. | -| admin.settings | Può accedere alle impostazioni di Castopod. | -| users.manage | Può gestire gli utenti di Castopod. | -| persons.manage | Può gestire le persone. | -| pages.manage | Può gestire le pagine. | -| podcasts.view | Può visualizzare tutti i podcast. | -| podcasts.create | Può creare nuovi podcast. | -| podcasts.import | Può importare podcast. | -| fediverse.manage-blocks | Può impedire agli attori/domini del fediverso di interagire con Castopod. | - - - -## 2. Per i ruoli e le autorizzazioni del podcast - -### Per i ruoli del podcast - - - -| ruolo | descrizione | autorizzazioni | -| ------ | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Ha il controllo completo del podcast #{id}. | \* | -| Editor | Gestisce contenuti e pubblicazioni del podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| Autore | Gestisce i contenuti del podcast #{id}, ma non li può pubblicare. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Ospite | Collaboratore generale del podcast #{id}. | view, episodes.view | - - - -### Autorizzazioni per podcast - - - -| autorizzazione | descrizione | -| ---------------------------- | ---------------------------------------------------------------------------------------------------- | -| view | Può visualizzare il pannello di controllo e le statistiche del podcast #{id}. | -| edit | Può modificare il podcast #{id}. | -| delete | Può eliminare il podcast #{id}. | -| manage-import | Può sincronizzare il podcast #{id} importato. | -| manage-persons | Può gestire le iscrizioni del podcast #{id}. | -| manage-subscriptions | Può gestire le iscrizioni del podcast #{id}. | -| manage-contributors | Può gestire i collaboratori del podcast #{id}. | -| manage-platforms | Può impostare/rimuovere i link della piattaforma del podcast #{id}. | -| manage-publications | Può pubblicare il podcast #{id}. | -| manage-notifications | Può visualizzare e contrassegnare le notifiche come lette per il podcast #{id}. | -| interact-as | Può interagire come il podcast #{id}, per salvare tra i preferiti, condividere o rispondere ai post. | -| episodes.view | Può visualizzare il pannello di controllo e le statistiche del podcast #{id}. | -| episodes.create | Può creare episodi per il podcast #{id}. | -| episodes.edit | Può modificare il podcast #{id}. | -| episodes.delete | Può eliminare il podcast #{id}. | -| episodes.manage-persons | Può gestire gli abbonamenti del podcast #{id}. | -| episodes.manage-clips | Può gestire le clip video o i suoni del podcast #{id}. | -| episodes.manage-publications | Può pubblicare il podcast #{id}. | -| episodes.manage-comments | Può creare/rimuovere i commenti dell'episodio del podcast #{id}. | - - diff --git a/docs/src/it/getting-started/docker.md b/docs/src/it/getting-started/docker.md deleted file mode 100644 index 12f01619..00000000 --- a/docs/src/it/getting-started/docker.md +++ /dev/null @@ -1,160 +0,0 @@ ---- -title: Official Docker images -sidebarDepth: 3 ---- - -# Official Docker images - -Castopod pushes 3 Docker images to the Docker Hub during its automated build -process: - -- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all - in one castopod image using nginx unit -- [**`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 - -Additionally, Castopod requires a MySQL-compatible database. A Redis database -can be added as a cache handler. - -## Supported tags - -- `develop` [unstable], latest development branch build -- `beta` [stable], latest beta version build -- `latest` [stable], latest version build -- `1.x.x` [stable], specific version build (since `1.0.0`) - -## Example usage - -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: - - ```yml - version: "3.7" - - services: - app: - image: castopod/castopod:latest - container_name: "castopod-app" - volumes: - - castopod-media:/var/www/castopod/public/media - environment: - MYSQL_DATABASE: castopod - MYSQL_USER: castopod - MYSQL_PASSWORD: changeme - CP_BASEURL: "https://castopod.example.com" - CP_ANALYTICS_SALT: changeme - CP_CACHE_HANDLER: redis - CP_REDIS_HOST: redis - CP_REDIS_PASSWORD: changeme - networks: - - castopod-app - - castopod-db - ports: - - 8000:8000 - restart: unless-stopped - - mariadb: - image: mariadb:10.5 - container_name: "castopod-mariadb" - networks: - - castopod-db - volumes: - - castopod-db:/var/lib/mysql - environment: - MYSQL_ROOT_PASSWORD: changeme - MYSQL_DATABASE: castopod - MYSQL_USER: castopod - MYSQL_PASSWORD: changeme - restart: unless-stopped - - redis: - image: redis:7.0-alpine - container_name: "castopod-redis" - command: --requirepass changeme - volumes: - - castopod-cache:/data - networks: - - castopod-app - - volumes: - castopod-media: - castopod-db: - castopod-cache: - - networks: - castopod-app: - castopod-db: - ``` - - You have to adapt some variables to your needs (e.g. `CP_BASEURL`, - `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). - -3. Setup a reverse proxy for 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/): - - ``` - #castopod - castopod.example.com { - reverse_proxy localhost:8000 - } - ``` - -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! - -5. You're all set, start podcasting! 🎙️🚀 - -## Environment Variables - -- **castopod/castopod** and **castopod/app** - - | Variable name | Type (`default`) | Default | - | ------------------------------------- | ----------------------- | ---------------- | - | **`CP_BASEURL`** | string | `undefined` | - | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | - | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | - | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | - | **`CP_ANALYTICS_SALT`** | string | `undefined` | - | **`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_REDIS_HOST`** | ?string | `"localhost"` | - | **`CP_REDIS_PASSWORD`** | ?string | `null` | - | **`CP_REDIS_PORT`** | ?number | `6379` | - | **`CP_REDIS_DATABASE`** | ?number | `0` | - | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | - | **`CP_EMAIL_FROM`** | ?string | `undefined` | - | **`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_ENABLE_2FA`** | ?boolean | `undefined` | - | **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` | - | **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` | - | **`CP_MEDIA_S3_KEY`** | ?string | `undefined` | - | **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` | - | **`CP_MEDIA_S3_REGION`** | ?string | `undefined` | - | **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` | - | **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` | - | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` | - | **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` | - | **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` | - | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | - | **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` | - | **`CP_TIMEOUT`** | ?number | `900` | - -- **castopod/web-server** - - | Variable name | Type | Default | - | ---------------------- | --------------------- | ------- | - | **`CP_APP_HOSTNAME`** | ?string | `"app"` | - | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | - | **`CP_TIMEOUT`** | ?number | `900` | diff --git a/docs/src/it/getting-started/install.md b/docs/src/it/getting-started/install.md deleted file mode 100644 index cdea18ec..00000000 --- a/docs/src/it/getting-started/install.md +++ /dev/null @@ -1,238 +0,0 @@ ---- -title: Installation -sidebarDepth: 3 ---- - -# How to install 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. - -::: tip Note - -We've released official Docker images for Castopod! - -If you prefer using Docker, you may skip this and go straight to the -[docker documentation](./docker.md) for Castopod. - -::: - -## Requirements - -- PHP v8.1 or higher -- MySQL version 5.7 or higher or MariaDB version 10.2 or higher -- HTTPS support -- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's - incoming requests - -### PHP v8.1 or higher - -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. -- [exif](https://www.php.net/manual/en/exif.installation.php) - -Additionally, make sure that the following extensions are enabled in your PHP: - -- json (enabled by default - don't turn it off) -- xml (enabled by default - don't turn it off) -- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php) - -### MySQL compatible database - -> We recommend using [MariaDB](https://mariadb.org). - -::: warning Warning - -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. - -::: - -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. - -#### Privileges - -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`. - -### (Optional) FFmpeg v4.1.8 or higher for Video Clips - -[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: - -- **FreeType 2** library for - [gd](https://www.php.net/manual/en/image.installation.php). - -### (Optional) Other recommendations - -- Redis for better cache performances. -- CDN for static files caching and better performances. -- e-mail gateway for lost passwords. - -## Install instructions - -### Pre-requisites - -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 haven’t 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): - - ```bash - * * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1 - ``` - - **Note** - If you do not add this cron task, the following Castopod features - will not work: - - - Importing a podcast from an existing RSS feed - - Broadcasting social activities to your followers in the fediverse - - Broadcasting episodes to open hubs using - [WebSub](https://en.wikipedia.org/wiki/WebSub) - - Generating video clips - - [requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips) - -### (recommended) Install Wizard - -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! - -::: info Note - -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. - -::: - -### Using CLI - -1. Create a `.env` file in the package root based on the `.env.example` file. -2. Initialize the database using: - - ```sh - php spark install:init-database - ``` - -3. Create the superadmin user using: - - ```sh - php spark install:create-superadmin - ``` - -4. Head on to your admin gateway to start podcasting! - -### Email/SMTP setup - -Email configuration is required for some features to work properly (eg. -retrieving your forgotten password, sending instructions to premium subscribers, -…) - -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" -``` - -#### Email config options - -| 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"` | - -### Media storage - -By default, files are saved to the `public/media` folder using the file system. -If you need to relocate the `media` folder to a different location, you can -specify it in your `.env` file as shown below: - -```ini -# […] - -media.root="media" -media.storage="/mnt/storage" -``` - -In this example, the files will be saved to the /mnt/storage/media folder. Make -sure to also update your web server configuration to reflect this change. - -### S3 - -If you prefer storing your media files on an S3 compatible storage, you may -specify it in your `.env`: - -```ini -# […] - -media.fileManager="s3" -media.s3.endpoint="your_s3_host" -media.s3.key="your_s3_key" -media.s3.secret="your_s3_secret" -media.s3.region="your_s3_region" -``` - -#### S3 config options - -| Variable name | Type | Default | -| ----------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`pathStyleEndpoint`** | boolean | `false` | -| **`keyPrefix`** | string | `undefined` | - -## Community packages - -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. - -### Install with 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. - -
- - - Install Castopod with YunoHost - - -Github -Repo - -
diff --git a/docs/src/it/getting-started/security.md b/docs/src/it/getting-started/security.md deleted file mode 100644 index e205698d..00000000 --- a/docs/src/it/getting-started/security.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: Security ---- - -# Security concerns - -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). - -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): - -- `writable/` folder must be **readable** and **writable**. -- `public/media/` folder must be **readable** and **writable**. -- any other file must be set to **readonly**. - -For instance, if you are using Apache or NGINX with Ubuntu you may do the -following: - -```bash -sudo chown -R root:root /path/to/castopod -sudo chown -R www-data:www-data /path/to/castopod/writable -sudo chown -R www-data:www-data /path/to/castopod/public/media -``` diff --git a/docs/src/it/index.md b/docs/src/it/index.md deleted file mode 100644 index 7f012c6c..00000000 --- a/docs/src/it/index.md +++ /dev/null @@ -1,300 +0,0 @@ ---- -sidebarDepth: 2 ---- - -# Welcome 👋 - -[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] - -Castopod is a free & open-source hosting platform made for podcasters who want -engage and interact with their audience. - -Castopod is easy to install and was built on top of -[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very -small footprint. - -
- Install -
- -## Features - -- 🌱  Free & open-source (AGPL v3 License) -- 🔐  Focused on data sovereignty: your content, audience, and analytics - belong to you, and you only -- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, - chapters, location, persons, soundbites, … -- 💬  Built-in social network: - - 🚀  Castopod is part of the Fediverse, a decentralized social network - - ❤️  Create posts, share, favourite, and comment on episodes -- 📈  Built-in analytics: - - ⚖️  GDPR / CCPA / LGPD compliant - - 🪙  Standard IABv2 audience measurement - - 🏡  On-premises analytics, no third party involved -- 📢  Built-in marketing tools: - - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) - - 📱  PWA: install as a standalone app - - 🎨  Customizable theme colors - - 🎬  Generate ready-to-share Video clips from episodes - - 🔉  Generate soundbites - - ▶️  Embeddable player, embed your episodes on any website -- 💸  Monetization: - - 🔗  Funding links - - 📲  listen-to-click ads - - 🤝  value4value / WebMonetization - - 💎  Premium podcasts -- 📡  Publish your episodes everywhere with RSS: - - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, - Google Podcasts, Deezer, Podcast Addict, Podfriend, … - - ⚡  Broadcast your episodes instantly with WebSub -- 📥  Podcast import: move your existing podcast into Castopod -- 📤  Move your podcast out of Castopod -- 🔀  Multi-tenant: host as many podcasts as you want -- 👥  Multi-user: add contributors and set roles -- 🌎  i18n support: translated in English, French, Polish, German, - Brazilian Portuguese & Spanish… with - [more to come](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. - -It is in fact one of the only media to have stayed this way for a long time. - -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. - -With podcasting becoming more widely used, some companies are trying to shift it -towards a more controlled and centralized 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. - -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. - -## Comparison with other solutions - -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 you. - -### 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 it. - -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. - -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. - -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 journey. - -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. - -Finally, depending on your needs, Wordpress and Castopod can even live side by -side as they share the same requirements! - -### 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 was initially built around music. And later on, as the project -evolved, the ability to host podcasts was introduced. - -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, …). - -So, you should probably use Funkwhale if you want to host your music, and use -Castopod if you want to host your podcasts. - -### Castopod vs other podcast hosts - -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! - -Each of these solutions differ from one another, you may compare with the -[list of features](#features). - -That being said, there are two main differences with other podcasting solutions: - -- 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 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. - -## Contributing - -Love Castopod and would like to help? Take a look at the following documentation -to get you started. - -### Code of conduct - -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 tolerated. - -### Contributing 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. - -## Contributors ✨ - -Thanks goes to these wonderful people -([emoji key](https://allcontributors.org/docs/en/emoji-key)): - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Ewen
Ewen

🌍 🤔 💻
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
KrzysztofDomanczyk
KrzysztofDomanczyk

💻
Guy Martin
Guy Martin

🐛 💻
- - - - - - -This project follows the -[all-contributors](https://github.com/all-contributors/all-contributors) -specification. Contributions of any kind welcome! - -## Contact - -You may reach us for help or ask any question you have on: - -- [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) - -Alternatively, you can follow us on social media platforms to get news about -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 - -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). - -
- Ad Aures Logo - NLnet Logo -
- -## License - -[GNU Affero General Public License v3.0](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 - -[release]: https://code.castopod.org/adaures/castopod/-/releases -[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md -[contributions]: https://code.castopod.org/adaures/castopod/-/issues -[semantic-release]: https://github.com/semantic-release/semantic-release -[discord]: https://castopod.org/discord -[stars]: https://github.com/ad-aures/castopod/stargazers -[crowdin]: https://translate.castopod.org/project/castopod diff --git a/docs/src/ja/getting-started/auth.md b/docs/src/ja/getting-started/auth.md deleted file mode 100644 index ff5d59c0..00000000 --- a/docs/src/ja/getting-started/auth.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -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 - - - -| 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 | - - - -### Instance permissions - - - -| 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. | - - - -## 2. Per podcast roles and permissions - -### Per podcast roles - - - -| 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, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| 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 | - - - -### Per podcast permissions - - - -| 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}. | - - diff --git a/docs/src/ja/getting-started/docker.md b/docs/src/ja/getting-started/docker.md deleted file mode 100644 index 12f01619..00000000 --- a/docs/src/ja/getting-started/docker.md +++ /dev/null @@ -1,160 +0,0 @@ ---- -title: Official Docker images -sidebarDepth: 3 ---- - -# Official Docker images - -Castopod pushes 3 Docker images to the Docker Hub during its automated build -process: - -- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all - in one castopod image using nginx unit -- [**`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 - -Additionally, Castopod requires a MySQL-compatible database. A Redis database -can be added as a cache handler. - -## Supported tags - -- `develop` [unstable], latest development branch build -- `beta` [stable], latest beta version build -- `latest` [stable], latest version build -- `1.x.x` [stable], specific version build (since `1.0.0`) - -## Example usage - -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: - - ```yml - version: "3.7" - - services: - app: - image: castopod/castopod:latest - container_name: "castopod-app" - volumes: - - castopod-media:/var/www/castopod/public/media - environment: - MYSQL_DATABASE: castopod - MYSQL_USER: castopod - MYSQL_PASSWORD: changeme - CP_BASEURL: "https://castopod.example.com" - CP_ANALYTICS_SALT: changeme - CP_CACHE_HANDLER: redis - CP_REDIS_HOST: redis - CP_REDIS_PASSWORD: changeme - networks: - - castopod-app - - castopod-db - ports: - - 8000:8000 - restart: unless-stopped - - mariadb: - image: mariadb:10.5 - container_name: "castopod-mariadb" - networks: - - castopod-db - volumes: - - castopod-db:/var/lib/mysql - environment: - MYSQL_ROOT_PASSWORD: changeme - MYSQL_DATABASE: castopod - MYSQL_USER: castopod - MYSQL_PASSWORD: changeme - restart: unless-stopped - - redis: - image: redis:7.0-alpine - container_name: "castopod-redis" - command: --requirepass changeme - volumes: - - castopod-cache:/data - networks: - - castopod-app - - volumes: - castopod-media: - castopod-db: - castopod-cache: - - networks: - castopod-app: - castopod-db: - ``` - - You have to adapt some variables to your needs (e.g. `CP_BASEURL`, - `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). - -3. Setup a reverse proxy for 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/): - - ``` - #castopod - castopod.example.com { - reverse_proxy localhost:8000 - } - ``` - -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! - -5. You're all set, start podcasting! 🎙️🚀 - -## Environment Variables - -- **castopod/castopod** and **castopod/app** - - | Variable name | Type (`default`) | Default | - | ------------------------------------- | ----------------------- | ---------------- | - | **`CP_BASEURL`** | string | `undefined` | - | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | - | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | - | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | - | **`CP_ANALYTICS_SALT`** | string | `undefined` | - | **`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_REDIS_HOST`** | ?string | `"localhost"` | - | **`CP_REDIS_PASSWORD`** | ?string | `null` | - | **`CP_REDIS_PORT`** | ?number | `6379` | - | **`CP_REDIS_DATABASE`** | ?number | `0` | - | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | - | **`CP_EMAIL_FROM`** | ?string | `undefined` | - | **`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_ENABLE_2FA`** | ?boolean | `undefined` | - | **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` | - | **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` | - | **`CP_MEDIA_S3_KEY`** | ?string | `undefined` | - | **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` | - | **`CP_MEDIA_S3_REGION`** | ?string | `undefined` | - | **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` | - | **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` | - | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` | - | **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` | - | **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` | - | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | - | **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` | - | **`CP_TIMEOUT`** | ?number | `900` | - -- **castopod/web-server** - - | Variable name | Type | Default | - | ---------------------- | --------------------- | ------- | - | **`CP_APP_HOSTNAME`** | ?string | `"app"` | - | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | - | **`CP_TIMEOUT`** | ?number | `900` | diff --git a/docs/src/ja/getting-started/install.md b/docs/src/ja/getting-started/install.md deleted file mode 100644 index cdea18ec..00000000 --- a/docs/src/ja/getting-started/install.md +++ /dev/null @@ -1,238 +0,0 @@ ---- -title: Installation -sidebarDepth: 3 ---- - -# How to install 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. - -::: tip Note - -We've released official Docker images for Castopod! - -If you prefer using Docker, you may skip this and go straight to the -[docker documentation](./docker.md) for Castopod. - -::: - -## Requirements - -- PHP v8.1 or higher -- MySQL version 5.7 or higher or MariaDB version 10.2 or higher -- HTTPS support -- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's - incoming requests - -### PHP v8.1 or higher - -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. -- [exif](https://www.php.net/manual/en/exif.installation.php) - -Additionally, make sure that the following extensions are enabled in your PHP: - -- json (enabled by default - don't turn it off) -- xml (enabled by default - don't turn it off) -- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php) - -### MySQL compatible database - -> We recommend using [MariaDB](https://mariadb.org). - -::: warning Warning - -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. - -::: - -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. - -#### Privileges - -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`. - -### (Optional) FFmpeg v4.1.8 or higher for Video Clips - -[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: - -- **FreeType 2** library for - [gd](https://www.php.net/manual/en/image.installation.php). - -### (Optional) Other recommendations - -- Redis for better cache performances. -- CDN for static files caching and better performances. -- e-mail gateway for lost passwords. - -## Install instructions - -### Pre-requisites - -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 haven’t 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): - - ```bash - * * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1 - ``` - - **Note** - If you do not add this cron task, the following Castopod features - will not work: - - - Importing a podcast from an existing RSS feed - - Broadcasting social activities to your followers in the fediverse - - Broadcasting episodes to open hubs using - [WebSub](https://en.wikipedia.org/wiki/WebSub) - - Generating video clips - - [requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips) - -### (recommended) Install Wizard - -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! - -::: info Note - -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. - -::: - -### Using CLI - -1. Create a `.env` file in the package root based on the `.env.example` file. -2. Initialize the database using: - - ```sh - php spark install:init-database - ``` - -3. Create the superadmin user using: - - ```sh - php spark install:create-superadmin - ``` - -4. Head on to your admin gateway to start podcasting! - -### Email/SMTP setup - -Email configuration is required for some features to work properly (eg. -retrieving your forgotten password, sending instructions to premium subscribers, -…) - -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" -``` - -#### Email config options - -| 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"` | - -### Media storage - -By default, files are saved to the `public/media` folder using the file system. -If you need to relocate the `media` folder to a different location, you can -specify it in your `.env` file as shown below: - -```ini -# […] - -media.root="media" -media.storage="/mnt/storage" -``` - -In this example, the files will be saved to the /mnt/storage/media folder. Make -sure to also update your web server configuration to reflect this change. - -### S3 - -If you prefer storing your media files on an S3 compatible storage, you may -specify it in your `.env`: - -```ini -# […] - -media.fileManager="s3" -media.s3.endpoint="your_s3_host" -media.s3.key="your_s3_key" -media.s3.secret="your_s3_secret" -media.s3.region="your_s3_region" -``` - -#### S3 config options - -| Variable name | Type | Default | -| ----------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`pathStyleEndpoint`** | boolean | `false` | -| **`keyPrefix`** | string | `undefined` | - -## Community packages - -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. - -### Install with 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. - -
- - - Install Castopod with YunoHost - - -Github -Repo - -
diff --git a/docs/src/ja/getting-started/security.md b/docs/src/ja/getting-started/security.md deleted file mode 100644 index e205698d..00000000 --- a/docs/src/ja/getting-started/security.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: Security ---- - -# Security concerns - -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). - -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): - -- `writable/` folder must be **readable** and **writable**. -- `public/media/` folder must be **readable** and **writable**. -- any other file must be set to **readonly**. - -For instance, if you are using Apache or NGINX with Ubuntu you may do the -following: - -```bash -sudo chown -R root:root /path/to/castopod -sudo chown -R www-data:www-data /path/to/castopod/writable -sudo chown -R www-data:www-data /path/to/castopod/public/media -``` diff --git a/docs/src/ja/getting-started/update.md b/docs/src/ja/getting-started/update.md deleted file mode 100644 index 98e019fb..00000000 --- a/docs/src/ja/getting-started/update.md +++ /dev/null @@ -1,109 +0,0 @@ ---- -title: Update -sidebarDepth: 3 ---- - -# How to update 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 ⚡. - -## Update instructions - -0. ⚠️ Before any update, we highly recommend you backup your Castopod files and - database. - - - cf. - [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 - - - cf. - [Where can I find my 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 - - - ⚠️ 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/) - -3. On your server: - - - Remove all files except `.env` and `public/media` - - Copy the new files from the downloaded package into your server - - ::: info Note - - You may need to reset files permissions as during the install process. - Check [Security Concerns](./security.md). - - ::: - -4. Update your database schema from your `Castopod Admin` > `About` page or by - running: - - ```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! - -::: info Note - -Releases may come with additional update instructions (see -[releases page](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) - -::: - -## Fully Automated updates - -> Coming soon... 👀 - -## Frequently asked questions (FAQ) - -### Where can I find my Castopod version? - -Go to your Castopod admin panel, the version is displayed on the bottom left -corner. - -Alternatively, you can find the version in the `app > Config > Constants.php` -file. - -### I haven't updated my instance in a long time… What should I do? - -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. - -> You may want to backup your instance depending on how long you haven't updated -> Castopod. - -For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to -`v1.0.0-beta.1`: - -0. (highly recommended) Make a backup of your files and database. - -1. Download the latest release, overwrite your files whilst keeping `.env` and - `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`, - `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`. - -3. ✨ Enjoy your fresh instance, you're all done! - -### Should I make a backup before updating? - -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… diff --git a/docs/src/ja/index.md b/docs/src/ja/index.md deleted file mode 100644 index 7f012c6c..00000000 --- a/docs/src/ja/index.md +++ /dev/null @@ -1,300 +0,0 @@ ---- -sidebarDepth: 2 ---- - -# Welcome 👋 - -[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] - -Castopod is a free & open-source hosting platform made for podcasters who want -engage and interact with their audience. - -Castopod is easy to install and was built on top of -[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very -small footprint. - -
- Install -
- -## Features - -- 🌱  Free & open-source (AGPL v3 License) -- 🔐  Focused on data sovereignty: your content, audience, and analytics - belong to you, and you only -- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, - chapters, location, persons, soundbites, … -- 💬  Built-in social network: - - 🚀  Castopod is part of the Fediverse, a decentralized social network - - ❤️  Create posts, share, favourite, and comment on episodes -- 📈  Built-in analytics: - - ⚖️  GDPR / CCPA / LGPD compliant - - 🪙  Standard IABv2 audience measurement - - 🏡  On-premises analytics, no third party involved -- 📢  Built-in marketing tools: - - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) - - 📱  PWA: install as a standalone app - - 🎨  Customizable theme colors - - 🎬  Generate ready-to-share Video clips from episodes - - 🔉  Generate soundbites - - ▶️  Embeddable player, embed your episodes on any website -- 💸  Monetization: - - 🔗  Funding links - - 📲  listen-to-click ads - - 🤝  value4value / WebMonetization - - 💎  Premium podcasts -- 📡  Publish your episodes everywhere with RSS: - - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, - Google Podcasts, Deezer, Podcast Addict, Podfriend, … - - ⚡  Broadcast your episodes instantly with WebSub -- 📥  Podcast import: move your existing podcast into Castopod -- 📤  Move your podcast out of Castopod -- 🔀  Multi-tenant: host as many podcasts as you want -- 👥  Multi-user: add contributors and set roles -- 🌎  i18n support: translated in English, French, Polish, German, - Brazilian Portuguese & Spanish… with - [more to come](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. - -It is in fact one of the only media to have stayed this way for a long time. - -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. - -With podcasting becoming more widely used, some companies are trying to shift it -towards a more controlled and centralized 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. - -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. - -## Comparison with other solutions - -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 you. - -### 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 it. - -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. - -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. - -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 journey. - -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. - -Finally, depending on your needs, Wordpress and Castopod can even live side by -side as they share the same requirements! - -### 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 was initially built around music. And later on, as the project -evolved, the ability to host podcasts was introduced. - -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, …). - -So, you should probably use Funkwhale if you want to host your music, and use -Castopod if you want to host your podcasts. - -### Castopod vs other podcast hosts - -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! - -Each of these solutions differ from one another, you may compare with the -[list of features](#features). - -That being said, there are two main differences with other podcasting solutions: - -- 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 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. - -## Contributing - -Love Castopod and would like to help? Take a look at the following documentation -to get you started. - -### Code of conduct - -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 tolerated. - -### Contributing 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. - -## Contributors ✨ - -Thanks goes to these wonderful people -([emoji key](https://allcontributors.org/docs/en/emoji-key)): - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Ewen
Ewen

🌍 🤔 💻
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
KrzysztofDomanczyk
KrzysztofDomanczyk

💻
Guy Martin
Guy Martin

🐛 💻
- - - - - - -This project follows the -[all-contributors](https://github.com/all-contributors/all-contributors) -specification. Contributions of any kind welcome! - -## Contact - -You may reach us for help or ask any question you have on: - -- [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) - -Alternatively, you can follow us on social media platforms to get news about -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 - -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). - -
- Ad Aures Logo - NLnet Logo -
- -## License - -[GNU Affero General Public License v3.0](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 - -[release]: https://code.castopod.org/adaures/castopod/-/releases -[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md -[contributions]: https://code.castopod.org/adaures/castopod/-/issues -[semantic-release]: https://github.com/semantic-release/semantic-release -[discord]: https://castopod.org/discord -[stars]: https://github.com/ad-aures/castopod/stargazers -[crowdin]: https://translate.castopod.org/project/castopod diff --git a/docs/src/kk/getting-started/auth.md b/docs/src/kk/getting-started/auth.md deleted file mode 100644 index ff5d59c0..00000000 --- a/docs/src/kk/getting-started/auth.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -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 - - - -| 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 | - - - -### Instance permissions - - - -| 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. | - - - -## 2. Per podcast roles and permissions - -### Per podcast roles - - - -| 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, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| 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 | - - - -### Per podcast permissions - - - -| 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}. | - - diff --git a/docs/src/kk/getting-started/docker.md b/docs/src/kk/getting-started/docker.md deleted file mode 100644 index 12f01619..00000000 --- a/docs/src/kk/getting-started/docker.md +++ /dev/null @@ -1,160 +0,0 @@ ---- -title: Official Docker images -sidebarDepth: 3 ---- - -# Official Docker images - -Castopod pushes 3 Docker images to the Docker Hub during its automated build -process: - -- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all - in one castopod image using nginx unit -- [**`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 - -Additionally, Castopod requires a MySQL-compatible database. A Redis database -can be added as a cache handler. - -## Supported tags - -- `develop` [unstable], latest development branch build -- `beta` [stable], latest beta version build -- `latest` [stable], latest version build -- `1.x.x` [stable], specific version build (since `1.0.0`) - -## Example usage - -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: - - ```yml - version: "3.7" - - services: - app: - image: castopod/castopod:latest - container_name: "castopod-app" - volumes: - - castopod-media:/var/www/castopod/public/media - environment: - MYSQL_DATABASE: castopod - MYSQL_USER: castopod - MYSQL_PASSWORD: changeme - CP_BASEURL: "https://castopod.example.com" - CP_ANALYTICS_SALT: changeme - CP_CACHE_HANDLER: redis - CP_REDIS_HOST: redis - CP_REDIS_PASSWORD: changeme - networks: - - castopod-app - - castopod-db - ports: - - 8000:8000 - restart: unless-stopped - - mariadb: - image: mariadb:10.5 - container_name: "castopod-mariadb" - networks: - - castopod-db - volumes: - - castopod-db:/var/lib/mysql - environment: - MYSQL_ROOT_PASSWORD: changeme - MYSQL_DATABASE: castopod - MYSQL_USER: castopod - MYSQL_PASSWORD: changeme - restart: unless-stopped - - redis: - image: redis:7.0-alpine - container_name: "castopod-redis" - command: --requirepass changeme - volumes: - - castopod-cache:/data - networks: - - castopod-app - - volumes: - castopod-media: - castopod-db: - castopod-cache: - - networks: - castopod-app: - castopod-db: - ``` - - You have to adapt some variables to your needs (e.g. `CP_BASEURL`, - `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). - -3. Setup a reverse proxy for 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/): - - ``` - #castopod - castopod.example.com { - reverse_proxy localhost:8000 - } - ``` - -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! - -5. You're all set, start podcasting! 🎙️🚀 - -## Environment Variables - -- **castopod/castopod** and **castopod/app** - - | Variable name | Type (`default`) | Default | - | ------------------------------------- | ----------------------- | ---------------- | - | **`CP_BASEURL`** | string | `undefined` | - | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | - | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | - | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | - | **`CP_ANALYTICS_SALT`** | string | `undefined` | - | **`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_REDIS_HOST`** | ?string | `"localhost"` | - | **`CP_REDIS_PASSWORD`** | ?string | `null` | - | **`CP_REDIS_PORT`** | ?number | `6379` | - | **`CP_REDIS_DATABASE`** | ?number | `0` | - | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | - | **`CP_EMAIL_FROM`** | ?string | `undefined` | - | **`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_ENABLE_2FA`** | ?boolean | `undefined` | - | **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` | - | **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` | - | **`CP_MEDIA_S3_KEY`** | ?string | `undefined` | - | **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` | - | **`CP_MEDIA_S3_REGION`** | ?string | `undefined` | - | **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` | - | **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` | - | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` | - | **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` | - | **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` | - | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | - | **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` | - | **`CP_TIMEOUT`** | ?number | `900` | - -- **castopod/web-server** - - | Variable name | Type | Default | - | ---------------------- | --------------------- | ------- | - | **`CP_APP_HOSTNAME`** | ?string | `"app"` | - | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | - | **`CP_TIMEOUT`** | ?number | `900` | diff --git a/docs/src/kk/getting-started/install.md b/docs/src/kk/getting-started/install.md deleted file mode 100644 index cdea18ec..00000000 --- a/docs/src/kk/getting-started/install.md +++ /dev/null @@ -1,238 +0,0 @@ ---- -title: Installation -sidebarDepth: 3 ---- - -# How to install 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. - -::: tip Note - -We've released official Docker images for Castopod! - -If you prefer using Docker, you may skip this and go straight to the -[docker documentation](./docker.md) for Castopod. - -::: - -## Requirements - -- PHP v8.1 or higher -- MySQL version 5.7 or higher or MariaDB version 10.2 or higher -- HTTPS support -- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's - incoming requests - -### PHP v8.1 or higher - -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. -- [exif](https://www.php.net/manual/en/exif.installation.php) - -Additionally, make sure that the following extensions are enabled in your PHP: - -- json (enabled by default - don't turn it off) -- xml (enabled by default - don't turn it off) -- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php) - -### MySQL compatible database - -> We recommend using [MariaDB](https://mariadb.org). - -::: warning Warning - -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. - -::: - -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. - -#### Privileges - -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`. - -### (Optional) FFmpeg v4.1.8 or higher for Video Clips - -[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: - -- **FreeType 2** library for - [gd](https://www.php.net/manual/en/image.installation.php). - -### (Optional) Other recommendations - -- Redis for better cache performances. -- CDN for static files caching and better performances. -- e-mail gateway for lost passwords. - -## Install instructions - -### Pre-requisites - -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 haven’t 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): - - ```bash - * * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1 - ``` - - **Note** - If you do not add this cron task, the following Castopod features - will not work: - - - Importing a podcast from an existing RSS feed - - Broadcasting social activities to your followers in the fediverse - - Broadcasting episodes to open hubs using - [WebSub](https://en.wikipedia.org/wiki/WebSub) - - Generating video clips - - [requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips) - -### (recommended) Install Wizard - -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! - -::: info Note - -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. - -::: - -### Using CLI - -1. Create a `.env` file in the package root based on the `.env.example` file. -2. Initialize the database using: - - ```sh - php spark install:init-database - ``` - -3. Create the superadmin user using: - - ```sh - php spark install:create-superadmin - ``` - -4. Head on to your admin gateway to start podcasting! - -### Email/SMTP setup - -Email configuration is required for some features to work properly (eg. -retrieving your forgotten password, sending instructions to premium subscribers, -…) - -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" -``` - -#### Email config options - -| 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"` | - -### Media storage - -By default, files are saved to the `public/media` folder using the file system. -If you need to relocate the `media` folder to a different location, you can -specify it in your `.env` file as shown below: - -```ini -# […] - -media.root="media" -media.storage="/mnt/storage" -``` - -In this example, the files will be saved to the /mnt/storage/media folder. Make -sure to also update your web server configuration to reflect this change. - -### S3 - -If you prefer storing your media files on an S3 compatible storage, you may -specify it in your `.env`: - -```ini -# […] - -media.fileManager="s3" -media.s3.endpoint="your_s3_host" -media.s3.key="your_s3_key" -media.s3.secret="your_s3_secret" -media.s3.region="your_s3_region" -``` - -#### S3 config options - -| Variable name | Type | Default | -| ----------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`pathStyleEndpoint`** | boolean | `false` | -| **`keyPrefix`** | string | `undefined` | - -## Community packages - -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. - -### Install with 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. - -
- - - Install Castopod with YunoHost - - -Github -Repo - -
diff --git a/docs/src/kk/getting-started/security.md b/docs/src/kk/getting-started/security.md deleted file mode 100644 index e205698d..00000000 --- a/docs/src/kk/getting-started/security.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: Security ---- - -# Security concerns - -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). - -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): - -- `writable/` folder must be **readable** and **writable**. -- `public/media/` folder must be **readable** and **writable**. -- any other file must be set to **readonly**. - -For instance, if you are using Apache or NGINX with Ubuntu you may do the -following: - -```bash -sudo chown -R root:root /path/to/castopod -sudo chown -R www-data:www-data /path/to/castopod/writable -sudo chown -R www-data:www-data /path/to/castopod/public/media -``` diff --git a/docs/src/kk/getting-started/update.md b/docs/src/kk/getting-started/update.md deleted file mode 100644 index 98e019fb..00000000 --- a/docs/src/kk/getting-started/update.md +++ /dev/null @@ -1,109 +0,0 @@ ---- -title: Update -sidebarDepth: 3 ---- - -# How to update 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 ⚡. - -## Update instructions - -0. ⚠️ Before any update, we highly recommend you backup your Castopod files and - database. - - - cf. - [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 - - - cf. - [Where can I find my 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 - - - ⚠️ 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/) - -3. On your server: - - - Remove all files except `.env` and `public/media` - - Copy the new files from the downloaded package into your server - - ::: info Note - - You may need to reset files permissions as during the install process. - Check [Security Concerns](./security.md). - - ::: - -4. Update your database schema from your `Castopod Admin` > `About` page or by - running: - - ```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! - -::: info Note - -Releases may come with additional update instructions (see -[releases page](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) - -::: - -## Fully Automated updates - -> Coming soon... 👀 - -## Frequently asked questions (FAQ) - -### Where can I find my Castopod version? - -Go to your Castopod admin panel, the version is displayed on the bottom left -corner. - -Alternatively, you can find the version in the `app > Config > Constants.php` -file. - -### I haven't updated my instance in a long time… What should I do? - -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. - -> You may want to backup your instance depending on how long you haven't updated -> Castopod. - -For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to -`v1.0.0-beta.1`: - -0. (highly recommended) Make a backup of your files and database. - -1. Download the latest release, overwrite your files whilst keeping `.env` and - `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`, - `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`. - -3. ✨ Enjoy your fresh instance, you're all done! - -### Should I make a backup before updating? - -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… diff --git a/docs/src/kk/index.md b/docs/src/kk/index.md deleted file mode 100644 index 7f012c6c..00000000 --- a/docs/src/kk/index.md +++ /dev/null @@ -1,300 +0,0 @@ ---- -sidebarDepth: 2 ---- - -# Welcome 👋 - -[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] - -Castopod is a free & open-source hosting platform made for podcasters who want -engage and interact with their audience. - -Castopod is easy to install and was built on top of -[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very -small footprint. - -
- Install -
- -## Features - -- 🌱  Free & open-source (AGPL v3 License) -- 🔐  Focused on data sovereignty: your content, audience, and analytics - belong to you, and you only -- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, - chapters, location, persons, soundbites, … -- 💬  Built-in social network: - - 🚀  Castopod is part of the Fediverse, a decentralized social network - - ❤️  Create posts, share, favourite, and comment on episodes -- 📈  Built-in analytics: - - ⚖️  GDPR / CCPA / LGPD compliant - - 🪙  Standard IABv2 audience measurement - - 🏡  On-premises analytics, no third party involved -- 📢  Built-in marketing tools: - - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) - - 📱  PWA: install as a standalone app - - 🎨  Customizable theme colors - - 🎬  Generate ready-to-share Video clips from episodes - - 🔉  Generate soundbites - - ▶️  Embeddable player, embed your episodes on any website -- 💸  Monetization: - - 🔗  Funding links - - 📲  listen-to-click ads - - 🤝  value4value / WebMonetization - - 💎  Premium podcasts -- 📡  Publish your episodes everywhere with RSS: - - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, - Google Podcasts, Deezer, Podcast Addict, Podfriend, … - - ⚡  Broadcast your episodes instantly with WebSub -- 📥  Podcast import: move your existing podcast into Castopod -- 📤  Move your podcast out of Castopod -- 🔀  Multi-tenant: host as many podcasts as you want -- 👥  Multi-user: add contributors and set roles -- 🌎  i18n support: translated in English, French, Polish, German, - Brazilian Portuguese & Spanish… with - [more to come](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. - -It is in fact one of the only media to have stayed this way for a long time. - -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. - -With podcasting becoming more widely used, some companies are trying to shift it -towards a more controlled and centralized 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. - -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. - -## Comparison with other solutions - -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 you. - -### 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 it. - -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. - -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. - -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 journey. - -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. - -Finally, depending on your needs, Wordpress and Castopod can even live side by -side as they share the same requirements! - -### 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 was initially built around music. And later on, as the project -evolved, the ability to host podcasts was introduced. - -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, …). - -So, you should probably use Funkwhale if you want to host your music, and use -Castopod if you want to host your podcasts. - -### Castopod vs other podcast hosts - -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! - -Each of these solutions differ from one another, you may compare with the -[list of features](#features). - -That being said, there are two main differences with other podcasting solutions: - -- 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 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. - -## Contributing - -Love Castopod and would like to help? Take a look at the following documentation -to get you started. - -### Code of conduct - -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 tolerated. - -### Contributing 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. - -## Contributors ✨ - -Thanks goes to these wonderful people -([emoji key](https://allcontributors.org/docs/en/emoji-key)): - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Ewen
Ewen

🌍 🤔 💻
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
KrzysztofDomanczyk
KrzysztofDomanczyk

💻
Guy Martin
Guy Martin

🐛 💻
- - - - - - -This project follows the -[all-contributors](https://github.com/all-contributors/all-contributors) -specification. Contributions of any kind welcome! - -## Contact - -You may reach us for help or ask any question you have on: - -- [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) - -Alternatively, you can follow us on social media platforms to get news about -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 - -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). - -
- Ad Aures Logo - NLnet Logo -
- -## License - -[GNU Affero General Public License v3.0](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 - -[release]: https://code.castopod.org/adaures/castopod/-/releases -[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md -[contributions]: https://code.castopod.org/adaures/castopod/-/issues -[semantic-release]: https://github.com/semantic-release/semantic-release -[discord]: https://castopod.org/discord -[stars]: https://github.com/ad-aures/castopod/stargazers -[crowdin]: https://translate.castopod.org/project/castopod diff --git a/docs/src/ko/getting-started/auth.md b/docs/src/ko/getting-started/auth.md deleted file mode 100644 index ff5d59c0..00000000 --- a/docs/src/ko/getting-started/auth.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -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 - - - -| 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 | - - - -### Instance permissions - - - -| 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. | - - - -## 2. Per podcast roles and permissions - -### Per podcast roles - - - -| 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, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| 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 | - - - -### Per podcast permissions - - - -| 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}. | - - diff --git a/docs/src/ko/getting-started/docker.md b/docs/src/ko/getting-started/docker.md deleted file mode 100644 index 12f01619..00000000 --- a/docs/src/ko/getting-started/docker.md +++ /dev/null @@ -1,160 +0,0 @@ ---- -title: Official Docker images -sidebarDepth: 3 ---- - -# Official Docker images - -Castopod pushes 3 Docker images to the Docker Hub during its automated build -process: - -- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all - in one castopod image using nginx unit -- [**`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 - -Additionally, Castopod requires a MySQL-compatible database. A Redis database -can be added as a cache handler. - -## Supported tags - -- `develop` [unstable], latest development branch build -- `beta` [stable], latest beta version build -- `latest` [stable], latest version build -- `1.x.x` [stable], specific version build (since `1.0.0`) - -## Example usage - -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: - - ```yml - version: "3.7" - - services: - app: - image: castopod/castopod:latest - container_name: "castopod-app" - volumes: - - castopod-media:/var/www/castopod/public/media - environment: - MYSQL_DATABASE: castopod - MYSQL_USER: castopod - MYSQL_PASSWORD: changeme - CP_BASEURL: "https://castopod.example.com" - CP_ANALYTICS_SALT: changeme - CP_CACHE_HANDLER: redis - CP_REDIS_HOST: redis - CP_REDIS_PASSWORD: changeme - networks: - - castopod-app - - castopod-db - ports: - - 8000:8000 - restart: unless-stopped - - mariadb: - image: mariadb:10.5 - container_name: "castopod-mariadb" - networks: - - castopod-db - volumes: - - castopod-db:/var/lib/mysql - environment: - MYSQL_ROOT_PASSWORD: changeme - MYSQL_DATABASE: castopod - MYSQL_USER: castopod - MYSQL_PASSWORD: changeme - restart: unless-stopped - - redis: - image: redis:7.0-alpine - container_name: "castopod-redis" - command: --requirepass changeme - volumes: - - castopod-cache:/data - networks: - - castopod-app - - volumes: - castopod-media: - castopod-db: - castopod-cache: - - networks: - castopod-app: - castopod-db: - ``` - - You have to adapt some variables to your needs (e.g. `CP_BASEURL`, - `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). - -3. Setup a reverse proxy for 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/): - - ``` - #castopod - castopod.example.com { - reverse_proxy localhost:8000 - } - ``` - -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! - -5. You're all set, start podcasting! 🎙️🚀 - -## Environment Variables - -- **castopod/castopod** and **castopod/app** - - | Variable name | Type (`default`) | Default | - | ------------------------------------- | ----------------------- | ---------------- | - | **`CP_BASEURL`** | string | `undefined` | - | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | - | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | - | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | - | **`CP_ANALYTICS_SALT`** | string | `undefined` | - | **`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_REDIS_HOST`** | ?string | `"localhost"` | - | **`CP_REDIS_PASSWORD`** | ?string | `null` | - | **`CP_REDIS_PORT`** | ?number | `6379` | - | **`CP_REDIS_DATABASE`** | ?number | `0` | - | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | - | **`CP_EMAIL_FROM`** | ?string | `undefined` | - | **`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_ENABLE_2FA`** | ?boolean | `undefined` | - | **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` | - | **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` | - | **`CP_MEDIA_S3_KEY`** | ?string | `undefined` | - | **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` | - | **`CP_MEDIA_S3_REGION`** | ?string | `undefined` | - | **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` | - | **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` | - | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` | - | **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` | - | **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` | - | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | - | **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` | - | **`CP_TIMEOUT`** | ?number | `900` | - -- **castopod/web-server** - - | Variable name | Type | Default | - | ---------------------- | --------------------- | ------- | - | **`CP_APP_HOSTNAME`** | ?string | `"app"` | - | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | - | **`CP_TIMEOUT`** | ?number | `900` | diff --git a/docs/src/ko/getting-started/install.md b/docs/src/ko/getting-started/install.md deleted file mode 100644 index cdea18ec..00000000 --- a/docs/src/ko/getting-started/install.md +++ /dev/null @@ -1,238 +0,0 @@ ---- -title: Installation -sidebarDepth: 3 ---- - -# How to install 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. - -::: tip Note - -We've released official Docker images for Castopod! - -If you prefer using Docker, you may skip this and go straight to the -[docker documentation](./docker.md) for Castopod. - -::: - -## Requirements - -- PHP v8.1 or higher -- MySQL version 5.7 or higher or MariaDB version 10.2 or higher -- HTTPS support -- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's - incoming requests - -### PHP v8.1 or higher - -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. -- [exif](https://www.php.net/manual/en/exif.installation.php) - -Additionally, make sure that the following extensions are enabled in your PHP: - -- json (enabled by default - don't turn it off) -- xml (enabled by default - don't turn it off) -- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php) - -### MySQL compatible database - -> We recommend using [MariaDB](https://mariadb.org). - -::: warning Warning - -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. - -::: - -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. - -#### Privileges - -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`. - -### (Optional) FFmpeg v4.1.8 or higher for Video Clips - -[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: - -- **FreeType 2** library for - [gd](https://www.php.net/manual/en/image.installation.php). - -### (Optional) Other recommendations - -- Redis for better cache performances. -- CDN for static files caching and better performances. -- e-mail gateway for lost passwords. - -## Install instructions - -### Pre-requisites - -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 haven’t 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): - - ```bash - * * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1 - ``` - - **Note** - If you do not add this cron task, the following Castopod features - will not work: - - - Importing a podcast from an existing RSS feed - - Broadcasting social activities to your followers in the fediverse - - Broadcasting episodes to open hubs using - [WebSub](https://en.wikipedia.org/wiki/WebSub) - - Generating video clips - - [requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips) - -### (recommended) Install Wizard - -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! - -::: info Note - -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. - -::: - -### Using CLI - -1. Create a `.env` file in the package root based on the `.env.example` file. -2. Initialize the database using: - - ```sh - php spark install:init-database - ``` - -3. Create the superadmin user using: - - ```sh - php spark install:create-superadmin - ``` - -4. Head on to your admin gateway to start podcasting! - -### Email/SMTP setup - -Email configuration is required for some features to work properly (eg. -retrieving your forgotten password, sending instructions to premium subscribers, -…) - -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" -``` - -#### Email config options - -| 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"` | - -### Media storage - -By default, files are saved to the `public/media` folder using the file system. -If you need to relocate the `media` folder to a different location, you can -specify it in your `.env` file as shown below: - -```ini -# […] - -media.root="media" -media.storage="/mnt/storage" -``` - -In this example, the files will be saved to the /mnt/storage/media folder. Make -sure to also update your web server configuration to reflect this change. - -### S3 - -If you prefer storing your media files on an S3 compatible storage, you may -specify it in your `.env`: - -```ini -# […] - -media.fileManager="s3" -media.s3.endpoint="your_s3_host" -media.s3.key="your_s3_key" -media.s3.secret="your_s3_secret" -media.s3.region="your_s3_region" -``` - -#### S3 config options - -| Variable name | Type | Default | -| ----------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`pathStyleEndpoint`** | boolean | `false` | -| **`keyPrefix`** | string | `undefined` | - -## Community packages - -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. - -### Install with 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. - -
- - - Install Castopod with YunoHost - - -Github -Repo - -
diff --git a/docs/src/ko/getting-started/security.md b/docs/src/ko/getting-started/security.md deleted file mode 100644 index e205698d..00000000 --- a/docs/src/ko/getting-started/security.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: Security ---- - -# Security concerns - -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). - -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): - -- `writable/` folder must be **readable** and **writable**. -- `public/media/` folder must be **readable** and **writable**. -- any other file must be set to **readonly**. - -For instance, if you are using Apache or NGINX with Ubuntu you may do the -following: - -```bash -sudo chown -R root:root /path/to/castopod -sudo chown -R www-data:www-data /path/to/castopod/writable -sudo chown -R www-data:www-data /path/to/castopod/public/media -``` diff --git a/docs/src/ko/getting-started/update.md b/docs/src/ko/getting-started/update.md deleted file mode 100644 index 98e019fb..00000000 --- a/docs/src/ko/getting-started/update.md +++ /dev/null @@ -1,109 +0,0 @@ ---- -title: Update -sidebarDepth: 3 ---- - -# How to update 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 ⚡. - -## Update instructions - -0. ⚠️ Before any update, we highly recommend you backup your Castopod files and - database. - - - cf. - [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 - - - cf. - [Where can I find my 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 - - - ⚠️ 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/) - -3. On your server: - - - Remove all files except `.env` and `public/media` - - Copy the new files from the downloaded package into your server - - ::: info Note - - You may need to reset files permissions as during the install process. - Check [Security Concerns](./security.md). - - ::: - -4. Update your database schema from your `Castopod Admin` > `About` page or by - running: - - ```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! - -::: info Note - -Releases may come with additional update instructions (see -[releases page](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) - -::: - -## Fully Automated updates - -> Coming soon... 👀 - -## Frequently asked questions (FAQ) - -### Where can I find my Castopod version? - -Go to your Castopod admin panel, the version is displayed on the bottom left -corner. - -Alternatively, you can find the version in the `app > Config > Constants.php` -file. - -### I haven't updated my instance in a long time… What should I do? - -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. - -> You may want to backup your instance depending on how long you haven't updated -> Castopod. - -For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to -`v1.0.0-beta.1`: - -0. (highly recommended) Make a backup of your files and database. - -1. Download the latest release, overwrite your files whilst keeping `.env` and - `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`, - `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`. - -3. ✨ Enjoy your fresh instance, you're all done! - -### Should I make a backup before updating? - -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… diff --git a/docs/src/ko/index.md b/docs/src/ko/index.md deleted file mode 100644 index 7f012c6c..00000000 --- a/docs/src/ko/index.md +++ /dev/null @@ -1,300 +0,0 @@ ---- -sidebarDepth: 2 ---- - -# Welcome 👋 - -[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] - -Castopod is a free & open-source hosting platform made for podcasters who want -engage and interact with their audience. - -Castopod is easy to install and was built on top of -[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very -small footprint. - -
- Install -
- -## Features - -- 🌱  Free & open-source (AGPL v3 License) -- 🔐  Focused on data sovereignty: your content, audience, and analytics - belong to you, and you only -- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, - chapters, location, persons, soundbites, … -- 💬  Built-in social network: - - 🚀  Castopod is part of the Fediverse, a decentralized social network - - ❤️  Create posts, share, favourite, and comment on episodes -- 📈  Built-in analytics: - - ⚖️  GDPR / CCPA / LGPD compliant - - 🪙  Standard IABv2 audience measurement - - 🏡  On-premises analytics, no third party involved -- 📢  Built-in marketing tools: - - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) - - 📱  PWA: install as a standalone app - - 🎨  Customizable theme colors - - 🎬  Generate ready-to-share Video clips from episodes - - 🔉  Generate soundbites - - ▶️  Embeddable player, embed your episodes on any website -- 💸  Monetization: - - 🔗  Funding links - - 📲  listen-to-click ads - - 🤝  value4value / WebMonetization - - 💎  Premium podcasts -- 📡  Publish your episodes everywhere with RSS: - - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, - Google Podcasts, Deezer, Podcast Addict, Podfriend, … - - ⚡  Broadcast your episodes instantly with WebSub -- 📥  Podcast import: move your existing podcast into Castopod -- 📤  Move your podcast out of Castopod -- 🔀  Multi-tenant: host as many podcasts as you want -- 👥  Multi-user: add contributors and set roles -- 🌎  i18n support: translated in English, French, Polish, German, - Brazilian Portuguese & Spanish… with - [more to come](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. - -It is in fact one of the only media to have stayed this way for a long time. - -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. - -With podcasting becoming more widely used, some companies are trying to shift it -towards a more controlled and centralized 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. - -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. - -## Comparison with other solutions - -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 you. - -### 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 it. - -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. - -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. - -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 journey. - -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. - -Finally, depending on your needs, Wordpress and Castopod can even live side by -side as they share the same requirements! - -### 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 was initially built around music. And later on, as the project -evolved, the ability to host podcasts was introduced. - -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, …). - -So, you should probably use Funkwhale if you want to host your music, and use -Castopod if you want to host your podcasts. - -### Castopod vs other podcast hosts - -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! - -Each of these solutions differ from one another, you may compare with the -[list of features](#features). - -That being said, there are two main differences with other podcasting solutions: - -- 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 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. - -## Contributing - -Love Castopod and would like to help? Take a look at the following documentation -to get you started. - -### Code of conduct - -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 tolerated. - -### Contributing 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. - -## Contributors ✨ - -Thanks goes to these wonderful people -([emoji key](https://allcontributors.org/docs/en/emoji-key)): - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Ewen
Ewen

🌍 🤔 💻
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
KrzysztofDomanczyk
KrzysztofDomanczyk

💻
Guy Martin
Guy Martin

🐛 💻
- - - - - - -This project follows the -[all-contributors](https://github.com/all-contributors/all-contributors) -specification. Contributions of any kind welcome! - -## Contact - -You may reach us for help or ask any question you have on: - -- [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) - -Alternatively, you can follow us on social media platforms to get news about -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 - -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). - -
- Ad Aures Logo - NLnet Logo -
- -## License - -[GNU Affero General Public License v3.0](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 - -[release]: https://code.castopod.org/adaures/castopod/-/releases -[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md -[contributions]: https://code.castopod.org/adaures/castopod/-/issues -[semantic-release]: https://github.com/semantic-release/semantic-release -[discord]: https://castopod.org/discord -[stars]: https://github.com/ad-aures/castopod/stargazers -[crowdin]: https://translate.castopod.org/project/castopod diff --git a/docs/src/nl/getting-started/_category_.json b/docs/src/nl/getting-started/_category_.json deleted file mode 100644 index 877a378f..00000000 --- a/docs/src/nl/getting-started/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Getting Started", - "position": 2 -} diff --git a/docs/src/nl/getting-started/auth.md b/docs/src/nl/getting-started/auth.md deleted file mode 100644 index 01b2a298..00000000 --- a/docs/src/nl/getting-started/auth.md +++ /dev/null @@ -1,88 +0,0 @@ ---- -title: Authentication & Authorization -sidebarDepth: 3 ---- - -# Authenticatie & Autorisatie - -Castopod gebruikt voor de authenticatie en autorisatie `codeigniter/schild` met -een aantal aangepaste regels. Rollen en permissies zijn gedefinieerd op twee -niveaus: - -1. [globaal: serverbreed](#1-instance-wide-roles-and-permissions) -2. [per podcast](#2-per-podcast-roles-and-permissions) - -## 1. Globale rollen en rechten - -### Globale rollen - - - -| rol | omschrijving | rechten | -| ----------- | ------------------------------------------ | ------------------------------------------------------------------------------------------ | -| Super admin | Heeft de volledige controle over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Beheerder | Beheert de inhoud van Castopod. | podcasts.create, podcasts.import, persons.manage, pages.manage | -| Podcaster | Algemene gebruikers van Castopod. | admin.access | - - - -### Globale rechten - - - -| recht | omschrijving | -| ----------------------- | -------------------------------------------------------------------- | -| admin.access | Kan toegang krijgen tot de beheeromgeving van Castopod. | -| admin.settings | Kan toegang krijgen tot de instellingen van Castopod. | -| users.manage | Kan Castopod-gebruikers beheren. | -| persons.manage | Kan personen beheren. | -| pages.manage | Kan pagina's beheren. | -| podcasts.view | Kan alle podcasts bekijken. | -| podcasts.create | Kan nieuwe podcast aanmaken. | -| podcasts.import | Kan podcasts importeren. | -| fediverse.manage-blocks | Kan fediverse actors/domains blokkeren voor interactie met Castopod. | - - - -## 2. Per podcast rollen en permissies - -### Per podcast rollen - - - -| rol | omschrijving | rechten | -| --------- | ------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Beheerder | Heeft de volledige controle over podcast #{id}. | \* | -| Editor | Beheert inhoud en publicaties van podcast #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| Auteur | Beheert de inhoud van podcast #{id} maar kan deze niet publiceren. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Gast | Algemene bijdrager van podcast #{id}. | view, episodes.view | - - - -### Per aflevering rollen - - - -| recht | omschrijving | -| ---------------------------- | -------------------------------------------------------------------------------------- | -| weergeven | Kan dashboard en statistieken van podcast #{id} zien. | -| bewerken | Kan podcast #{id} wijzigen. | -| verwijderen | Kan podcast #{id} verwijderen. | -| manage-import | Kan de geïmporteerde podcast #{id} synchroniseren. | -| manage-persons | Kan personen van podcast #{id} beheren. | -| manage-subscriptions | Kan abonnees van podcast #{id} beheren. | -| manage-contributors | Kan bijdragers van podcast #{id} beheren. | -| manage-platforms | Kan platform links van podcast #{id} instellen of verwijderen. | -| manage-publications | Kan podcast #{id} publiceren. | -| manage-notifications | Kan meldingen voor podcast #{id} bekijken en als gelezen markeren. | -| interact-as | Kan als podcast #{id} handelen om te favorieten, te delen of te reageren op berichten. | -| episodes.view | Kan dashboard en statistieken van podcast #{id} zien. | -| episodes.create | Kan afleveringen voor podcast #{id} aanmaken. | -| episodes.edit | Kan afleveringen van podcast #{id} wijzigen. | -| episodes.delete | Kan afleveringen van podcast #{id} verwijderen. | -| episodes.manage-persons | Kan personen in aflevering van podcast #{id} beheren. | -| episodes.manage-clips | Kan videoclips of soundbites van podcast #{id} beheren. | -| episodes.manage-publications | Kan afleveringen van podcast #{id} publiceren. | -| episodes.manage-comments | Kan reacties op afleveringen van podcast #{id} maken of verwijderen. | - - diff --git a/docs/src/nl/getting-started/security.md b/docs/src/nl/getting-started/security.md deleted file mode 100644 index e99a3aea..00000000 --- a/docs/src/nl/getting-started/security.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: Beveiliging ---- - -# Veiligheidszorgen - -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). - -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): - -- `writable/` folder must be **readable** and **writable**. -- `public/media/` folder must be **readable** and **writable**. -- any other file must be set to **readonly**. - -For instance, if you are using Apache or NGINX with Ubuntu you may do the -following: - -```bash -sudo chown -R root:root /path/to/castopod -sudo chown -R www-data:www-data /path/to/castopod/writable -sudo chown -R www-data:www-data /path/to/castopod/public/media -``` diff --git a/docs/src/nl/index.md b/docs/src/nl/index.md deleted file mode 100644 index ee8c0132..00000000 --- a/docs/src/nl/index.md +++ /dev/null @@ -1,300 +0,0 @@ ---- -sidebarDepth: 2 ---- - -# Welkom 👋 - -[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] - -Castopod is a free & open-source hosting platform made for podcasters who want -engage and interact with their audience. - -Castopod is easy to install and was built on top of -[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very -small footprint. - - - -## Functies - -- 🌱  Gratis & open-source (AGPL v3 Licentie) -- 🔐  Focused on data sovereignty: your content, audience, and analytics - belong to you, and you only -- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, - chapters, location, persons, soundbites, … -- 💬  Ingebouwd sociaal netwerk: - - 🚀  Castopod is part of the Fediverse, a decentralized social network - - ❤️  Create posts, share, favourite, and comment on episodes -- 📈  Built-in analytics: - - ⚖️  GDPR / CCPA / LGPD compliant - - 🪙  Standard IABv2 audience measurement - - 🏡  On-premises analytics, no third party involved -- 📢  Ingebouwde marketingtools: - - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) - - 📱  PWA: install as a standalone app - - 🎨  Customizable theme colors - - 🎬  Generate ready-to-share Video clips from episodes - - 🔉  Generate soundbites - - ▶️  Embeddable player, embed your episodes on any website -- 💸  Monetization: - - 🔗  Funding links - - 📲  listen-to-click ads - - 🤝  value4value / WebMonetization - - 💎  Premium podcasts -- 📡  Publish your episodes everywhere with RSS: - - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, - Google Podcasts, Deezer, Podcast Addict, Podfriend, … - - ⚡  Broadcast your episodes instantly with WebSub -- 📥  Podcast import: move your existing podcast into Castopod -- 📤  Move your podcast out of Castopod -- 🔀  Multi-tenant: host as many podcasts as you want -- 👥  Multi-user: add contributors and set roles -- 🌎  i18n support: translated in English, French, Polish, German, - Brazilian Portuguese & Spanish… with - [more to come](https://translate.castopod.org)! - -## Motivatie - -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. - -It is in fact one of the only media to have stayed this way for a long time. - -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. - -With podcasting becoming more widely used, some companies are trying to shift it -towards a more controlled and centralized 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. - -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. - -## Comparison with other solutions - -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 you. - -### Castopod vs Wordpress - -Castopod is often referred to as "the Wordpress for podcasts" because of the -similarities between the two. In sommige opzichten is dat waar. And actually, -Castopod was greatly inspired by the Wordpress ecosystem, seeing the ease of -adoption from the community and the number of websites running it. - -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. - -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. - -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 journey. - -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. - -Finally, depending on your needs, Wordpress and Castopod can even live side by -side as they share the same requirements! - -### 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 was initially built around music. And later on, as the project -evolved, the ability to host podcasts was introduced. - -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, …). - -So, you should probably use Funkwhale if you want to host your music, and use -Castopod if you want to host your podcasts. - -### Castopod vs other podcast hosts - -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! - -Each of these solutions differ from one another, you may compare with the -[list of features](#features). - -That being said, there are two main differences with other podcasting solutions: - -- 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 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. - -## Bijdragen - -Houdt u van Castopod en wilt u u helpen? Take a look at the following -documentation to get you started. - -### Gedragscode - -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 tolerated. - -### Contributing 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. - -## Bijdragers ✨ - -Bedankt aan deze geweldige mensen -([emoji sleutel](https://allcontributors.org/docs/en/emoji-key)): - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Ewen
Ewen

🌍 🤔 💻
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
KrzysztofDomanczyk
KrzysztofDomanczyk

💻
Guy Martin
Guy Martin

🐛 💻
- - - - - - -This project follows the -[all-contributors](https://github.com/all-contributors/all-contributors) -specification. Bijdragen van elke vorm zijn welkom! - -## Contact - -You may reach us for help or ask any question you have on: - -- [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) - -Alternatively, you can follow us on social media platforms to get news about -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) - -## Sponsoren - -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). - -
- Ad Aures Logo - NLnet Logo -
- -## License - -[GNU Affero General Public License v3.0](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 - -[release]: https://code.castopod.org/adaures/castopod/-/releases -[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md -[contributions]: https://code.castopod.org/adaures/castopod/-/issues -[semantic-release]: https://github.com/semantic-release/semantic-release -[discord]: https://castopod.org/discord -[stars]: https://github.com/ad-aures/castopod/stargazers -[crowdin]: https://translate.castopod.org/project/castopod diff --git a/docs/src/nn-NO/getting-started/_category_.json b/docs/src/nn-NO/getting-started/_category_.json deleted file mode 100644 index 877a378f..00000000 --- a/docs/src/nn-NO/getting-started/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Getting Started", - "position": 2 -} diff --git a/docs/src/nn-NO/index.md b/docs/src/nn-NO/index.md deleted file mode 100644 index 9fce23bb..00000000 --- a/docs/src/nn-NO/index.md +++ /dev/null @@ -1,304 +0,0 @@ ---- -sidebarDepth: 2 ---- - -# Velkomen 👋 - -[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] - -Castopod er ei open og gratis løysing for dei som vil køyra si eiga -podkasting-plattform, og for podkastarar som vil engasjera og samhandla med -publikum. - -Castopod er lett å installera og er bygd på -[CodeIgniter4](https://codeigniter.com/), eit kraftig PHP-rammeverk med små -systemkrav. - - - -## Funksjonar - -- 🌱  Fri og open (AGPL v3-lisens) -- 🔐  Legg vekt på at du eig dine eigne data: innhaldet, publikum og - analysedata høyrer deg til, og berre deg -- 🪄  Podkasting 2.0-funksjonar: GUID, låsing, transkripsjonar, - finansiering, kapittel, plassering, personar, lydbetar, … -- 💬  Innebygd sosialt nettverk: - - 🚀  Castopod er ein del av fødiverset, som er eit desentralisert - sosialt nettverk - - ❤️  Skriv innlegg, del dei, favorittmerk dei, og kommenter episodane -- 📈  Innebygde analyseverkty: - - ⚖️  Fylgjer GDPR / CCPA / LGPD - - 🪙  Standard IABv2-publikumsmåling - - 🏡  Eigen analyse, heilt utan utanforståande tredjepartar -- 📢  Innebygd marknadsføring: - - ✅  Søkjemotorvenleg (open-graph meta-knaggar, JSON-LD, …) - - 📱  PWA: installer som frittståande app - - 🎨  Bruk eigne fargar - - 🎬  Lag og del filmklypp frå episodane - - 🔉  Lag lydbetar - - ▶️  Innbyggbar spelar, så du kan spela episodane dine på ein kvar - nettstad -- 💸  Ten pengar: - - 🔗  Donasjonslenker - - 📲  lytt-for-å-klikka-annonsar - - 🤝  value4value / WebMonetization - - 💎  Betalte podkastar -- 📡  Kringkast episodane dine kvar som helst med RSS: - - 📱  På alle indeksar og appar: Podcast Index, Apple Podcasts, Spotify, - Google Podcasts, Deezer, Podcast Addict, Podfriend, … - - ⚡  Kringkast episodane dine straks med WebSub -- 📥  Podkastimport: Flytt podkasten din til Castopod -- 📤  Flytt podkasten din bort frå Castopod -- 🔀  For fleire: Ver vertskap for så mange podkastar du vil -- 👥  Fleirbrukar: legg til bidragsytarar og lag roller for dei -- 🌎  i18n-støtte: Omsett til nynorsk, engelsk, fransk, polsk, tysk, - brasiliansk portugisisk & spansk… med - [fleire språk på veg](https://translate.castopod.org)! - -## Kvifor Castopod? - -Podkasting-økosystemet er desentralt av natur: Du kan laga podkasten din som ei -RSS-fil, leggja han ut på nettet, og få delt han overalt. - -Det er faktisk det einaste mediet som har vore slik i lang tid. - -Ettersom bruken av podkastar utviklar seg, er det fleire som startar med -podkasting; anten det er produsentar som leitar etter nye måtar å dela ideane -sine på, eller det er lyttarar som leitar etter betre podkastar å høyra på. - -Når podkasting no har vorte meir populært, er det fleire firma som prøver å -gjera det til eit kontrollert og sentralisert medium. - -Castopod vart laga som ein freistnad på å gje eit ope og framhaldande alternativ -til å leggja ut podkastane dine, med vekt på desentralisering slik at -podkastarar kan uttrykkja seg utan å binda seg til ei bestemt løysing. - -Prosjektet er støtta av brukarmiljøa bak open kjeldekode, særleg -[Allheimen](https://tanketom.no/teknologi/mastodon-og-the-fediverse) og -[Podcasting 2.0](https://podcastindex.org/)-rørslene. - -## Samanlikning med andre løysingar - -Me trur at ingen løysingar er perfekt for alle, det kjem an på kva du treng. -Difor får du her samanlikningar med andre verktøy, slik at du kan finna ut om -Castopod passar for deg. - -### Castopod og Wordpress - -Castopod blir ofte kalla "Wordpress for podkastar" fordi det er ein del -likskapar mellm dei to. Det er delvis sant. Faktum er at Castopod har henta -mykje inspirasjon frå Wordpress-økosystemet. Me såg kor lett Wordpress var å ta -i bruk, og kor mange nettstader og nettsamfunn som bruker det. - -Til liks med Wordpress er Castopod gratis og open programvare, laga med PHP og -ein MySQL-database, og pakka saman på ein slik måte at du lett kan installera -det på dei fleste vevtentarar. - -Worpress er ein flott måte å laga din eigen nettstad på, samt utvida han med -tillegg slik at han gjer det du ynskjer. Det er eit komplett -innhaldsstyringssystem for å laga kva som helst type nettstad. - -Castopod er derimot meint som ei løysing for dei som lagar podkastar, og legg -difor vekt på podkasting og ingenting anna. Du treng ingen programtillegg for å -starta på den vedunderlege podkastreisa di. - -På denne måten kan me laga program som passar spesielt til podkasting, alt frå å -laga podkastar til å publisera nye episodar til å kringkasta, marknadsføra og -analysera dei. - -Til slutt: Wordpress og Castopod kan leva side om side på nettstaden din om du -treng det, sidan dei har same systemkrava! - -### Castopod og Funkwhale - -Funkwhale er ein musikktenar du kan køyra sjølv på din eigen vevtenar. Akkurat -som Castopod er Funkwhale ein del av allheimen, som er eit sosialt nettverk -spreidd over mange nettstader som kan samhandla med kvarandre. - -Funkwhale vart fyrst laga for musikk. Seinare, etter kvart som prosjektet -utvikla seg, vart det mogleg å leggja ut podkastar òg. - -Til skilnad frå Funkwhale er Castopod utforma og utvikla berre for podkastar. -Det tyder at det er lettare å ta i bruk funksjonar tilknytt podkast-økosystemet, -slik som podkasting 2.0-funksjonar (transkripsjonar, kapittel, plasseringar, -personmerking …). - -Det tyder at du truleg bør bruka Funkwhale om du vil ha ein stad til musikken -din, og Castopod dersom du vil ha ein stad til podkastane dine. - -### Castopod og andre podkastvertar - -Det er mange løysingar for deg som vil ha ein eigen nettstad til podkastar. -Nokre av dei er verkeleg flotte, og -[mange av dei](https://podcastindex.org/apps) hoppar på podkastin 2.0-toget, -nett som Castopod! - -Kvar av desse løysingane er ulike, og du kan -[samanlikna kva funksjonar dei har](#features). - -Når det er sagt, er det to hovudskilnader mellom Castopod og andre -podkastløysingar: - -- Du kan køyra Castopod på di eiga tenarmaskin, og det er den einaste løysinga - som gjev deg full kontroll over det du lagar. Og fordi Castopod er open - kjeldekode, kan du endra løysinga slik du treng. - -- Castopod er den einaste løysinga no som både koplar til eit desentralt sosialt - nettverk med Activitypub og som har mange av podkasting 2.0-løysingane. Me tek - sikte på å kopla dei to tettare saman. - -## Bidra til Castopod - -Likar du Castopod og kunne tenkja deg å hjelpa til? Les denne dokumentasjonen -for å koma i gang. - -### Ordensreglar - -Castopod har laga retningsliner for åtferd som me ventar at prosjektdeltakarar -held seg til. Les gjerne -[CODE_OF_CONDUCT-retninglinene](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md) -så du veit kva slags åtferd me godtek og ikkje. - -### Korleis bidra - -Les gjerne [korleis du bidreg](../contributing/guidelines.md) for å læra korleis -me utviklar Castopod, korleis me føreslær rettingar og forbetringar, og korleis -me byggjer og prøver ut endringar i programmet. - -## Bidragsytarar ✨ - -Mange takk til dei flotte folka på -([emoji key](https://allcontributors.org/docs/en/emoji-key)): - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Ewen
Ewen

🌍 🤔 💻
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
KrzysztofDomanczyk
KrzysztofDomanczyk

💻
Guy Martin
Guy Martin

🐛 💻
- - - - - - -Dette prosjektet fylgjer -[all-contributors](https://github.com/all-contributors/all-contributors)-spesifikasjonen. -Me er glade for alle slags bidrag! - -## Kontakt - -Du kan spørja om hjelp eller kva som helst andre spørsmål på: - -- [Discord](https://castopod.org/discord) (for å prata direkte med utviklarane - og brukarmiljøet) -- [Feilmeldinga](https://code.castopod.org/adaures/castopod/-/issues) (for å - føreslå nye funksjonar og melda feil) - -Alternativt kan du fylgja oss på sosiale media for å få nytt om Castopod: - -- [podlibre.social](https://podlibre.social/@Castopod) (Mastodon-nettstad) -- [Twitter](https://twitter.com/castopod) -- [LinkedIn](https://linkedin.com/company/castopod) -- [Facebook](https://www.facebook.com/castopod) - -## Sponsorar - -Utviklinga av Castopod er mogleg på grunn av bidrag frå sponsorar og -bidragsytarar. Viss du vil hjelpa til, bed me deg vurdera å -[sponsa utviklinga av Castopod](https://opencollective.com/castopod/contribute). - -
- Ad Aures Logo - NLnet Logo -
- -## Lisens - -[GNU Affero General Public-lisensen v3.0](https://choosealicense.com/licenses/agpl-3.0/) - -Copyright © 2020-d.d., [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 - -[release]: https://code.castopod.org/adaures/castopod/-/releases -[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md -[contributions]: https://code.castopod.org/adaures/castopod/-/issues -[semantic-release]: https://github.com/semantic-release/semantic-release -[discord]: https://castopod.org/discord -[stars]: https://github.com/ad-aures/castopod/stargazers -[crowdin]: https://translate.castopod.org/project/castopod diff --git a/docs/src/oc/getting-started/_category_.json b/docs/src/oc/getting-started/_category_.json deleted file mode 100644 index 877a378f..00000000 --- a/docs/src/oc/getting-started/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Getting Started", - "position": 2 -} diff --git a/docs/src/oc/getting-started/auth.md b/docs/src/oc/getting-started/auth.md deleted file mode 100644 index ff5d59c0..00000000 --- a/docs/src/oc/getting-started/auth.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -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 - - - -| 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 | - - - -### Instance permissions - - - -| 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. | - - - -## 2. Per podcast roles and permissions - -### Per podcast roles - - - -| 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, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| 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 | - - - -### Per podcast permissions - - - -| 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}. | - - diff --git a/docs/src/oc/getting-started/docker.md b/docs/src/oc/getting-started/docker.md deleted file mode 100644 index 12f01619..00000000 --- a/docs/src/oc/getting-started/docker.md +++ /dev/null @@ -1,160 +0,0 @@ ---- -title: Official Docker images -sidebarDepth: 3 ---- - -# Official Docker images - -Castopod pushes 3 Docker images to the Docker Hub during its automated build -process: - -- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all - in one castopod image using nginx unit -- [**`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 - -Additionally, Castopod requires a MySQL-compatible database. A Redis database -can be added as a cache handler. - -## Supported tags - -- `develop` [unstable], latest development branch build -- `beta` [stable], latest beta version build -- `latest` [stable], latest version build -- `1.x.x` [stable], specific version build (since `1.0.0`) - -## Example usage - -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: - - ```yml - version: "3.7" - - services: - app: - image: castopod/castopod:latest - container_name: "castopod-app" - volumes: - - castopod-media:/var/www/castopod/public/media - environment: - MYSQL_DATABASE: castopod - MYSQL_USER: castopod - MYSQL_PASSWORD: changeme - CP_BASEURL: "https://castopod.example.com" - CP_ANALYTICS_SALT: changeme - CP_CACHE_HANDLER: redis - CP_REDIS_HOST: redis - CP_REDIS_PASSWORD: changeme - networks: - - castopod-app - - castopod-db - ports: - - 8000:8000 - restart: unless-stopped - - mariadb: - image: mariadb:10.5 - container_name: "castopod-mariadb" - networks: - - castopod-db - volumes: - - castopod-db:/var/lib/mysql - environment: - MYSQL_ROOT_PASSWORD: changeme - MYSQL_DATABASE: castopod - MYSQL_USER: castopod - MYSQL_PASSWORD: changeme - restart: unless-stopped - - redis: - image: redis:7.0-alpine - container_name: "castopod-redis" - command: --requirepass changeme - volumes: - - castopod-cache:/data - networks: - - castopod-app - - volumes: - castopod-media: - castopod-db: - castopod-cache: - - networks: - castopod-app: - castopod-db: - ``` - - You have to adapt some variables to your needs (e.g. `CP_BASEURL`, - `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). - -3. Setup a reverse proxy for 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/): - - ``` - #castopod - castopod.example.com { - reverse_proxy localhost:8000 - } - ``` - -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! - -5. You're all set, start podcasting! 🎙️🚀 - -## Environment Variables - -- **castopod/castopod** and **castopod/app** - - | Variable name | Type (`default`) | Default | - | ------------------------------------- | ----------------------- | ---------------- | - | **`CP_BASEURL`** | string | `undefined` | - | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | - | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | - | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | - | **`CP_ANALYTICS_SALT`** | string | `undefined` | - | **`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_REDIS_HOST`** | ?string | `"localhost"` | - | **`CP_REDIS_PASSWORD`** | ?string | `null` | - | **`CP_REDIS_PORT`** | ?number | `6379` | - | **`CP_REDIS_DATABASE`** | ?number | `0` | - | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | - | **`CP_EMAIL_FROM`** | ?string | `undefined` | - | **`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_ENABLE_2FA`** | ?boolean | `undefined` | - | **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` | - | **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` | - | **`CP_MEDIA_S3_KEY`** | ?string | `undefined` | - | **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` | - | **`CP_MEDIA_S3_REGION`** | ?string | `undefined` | - | **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` | - | **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` | - | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` | - | **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` | - | **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` | - | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | - | **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` | - | **`CP_TIMEOUT`** | ?number | `900` | - -- **castopod/web-server** - - | Variable name | Type | Default | - | ---------------------- | --------------------- | ------- | - | **`CP_APP_HOSTNAME`** | ?string | `"app"` | - | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | - | **`CP_TIMEOUT`** | ?number | `900` | diff --git a/docs/src/oc/getting-started/install.md b/docs/src/oc/getting-started/install.md deleted file mode 100644 index cdea18ec..00000000 --- a/docs/src/oc/getting-started/install.md +++ /dev/null @@ -1,238 +0,0 @@ ---- -title: Installation -sidebarDepth: 3 ---- - -# How to install 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. - -::: tip Note - -We've released official Docker images for Castopod! - -If you prefer using Docker, you may skip this and go straight to the -[docker documentation](./docker.md) for Castopod. - -::: - -## Requirements - -- PHP v8.1 or higher -- MySQL version 5.7 or higher or MariaDB version 10.2 or higher -- HTTPS support -- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's - incoming requests - -### PHP v8.1 or higher - -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. -- [exif](https://www.php.net/manual/en/exif.installation.php) - -Additionally, make sure that the following extensions are enabled in your PHP: - -- json (enabled by default - don't turn it off) -- xml (enabled by default - don't turn it off) -- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php) - -### MySQL compatible database - -> We recommend using [MariaDB](https://mariadb.org). - -::: warning Warning - -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. - -::: - -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. - -#### Privileges - -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`. - -### (Optional) FFmpeg v4.1.8 or higher for Video Clips - -[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: - -- **FreeType 2** library for - [gd](https://www.php.net/manual/en/image.installation.php). - -### (Optional) Other recommendations - -- Redis for better cache performances. -- CDN for static files caching and better performances. -- e-mail gateway for lost passwords. - -## Install instructions - -### Pre-requisites - -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 haven’t 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): - - ```bash - * * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1 - ``` - - **Note** - If you do not add this cron task, the following Castopod features - will not work: - - - Importing a podcast from an existing RSS feed - - Broadcasting social activities to your followers in the fediverse - - Broadcasting episodes to open hubs using - [WebSub](https://en.wikipedia.org/wiki/WebSub) - - Generating video clips - - [requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips) - -### (recommended) Install Wizard - -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! - -::: info Note - -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. - -::: - -### Using CLI - -1. Create a `.env` file in the package root based on the `.env.example` file. -2. Initialize the database using: - - ```sh - php spark install:init-database - ``` - -3. Create the superadmin user using: - - ```sh - php spark install:create-superadmin - ``` - -4. Head on to your admin gateway to start podcasting! - -### Email/SMTP setup - -Email configuration is required for some features to work properly (eg. -retrieving your forgotten password, sending instructions to premium subscribers, -…) - -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" -``` - -#### Email config options - -| 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"` | - -### Media storage - -By default, files are saved to the `public/media` folder using the file system. -If you need to relocate the `media` folder to a different location, you can -specify it in your `.env` file as shown below: - -```ini -# […] - -media.root="media" -media.storage="/mnt/storage" -``` - -In this example, the files will be saved to the /mnt/storage/media folder. Make -sure to also update your web server configuration to reflect this change. - -### S3 - -If you prefer storing your media files on an S3 compatible storage, you may -specify it in your `.env`: - -```ini -# […] - -media.fileManager="s3" -media.s3.endpoint="your_s3_host" -media.s3.key="your_s3_key" -media.s3.secret="your_s3_secret" -media.s3.region="your_s3_region" -``` - -#### S3 config options - -| Variable name | Type | Default | -| ----------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`pathStyleEndpoint`** | boolean | `false` | -| **`keyPrefix`** | string | `undefined` | - -## Community packages - -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. - -### Install with 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. - -
- - - Install Castopod with YunoHost - - -Github -Repo - -
diff --git a/docs/src/oc/getting-started/security.md b/docs/src/oc/getting-started/security.md deleted file mode 100644 index e205698d..00000000 --- a/docs/src/oc/getting-started/security.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: Security ---- - -# Security concerns - -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). - -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): - -- `writable/` folder must be **readable** and **writable**. -- `public/media/` folder must be **readable** and **writable**. -- any other file must be set to **readonly**. - -For instance, if you are using Apache or NGINX with Ubuntu you may do the -following: - -```bash -sudo chown -R root:root /path/to/castopod -sudo chown -R www-data:www-data /path/to/castopod/writable -sudo chown -R www-data:www-data /path/to/castopod/public/media -``` diff --git a/docs/src/oc/getting-started/update.md b/docs/src/oc/getting-started/update.md deleted file mode 100644 index 98e019fb..00000000 --- a/docs/src/oc/getting-started/update.md +++ /dev/null @@ -1,109 +0,0 @@ ---- -title: Update -sidebarDepth: 3 ---- - -# How to update 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 ⚡. - -## Update instructions - -0. ⚠️ Before any update, we highly recommend you backup your Castopod files and - database. - - - cf. - [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 - - - cf. - [Where can I find my 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 - - - ⚠️ 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/) - -3. On your server: - - - Remove all files except `.env` and `public/media` - - Copy the new files from the downloaded package into your server - - ::: info Note - - You may need to reset files permissions as during the install process. - Check [Security Concerns](./security.md). - - ::: - -4. Update your database schema from your `Castopod Admin` > `About` page or by - running: - - ```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! - -::: info Note - -Releases may come with additional update instructions (see -[releases page](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) - -::: - -## Fully Automated updates - -> Coming soon... 👀 - -## Frequently asked questions (FAQ) - -### Where can I find my Castopod version? - -Go to your Castopod admin panel, the version is displayed on the bottom left -corner. - -Alternatively, you can find the version in the `app > Config > Constants.php` -file. - -### I haven't updated my instance in a long time… What should I do? - -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. - -> You may want to backup your instance depending on how long you haven't updated -> Castopod. - -For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to -`v1.0.0-beta.1`: - -0. (highly recommended) Make a backup of your files and database. - -1. Download the latest release, overwrite your files whilst keeping `.env` and - `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`, - `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`. - -3. ✨ Enjoy your fresh instance, you're all done! - -### Should I make a backup before updating? - -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… diff --git a/docs/src/oc/index.md b/docs/src/oc/index.md deleted file mode 100644 index 7f012c6c..00000000 --- a/docs/src/oc/index.md +++ /dev/null @@ -1,300 +0,0 @@ ---- -sidebarDepth: 2 ---- - -# Welcome 👋 - -[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] - -Castopod is a free & open-source hosting platform made for podcasters who want -engage and interact with their audience. - -Castopod is easy to install and was built on top of -[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very -small footprint. - -
- Install -
- -## Features - -- 🌱  Free & open-source (AGPL v3 License) -- 🔐  Focused on data sovereignty: your content, audience, and analytics - belong to you, and you only -- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, - chapters, location, persons, soundbites, … -- 💬  Built-in social network: - - 🚀  Castopod is part of the Fediverse, a decentralized social network - - ❤️  Create posts, share, favourite, and comment on episodes -- 📈  Built-in analytics: - - ⚖️  GDPR / CCPA / LGPD compliant - - 🪙  Standard IABv2 audience measurement - - 🏡  On-premises analytics, no third party involved -- 📢  Built-in marketing tools: - - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) - - 📱  PWA: install as a standalone app - - 🎨  Customizable theme colors - - 🎬  Generate ready-to-share Video clips from episodes - - 🔉  Generate soundbites - - ▶️  Embeddable player, embed your episodes on any website -- 💸  Monetization: - - 🔗  Funding links - - 📲  listen-to-click ads - - 🤝  value4value / WebMonetization - - 💎  Premium podcasts -- 📡  Publish your episodes everywhere with RSS: - - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, - Google Podcasts, Deezer, Podcast Addict, Podfriend, … - - ⚡  Broadcast your episodes instantly with WebSub -- 📥  Podcast import: move your existing podcast into Castopod -- 📤  Move your podcast out of Castopod -- 🔀  Multi-tenant: host as many podcasts as you want -- 👥  Multi-user: add contributors and set roles -- 🌎  i18n support: translated in English, French, Polish, German, - Brazilian Portuguese & Spanish… with - [more to come](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. - -It is in fact one of the only media to have stayed this way for a long time. - -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. - -With podcasting becoming more widely used, some companies are trying to shift it -towards a more controlled and centralized 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. - -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. - -## Comparison with other solutions - -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 you. - -### 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 it. - -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. - -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. - -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 journey. - -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. - -Finally, depending on your needs, Wordpress and Castopod can even live side by -side as they share the same requirements! - -### 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 was initially built around music. And later on, as the project -evolved, the ability to host podcasts was introduced. - -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, …). - -So, you should probably use Funkwhale if you want to host your music, and use -Castopod if you want to host your podcasts. - -### Castopod vs other podcast hosts - -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! - -Each of these solutions differ from one another, you may compare with the -[list of features](#features). - -That being said, there are two main differences with other podcasting solutions: - -- 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 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. - -## Contributing - -Love Castopod and would like to help? Take a look at the following documentation -to get you started. - -### Code of conduct - -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 tolerated. - -### Contributing 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. - -## Contributors ✨ - -Thanks goes to these wonderful people -([emoji key](https://allcontributors.org/docs/en/emoji-key)): - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Ewen
Ewen

🌍 🤔 💻
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
KrzysztofDomanczyk
KrzysztofDomanczyk

💻
Guy Martin
Guy Martin

🐛 💻
- - - - - - -This project follows the -[all-contributors](https://github.com/all-contributors/all-contributors) -specification. Contributions of any kind welcome! - -## Contact - -You may reach us for help or ask any question you have on: - -- [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) - -Alternatively, you can follow us on social media platforms to get news about -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 - -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). - -
- Ad Aures Logo - NLnet Logo -
- -## License - -[GNU Affero General Public License v3.0](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 - -[release]: https://code.castopod.org/adaures/castopod/-/releases -[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md -[contributions]: https://code.castopod.org/adaures/castopod/-/issues -[semantic-release]: https://github.com/semantic-release/semantic-release -[discord]: https://castopod.org/discord -[stars]: https://github.com/ad-aures/castopod/stargazers -[crowdin]: https://translate.castopod.org/project/castopod diff --git a/docs/src/pl/getting-started/_category_.json b/docs/src/pl/getting-started/_category_.json deleted file mode 100644 index 877a378f..00000000 --- a/docs/src/pl/getting-started/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Getting Started", - "position": 2 -} diff --git a/docs/src/pl/getting-started/auth.md b/docs/src/pl/getting-started/auth.md deleted file mode 100644 index a953d785..00000000 --- a/docs/src/pl/getting-started/auth.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -title: Authentication & Authorization -sidebarDepth: 3 ---- - -# Uwierzytelnianie & Autoryzacja - -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 - - - -| 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 | - - - -### Instance permissions - - - -| 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. | - - - -## 2. Per podcast roles and permissions - -### Per podcast roles - - - -| 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, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| 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 | - - - -### Per podcast permissions - - - -| 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}. | - - diff --git a/docs/src/pl/getting-started/docker.md b/docs/src/pl/getting-started/docker.md deleted file mode 100644 index 12f01619..00000000 --- a/docs/src/pl/getting-started/docker.md +++ /dev/null @@ -1,160 +0,0 @@ ---- -title: Official Docker images -sidebarDepth: 3 ---- - -# Official Docker images - -Castopod pushes 3 Docker images to the Docker Hub during its automated build -process: - -- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all - in one castopod image using nginx unit -- [**`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 - -Additionally, Castopod requires a MySQL-compatible database. A Redis database -can be added as a cache handler. - -## Supported tags - -- `develop` [unstable], latest development branch build -- `beta` [stable], latest beta version build -- `latest` [stable], latest version build -- `1.x.x` [stable], specific version build (since `1.0.0`) - -## Example usage - -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: - - ```yml - version: "3.7" - - services: - app: - image: castopod/castopod:latest - container_name: "castopod-app" - volumes: - - castopod-media:/var/www/castopod/public/media - environment: - MYSQL_DATABASE: castopod - MYSQL_USER: castopod - MYSQL_PASSWORD: changeme - CP_BASEURL: "https://castopod.example.com" - CP_ANALYTICS_SALT: changeme - CP_CACHE_HANDLER: redis - CP_REDIS_HOST: redis - CP_REDIS_PASSWORD: changeme - networks: - - castopod-app - - castopod-db - ports: - - 8000:8000 - restart: unless-stopped - - mariadb: - image: mariadb:10.5 - container_name: "castopod-mariadb" - networks: - - castopod-db - volumes: - - castopod-db:/var/lib/mysql - environment: - MYSQL_ROOT_PASSWORD: changeme - MYSQL_DATABASE: castopod - MYSQL_USER: castopod - MYSQL_PASSWORD: changeme - restart: unless-stopped - - redis: - image: redis:7.0-alpine - container_name: "castopod-redis" - command: --requirepass changeme - volumes: - - castopod-cache:/data - networks: - - castopod-app - - volumes: - castopod-media: - castopod-db: - castopod-cache: - - networks: - castopod-app: - castopod-db: - ``` - - You have to adapt some variables to your needs (e.g. `CP_BASEURL`, - `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). - -3. Setup a reverse proxy for 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/): - - ``` - #castopod - castopod.example.com { - reverse_proxy localhost:8000 - } - ``` - -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! - -5. You're all set, start podcasting! 🎙️🚀 - -## Environment Variables - -- **castopod/castopod** and **castopod/app** - - | Variable name | Type (`default`) | Default | - | ------------------------------------- | ----------------------- | ---------------- | - | **`CP_BASEURL`** | string | `undefined` | - | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | - | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | - | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | - | **`CP_ANALYTICS_SALT`** | string | `undefined` | - | **`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_REDIS_HOST`** | ?string | `"localhost"` | - | **`CP_REDIS_PASSWORD`** | ?string | `null` | - | **`CP_REDIS_PORT`** | ?number | `6379` | - | **`CP_REDIS_DATABASE`** | ?number | `0` | - | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | - | **`CP_EMAIL_FROM`** | ?string | `undefined` | - | **`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_ENABLE_2FA`** | ?boolean | `undefined` | - | **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` | - | **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` | - | **`CP_MEDIA_S3_KEY`** | ?string | `undefined` | - | **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` | - | **`CP_MEDIA_S3_REGION`** | ?string | `undefined` | - | **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` | - | **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` | - | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` | - | **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` | - | **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` | - | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | - | **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` | - | **`CP_TIMEOUT`** | ?number | `900` | - -- **castopod/web-server** - - | Variable name | Type | Default | - | ---------------------- | --------------------- | ------- | - | **`CP_APP_HOSTNAME`** | ?string | `"app"` | - | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | - | **`CP_TIMEOUT`** | ?number | `900` | diff --git a/docs/src/pl/getting-started/install.md b/docs/src/pl/getting-started/install.md deleted file mode 100644 index cdea18ec..00000000 --- a/docs/src/pl/getting-started/install.md +++ /dev/null @@ -1,238 +0,0 @@ ---- -title: Installation -sidebarDepth: 3 ---- - -# How to install 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. - -::: tip Note - -We've released official Docker images for Castopod! - -If you prefer using Docker, you may skip this and go straight to the -[docker documentation](./docker.md) for Castopod. - -::: - -## Requirements - -- PHP v8.1 or higher -- MySQL version 5.7 or higher or MariaDB version 10.2 or higher -- HTTPS support -- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's - incoming requests - -### PHP v8.1 or higher - -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. -- [exif](https://www.php.net/manual/en/exif.installation.php) - -Additionally, make sure that the following extensions are enabled in your PHP: - -- json (enabled by default - don't turn it off) -- xml (enabled by default - don't turn it off) -- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php) - -### MySQL compatible database - -> We recommend using [MariaDB](https://mariadb.org). - -::: warning Warning - -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. - -::: - -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. - -#### Privileges - -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`. - -### (Optional) FFmpeg v4.1.8 or higher for Video Clips - -[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: - -- **FreeType 2** library for - [gd](https://www.php.net/manual/en/image.installation.php). - -### (Optional) Other recommendations - -- Redis for better cache performances. -- CDN for static files caching and better performances. -- e-mail gateway for lost passwords. - -## Install instructions - -### Pre-requisites - -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 haven’t 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): - - ```bash - * * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1 - ``` - - **Note** - If you do not add this cron task, the following Castopod features - will not work: - - - Importing a podcast from an existing RSS feed - - Broadcasting social activities to your followers in the fediverse - - Broadcasting episodes to open hubs using - [WebSub](https://en.wikipedia.org/wiki/WebSub) - - Generating video clips - - [requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips) - -### (recommended) Install Wizard - -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! - -::: info Note - -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. - -::: - -### Using CLI - -1. Create a `.env` file in the package root based on the `.env.example` file. -2. Initialize the database using: - - ```sh - php spark install:init-database - ``` - -3. Create the superadmin user using: - - ```sh - php spark install:create-superadmin - ``` - -4. Head on to your admin gateway to start podcasting! - -### Email/SMTP setup - -Email configuration is required for some features to work properly (eg. -retrieving your forgotten password, sending instructions to premium subscribers, -…) - -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" -``` - -#### Email config options - -| 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"` | - -### Media storage - -By default, files are saved to the `public/media` folder using the file system. -If you need to relocate the `media` folder to a different location, you can -specify it in your `.env` file as shown below: - -```ini -# […] - -media.root="media" -media.storage="/mnt/storage" -``` - -In this example, the files will be saved to the /mnt/storage/media folder. Make -sure to also update your web server configuration to reflect this change. - -### S3 - -If you prefer storing your media files on an S3 compatible storage, you may -specify it in your `.env`: - -```ini -# […] - -media.fileManager="s3" -media.s3.endpoint="your_s3_host" -media.s3.key="your_s3_key" -media.s3.secret="your_s3_secret" -media.s3.region="your_s3_region" -``` - -#### S3 config options - -| Variable name | Type | Default | -| ----------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`pathStyleEndpoint`** | boolean | `false` | -| **`keyPrefix`** | string | `undefined` | - -## Community packages - -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. - -### Install with 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. - -
- - - Install Castopod with YunoHost - - -Github -Repo - -
diff --git a/docs/src/pl/getting-started/security.md b/docs/src/pl/getting-started/security.md deleted file mode 100644 index e205698d..00000000 --- a/docs/src/pl/getting-started/security.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: Security ---- - -# Security concerns - -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). - -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): - -- `writable/` folder must be **readable** and **writable**. -- `public/media/` folder must be **readable** and **writable**. -- any other file must be set to **readonly**. - -For instance, if you are using Apache or NGINX with Ubuntu you may do the -following: - -```bash -sudo chown -R root:root /path/to/castopod -sudo chown -R www-data:www-data /path/to/castopod/writable -sudo chown -R www-data:www-data /path/to/castopod/public/media -``` diff --git a/docs/src/pl/index.md b/docs/src/pl/index.md deleted file mode 100644 index 7f012c6c..00000000 --- a/docs/src/pl/index.md +++ /dev/null @@ -1,300 +0,0 @@ ---- -sidebarDepth: 2 ---- - -# Welcome 👋 - -[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] - -Castopod is a free & open-source hosting platform made for podcasters who want -engage and interact with their audience. - -Castopod is easy to install and was built on top of -[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very -small footprint. - -
- Install -
- -## Features - -- 🌱  Free & open-source (AGPL v3 License) -- 🔐  Focused on data sovereignty: your content, audience, and analytics - belong to you, and you only -- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, - chapters, location, persons, soundbites, … -- 💬  Built-in social network: - - 🚀  Castopod is part of the Fediverse, a decentralized social network - - ❤️  Create posts, share, favourite, and comment on episodes -- 📈  Built-in analytics: - - ⚖️  GDPR / CCPA / LGPD compliant - - 🪙  Standard IABv2 audience measurement - - 🏡  On-premises analytics, no third party involved -- 📢  Built-in marketing tools: - - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) - - 📱  PWA: install as a standalone app - - 🎨  Customizable theme colors - - 🎬  Generate ready-to-share Video clips from episodes - - 🔉  Generate soundbites - - ▶️  Embeddable player, embed your episodes on any website -- 💸  Monetization: - - 🔗  Funding links - - 📲  listen-to-click ads - - 🤝  value4value / WebMonetization - - 💎  Premium podcasts -- 📡  Publish your episodes everywhere with RSS: - - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, - Google Podcasts, Deezer, Podcast Addict, Podfriend, … - - ⚡  Broadcast your episodes instantly with WebSub -- 📥  Podcast import: move your existing podcast into Castopod -- 📤  Move your podcast out of Castopod -- 🔀  Multi-tenant: host as many podcasts as you want -- 👥  Multi-user: add contributors and set roles -- 🌎  i18n support: translated in English, French, Polish, German, - Brazilian Portuguese & Spanish… with - [more to come](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. - -It is in fact one of the only media to have stayed this way for a long time. - -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. - -With podcasting becoming more widely used, some companies are trying to shift it -towards a more controlled and centralized 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. - -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. - -## Comparison with other solutions - -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 you. - -### 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 it. - -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. - -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. - -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 journey. - -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. - -Finally, depending on your needs, Wordpress and Castopod can even live side by -side as they share the same requirements! - -### 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 was initially built around music. And later on, as the project -evolved, the ability to host podcasts was introduced. - -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, …). - -So, you should probably use Funkwhale if you want to host your music, and use -Castopod if you want to host your podcasts. - -### Castopod vs other podcast hosts - -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! - -Each of these solutions differ from one another, you may compare with the -[list of features](#features). - -That being said, there are two main differences with other podcasting solutions: - -- 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 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. - -## Contributing - -Love Castopod and would like to help? Take a look at the following documentation -to get you started. - -### Code of conduct - -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 tolerated. - -### Contributing 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. - -## Contributors ✨ - -Thanks goes to these wonderful people -([emoji key](https://allcontributors.org/docs/en/emoji-key)): - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Ewen
Ewen

🌍 🤔 💻
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
KrzysztofDomanczyk
KrzysztofDomanczyk

💻
Guy Martin
Guy Martin

🐛 💻
- - - - - - -This project follows the -[all-contributors](https://github.com/all-contributors/all-contributors) -specification. Contributions of any kind welcome! - -## Contact - -You may reach us for help or ask any question you have on: - -- [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) - -Alternatively, you can follow us on social media platforms to get news about -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 - -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). - -
- Ad Aures Logo - NLnet Logo -
- -## License - -[GNU Affero General Public License v3.0](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 - -[release]: https://code.castopod.org/adaures/castopod/-/releases -[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md -[contributions]: https://code.castopod.org/adaures/castopod/-/issues -[semantic-release]: https://github.com/semantic-release/semantic-release -[discord]: https://castopod.org/discord -[stars]: https://github.com/ad-aures/castopod/stargazers -[crowdin]: https://translate.castopod.org/project/castopod diff --git a/docs/src/pt-BR/getting-started/_category_.json b/docs/src/pt-BR/getting-started/_category_.json deleted file mode 100644 index 877a378f..00000000 --- a/docs/src/pt-BR/getting-started/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Getting Started", - "position": 2 -} diff --git a/docs/src/pt-BR/getting-started/auth.md b/docs/src/pt-BR/getting-started/auth.md deleted file mode 100644 index 71ae5a8f..00000000 --- a/docs/src/pt-BR/getting-started/auth.md +++ /dev/null @@ -1,88 +0,0 @@ ---- -title: Authentication & Authorization -sidebarDepth: 3 ---- - -# Autenticação & Autorização - -Castopod lida com autenticação e autorização usando `codeigniter/shield` -juntamente com regras personalizadas. Papéis e permissões são definidos em dois -níveis: - -1. [toda instância](#1-instance-wide-roles-and-permissions) -2. [por podcast](#2-per-podcast-roles-and-permissions) - -## Papéis e permissões para toda a instância - -### Cargos de instância - - - -| cargos | descrição | permissões | -| ----------- | ------------------------------------- | ------------------------------------------------------------------------------------------ | -| Super admin | Tem controle completo sobre Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Gerentes | Gerencia o conteúdo de Castopod. | criar.podcasts, importar.podcasts, gerenciar.pessoas, gerenciar.páginas | -| Podcaster | Usuários gerais do Castopod. | admin.access | - - - -### Permissões da instância - - - -| permissões | descrição | -| ----------------------- | ---------------------------------------------------------------- | -| admin.access | Pode acessar a área de administração do Castopod. | -| admin.settings | Pode acessar as configurações de Castopod. | -| users.manage | Pode gerenciar usuários do Castopod. | -| persons.manage | Pode gerenciar pessoas. | -| pages.manage | Pode gerenciar páginas. | -| podcasts.view | Pode ver todos os podcasts. | -| podcasts.create | Pode criar novos podcasts. | -| podcasts.import | Pode importar podcasts. | -| fediverse.manage-blocks | Pode bloquear ator/domínios distintos de interagir com Castopod. | - - - -## 2. Por funções de podcast e permissões - -### Por cargos de podcast - - - -| cargos | descrição | permissões | -| --------- | -------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Tem controle completo de podcast #{id}. | \* | -| Editor | Gerencia o conteúdo e as publicações do podcast #{id}. | visualizar, editar, gerenciar-importação, gerenciar-pessoas, gerenciar-plataformas, gerenciar-publicações, gerenciar-notificações, interagir-com, visualizar.episódios, criar.episódios,deletar.episódios, gerenciar-pessoas.episódios, gerenciar-clips.episódios, gerenciar-publicações.episódios, gerenciar-comentários.episódios | -| Autor | Gerencia o conteúdo do podcast #{id} mas não pode publicá-los. | visualizar, gerenciar-pessoas, visualizar.episódios, criar.episódios, editar.episódios, gerenciar-pessoas.episódios, gerenciar-clips.episódios | -| Convidado | Contribuidor geral do podcast #{id}. | visualizar, visualizar.episódios | - - - -### Por permissões de podcast - - - -| permissões | descrição | -| --------------------------------- | ------------------------------------------------------------------------------------------- | -| visualizar | Pode visualizar o painel de controle e análise de podcast #{id}. | -| editar | Pode editar podcast #{id}. | -| excluir | Pode excluir o podcast #{id}. | -| gerenciar-importações | Pode sincronizar o podcast importado #{id}. | -| gerenciar-pessoas | Pode gerenciar assinantes de podcast #{id}. | -| gerenciar-assinaturas | Pode gerenciar assinaturas de podcast #{id}. | -| gerente-contribuidores | Pode gerenciar contribuidores do podcast #{id}. | -| gerenciar-plataformas | Pode definir/remover links de plataforma do podcast #{id}. | -| gerencie-publicações | Pode publicar podcast #{id}. | -| gerenciar-notificações | Pode ver e marcar notificações como lidas para o podcast #{id}. | -| interagir-como | Pode interagir com o podcast #{id} para favorito, compartilhar ou responder às publicações. | -| visualizar.episódios | Pode visualizar o painel de controle e análise de podcast #{id}. | -| criar.episódio | Pode criar episódios para o podcast #{id}. | -| editar.episódios | Pode editar o podcast #{id}. | -| deletar.episódios | Pode deletar episódios do podcast #{id}. | -| gerenciar-pessoas.episódios | Pode gerenciar assinaturas de episódios do podcast #{id}. | -| gerenciar-clips.episódios | Pode gerenciar clipes de vídeo ou sons de episódios do podcast #{id}. | -| gerenciar-publicações.episódios | Pode publicar episódios do podcast #{id}. | -| gerenteciar-comentários.episódios | Pode criar/remover comentários de episódio do podcast #{id}. | - - diff --git a/docs/src/pt-BR/getting-started/docker.md b/docs/src/pt-BR/getting-started/docker.md deleted file mode 100644 index 12f01619..00000000 --- a/docs/src/pt-BR/getting-started/docker.md +++ /dev/null @@ -1,160 +0,0 @@ ---- -title: Official Docker images -sidebarDepth: 3 ---- - -# Official Docker images - -Castopod pushes 3 Docker images to the Docker Hub during its automated build -process: - -- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all - in one castopod image using nginx unit -- [**`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 - -Additionally, Castopod requires a MySQL-compatible database. A Redis database -can be added as a cache handler. - -## Supported tags - -- `develop` [unstable], latest development branch build -- `beta` [stable], latest beta version build -- `latest` [stable], latest version build -- `1.x.x` [stable], specific version build (since `1.0.0`) - -## Example usage - -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: - - ```yml - version: "3.7" - - services: - app: - image: castopod/castopod:latest - container_name: "castopod-app" - volumes: - - castopod-media:/var/www/castopod/public/media - environment: - MYSQL_DATABASE: castopod - MYSQL_USER: castopod - MYSQL_PASSWORD: changeme - CP_BASEURL: "https://castopod.example.com" - CP_ANALYTICS_SALT: changeme - CP_CACHE_HANDLER: redis - CP_REDIS_HOST: redis - CP_REDIS_PASSWORD: changeme - networks: - - castopod-app - - castopod-db - ports: - - 8000:8000 - restart: unless-stopped - - mariadb: - image: mariadb:10.5 - container_name: "castopod-mariadb" - networks: - - castopod-db - volumes: - - castopod-db:/var/lib/mysql - environment: - MYSQL_ROOT_PASSWORD: changeme - MYSQL_DATABASE: castopod - MYSQL_USER: castopod - MYSQL_PASSWORD: changeme - restart: unless-stopped - - redis: - image: redis:7.0-alpine - container_name: "castopod-redis" - command: --requirepass changeme - volumes: - - castopod-cache:/data - networks: - - castopod-app - - volumes: - castopod-media: - castopod-db: - castopod-cache: - - networks: - castopod-app: - castopod-db: - ``` - - You have to adapt some variables to your needs (e.g. `CP_BASEURL`, - `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). - -3. Setup a reverse proxy for 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/): - - ``` - #castopod - castopod.example.com { - reverse_proxy localhost:8000 - } - ``` - -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! - -5. You're all set, start podcasting! 🎙️🚀 - -## Environment Variables - -- **castopod/castopod** and **castopod/app** - - | Variable name | Type (`default`) | Default | - | ------------------------------------- | ----------------------- | ---------------- | - | **`CP_BASEURL`** | string | `undefined` | - | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | - | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | - | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | - | **`CP_ANALYTICS_SALT`** | string | `undefined` | - | **`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_REDIS_HOST`** | ?string | `"localhost"` | - | **`CP_REDIS_PASSWORD`** | ?string | `null` | - | **`CP_REDIS_PORT`** | ?number | `6379` | - | **`CP_REDIS_DATABASE`** | ?number | `0` | - | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | - | **`CP_EMAIL_FROM`** | ?string | `undefined` | - | **`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_ENABLE_2FA`** | ?boolean | `undefined` | - | **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` | - | **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` | - | **`CP_MEDIA_S3_KEY`** | ?string | `undefined` | - | **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` | - | **`CP_MEDIA_S3_REGION`** | ?string | `undefined` | - | **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` | - | **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` | - | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` | - | **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` | - | **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` | - | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | - | **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` | - | **`CP_TIMEOUT`** | ?number | `900` | - -- **castopod/web-server** - - | Variable name | Type | Default | - | ---------------------- | --------------------- | ------- | - | **`CP_APP_HOSTNAME`** | ?string | `"app"` | - | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | - | **`CP_TIMEOUT`** | ?number | `900` | diff --git a/docs/src/pt-BR/index.md b/docs/src/pt-BR/index.md deleted file mode 100644 index 38593f36..00000000 --- a/docs/src/pt-BR/index.md +++ /dev/null @@ -1,301 +0,0 @@ ---- -sidebarDepth: 2 ---- - -# Bem-vindo 👋 - -[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] - -Castopod é uma plataforma de hospedagem de código livre & aberto feita para -podcasters que querem se envolver e interagir com seu público. - -Castopod é fácil de instalar e foi construído em cima do -[CodeIgniter4](https://codeigniter.com/), um poderoso framework PHP com uma -pegada muito pequena. - - - -## Funcionalidades - -- 🌱  Livre & de código aberto (Licença AGPL v3) -- 🔐  Focado na soberania de dados: seu conteúdo, público e análises - pertence a você, e somente você -- 🪄  Recursos do podcasting 2.0: GUID, bloqueado, transcrições, - financiamento, capítulos, localização, pessoas, soundbites, … -- 💬  Rede social integrada: - - 🚀  Castopod é parte do Fediverso, uma rede social descentralizada - - ❤️  Crie publicações, compartilhe, favorite e comente em episódios -- 📈  Estatísticas integradas: - - ⚖️  Compatível com GDPR / CCPA / LGPD - - 🪙  Medição de audiência no padrão do IABv2 - - 🏡  Estatísticas feitas localmente, sem terceiros envolvidos -- 📢  Ferramentas de marketing integradas: - - ✅  Pronto para SEO (meta-tags de open-graph, JSON-LD, …) - - 📱  PWA: instalar como um aplicativo autônomo - - 🎨  Cores de tema personalizáveis - - 🎬  Gere clipes de vídeo prontos para compartilhar a partir dos - episódios - - 🔉  Gere clipes de áudio - - ▶️  Player incorporável, incorpore seus episódios em qualquer site -- 💸  Monetização: - - 🔗  Links de financiamento - - 📲  anúncios clique-para-ouvir - - 🤝  value4value / WebMonetization - - 💎  Premium podcasts -- 📡  Publique seus episódios em qualquer lugar com RSS: - - 📱  Em todos os agregadores e aplicativos: Podcast Index, Apple - Podcasts, Spotify, Google Podcasts, Deezer, Podcast Addict, Podfriend, … - - ⚡  Transmita seus episódios instantaneamente com WebSub -- 📥  Importação de Podcast: mova seu podcast existente para o Castopod -- 📤  Mova seu podcast para fora do Castopod -- 🔀  Multi-inquilino: hospede quantos podcasts você quiser -- 👥  Multi-usuário: adicione contribuidores e defina cargos -- 🌎  Suporte i18n: traduzido em inglês, francês, polonês, alemão, - português brasileiro e espanhol… com - [mais por vir](https://translate.castopod.org)! - -## Motivação - -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. - -It is in fact one of the only media to have stayed this way for a long time. - -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. - -With podcasting becoming more widely used, some companies are trying to shift it -towards a more controlled and centralized 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. - -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. - -## Comparação com outras soluções - -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 you. - -### 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 it. - -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. - -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. - -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 journey. - -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. - -Finally, depending on your needs, Wordpress and Castopod can even live side by -side as they share the same requirements! - -### 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 was initially built around music. And later on, as the project -evolved, the ability to host podcasts was introduced. - -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, …). - -So, you should probably use Funkwhale if you want to host your music, and use -Castopod if you want to host your podcasts. - -### Castopod vs outras hospedagens de podcast - -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! - -Each of these solutions differ from one another, you may compare with the -[list of features](#features). - -That being said, there are two main differences with other podcasting solutions: - -- Castopod pode ser auto-hospedado e é a única solução que permite manter o - controle total sobre o que você produz. Além disso, como é de código aberto, - você pode até personalizá-lo como desejar. - -- O Castopod é a única solução que atualmente integra uma rede social - descentralizada com o ActivityPub, bem como muitos dos recursos de podcasting - 2.0, na esperança de preencher a lacuna entre as duas. - -## Contribuir - -Love Castopod and would like to help? Take a look at the following documentation -to get you started. - -### Código de conduta - -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 tolerated. - -### Guia de contribuição - -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. - -## Contribuidores ✨ - -Thanks goes to these wonderful people -([emoji key](https://allcontributors.org/docs/en/emoji-key)): - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Ewen
Ewen

🌍 🤔 💻
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
KrzysztofDomanczyk
KrzysztofDomanczyk

💻
Guy Martin
Guy Martin

🐛 💻
- - - - - - -This project follows the -[all-contributors](https://github.com/all-contributors/all-contributors) -specification. Contributions of any kind welcome! - -## Contato - -You may reach us for help or ask any question you have on: - -- [Discord](https://castopod.org/discord) (para interação direta com - desenvolvedores e a comunidade) -- [Rastreador de problemas](https://code.castopod.org/adaures/castopod/-/issues) - (para solicitações de recursos e relatos de bugs) - -Alternatively, you can follow us on social media platforms to get news about -Castopod: - -- [podlibre.social](https://podlibre.social/@Castopod) (instância do Mastodon) -- [Twitter](https://twitter.com/castopod) -- [LinkedIn](https://linkedin.com/company/castopod) -- [Facebook](https://www.facebook.com/castopod) - -## Apoiadores - -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). - -
- Logo de Ad Aures - Logo da NLnet -
- -## Licença - -[GNU Affero General Public License v3.0](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 - -[release]: https://code.castopod.org/adaures/castopod/-/releases -[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md -[contributions]: https://code.castopod.org/adaures/castopod/-/issues -[semantic-release]: https://github.com/semantic-release/semantic-release -[discord]: https://castopod.org/discord -[stars]: https://github.com/ad-aures/castopod/stargazers -[crowdin]: https://translate.castopod.org/project/castopod diff --git a/docs/src/pt/getting-started/_category_.json b/docs/src/pt/getting-started/_category_.json deleted file mode 100644 index 877a378f..00000000 --- a/docs/src/pt/getting-started/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Getting Started", - "position": 2 -} diff --git a/docs/src/pt/getting-started/auth.md b/docs/src/pt/getting-started/auth.md deleted file mode 100644 index ff5d59c0..00000000 --- a/docs/src/pt/getting-started/auth.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -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 - - - -| 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 | - - - -### Instance permissions - - - -| 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. | - - - -## 2. Per podcast roles and permissions - -### Per podcast roles - - - -| 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, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| 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 | - - - -### Per podcast permissions - - - -| 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}. | - - diff --git a/docs/src/pt/getting-started/docker.md b/docs/src/pt/getting-started/docker.md deleted file mode 100644 index 12f01619..00000000 --- a/docs/src/pt/getting-started/docker.md +++ /dev/null @@ -1,160 +0,0 @@ ---- -title: Official Docker images -sidebarDepth: 3 ---- - -# Official Docker images - -Castopod pushes 3 Docker images to the Docker Hub during its automated build -process: - -- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all - in one castopod image using nginx unit -- [**`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 - -Additionally, Castopod requires a MySQL-compatible database. A Redis database -can be added as a cache handler. - -## Supported tags - -- `develop` [unstable], latest development branch build -- `beta` [stable], latest beta version build -- `latest` [stable], latest version build -- `1.x.x` [stable], specific version build (since `1.0.0`) - -## Example usage - -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: - - ```yml - version: "3.7" - - services: - app: - image: castopod/castopod:latest - container_name: "castopod-app" - volumes: - - castopod-media:/var/www/castopod/public/media - environment: - MYSQL_DATABASE: castopod - MYSQL_USER: castopod - MYSQL_PASSWORD: changeme - CP_BASEURL: "https://castopod.example.com" - CP_ANALYTICS_SALT: changeme - CP_CACHE_HANDLER: redis - CP_REDIS_HOST: redis - CP_REDIS_PASSWORD: changeme - networks: - - castopod-app - - castopod-db - ports: - - 8000:8000 - restart: unless-stopped - - mariadb: - image: mariadb:10.5 - container_name: "castopod-mariadb" - networks: - - castopod-db - volumes: - - castopod-db:/var/lib/mysql - environment: - MYSQL_ROOT_PASSWORD: changeme - MYSQL_DATABASE: castopod - MYSQL_USER: castopod - MYSQL_PASSWORD: changeme - restart: unless-stopped - - redis: - image: redis:7.0-alpine - container_name: "castopod-redis" - command: --requirepass changeme - volumes: - - castopod-cache:/data - networks: - - castopod-app - - volumes: - castopod-media: - castopod-db: - castopod-cache: - - networks: - castopod-app: - castopod-db: - ``` - - You have to adapt some variables to your needs (e.g. `CP_BASEURL`, - `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). - -3. Setup a reverse proxy for 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/): - - ``` - #castopod - castopod.example.com { - reverse_proxy localhost:8000 - } - ``` - -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! - -5. You're all set, start podcasting! 🎙️🚀 - -## Environment Variables - -- **castopod/castopod** and **castopod/app** - - | Variable name | Type (`default`) | Default | - | ------------------------------------- | ----------------------- | ---------------- | - | **`CP_BASEURL`** | string | `undefined` | - | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | - | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | - | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | - | **`CP_ANALYTICS_SALT`** | string | `undefined` | - | **`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_REDIS_HOST`** | ?string | `"localhost"` | - | **`CP_REDIS_PASSWORD`** | ?string | `null` | - | **`CP_REDIS_PORT`** | ?number | `6379` | - | **`CP_REDIS_DATABASE`** | ?number | `0` | - | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | - | **`CP_EMAIL_FROM`** | ?string | `undefined` | - | **`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_ENABLE_2FA`** | ?boolean | `undefined` | - | **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` | - | **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` | - | **`CP_MEDIA_S3_KEY`** | ?string | `undefined` | - | **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` | - | **`CP_MEDIA_S3_REGION`** | ?string | `undefined` | - | **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` | - | **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` | - | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` | - | **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` | - | **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` | - | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | - | **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` | - | **`CP_TIMEOUT`** | ?number | `900` | - -- **castopod/web-server** - - | Variable name | Type | Default | - | ---------------------- | --------------------- | ------- | - | **`CP_APP_HOSTNAME`** | ?string | `"app"` | - | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | - | **`CP_TIMEOUT`** | ?number | `900` | diff --git a/docs/src/pt/getting-started/security.md b/docs/src/pt/getting-started/security.md deleted file mode 100644 index e205698d..00000000 --- a/docs/src/pt/getting-started/security.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: Security ---- - -# Security concerns - -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). - -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): - -- `writable/` folder must be **readable** and **writable**. -- `public/media/` folder must be **readable** and **writable**. -- any other file must be set to **readonly**. - -For instance, if you are using Apache or NGINX with Ubuntu you may do the -following: - -```bash -sudo chown -R root:root /path/to/castopod -sudo chown -R www-data:www-data /path/to/castopod/writable -sudo chown -R www-data:www-data /path/to/castopod/public/media -``` diff --git a/docs/src/pt/getting-started/update.md b/docs/src/pt/getting-started/update.md deleted file mode 100644 index 98e019fb..00000000 --- a/docs/src/pt/getting-started/update.md +++ /dev/null @@ -1,109 +0,0 @@ ---- -title: Update -sidebarDepth: 3 ---- - -# How to update 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 ⚡. - -## Update instructions - -0. ⚠️ Before any update, we highly recommend you backup your Castopod files and - database. - - - cf. - [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 - - - cf. - [Where can I find my 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 - - - ⚠️ 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/) - -3. On your server: - - - Remove all files except `.env` and `public/media` - - Copy the new files from the downloaded package into your server - - ::: info Note - - You may need to reset files permissions as during the install process. - Check [Security Concerns](./security.md). - - ::: - -4. Update your database schema from your `Castopod Admin` > `About` page or by - running: - - ```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! - -::: info Note - -Releases may come with additional update instructions (see -[releases page](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) - -::: - -## Fully Automated updates - -> Coming soon... 👀 - -## Frequently asked questions (FAQ) - -### Where can I find my Castopod version? - -Go to your Castopod admin panel, the version is displayed on the bottom left -corner. - -Alternatively, you can find the version in the `app > Config > Constants.php` -file. - -### I haven't updated my instance in a long time… What should I do? - -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. - -> You may want to backup your instance depending on how long you haven't updated -> Castopod. - -For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to -`v1.0.0-beta.1`: - -0. (highly recommended) Make a backup of your files and database. - -1. Download the latest release, overwrite your files whilst keeping `.env` and - `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`, - `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`. - -3. ✨ Enjoy your fresh instance, you're all done! - -### Should I make a backup before updating? - -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… diff --git a/docs/src/pt/index.md b/docs/src/pt/index.md deleted file mode 100644 index 7f012c6c..00000000 --- a/docs/src/pt/index.md +++ /dev/null @@ -1,300 +0,0 @@ ---- -sidebarDepth: 2 ---- - -# Welcome 👋 - -[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] - -Castopod is a free & open-source hosting platform made for podcasters who want -engage and interact with their audience. - -Castopod is easy to install and was built on top of -[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very -small footprint. - -
- Install -
- -## Features - -- 🌱  Free & open-source (AGPL v3 License) -- 🔐  Focused on data sovereignty: your content, audience, and analytics - belong to you, and you only -- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, - chapters, location, persons, soundbites, … -- 💬  Built-in social network: - - 🚀  Castopod is part of the Fediverse, a decentralized social network - - ❤️  Create posts, share, favourite, and comment on episodes -- 📈  Built-in analytics: - - ⚖️  GDPR / CCPA / LGPD compliant - - 🪙  Standard IABv2 audience measurement - - 🏡  On-premises analytics, no third party involved -- 📢  Built-in marketing tools: - - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) - - 📱  PWA: install as a standalone app - - 🎨  Customizable theme colors - - 🎬  Generate ready-to-share Video clips from episodes - - 🔉  Generate soundbites - - ▶️  Embeddable player, embed your episodes on any website -- 💸  Monetization: - - 🔗  Funding links - - 📲  listen-to-click ads - - 🤝  value4value / WebMonetization - - 💎  Premium podcasts -- 📡  Publish your episodes everywhere with RSS: - - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, - Google Podcasts, Deezer, Podcast Addict, Podfriend, … - - ⚡  Broadcast your episodes instantly with WebSub -- 📥  Podcast import: move your existing podcast into Castopod -- 📤  Move your podcast out of Castopod -- 🔀  Multi-tenant: host as many podcasts as you want -- 👥  Multi-user: add contributors and set roles -- 🌎  i18n support: translated in English, French, Polish, German, - Brazilian Portuguese & Spanish… with - [more to come](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. - -It is in fact one of the only media to have stayed this way for a long time. - -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. - -With podcasting becoming more widely used, some companies are trying to shift it -towards a more controlled and centralized 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. - -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. - -## Comparison with other solutions - -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 you. - -### 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 it. - -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. - -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. - -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 journey. - -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. - -Finally, depending on your needs, Wordpress and Castopod can even live side by -side as they share the same requirements! - -### 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 was initially built around music. And later on, as the project -evolved, the ability to host podcasts was introduced. - -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, …). - -So, you should probably use Funkwhale if you want to host your music, and use -Castopod if you want to host your podcasts. - -### Castopod vs other podcast hosts - -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! - -Each of these solutions differ from one another, you may compare with the -[list of features](#features). - -That being said, there are two main differences with other podcasting solutions: - -- 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 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. - -## Contributing - -Love Castopod and would like to help? Take a look at the following documentation -to get you started. - -### Code of conduct - -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 tolerated. - -### Contributing 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. - -## Contributors ✨ - -Thanks goes to these wonderful people -([emoji key](https://allcontributors.org/docs/en/emoji-key)): - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Ewen
Ewen

🌍 🤔 💻
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
KrzysztofDomanczyk
KrzysztofDomanczyk

💻
Guy Martin
Guy Martin

🐛 💻
- - - - - - -This project follows the -[all-contributors](https://github.com/all-contributors/all-contributors) -specification. Contributions of any kind welcome! - -## Contact - -You may reach us for help or ask any question you have on: - -- [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) - -Alternatively, you can follow us on social media platforms to get news about -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 - -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). - -
- Ad Aures Logo - NLnet Logo -
- -## License - -[GNU Affero General Public License v3.0](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 - -[release]: https://code.castopod.org/adaures/castopod/-/releases -[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md -[contributions]: https://code.castopod.org/adaures/castopod/-/issues -[semantic-release]: https://github.com/semantic-release/semantic-release -[discord]: https://castopod.org/discord -[stars]: https://github.com/ad-aures/castopod/stargazers -[crowdin]: https://translate.castopod.org/project/castopod diff --git a/docs/src/public/images/castopod-icon.svg b/docs/src/public/images/castopod-icon.svg deleted file mode 100644 index 22810aab..00000000 --- a/docs/src/public/images/castopod-icon.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/docs/src/public/images/sponsors/adaures.svg b/docs/src/public/images/sponsors/adaures.svg deleted file mode 100644 index d0327c25..00000000 --- a/docs/src/public/images/sponsors/adaures.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - \ No newline at end of file diff --git a/docs/src/public/images/sponsors/nlnet.svg b/docs/src/public/images/sponsors/nlnet.svg deleted file mode 100644 index 34f41f4a..00000000 --- a/docs/src/public/images/sponsors/nlnet.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/src/ro/getting-started/auth.md b/docs/src/ro/getting-started/auth.md deleted file mode 100644 index 4b279e34..00000000 --- a/docs/src/ro/getting-started/auth.md +++ /dev/null @@ -1,88 +0,0 @@ ---- -title: Autentificare & Autorizare -sidebarDepth: 3 ---- - -# Autentificare & Autorizare - -Castopod folosește pentru autentificare și autorizare `codeigniter/shield` -cuplat la reguli personalizate. Rolurile și permisiunile sunt definite la două -niveluri: - -1. [întreaga instanță](#1-instance-wide-roles-and-permissions) -2. [per podcast](#2-per-podcast-roles-and-permissions) - -## 1. Gestionați roluri şi permisiuni pe întreaga instanță - -### Rolurile instanței - - - -| rol | descriere | permisiuni | -| ----------- | ----------------------------------------- | ------------------------------------------------------------------------------------------ | -| Super admin | Deține controlul complet asupra Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Manager | Gestionează conținutul Castopodului. | podcasts.create, podcasts.import, persons.manage, pages.manage | -| Podcaster | Utilizatorii generali ai Castopod. | admin.access | - - - -### Permisiuni instanță - - - -| permisiune | descriere | -| ----------------------- | -------------------------------------------------------------------------- | -| admin.access | Poate accesa zona de administrare Castopod. | -| admin.settings | Poate accesa setările Castopod. | -| users.manage | Poate gestiona utilizatorii Castopod. | -| persons.manage | Poate gestiona persoane. | -| pages.manage | Poate gestiona pagini. | -| podcasts.view | Poate vedea toate podcast-urile. | -| podcasts.create | Poate crea noi podcast-uri. | -| podcasts.import | Poate importa podcast-uri. | -| fediverse.manage-blocks | Poate bloca actorilor/domenii din fediverse să interacționeze cu Castopod. | - - - -## 2. Roluri și permisiuni per podcast - -### Roluri per podcast - - - -| rol | descriere | permisiuni | -| ------ | -------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Admin | Deține controlul complet asupra podcastului #{id}. | \* | -| Editor | Gestionează conținutul și publicațiile podcastului #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| Author | Gestionează conținutul podcastului #{id} dar nu poate publica. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Guest | Contribuitor al podcastului #{id}. | view, episodes.view | - - - -### Permisiuni per podcast - - - -| permisiune | descriere | -| ---------------------------- | ------------------------------------------------------------------------------------------------------- | -| view | Poate vedea panoul de control și analiticele podcastului #{id}. | -| edit | Poate edita podcastul #{id}. | -| delete | Poate șterge podcastul #{id}. | -| manage-import | Poate sincroniza podcastul importat #{id}. | -| manage-persons | Poate administra abonamentele podcastului #{id}. | -| manage-subscriptions | Poate administra abonamentele podcastului #{id}. | -| manage-contributors | Poate administra colaboratorii podcastului #{id}. | -| manage-platforms | Poate seta/elimina link-urile podcastului #{id}. | -| manage-publications | Poate publica podcastul #{id}. | -| manage-notifications | Poate vizualiza și marca notificările ca fiind citite pentru podcastul #{id}. | -| interact-as | Poate interacționa ca podcastul #{id} pentru adăuga la favorite, a distribui sau a răspunde la postări. | -| episodes.view | Poate vizualiza panoul de control și analiticile podcastului #{id}. | -| episodes.create | Poate crea episoade pentru podcastul #{id}. | -| episodes.edit | Poate edita podcastul #{id}. | -| episodes.delete | Poate șterge podcastul #{id}. | -| episodes.manage-persons | Poate administra abonamentele podcastului #{id}. | -| episodes.manage-clips | Poate administra clipuri video sau biții de sunet ai podcastului #{id}. | -| episodes.manage-publications | Poate publica podcastul #{id}. | -| episodes.manage-comments | Poate crea/elimina comentariile episodului podcastului #{id}. | - - diff --git a/docs/src/ro/getting-started/install.md b/docs/src/ro/getting-started/install.md deleted file mode 100644 index cdea18ec..00000000 --- a/docs/src/ro/getting-started/install.md +++ /dev/null @@ -1,238 +0,0 @@ ---- -title: Installation -sidebarDepth: 3 ---- - -# How to install 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. - -::: tip Note - -We've released official Docker images for Castopod! - -If you prefer using Docker, you may skip this and go straight to the -[docker documentation](./docker.md) for Castopod. - -::: - -## Requirements - -- PHP v8.1 or higher -- MySQL version 5.7 or higher or MariaDB version 10.2 or higher -- HTTPS support -- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's - incoming requests - -### PHP v8.1 or higher - -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. -- [exif](https://www.php.net/manual/en/exif.installation.php) - -Additionally, make sure that the following extensions are enabled in your PHP: - -- json (enabled by default - don't turn it off) -- xml (enabled by default - don't turn it off) -- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php) - -### MySQL compatible database - -> We recommend using [MariaDB](https://mariadb.org). - -::: warning Warning - -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. - -::: - -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. - -#### Privileges - -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`. - -### (Optional) FFmpeg v4.1.8 or higher for Video Clips - -[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: - -- **FreeType 2** library for - [gd](https://www.php.net/manual/en/image.installation.php). - -### (Optional) Other recommendations - -- Redis for better cache performances. -- CDN for static files caching and better performances. -- e-mail gateway for lost passwords. - -## Install instructions - -### Pre-requisites - -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 haven’t 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): - - ```bash - * * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1 - ``` - - **Note** - If you do not add this cron task, the following Castopod features - will not work: - - - Importing a podcast from an existing RSS feed - - Broadcasting social activities to your followers in the fediverse - - Broadcasting episodes to open hubs using - [WebSub](https://en.wikipedia.org/wiki/WebSub) - - Generating video clips - - [requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips) - -### (recommended) Install Wizard - -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! - -::: info Note - -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. - -::: - -### Using CLI - -1. Create a `.env` file in the package root based on the `.env.example` file. -2. Initialize the database using: - - ```sh - php spark install:init-database - ``` - -3. Create the superadmin user using: - - ```sh - php spark install:create-superadmin - ``` - -4. Head on to your admin gateway to start podcasting! - -### Email/SMTP setup - -Email configuration is required for some features to work properly (eg. -retrieving your forgotten password, sending instructions to premium subscribers, -…) - -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" -``` - -#### Email config options - -| 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"` | - -### Media storage - -By default, files are saved to the `public/media` folder using the file system. -If you need to relocate the `media` folder to a different location, you can -specify it in your `.env` file as shown below: - -```ini -# […] - -media.root="media" -media.storage="/mnt/storage" -``` - -In this example, the files will be saved to the /mnt/storage/media folder. Make -sure to also update your web server configuration to reflect this change. - -### S3 - -If you prefer storing your media files on an S3 compatible storage, you may -specify it in your `.env`: - -```ini -# […] - -media.fileManager="s3" -media.s3.endpoint="your_s3_host" -media.s3.key="your_s3_key" -media.s3.secret="your_s3_secret" -media.s3.region="your_s3_region" -``` - -#### S3 config options - -| Variable name | Type | Default | -| ----------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`pathStyleEndpoint`** | boolean | `false` | -| **`keyPrefix`** | string | `undefined` | - -## Community packages - -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. - -### Install with 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. - -
- - - Install Castopod with YunoHost - - -Github -Repo - -
diff --git a/docs/src/ro/getting-started/security.md b/docs/src/ro/getting-started/security.md deleted file mode 100644 index e205698d..00000000 --- a/docs/src/ro/getting-started/security.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: Security ---- - -# Security concerns - -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). - -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): - -- `writable/` folder must be **readable** and **writable**. -- `public/media/` folder must be **readable** and **writable**. -- any other file must be set to **readonly**. - -For instance, if you are using Apache or NGINX with Ubuntu you may do the -following: - -```bash -sudo chown -R root:root /path/to/castopod -sudo chown -R www-data:www-data /path/to/castopod/writable -sudo chown -R www-data:www-data /path/to/castopod/public/media -``` diff --git a/docs/src/ro/getting-started/update.md b/docs/src/ro/getting-started/update.md deleted file mode 100644 index 98e019fb..00000000 --- a/docs/src/ro/getting-started/update.md +++ /dev/null @@ -1,109 +0,0 @@ ---- -title: Update -sidebarDepth: 3 ---- - -# How to update 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 ⚡. - -## Update instructions - -0. ⚠️ Before any update, we highly recommend you backup your Castopod files and - database. - - - cf. - [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 - - - cf. - [Where can I find my 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 - - - ⚠️ 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/) - -3. On your server: - - - Remove all files except `.env` and `public/media` - - Copy the new files from the downloaded package into your server - - ::: info Note - - You may need to reset files permissions as during the install process. - Check [Security Concerns](./security.md). - - ::: - -4. Update your database schema from your `Castopod Admin` > `About` page or by - running: - - ```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! - -::: info Note - -Releases may come with additional update instructions (see -[releases page](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) - -::: - -## Fully Automated updates - -> Coming soon... 👀 - -## Frequently asked questions (FAQ) - -### Where can I find my Castopod version? - -Go to your Castopod admin panel, the version is displayed on the bottom left -corner. - -Alternatively, you can find the version in the `app > Config > Constants.php` -file. - -### I haven't updated my instance in a long time… What should I do? - -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. - -> You may want to backup your instance depending on how long you haven't updated -> Castopod. - -For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to -`v1.0.0-beta.1`: - -0. (highly recommended) Make a backup of your files and database. - -1. Download the latest release, overwrite your files whilst keeping `.env` and - `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`, - `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`. - -3. ✨ Enjoy your fresh instance, you're all done! - -### Should I make a backup before updating? - -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… diff --git a/docs/src/ro/index.md b/docs/src/ro/index.md deleted file mode 100644 index 7f012c6c..00000000 --- a/docs/src/ro/index.md +++ /dev/null @@ -1,300 +0,0 @@ ---- -sidebarDepth: 2 ---- - -# Welcome 👋 - -[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] - -Castopod is a free & open-source hosting platform made for podcasters who want -engage and interact with their audience. - -Castopod is easy to install and was built on top of -[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very -small footprint. - -
- Install -
- -## Features - -- 🌱  Free & open-source (AGPL v3 License) -- 🔐  Focused on data sovereignty: your content, audience, and analytics - belong to you, and you only -- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, - chapters, location, persons, soundbites, … -- 💬  Built-in social network: - - 🚀  Castopod is part of the Fediverse, a decentralized social network - - ❤️  Create posts, share, favourite, and comment on episodes -- 📈  Built-in analytics: - - ⚖️  GDPR / CCPA / LGPD compliant - - 🪙  Standard IABv2 audience measurement - - 🏡  On-premises analytics, no third party involved -- 📢  Built-in marketing tools: - - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) - - 📱  PWA: install as a standalone app - - 🎨  Customizable theme colors - - 🎬  Generate ready-to-share Video clips from episodes - - 🔉  Generate soundbites - - ▶️  Embeddable player, embed your episodes on any website -- 💸  Monetization: - - 🔗  Funding links - - 📲  listen-to-click ads - - 🤝  value4value / WebMonetization - - 💎  Premium podcasts -- 📡  Publish your episodes everywhere with RSS: - - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, - Google Podcasts, Deezer, Podcast Addict, Podfriend, … - - ⚡  Broadcast your episodes instantly with WebSub -- 📥  Podcast import: move your existing podcast into Castopod -- 📤  Move your podcast out of Castopod -- 🔀  Multi-tenant: host as many podcasts as you want -- 👥  Multi-user: add contributors and set roles -- 🌎  i18n support: translated in English, French, Polish, German, - Brazilian Portuguese & Spanish… with - [more to come](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. - -It is in fact one of the only media to have stayed this way for a long time. - -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. - -With podcasting becoming more widely used, some companies are trying to shift it -towards a more controlled and centralized 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. - -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. - -## Comparison with other solutions - -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 you. - -### 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 it. - -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. - -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. - -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 journey. - -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. - -Finally, depending on your needs, Wordpress and Castopod can even live side by -side as they share the same requirements! - -### 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 was initially built around music. And later on, as the project -evolved, the ability to host podcasts was introduced. - -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, …). - -So, you should probably use Funkwhale if you want to host your music, and use -Castopod if you want to host your podcasts. - -### Castopod vs other podcast hosts - -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! - -Each of these solutions differ from one another, you may compare with the -[list of features](#features). - -That being said, there are two main differences with other podcasting solutions: - -- 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 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. - -## Contributing - -Love Castopod and would like to help? Take a look at the following documentation -to get you started. - -### Code of conduct - -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 tolerated. - -### Contributing 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. - -## Contributors ✨ - -Thanks goes to these wonderful people -([emoji key](https://allcontributors.org/docs/en/emoji-key)): - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Ewen
Ewen

🌍 🤔 💻
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
KrzysztofDomanczyk
KrzysztofDomanczyk

💻
Guy Martin
Guy Martin

🐛 💻
- - - - - - -This project follows the -[all-contributors](https://github.com/all-contributors/all-contributors) -specification. Contributions of any kind welcome! - -## Contact - -You may reach us for help or ask any question you have on: - -- [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) - -Alternatively, you can follow us on social media platforms to get news about -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 - -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). - -
- Ad Aures Logo - NLnet Logo -
- -## License - -[GNU Affero General Public License v3.0](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 - -[release]: https://code.castopod.org/adaures/castopod/-/releases -[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md -[contributions]: https://code.castopod.org/adaures/castopod/-/issues -[semantic-release]: https://github.com/semantic-release/semantic-release -[discord]: https://castopod.org/discord -[stars]: https://github.com/ad-aures/castopod/stargazers -[crowdin]: https://translate.castopod.org/project/castopod diff --git a/docs/src/ru/getting-started/_category_.json b/docs/src/ru/getting-started/_category_.json deleted file mode 100644 index 877a378f..00000000 --- a/docs/src/ru/getting-started/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Getting Started", - "position": 2 -} diff --git a/docs/src/ru/getting-started/auth.md b/docs/src/ru/getting-started/auth.md deleted file mode 100644 index ff5d59c0..00000000 --- a/docs/src/ru/getting-started/auth.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -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 - - - -| 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 | - - - -### Instance permissions - - - -| 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. | - - - -## 2. Per podcast roles and permissions - -### Per podcast roles - - - -| 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, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| 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 | - - - -### Per podcast permissions - - - -| 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}. | - - diff --git a/docs/src/ru/getting-started/docker.md b/docs/src/ru/getting-started/docker.md deleted file mode 100644 index 12f01619..00000000 --- a/docs/src/ru/getting-started/docker.md +++ /dev/null @@ -1,160 +0,0 @@ ---- -title: Official Docker images -sidebarDepth: 3 ---- - -# Official Docker images - -Castopod pushes 3 Docker images to the Docker Hub during its automated build -process: - -- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all - in one castopod image using nginx unit -- [**`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 - -Additionally, Castopod requires a MySQL-compatible database. A Redis database -can be added as a cache handler. - -## Supported tags - -- `develop` [unstable], latest development branch build -- `beta` [stable], latest beta version build -- `latest` [stable], latest version build -- `1.x.x` [stable], specific version build (since `1.0.0`) - -## Example usage - -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: - - ```yml - version: "3.7" - - services: - app: - image: castopod/castopod:latest - container_name: "castopod-app" - volumes: - - castopod-media:/var/www/castopod/public/media - environment: - MYSQL_DATABASE: castopod - MYSQL_USER: castopod - MYSQL_PASSWORD: changeme - CP_BASEURL: "https://castopod.example.com" - CP_ANALYTICS_SALT: changeme - CP_CACHE_HANDLER: redis - CP_REDIS_HOST: redis - CP_REDIS_PASSWORD: changeme - networks: - - castopod-app - - castopod-db - ports: - - 8000:8000 - restart: unless-stopped - - mariadb: - image: mariadb:10.5 - container_name: "castopod-mariadb" - networks: - - castopod-db - volumes: - - castopod-db:/var/lib/mysql - environment: - MYSQL_ROOT_PASSWORD: changeme - MYSQL_DATABASE: castopod - MYSQL_USER: castopod - MYSQL_PASSWORD: changeme - restart: unless-stopped - - redis: - image: redis:7.0-alpine - container_name: "castopod-redis" - command: --requirepass changeme - volumes: - - castopod-cache:/data - networks: - - castopod-app - - volumes: - castopod-media: - castopod-db: - castopod-cache: - - networks: - castopod-app: - castopod-db: - ``` - - You have to adapt some variables to your needs (e.g. `CP_BASEURL`, - `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). - -3. Setup a reverse proxy for 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/): - - ``` - #castopod - castopod.example.com { - reverse_proxy localhost:8000 - } - ``` - -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! - -5. You're all set, start podcasting! 🎙️🚀 - -## Environment Variables - -- **castopod/castopod** and **castopod/app** - - | Variable name | Type (`default`) | Default | - | ------------------------------------- | ----------------------- | ---------------- | - | **`CP_BASEURL`** | string | `undefined` | - | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | - | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | - | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | - | **`CP_ANALYTICS_SALT`** | string | `undefined` | - | **`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_REDIS_HOST`** | ?string | `"localhost"` | - | **`CP_REDIS_PASSWORD`** | ?string | `null` | - | **`CP_REDIS_PORT`** | ?number | `6379` | - | **`CP_REDIS_DATABASE`** | ?number | `0` | - | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | - | **`CP_EMAIL_FROM`** | ?string | `undefined` | - | **`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_ENABLE_2FA`** | ?boolean | `undefined` | - | **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` | - | **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` | - | **`CP_MEDIA_S3_KEY`** | ?string | `undefined` | - | **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` | - | **`CP_MEDIA_S3_REGION`** | ?string | `undefined` | - | **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` | - | **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` | - | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` | - | **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` | - | **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` | - | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | - | **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` | - | **`CP_TIMEOUT`** | ?number | `900` | - -- **castopod/web-server** - - | Variable name | Type | Default | - | ---------------------- | --------------------- | ------- | - | **`CP_APP_HOSTNAME`** | ?string | `"app"` | - | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | - | **`CP_TIMEOUT`** | ?number | `900` | diff --git a/docs/src/ru/getting-started/security.md b/docs/src/ru/getting-started/security.md deleted file mode 100644 index e205698d..00000000 --- a/docs/src/ru/getting-started/security.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: Security ---- - -# Security concerns - -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). - -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): - -- `writable/` folder must be **readable** and **writable**. -- `public/media/` folder must be **readable** and **writable**. -- any other file must be set to **readonly**. - -For instance, if you are using Apache or NGINX with Ubuntu you may do the -following: - -```bash -sudo chown -R root:root /path/to/castopod -sudo chown -R www-data:www-data /path/to/castopod/writable -sudo chown -R www-data:www-data /path/to/castopod/public/media -``` diff --git a/docs/src/ru/index.md b/docs/src/ru/index.md deleted file mode 100644 index 7f012c6c..00000000 --- a/docs/src/ru/index.md +++ /dev/null @@ -1,300 +0,0 @@ ---- -sidebarDepth: 2 ---- - -# Welcome 👋 - -[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] - -Castopod is a free & open-source hosting platform made for podcasters who want -engage and interact with their audience. - -Castopod is easy to install and was built on top of -[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very -small footprint. - -
- Install -
- -## Features - -- 🌱  Free & open-source (AGPL v3 License) -- 🔐  Focused on data sovereignty: your content, audience, and analytics - belong to you, and you only -- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, - chapters, location, persons, soundbites, … -- 💬  Built-in social network: - - 🚀  Castopod is part of the Fediverse, a decentralized social network - - ❤️  Create posts, share, favourite, and comment on episodes -- 📈  Built-in analytics: - - ⚖️  GDPR / CCPA / LGPD compliant - - 🪙  Standard IABv2 audience measurement - - 🏡  On-premises analytics, no third party involved -- 📢  Built-in marketing tools: - - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) - - 📱  PWA: install as a standalone app - - 🎨  Customizable theme colors - - 🎬  Generate ready-to-share Video clips from episodes - - 🔉  Generate soundbites - - ▶️  Embeddable player, embed your episodes on any website -- 💸  Monetization: - - 🔗  Funding links - - 📲  listen-to-click ads - - 🤝  value4value / WebMonetization - - 💎  Premium podcasts -- 📡  Publish your episodes everywhere with RSS: - - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, - Google Podcasts, Deezer, Podcast Addict, Podfriend, … - - ⚡  Broadcast your episodes instantly with WebSub -- 📥  Podcast import: move your existing podcast into Castopod -- 📤  Move your podcast out of Castopod -- 🔀  Multi-tenant: host as many podcasts as you want -- 👥  Multi-user: add contributors and set roles -- 🌎  i18n support: translated in English, French, Polish, German, - Brazilian Portuguese & Spanish… with - [more to come](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. - -It is in fact one of the only media to have stayed this way for a long time. - -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. - -With podcasting becoming more widely used, some companies are trying to shift it -towards a more controlled and centralized 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. - -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. - -## Comparison with other solutions - -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 you. - -### 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 it. - -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. - -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. - -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 journey. - -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. - -Finally, depending on your needs, Wordpress and Castopod can even live side by -side as they share the same requirements! - -### 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 was initially built around music. And later on, as the project -evolved, the ability to host podcasts was introduced. - -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, …). - -So, you should probably use Funkwhale if you want to host your music, and use -Castopod if you want to host your podcasts. - -### Castopod vs other podcast hosts - -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! - -Each of these solutions differ from one another, you may compare with the -[list of features](#features). - -That being said, there are two main differences with other podcasting solutions: - -- 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 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. - -## Contributing - -Love Castopod and would like to help? Take a look at the following documentation -to get you started. - -### Code of conduct - -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 tolerated. - -### Contributing 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. - -## Contributors ✨ - -Thanks goes to these wonderful people -([emoji key](https://allcontributors.org/docs/en/emoji-key)): - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Ewen
Ewen

🌍 🤔 💻
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
KrzysztofDomanczyk
KrzysztofDomanczyk

💻
Guy Martin
Guy Martin

🐛 💻
- - - - - - -This project follows the -[all-contributors](https://github.com/all-contributors/all-contributors) -specification. Contributions of any kind welcome! - -## Contact - -You may reach us for help or ask any question you have on: - -- [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) - -Alternatively, you can follow us on social media platforms to get news about -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 - -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). - -
- Ad Aures Logo - NLnet Logo -
- -## License - -[GNU Affero General Public License v3.0](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 - -[release]: https://code.castopod.org/adaures/castopod/-/releases -[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md -[contributions]: https://code.castopod.org/adaures/castopod/-/issues -[semantic-release]: https://github.com/semantic-release/semantic-release -[discord]: https://castopod.org/discord -[stars]: https://github.com/ad-aures/castopod/stargazers -[crowdin]: https://translate.castopod.org/project/castopod diff --git a/docs/src/sk/getting-started/auth.md b/docs/src/sk/getting-started/auth.md deleted file mode 100644 index ff5d59c0..00000000 --- a/docs/src/sk/getting-started/auth.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -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 - - - -| 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 | - - - -### Instance permissions - - - -| 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. | - - - -## 2. Per podcast roles and permissions - -### Per podcast roles - - - -| 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, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| 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 | - - - -### Per podcast permissions - - - -| 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}. | - - diff --git a/docs/src/sk/getting-started/docker.md b/docs/src/sk/getting-started/docker.md deleted file mode 100644 index 12f01619..00000000 --- a/docs/src/sk/getting-started/docker.md +++ /dev/null @@ -1,160 +0,0 @@ ---- -title: Official Docker images -sidebarDepth: 3 ---- - -# Official Docker images - -Castopod pushes 3 Docker images to the Docker Hub during its automated build -process: - -- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all - in one castopod image using nginx unit -- [**`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 - -Additionally, Castopod requires a MySQL-compatible database. A Redis database -can be added as a cache handler. - -## Supported tags - -- `develop` [unstable], latest development branch build -- `beta` [stable], latest beta version build -- `latest` [stable], latest version build -- `1.x.x` [stable], specific version build (since `1.0.0`) - -## Example usage - -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: - - ```yml - version: "3.7" - - services: - app: - image: castopod/castopod:latest - container_name: "castopod-app" - volumes: - - castopod-media:/var/www/castopod/public/media - environment: - MYSQL_DATABASE: castopod - MYSQL_USER: castopod - MYSQL_PASSWORD: changeme - CP_BASEURL: "https://castopod.example.com" - CP_ANALYTICS_SALT: changeme - CP_CACHE_HANDLER: redis - CP_REDIS_HOST: redis - CP_REDIS_PASSWORD: changeme - networks: - - castopod-app - - castopod-db - ports: - - 8000:8000 - restart: unless-stopped - - mariadb: - image: mariadb:10.5 - container_name: "castopod-mariadb" - networks: - - castopod-db - volumes: - - castopod-db:/var/lib/mysql - environment: - MYSQL_ROOT_PASSWORD: changeme - MYSQL_DATABASE: castopod - MYSQL_USER: castopod - MYSQL_PASSWORD: changeme - restart: unless-stopped - - redis: - image: redis:7.0-alpine - container_name: "castopod-redis" - command: --requirepass changeme - volumes: - - castopod-cache:/data - networks: - - castopod-app - - volumes: - castopod-media: - castopod-db: - castopod-cache: - - networks: - castopod-app: - castopod-db: - ``` - - You have to adapt some variables to your needs (e.g. `CP_BASEURL`, - `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). - -3. Setup a reverse proxy for 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/): - - ``` - #castopod - castopod.example.com { - reverse_proxy localhost:8000 - } - ``` - -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! - -5. You're all set, start podcasting! 🎙️🚀 - -## Environment Variables - -- **castopod/castopod** and **castopod/app** - - | Variable name | Type (`default`) | Default | - | ------------------------------------- | ----------------------- | ---------------- | - | **`CP_BASEURL`** | string | `undefined` | - | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | - | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | - | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | - | **`CP_ANALYTICS_SALT`** | string | `undefined` | - | **`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_REDIS_HOST`** | ?string | `"localhost"` | - | **`CP_REDIS_PASSWORD`** | ?string | `null` | - | **`CP_REDIS_PORT`** | ?number | `6379` | - | **`CP_REDIS_DATABASE`** | ?number | `0` | - | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | - | **`CP_EMAIL_FROM`** | ?string | `undefined` | - | **`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_ENABLE_2FA`** | ?boolean | `undefined` | - | **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` | - | **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` | - | **`CP_MEDIA_S3_KEY`** | ?string | `undefined` | - | **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` | - | **`CP_MEDIA_S3_REGION`** | ?string | `undefined` | - | **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` | - | **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` | - | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` | - | **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` | - | **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` | - | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | - | **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` | - | **`CP_TIMEOUT`** | ?number | `900` | - -- **castopod/web-server** - - | Variable name | Type | Default | - | ---------------------- | --------------------- | ------- | - | **`CP_APP_HOSTNAME`** | ?string | `"app"` | - | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | - | **`CP_TIMEOUT`** | ?number | `900` | diff --git a/docs/src/sk/getting-started/update.md b/docs/src/sk/getting-started/update.md deleted file mode 100644 index 1c840346..00000000 --- a/docs/src/sk/getting-started/update.md +++ /dev/null @@ -1,109 +0,0 @@ ---- -title: Aktualizácia -sidebarDepth: 3 ---- - -# Ako aktualizovať 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 ⚡. - -## Update instructions - -0. ⚠️ Before any update, we highly recommend you backup your Castopod files and - database. - - - cf. - [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 - - - cf. - [Where can I find my 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 - - - ⚠️ 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/) - -3. On your server: - - - Remove all files except `.env` and `public/media` - - Copy the new files from the downloaded package into your server - - ::: info Note - - You may need to reset files permissions as during the install process. - Check [Security Concerns](./security.md). - - ::: - -4. Update your database schema from your `Castopod Admin` > `About` page or by - running: - - ```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! - -::: info Note - -Releases may come with additional update instructions (see -[releases page](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) - -::: - -## Fully Automated updates - -> Coming soon... 👀 - -## Frequently asked questions (FAQ) - -### Where can I find my Castopod version? - -Go to your Castopod admin panel, the version is displayed on the bottom left -corner. - -Alternatively, you can find the version in the `app > Config > Constants.php` -file. - -### I haven't updated my instance in a long time… What should I do? - -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. - -> You may want to backup your instance depending on how long you haven't updated -> Castopod. - -For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to -`v1.0.0-beta.1`: - -0. (highly recommended) Make a backup of your files and database. - -1. Download the latest release, overwrite your files whilst keeping `.env` and - `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`, - `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`. - -3. ✨ Enjoy your fresh instance, you're all done! - -### Should I make a backup before updating? - -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… diff --git a/docs/src/sk/index.md b/docs/src/sk/index.md deleted file mode 100644 index 04bdf108..00000000 --- a/docs/src/sk/index.md +++ /dev/null @@ -1,300 +0,0 @@ ---- -sidebarDepth: 2 ---- - -# Welcome 👋 - -[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] - -Castopod is a free & open-source hosting platform made for podcasters who want -engage and interact with their audience. - -Castopod is easy to install and was built on top of -[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very -small footprint. - -
- Install -
- -## Features - -- 🌱  Free & open-source (AGPL v3 License) -- 🔐  Focused on data sovereignty: your content, audience, and analytics - belong to you, and you only -- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, - chapters, location, persons, soundbites, … -- 💬  Built-in social network: - - 🚀  Castopod is part of the Fediverse, a decentralized social network - - ❤️  Create posts, share, favourite, and comment on episodes -- 📈  Built-in analytics: - - ⚖️  GDPR / CCPA / LGPD compliant - - 🪙  Standard IABv2 audience measurement - - 🏡  On-premises analytics, no third party involved -- 📢  Built-in marketing tools: - - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) - - 📱  PWA: install as a standalone app - - 🎨  Customizable theme colors - - 🎬  Generate ready-to-share Video clips from episodes - - 🔉  Generate soundbites - - ▶️  Embeddable player, embed your episodes on any website -- 💸  Monetization: - - 🔗  Funding links - - 📲  listen-to-click ads - - 🤝  value4value / WebMonetization - - 💎  Premium podcasts -- 📡  Publish your episodes everywhere with RSS: - - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, - Google Podcasts, Deezer, Podcast Addict, Podfriend, … - - ⚡  Broadcast your episodes instantly with WebSub -- 📥  Podcast import: move your existing podcast into Castopod -- 📤  Move your podcast out of Castopod -- 🔀  Multi-tenant: host as many podcasts as you want -- 👥  Multi-user: add contributors and set roles -- 🌎  i18n support: translated in English, French, Polish, German, - Brazilian Portuguese & Spanish… with - [more to come](https://translate.castopod.org)! - -## Motivácia - -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. - -It is in fact one of the only media to have stayed this way for a long time. - -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. - -With podcasting becoming more widely used, some companies are trying to shift it -towards a more controlled and centralized 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. - -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. - -## Comparison with other solutions - -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 you. - -### 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 it. - -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. - -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. - -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 journey. - -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. - -Finally, depending on your needs, Wordpress and Castopod can even live side by -side as they share the same requirements! - -### 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 was initially built around music. And later on, as the project -evolved, the ability to host podcasts was introduced. - -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, …). - -So, you should probably use Funkwhale if you want to host your music, and use -Castopod if you want to host your podcasts. - -### Castopod vs other podcast hosts - -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! - -Each of these solutions differ from one another, you may compare with the -[list of features](#features). - -That being said, there are two main differences with other podcasting solutions: - -- 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 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. - -## Contributing - -Love Castopod and would like to help? Take a look at the following documentation -to get you started. - -### Code of conduct - -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 tolerated. - -### Contributing 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. - -## Contributors ✨ - -Thanks goes to these wonderful people -([emoji key](https://allcontributors.org/docs/en/emoji-key)): - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Ewen
Ewen

🌍 🤔 💻
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
KrzysztofDomanczyk
KrzysztofDomanczyk

💻
Guy Martin
Guy Martin

🐛 💻
- - - - - - -This project follows the -[all-contributors](https://github.com/all-contributors/all-contributors) -specification. Contributions of any kind welcome! - -## Contact - -You may reach us for help or ask any question you have on: - -- [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) - -Alternatively, you can follow us on social media platforms to get news about -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 - -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). - -
- Ad Aures Logo - NLnet Logo -
- -## License - -[GNU Affero General Public License v3.0](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 - -[release]: https://code.castopod.org/adaures/castopod/-/releases -[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md -[contributions]: https://code.castopod.org/adaures/castopod/-/issues -[semantic-release]: https://github.com/semantic-release/semantic-release -[discord]: https://castopod.org/discord -[stars]: https://github.com/ad-aures/castopod/stargazers -[crowdin]: https://translate.castopod.org/project/castopod diff --git a/docs/src/sr-Latn/getting-started/auth.md b/docs/src/sr-Latn/getting-started/auth.md deleted file mode 100644 index 663557e1..00000000 --- a/docs/src/sr-Latn/getting-started/auth.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -title: Verifikacija i Odobravanje -sidebarDepth: 3 ---- - -# Verifikacija i Odobravanje - -Castopod upravlja verifikacijom i odobravanjem koristeći `codeigniter/shield` u -paru sa prilagođenim pravilima. Uloge i dozvole su definisane na dva nivoa: - -1. [po nalogu](#1-instance-wide-roles-and-permissions) -2. [po podkastu](#2-per-podcast-roles-and-permissions) - -## 1. Uloge i dozvole po nalogu - -### Uloge po nalogu - - - -| uloga | opis | dozvola | -| ------------------- | -------------------------------------------- | ------------------------------------------------------------------------------------------ | -| Super administrator | Ima kompletnu kontrolu nad Castopod nalogom. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Menadžer | Upravlja sadržajem na Castopod-u. | podcasts.create, podcasts.import, persons.manage, pages.manage | -| Podkaster | Opšti korisnici Castopod-a. | admin.access | - - - -### Dozvole po nalogu - - - -| dozvola | opis | -| ----------------------- | --------------------------------------------------------------- | -| admin.access | Može pristupiti administratorskom delu Castopod-a. | -| admin.settings | Može pristupiti podešavanjima Castopod-a. | -| users.manage | Može upravljati korisnicima Castopod-a. | -| persons.manage | Može upravljati osobama. | -| pages.manage | Može upravljati stranicama. | -| podcasts.view | Može videti sve podkaste. | -| podcasts.create | Može napraviti nove podkaste. | -| podcasts.import | Može uvesti nove podkaste. | -| fediverse.manage-blocks | Može blokirati interakciju Castopoda i fediverse naloga/domena. | - - - -## 2. Uloge i dozvole po podkastu - -### Uloge po podkastu - - - -| uloga | opis | dozvola | -| ------------- | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Administrator | Ima kompletnu kontrolu nad podkastom #{id}. | \* | -| Urednik | Upravlja sadržajem i objavama podkasta #{id}. | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| Autor | Upravlja sadržajem podkasta #{id} ali ne može da ga objavi. | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| Gost | Saradnik na podkastu #{id}. | view, episodes.view | - - - -### Dozvole po podkastu - - - -| dozvola | opis | -| ---------------------------- | -------------------------------------------------------------------------------------- | -| view | Može videti upravljačku tablu i analitiku podkasta #{id}. | -| edit | Može uređivati podkast #{id}. | -| delete | Može obrisati podkast #{id}. | -| manage-import | Može upravljati uvozom podkasta #{id}. | -| manage-persons | Može upravljati osobama na podkastu #{id}. | -| manage-subscriptions | Može upravljati pretplatama na podkast #{id}. | -| manage-contributors | Može upravljati saradnicima na podkastu #{id}. | -| manage-platforms | Može ubaciti/izbaciti veze ka platformama podkasta #{id}. | -| manage-publications | Može objaviti podkast #{id}. | -| manage-notifications | Može videti obaveštenja i označiti ih kao pročitana za podkast #{id}. | -| interact-as | Može da komunicira kao podkast #{id} i deli, odgovara na i stavlja u omiljene postove. | -| episodes.view | Može videti upravljačku tablu i analitiku podkasta #{id}. | -| episodes.create | Može napraviti epizodu podkasta #{id}. | -| episodes.edit | Može uređivati epizodu podkasta #{id}. | -| episodes.delete | Može obrisati epizodu podkasta #{id}. | -| episodes.manage-persons | Može upravljati pretplatama na podkast #{id}. | -| episodes.manage-clips | Može upravljati video klipovima i zvučnim isečcima podkasta #{id}. | -| episodes.manage-publications | Može objaviti podkast #{id}. | -| episodes.manage-comments | Može dodati/obrisati komentar na epizodi podkasta #{id}. | - - diff --git a/docs/src/sr-Latn/index.md b/docs/src/sr-Latn/index.md deleted file mode 100644 index 9e8a4669..00000000 --- a/docs/src/sr-Latn/index.md +++ /dev/null @@ -1,302 +0,0 @@ ---- -sidebarDepth: 2 ---- - -# Dobrodošli 👋 - -[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] - -Castopod je besplatna platforma otvorenog koda napravljena za podkastere koji -žele interakciju sa svojom publikom. - -Castopod se lako instalira i napravljen je na -[CodeIgniter4](https://codeigniter.com/), moćnom PHP okviru sa jako malim -otiskom (footprint). - - - -## Funkcionalnosti - -- 🌱 Besplatan i otvorenog koda (AGPL v3 License) -- 🔐 Fokusiran an suverenitet podataka: vaš sadržaj, publika i analitika pripada - vama i samo vama -- 🪄  Podkasting 2.0 funkcionalnosti: GUID, zaključan, transkripti, - podrška, poglavlja, lokacija, posobe, zvučni isečci, … -- 💬  Ugrađena društvena mreža: - - 🚀  Castopod je deo Fediversa, decentralizovane društvene mreže - - ❤️  Napravite objave, delite, dodajte u omiljene i komentarišite - epizode -- 📈  Ugrađena analitika: - - ⚖️  U skladu sa GDPR / CCPA / LGPD - - 🪙  Merenje publike putem IABv2 standarda - - 🏡  Analitika na licu mesta, bez uključenosti trećih strana -- 📢  Ugrađeni marketinški alati: - - ✅  SEO spremno (open-graph meta-tags, JSON-LD, …) - - 📱  PWA: instalirajte kao samostojeću aplikaciju - - 🎨  Prilagodljive boje teme - - 🎬  Napravite video isečke iz epizoda koji su spremni za deljenje - - 🔉  Napravite audio isečke - - ▶️  Plejer koji možete koristiti na svom sajtu (embed) -- 💸  Monetizacija: - - 🔗  Linkovi za podršku publike - - 📲  Slušaj i klikni reklame - - 🤝  value4value / Veb Monetizacija - - 💎  Premijum podkasti -- 📡  Objavite svoje epizode svugde uz RSS: - - 📱  Na svim agregatorima i aplikacijama: Podcast Index, Apple Podcasts, - Spotify, Google Podcasts, Deezer, Podcast Addict, Podfriend, … - - ⚡  Emitujte svoje epizode instant uz WebSub -- 📥  Uvoz podkasta: prebacite svoj postojeći podkast na Castopod -- 📤  Prebacite svoj podkast sa Castopod-a -- 🔀  Mreža: hostujte koliko god želite podkasta -- 👥  Više korisnika: dodajte saradnike i odredite njihove uloge -- 🌎  i18n podrška: prevedeno na engleski, francuski, poljski, nemački, - brazilski portugalski, španski… - [još jezika uskoro](https://translate.castopod.org)! - -## Motivacija - -Ekosistem podcasta je po prirodi decentralizovan: možete kreirati svoj podkast -kao RSS datoteku, objavite je na vebu i deliti svuda na mreži. - -To je zapravo jedan od retkih medija koji je ostao decentralizovan ovako dugo. - -Kako se upotreba razvija, sve više ljudi ulazi u podkaste: ili kao kreatori koji -pronalaze nove načine da podele svoje ideje ili kao slušaoci u potrazi za boljim -sadržajem. - -Kako podkasting postaje sve više korišćen, neke kompanije pokušavaju da ga -promene ka kontrolisanijem i centralizovanijem mediju. - -Castopod je stvoren u nastojanju da pruži otvorenu i održivu alternativu za -hostovanje vaših podkasta, promovišući decentralizaciju kako bi se osiguralo da -podkasterska kreativnost može da se izrazi. - -Ovaj projekat gura zajednica otvorenog koda, ponajviše -[Fedivers](https://fediverse.party/en/fediverse/) i -[Podcasting 2.0](https://podcastindex.org/) pokreti. - -## Poređenje sa drugim rešenjima - -Verujemo da jedno rešenje nije dobro za sve, već da sve zavisi od vaših potreba. -Tako da evo poređenja sa drugim alatima kako bi ste mogli da procenite da li je -Castopod prava stvar za vas. - -### Castopod protiv Wordpress-a - -Castopod je često nazivan "Wordpress-om za podkaste" zbog sličnosti koje deli sa -ovom ploatformom. U neku ruku ovo je tačno. I zapravo, Castopod bio je u velikoj -meri inspirisan Wordpress ekosistemom, videvši lakoću usvajanja od zajednice i -broja veb lokacija koje rade na njemu. - -Isto kao i Wordpress, Castopod je besplatan i otvorenog koda, napravljen -koristeći PHP i MySQL baze podataka i spakovan na način koji vam omogućava -jednostavnu instalaciju na većini veb servera. - -Wordpress je odličan način na napravite veb stranicu i upotpunite je dodatcima -kako bi dobili ono što želite. To je potpuno razvijen CMS koji vam pomaže da -dobijete bilo koju vrstu veb stranica na mreži. - -S druge strane, Castopod treba da odgovori na posebne potrebe podkastera, -fokusirajući se na podkasting, i ništa drugo. Nisu vam potrebni nikakvi dodatci -kako bi ste krenuli na svoje podkastersko putovanje. - -Ovo omogućava optimizaciju procesa specifičnih za podcasting: u rasponu od -kreiranja vaših podkasta i objavljivanja novih epizoda sve do emitovanja, -marketinga i analitike. - -Konačno, u zavisnosti od vaših potreba, Wordpress i Castopod mogu čak i da -funkcionišu zajedno jer dele iste zahteve! - -### Castopod protiv Funkwhale-a - -Funkwhale je moderan besplatni muzički server otvorenog koda koji se samostalno -hostuje. Kao i Castopod, Funkwhale je deo Fedivers-a, decentralizovane društvene -mreže što omogućava kompatibilnost između njih. - -Funkwhale je u početku napravljen oko muzike. Kasnije, kako je projekat -napredovao, dodata je opcija hostovanja podkasta. - -Za razliku od Funkwhale-a, Castopod je dizajniran i napravljen isključivo oko -podkasta. Ovo omogućava lakšu implementaciju funkcionalnosti koje se odnose na -podkast ekosistem, kao što su podkasting 2.0 alati (transkripti, poglavlja, -lokacije, osobe, ...). - -Tako da bi ste verovatno trebali da koristite Funkwhale ukoliko želite da -hostujete svoju muziku a Castopod ukoliko želite da hostujete svoje podkaste. - -### Castopod protiv drugih podkast hosting-a - -Postoji mnogo različitih rešenja za hostovanje vaših podkasta, neka od njih su -stvarno fantastična i [ dosta njih](https://podcastindex.org/apps) se -priključuje Podcasting 2.0 trendu, isto kao i Castopod! - -Svako od ovih rešenja se razlikuje jedno od drugog, možete ih uporediti sa -[listom funkcionalnosti](#features). - -Imajući to u vidu, postoje dve glavne razlike u odnosu na druga rešenja za -podkasting: - -- Castopod može biti samostalno hostovan i jedino je rešenje koje vam omogućava - da zadržite punu kontrolu nad onim što proizvodite. Takođe, pošto je otvorenog - koda, možete ga čak prilagoditi kako želite. - -- Castopod je jedino rešenje koje trenutno uklapa decentralizovanu društvenu - mrežu sa ActivityPub-om kao i mnoge funkcionalnosti podkasting-a 2.0, nadajući - se da će ih tako približiti. - -## Doprinos - -Volite Catsopod i voleli bi ste da pomognete? Pogledajte dokumentaciju koja -sledi kako bi ste počeli. - -### Kodeks ponašanja - -Castopod je usvojio Kodeks ponašanja kojeg očekujemo da se učesnici u projektu -pridržavaju. Molimo da pročitate -[Uputstvo Kodeksa ponašanja](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md) -kako bi ste razumeli šta hoće a šta neće biti tolerisano. - -### Vodič za doprinos - -Pročitajte naše [uputstvo za doprinos](../contributing/guidelines.md) kako bi -ste bolje razumeli naš proces razvoja, kako da predložite popravke bagova i -unapređenja i kako da napravite i testirate svoje promene na Castopod-u. - -## Saradnici ✨ - -Veliko hvala ovim divnim ljudima -([ključ emotikona](https://allcontributors.org/docs/en/emoji-key)): - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Ewen
Ewen

🌍 🤔 💻
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
forght
forght

🌍
glottis0q
glottis0q

🌍
glottis0q
glottis0q

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
KrzysztofDomanczyk
KrzysztofDomanczyk

💻
Guy Martin
Guy Martin

🐛 💻
- - - - - - -Ovaj projekat prati specifikaciju -[svih saradnika](https://github.com/all-contributors/all-contributors). -Doprinosi bilo koje vrste su dobrodošli! - -## Kontakt - -Možete nas kontaktirati za pomoć ili postaviti bilo koje pitanje koje imate na: - -- [Discord-u](https://castopod.org/discord) (za direktnu interakciju sa - programerima i zajednicom) -- [Listi pitanja](https://code.castopod.org/adaures/castopod/-/issues) (za - zahteve za funkcionalnostima i prijavu bagova) - -Takođe, možete nas pratiti na društvenim mrežama kako bi ste dobili najnovije -vesti o Castopod-u: - -- [podlibre.social](https://podlibre.social/@Castopod) (instanca Mastodon-a) -- [Twitter](https://twitter.com/castopod) -- [LinkedIn](https://linkedin.com/company/castopod) -- [Facebook](https://www.facebook.com/castopod) - -## Sponzori - -Tekući razvoj Castopod-a je omogućen uz podršku vas koji nas podržavate. Ukoliko -želite da pomognete, razmislite o -[sponzorisanju razvoja Castopod-a](https://opencollective.com/castopod/contribute). - -
- Ad Aures Logo - NLnet Logo -
- -## Licenca - -[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) - -Autorska prava © 2020-danas, [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 - -[release]: https://code.castopod.org/adaures/castopod/-/releases -[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md -[contributions]: https://code.castopod.org/adaures/castopod/-/issues -[semantic-release]: https://github.com/semantic-release/semantic-release -[discord]: https://castopod.org/discord -[stars]: https://github.com/ad-aures/castopod/stargazers -[crowdin]: https://translate.castopod.org/project/castopod diff --git a/docs/src/sr_Latn/getting-started/auth.md b/docs/src/sr_Latn/getting-started/auth.md deleted file mode 100644 index e9993d34..00000000 --- a/docs/src/sr_Latn/getting-started/auth.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -title: Verifikacija i Odobravanje -sidebarDepth: 3 ---- - -# Verifikacija i Odobravanje - -Castopod upravlja verifikacijom i odobravanjem koristeći `codeigniter/shield` u -paru sa prilagođenim pravilima. Uloge i dozvole su definisane na dva nivoa: - -1. [po nalogu](#1-instance-wide-roles-and-permissions) -2. [po podkastu](#2-per-podcast-roles-and-permissions) - -## 1. Uloge i dozvole po nalogu - -### Uloge po nalogu - - - -| 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 | - - - -### Dozvole po nalogu - - - -| 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. | - - - -## 2. Uloge i dozvole po podkastu - -### Uloge po podkastu - - - -| 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, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| 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 | - - - -### Dozvole po podkastu - - - -| 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}. | - - diff --git a/docs/src/sr_Latn/index.md b/docs/src/sr_Latn/index.md deleted file mode 100644 index 9e8a4669..00000000 --- a/docs/src/sr_Latn/index.md +++ /dev/null @@ -1,302 +0,0 @@ ---- -sidebarDepth: 2 ---- - -# Dobrodošli 👋 - -[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] - -Castopod je besplatna platforma otvorenog koda napravljena za podkastere koji -žele interakciju sa svojom publikom. - -Castopod se lako instalira i napravljen je na -[CodeIgniter4](https://codeigniter.com/), moćnom PHP okviru sa jako malim -otiskom (footprint). - - - -## Funkcionalnosti - -- 🌱 Besplatan i otvorenog koda (AGPL v3 License) -- 🔐 Fokusiran an suverenitet podataka: vaš sadržaj, publika i analitika pripada - vama i samo vama -- 🪄  Podkasting 2.0 funkcionalnosti: GUID, zaključan, transkripti, - podrška, poglavlja, lokacija, posobe, zvučni isečci, … -- 💬  Ugrađena društvena mreža: - - 🚀  Castopod je deo Fediversa, decentralizovane društvene mreže - - ❤️  Napravite objave, delite, dodajte u omiljene i komentarišite - epizode -- 📈  Ugrađena analitika: - - ⚖️  U skladu sa GDPR / CCPA / LGPD - - 🪙  Merenje publike putem IABv2 standarda - - 🏡  Analitika na licu mesta, bez uključenosti trećih strana -- 📢  Ugrađeni marketinški alati: - - ✅  SEO spremno (open-graph meta-tags, JSON-LD, …) - - 📱  PWA: instalirajte kao samostojeću aplikaciju - - 🎨  Prilagodljive boje teme - - 🎬  Napravite video isečke iz epizoda koji su spremni za deljenje - - 🔉  Napravite audio isečke - - ▶️  Plejer koji možete koristiti na svom sajtu (embed) -- 💸  Monetizacija: - - 🔗  Linkovi za podršku publike - - 📲  Slušaj i klikni reklame - - 🤝  value4value / Veb Monetizacija - - 💎  Premijum podkasti -- 📡  Objavite svoje epizode svugde uz RSS: - - 📱  Na svim agregatorima i aplikacijama: Podcast Index, Apple Podcasts, - Spotify, Google Podcasts, Deezer, Podcast Addict, Podfriend, … - - ⚡  Emitujte svoje epizode instant uz WebSub -- 📥  Uvoz podkasta: prebacite svoj postojeći podkast na Castopod -- 📤  Prebacite svoj podkast sa Castopod-a -- 🔀  Mreža: hostujte koliko god želite podkasta -- 👥  Više korisnika: dodajte saradnike i odredite njihove uloge -- 🌎  i18n podrška: prevedeno na engleski, francuski, poljski, nemački, - brazilski portugalski, španski… - [još jezika uskoro](https://translate.castopod.org)! - -## Motivacija - -Ekosistem podcasta je po prirodi decentralizovan: možete kreirati svoj podkast -kao RSS datoteku, objavite je na vebu i deliti svuda na mreži. - -To je zapravo jedan od retkih medija koji je ostao decentralizovan ovako dugo. - -Kako se upotreba razvija, sve više ljudi ulazi u podkaste: ili kao kreatori koji -pronalaze nove načine da podele svoje ideje ili kao slušaoci u potrazi za boljim -sadržajem. - -Kako podkasting postaje sve više korišćen, neke kompanije pokušavaju da ga -promene ka kontrolisanijem i centralizovanijem mediju. - -Castopod je stvoren u nastojanju da pruži otvorenu i održivu alternativu za -hostovanje vaših podkasta, promovišući decentralizaciju kako bi se osiguralo da -podkasterska kreativnost može da se izrazi. - -Ovaj projekat gura zajednica otvorenog koda, ponajviše -[Fedivers](https://fediverse.party/en/fediverse/) i -[Podcasting 2.0](https://podcastindex.org/) pokreti. - -## Poređenje sa drugim rešenjima - -Verujemo da jedno rešenje nije dobro za sve, već da sve zavisi od vaših potreba. -Tako da evo poređenja sa drugim alatima kako bi ste mogli da procenite da li je -Castopod prava stvar za vas. - -### Castopod protiv Wordpress-a - -Castopod je često nazivan "Wordpress-om za podkaste" zbog sličnosti koje deli sa -ovom ploatformom. U neku ruku ovo je tačno. I zapravo, Castopod bio je u velikoj -meri inspirisan Wordpress ekosistemom, videvši lakoću usvajanja od zajednice i -broja veb lokacija koje rade na njemu. - -Isto kao i Wordpress, Castopod je besplatan i otvorenog koda, napravljen -koristeći PHP i MySQL baze podataka i spakovan na način koji vam omogućava -jednostavnu instalaciju na većini veb servera. - -Wordpress je odličan način na napravite veb stranicu i upotpunite je dodatcima -kako bi dobili ono što želite. To je potpuno razvijen CMS koji vam pomaže da -dobijete bilo koju vrstu veb stranica na mreži. - -S druge strane, Castopod treba da odgovori na posebne potrebe podkastera, -fokusirajući se na podkasting, i ništa drugo. Nisu vam potrebni nikakvi dodatci -kako bi ste krenuli na svoje podkastersko putovanje. - -Ovo omogućava optimizaciju procesa specifičnih za podcasting: u rasponu od -kreiranja vaših podkasta i objavljivanja novih epizoda sve do emitovanja, -marketinga i analitike. - -Konačno, u zavisnosti od vaših potreba, Wordpress i Castopod mogu čak i da -funkcionišu zajedno jer dele iste zahteve! - -### Castopod protiv Funkwhale-a - -Funkwhale je moderan besplatni muzički server otvorenog koda koji se samostalno -hostuje. Kao i Castopod, Funkwhale je deo Fedivers-a, decentralizovane društvene -mreže što omogućava kompatibilnost između njih. - -Funkwhale je u početku napravljen oko muzike. Kasnije, kako je projekat -napredovao, dodata je opcija hostovanja podkasta. - -Za razliku od Funkwhale-a, Castopod je dizajniran i napravljen isključivo oko -podkasta. Ovo omogućava lakšu implementaciju funkcionalnosti koje se odnose na -podkast ekosistem, kao što su podkasting 2.0 alati (transkripti, poglavlja, -lokacije, osobe, ...). - -Tako da bi ste verovatno trebali da koristite Funkwhale ukoliko želite da -hostujete svoju muziku a Castopod ukoliko želite da hostujete svoje podkaste. - -### Castopod protiv drugih podkast hosting-a - -Postoji mnogo različitih rešenja za hostovanje vaših podkasta, neka od njih su -stvarno fantastična i [ dosta njih](https://podcastindex.org/apps) se -priključuje Podcasting 2.0 trendu, isto kao i Castopod! - -Svako od ovih rešenja se razlikuje jedno od drugog, možete ih uporediti sa -[listom funkcionalnosti](#features). - -Imajući to u vidu, postoje dve glavne razlike u odnosu na druga rešenja za -podkasting: - -- Castopod može biti samostalno hostovan i jedino je rešenje koje vam omogućava - da zadržite punu kontrolu nad onim što proizvodite. Takođe, pošto je otvorenog - koda, možete ga čak prilagoditi kako želite. - -- Castopod je jedino rešenje koje trenutno uklapa decentralizovanu društvenu - mrežu sa ActivityPub-om kao i mnoge funkcionalnosti podkasting-a 2.0, nadajući - se da će ih tako približiti. - -## Doprinos - -Volite Catsopod i voleli bi ste da pomognete? Pogledajte dokumentaciju koja -sledi kako bi ste počeli. - -### Kodeks ponašanja - -Castopod je usvojio Kodeks ponašanja kojeg očekujemo da se učesnici u projektu -pridržavaju. Molimo da pročitate -[Uputstvo Kodeksa ponašanja](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md) -kako bi ste razumeli šta hoće a šta neće biti tolerisano. - -### Vodič za doprinos - -Pročitajte naše [uputstvo za doprinos](../contributing/guidelines.md) kako bi -ste bolje razumeli naš proces razvoja, kako da predložite popravke bagova i -unapređenja i kako da napravite i testirate svoje promene na Castopod-u. - -## Saradnici ✨ - -Veliko hvala ovim divnim ljudima -([ključ emotikona](https://allcontributors.org/docs/en/emoji-key)): - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Ewen
Ewen

🌍 🤔 💻
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
forght
forght

🌍
glottis0q
glottis0q

🌍
glottis0q
glottis0q

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
KrzysztofDomanczyk
KrzysztofDomanczyk

💻
Guy Martin
Guy Martin

🐛 💻
- - - - - - -Ovaj projekat prati specifikaciju -[svih saradnika](https://github.com/all-contributors/all-contributors). -Doprinosi bilo koje vrste su dobrodošli! - -## Kontakt - -Možete nas kontaktirati za pomoć ili postaviti bilo koje pitanje koje imate na: - -- [Discord-u](https://castopod.org/discord) (za direktnu interakciju sa - programerima i zajednicom) -- [Listi pitanja](https://code.castopod.org/adaures/castopod/-/issues) (za - zahteve za funkcionalnostima i prijavu bagova) - -Takođe, možete nas pratiti na društvenim mrežama kako bi ste dobili najnovije -vesti o Castopod-u: - -- [podlibre.social](https://podlibre.social/@Castopod) (instanca Mastodon-a) -- [Twitter](https://twitter.com/castopod) -- [LinkedIn](https://linkedin.com/company/castopod) -- [Facebook](https://www.facebook.com/castopod) - -## Sponzori - -Tekući razvoj Castopod-a je omogućen uz podršku vas koji nas podržavate. Ukoliko -želite da pomognete, razmislite o -[sponzorisanju razvoja Castopod-a](https://opencollective.com/castopod/contribute). - -
- Ad Aures Logo - NLnet Logo -
- -## Licenca - -[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) - -Autorska prava © 2020-danas, [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 - -[release]: https://code.castopod.org/adaures/castopod/-/releases -[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md -[contributions]: https://code.castopod.org/adaures/castopod/-/issues -[semantic-release]: https://github.com/semantic-release/semantic-release -[discord]: https://castopod.org/discord -[stars]: https://github.com/ad-aures/castopod/stargazers -[crowdin]: https://translate.castopod.org/project/castopod diff --git a/docs/src/styles/tailwind.css b/docs/src/styles/tailwind.css new file mode 100644 index 00000000..3dd1a175 --- /dev/null +++ b/docs/src/styles/tailwind.css @@ -0,0 +1,14 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +main { + h1, + h2, + h3, + h4, + h5, + h6 { + font-family: Rubik, sans-serif; + } +} diff --git a/docs/src/sv/getting-started/_category_.json b/docs/src/sv/getting-started/_category_.json deleted file mode 100644 index 877a378f..00000000 --- a/docs/src/sv/getting-started/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Getting Started", - "position": 2 -} diff --git a/docs/src/sv/getting-started/auth.md b/docs/src/sv/getting-started/auth.md deleted file mode 100644 index ff5d59c0..00000000 --- a/docs/src/sv/getting-started/auth.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -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 - - - -| 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 | - - - -### Instance permissions - - - -| 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. | - - - -## 2. Per podcast roles and permissions - -### Per podcast roles - - - -| 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, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| 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 | - - - -### Per podcast permissions - - - -| 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}. | - - diff --git a/docs/src/sv/index.md b/docs/src/sv/index.md deleted file mode 100644 index feeb7306..00000000 --- a/docs/src/sv/index.md +++ /dev/null @@ -1,301 +0,0 @@ ---- -sidebarDepth: 2 ---- - -# Välkommen 👋 - -[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] - -Castopod är en gratis hostingplattform med öppen källkod gjord för podcastare -som vill engagera och interagera med sin publik. - -Castopod är lätt att installera och byggdes ovanpå -[CodeIgniter4](https://codeigniter.com/), ett kraftfullt PHP-ramverk med ett -mycket litet fotavtryck. - - - -## Funktioner - -- 🌱  Gratis & öppen källkod (AGPL v3-licens) -- 🔐  Fokuserad på datasuveränitet: ditt innehåll, målgrupp och analys - tillhör dig, och du bara -- 🪄  Podcasting 2.0 funktioner: GUID, låst, avskrifter, finansiering, - kapitel, plats, personer, ljud, … -- 💬  Inbyggt socialt nätverk: - - 🚀  Castopod är en del av Fediverse, ett decentraliserat socialt - nätverk - - ❤️  Skapa inlägg, dela, favorit och kommentera avsnitt -- 📈  Inbyggd analys: - - ⚖️  GDPR / CCPA / LGPD kompatibel - - 🪙  Standard IABv2 målgruppsmätning - - 🏡  Lokalanalys, ingen tredje part involverad -- 📢  Inbyggda marknadsföringsverktyg: - - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) - - 📱  PWA: installera som en fristående app - - 🎨  Anpassningsbara temafärger - - 🎬  Generera att dela videoklipp från avsnitt - - 🔉  Generera ljudbitar - - ▶️  Inbäddbar spelare, bädda in dina avsnitt på valfri webbplats -- 💸  Monetization: - - 🔗  Finansierar länkar - - 📲  lista-att-klicka annonser - - 🤝  value4value / WebMonetization - - 💎  Premium podcasts -- 📡  Publicera dina avsnitt överallt med RSS: - - 📱  På alla index och appar: Podcast Index, Apple Podcasts, Spotify, - Google Podcasts, Deezer, Podcast Addict, Podfriend, … - - ⚡  Sänd dina avsnitt direkt med WebSub -- 📥  Podcast import: flytta din befintliga podcast till Castopod -- 📤  Flytta ut din podcast från Castopod -- 🔀  Flera hyresgäst: värd så många podcasts du vill -- 👥  Flera användare: lägg till bidragslämnare och ange roller -- 🌎  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. - -It is in fact one of the only media to have stayed this way for a long time. - -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. - -With podcasting becoming more widely used, some companies are trying to shift it -towards a more controlled and centralized 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. - -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. - -## 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 you. - -### 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 it. - -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. - -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. - -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 journey. - -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. - -Finally, depending on your needs, Wordpress and Castopod can even live side by -side as they share the same requirements! - -### 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 was initially built around music. And later on, as the project -evolved, the ability to host podcasts was introduced. - -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, …). - -So, you should probably use Funkwhale if you want to host your music, and use -Castopod if you want to host your podcasts. - -### 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! - -Each of these solutions differ from one another, you may compare with the -[list of features](#features). - -That being said, there are two main differences with other podcasting solutions: - -- 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 ä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å. - -## Hjälp till - -Love Castopod and would like to help? Take a look at the following documentation -to get you started. - -### 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 tolerated. - -### 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. - -## Alla bidragsgivare ✨ - -Thanks goes to these wonderful people -([emoji key](https://allcontributors.org/docs/en/emoji-key)): - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Ewen
Ewen

🌍 🤔 💻
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
KrzysztofDomanczyk
KrzysztofDomanczyk

💻
Guy Martin
Guy Martin

🐛 💻
- - - - - - -This project follows the -[all-contributors](https://github.com/all-contributors/all-contributors) -specification. Contributions of any kind welcome! - -## Kontakt - -You may reach us for help or ask any question you have on: - -- [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: - -- [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) - -## 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). - -
- Ad Aures Logo - NLnet Logo -
- -## Licens - -[GNU Affero General Public License v3.0](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 - -[release]: https://code.castopod.org/adaures/castopod/-/releases -[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md -[contributions]: https://code.castopod.org/adaures/castopod/-/issues -[semantic-release]: https://github.com/semantic-release/semantic-release -[discord]: https://castopod.org/discord -[stars]: https://github.com/ad-aures/castopod/stargazers -[crowdin]: https://translate.castopod.org/project/castopod diff --git a/docs/src/uk/getting-started/auth.md b/docs/src/uk/getting-started/auth.md deleted file mode 100644 index f2548d7e..00000000 --- a/docs/src/uk/getting-started/auth.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -title: Authentication & Authorization -sidebarDepth: 3 ---- - -# Аутентифікація & Авторизація - -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 - - - -| role | description | permissions | -| ---------- | ----------------------------------- | ------------------------------------------------------------------------------------------ | -| Суперадмін | Has complete control over Castopod. | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| Менеджер | Manages Castopod's content. | podcasts.create, podcasts.import, persons.manage, pages.manage | -| Підкастер | General users of Castopod. | admin.access | - - - -### Instance permissions - - - -| permission | Опис | -| ----------------------- | ------------------------------------------------------------------ | -| 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. | - - - -## 2. Per podcast roles and permissions - -### Per podcast roles - - - -| 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, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| 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 | - - - -### Per podcast permissions - - - -| 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}. | - - diff --git a/docs/src/uk/getting-started/docker.md b/docs/src/uk/getting-started/docker.md deleted file mode 100644 index 12f01619..00000000 --- a/docs/src/uk/getting-started/docker.md +++ /dev/null @@ -1,160 +0,0 @@ ---- -title: Official Docker images -sidebarDepth: 3 ---- - -# Official Docker images - -Castopod pushes 3 Docker images to the Docker Hub during its automated build -process: - -- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all - in one castopod image using nginx unit -- [**`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 - -Additionally, Castopod requires a MySQL-compatible database. A Redis database -can be added as a cache handler. - -## Supported tags - -- `develop` [unstable], latest development branch build -- `beta` [stable], latest beta version build -- `latest` [stable], latest version build -- `1.x.x` [stable], specific version build (since `1.0.0`) - -## Example usage - -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: - - ```yml - version: "3.7" - - services: - app: - image: castopod/castopod:latest - container_name: "castopod-app" - volumes: - - castopod-media:/var/www/castopod/public/media - environment: - MYSQL_DATABASE: castopod - MYSQL_USER: castopod - MYSQL_PASSWORD: changeme - CP_BASEURL: "https://castopod.example.com" - CP_ANALYTICS_SALT: changeme - CP_CACHE_HANDLER: redis - CP_REDIS_HOST: redis - CP_REDIS_PASSWORD: changeme - networks: - - castopod-app - - castopod-db - ports: - - 8000:8000 - restart: unless-stopped - - mariadb: - image: mariadb:10.5 - container_name: "castopod-mariadb" - networks: - - castopod-db - volumes: - - castopod-db:/var/lib/mysql - environment: - MYSQL_ROOT_PASSWORD: changeme - MYSQL_DATABASE: castopod - MYSQL_USER: castopod - MYSQL_PASSWORD: changeme - restart: unless-stopped - - redis: - image: redis:7.0-alpine - container_name: "castopod-redis" - command: --requirepass changeme - volumes: - - castopod-cache:/data - networks: - - castopod-app - - volumes: - castopod-media: - castopod-db: - castopod-cache: - - networks: - castopod-app: - castopod-db: - ``` - - You have to adapt some variables to your needs (e.g. `CP_BASEURL`, - `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). - -3. Setup a reverse proxy for 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/): - - ``` - #castopod - castopod.example.com { - reverse_proxy localhost:8000 - } - ``` - -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! - -5. You're all set, start podcasting! 🎙️🚀 - -## Environment Variables - -- **castopod/castopod** and **castopod/app** - - | Variable name | Type (`default`) | Default | - | ------------------------------------- | ----------------------- | ---------------- | - | **`CP_BASEURL`** | string | `undefined` | - | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | - | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | - | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | - | **`CP_ANALYTICS_SALT`** | string | `undefined` | - | **`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_REDIS_HOST`** | ?string | `"localhost"` | - | **`CP_REDIS_PASSWORD`** | ?string | `null` | - | **`CP_REDIS_PORT`** | ?number | `6379` | - | **`CP_REDIS_DATABASE`** | ?number | `0` | - | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | - | **`CP_EMAIL_FROM`** | ?string | `undefined` | - | **`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_ENABLE_2FA`** | ?boolean | `undefined` | - | **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` | - | **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` | - | **`CP_MEDIA_S3_KEY`** | ?string | `undefined` | - | **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` | - | **`CP_MEDIA_S3_REGION`** | ?string | `undefined` | - | **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` | - | **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` | - | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` | - | **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` | - | **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` | - | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | - | **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` | - | **`CP_TIMEOUT`** | ?number | `900` | - -- **castopod/web-server** - - | Variable name | Type | Default | - | ---------------------- | --------------------- | ------- | - | **`CP_APP_HOSTNAME`** | ?string | `"app"` | - | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | - | **`CP_TIMEOUT`** | ?number | `900` | diff --git a/docs/src/uk/getting-started/install.md b/docs/src/uk/getting-started/install.md deleted file mode 100644 index cdea18ec..00000000 --- a/docs/src/uk/getting-started/install.md +++ /dev/null @@ -1,238 +0,0 @@ ---- -title: Installation -sidebarDepth: 3 ---- - -# How to install 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. - -::: tip Note - -We've released official Docker images for Castopod! - -If you prefer using Docker, you may skip this and go straight to the -[docker documentation](./docker.md) for Castopod. - -::: - -## Requirements - -- PHP v8.1 or higher -- MySQL version 5.7 or higher or MariaDB version 10.2 or higher -- HTTPS support -- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's - incoming requests - -### PHP v8.1 or higher - -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. -- [exif](https://www.php.net/manual/en/exif.installation.php) - -Additionally, make sure that the following extensions are enabled in your PHP: - -- json (enabled by default - don't turn it off) -- xml (enabled by default - don't turn it off) -- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php) - -### MySQL compatible database - -> We recommend using [MariaDB](https://mariadb.org). - -::: warning Warning - -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. - -::: - -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. - -#### Privileges - -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`. - -### (Optional) FFmpeg v4.1.8 or higher for Video Clips - -[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: - -- **FreeType 2** library for - [gd](https://www.php.net/manual/en/image.installation.php). - -### (Optional) Other recommendations - -- Redis for better cache performances. -- CDN for static files caching and better performances. -- e-mail gateway for lost passwords. - -## Install instructions - -### Pre-requisites - -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 haven’t 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): - - ```bash - * * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1 - ``` - - **Note** - If you do not add this cron task, the following Castopod features - will not work: - - - Importing a podcast from an existing RSS feed - - Broadcasting social activities to your followers in the fediverse - - Broadcasting episodes to open hubs using - [WebSub](https://en.wikipedia.org/wiki/WebSub) - - Generating video clips - - [requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips) - -### (recommended) Install Wizard - -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! - -::: info Note - -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. - -::: - -### Using CLI - -1. Create a `.env` file in the package root based on the `.env.example` file. -2. Initialize the database using: - - ```sh - php spark install:init-database - ``` - -3. Create the superadmin user using: - - ```sh - php spark install:create-superadmin - ``` - -4. Head on to your admin gateway to start podcasting! - -### Email/SMTP setup - -Email configuration is required for some features to work properly (eg. -retrieving your forgotten password, sending instructions to premium subscribers, -…) - -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" -``` - -#### Email config options - -| 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"` | - -### Media storage - -By default, files are saved to the `public/media` folder using the file system. -If you need to relocate the `media` folder to a different location, you can -specify it in your `.env` file as shown below: - -```ini -# […] - -media.root="media" -media.storage="/mnt/storage" -``` - -In this example, the files will be saved to the /mnt/storage/media folder. Make -sure to also update your web server configuration to reflect this change. - -### S3 - -If you prefer storing your media files on an S3 compatible storage, you may -specify it in your `.env`: - -```ini -# […] - -media.fileManager="s3" -media.s3.endpoint="your_s3_host" -media.s3.key="your_s3_key" -media.s3.secret="your_s3_secret" -media.s3.region="your_s3_region" -``` - -#### S3 config options - -| Variable name | Type | Default | -| ----------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`pathStyleEndpoint`** | boolean | `false` | -| **`keyPrefix`** | string | `undefined` | - -## Community packages - -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. - -### Install with 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. - -
- - - Install Castopod with YunoHost - - -Github -Repo - -
diff --git a/docs/src/uk/getting-started/security.md b/docs/src/uk/getting-started/security.md deleted file mode 100644 index e205698d..00000000 --- a/docs/src/uk/getting-started/security.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: Security ---- - -# Security concerns - -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). - -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): - -- `writable/` folder must be **readable** and **writable**. -- `public/media/` folder must be **readable** and **writable**. -- any other file must be set to **readonly**. - -For instance, if you are using Apache or NGINX with Ubuntu you may do the -following: - -```bash -sudo chown -R root:root /path/to/castopod -sudo chown -R www-data:www-data /path/to/castopod/writable -sudo chown -R www-data:www-data /path/to/castopod/public/media -``` diff --git a/docs/src/uk/getting-started/update.md b/docs/src/uk/getting-started/update.md deleted file mode 100644 index 98e019fb..00000000 --- a/docs/src/uk/getting-started/update.md +++ /dev/null @@ -1,109 +0,0 @@ ---- -title: Update -sidebarDepth: 3 ---- - -# How to update 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 ⚡. - -## Update instructions - -0. ⚠️ Before any update, we highly recommend you backup your Castopod files and - database. - - - cf. - [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 - - - cf. - [Where can I find my 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 - - - ⚠️ 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/) - -3. On your server: - - - Remove all files except `.env` and `public/media` - - Copy the new files from the downloaded package into your server - - ::: info Note - - You may need to reset files permissions as during the install process. - Check [Security Concerns](./security.md). - - ::: - -4. Update your database schema from your `Castopod Admin` > `About` page or by - running: - - ```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! - -::: info Note - -Releases may come with additional update instructions (see -[releases page](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) - -::: - -## Fully Automated updates - -> Coming soon... 👀 - -## Frequently asked questions (FAQ) - -### Where can I find my Castopod version? - -Go to your Castopod admin panel, the version is displayed on the bottom left -corner. - -Alternatively, you can find the version in the `app > Config > Constants.php` -file. - -### I haven't updated my instance in a long time… What should I do? - -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. - -> You may want to backup your instance depending on how long you haven't updated -> Castopod. - -For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to -`v1.0.0-beta.1`: - -0. (highly recommended) Make a backup of your files and database. - -1. Download the latest release, overwrite your files whilst keeping `.env` and - `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`, - `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`. - -3. ✨ Enjoy your fresh instance, you're all done! - -### Should I make a backup before updating? - -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… diff --git a/docs/src/uk/index.md b/docs/src/uk/index.md deleted file mode 100644 index 7f012c6c..00000000 --- a/docs/src/uk/index.md +++ /dev/null @@ -1,300 +0,0 @@ ---- -sidebarDepth: 2 ---- - -# Welcome 👋 - -[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] - -Castopod is a free & open-source hosting platform made for podcasters who want -engage and interact with their audience. - -Castopod is easy to install and was built on top of -[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very -small footprint. - -
- Install -
- -## Features - -- 🌱  Free & open-source (AGPL v3 License) -- 🔐  Focused on data sovereignty: your content, audience, and analytics - belong to you, and you only -- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, - chapters, location, persons, soundbites, … -- 💬  Built-in social network: - - 🚀  Castopod is part of the Fediverse, a decentralized social network - - ❤️  Create posts, share, favourite, and comment on episodes -- 📈  Built-in analytics: - - ⚖️  GDPR / CCPA / LGPD compliant - - 🪙  Standard IABv2 audience measurement - - 🏡  On-premises analytics, no third party involved -- 📢  Built-in marketing tools: - - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) - - 📱  PWA: install as a standalone app - - 🎨  Customizable theme colors - - 🎬  Generate ready-to-share Video clips from episodes - - 🔉  Generate soundbites - - ▶️  Embeddable player, embed your episodes on any website -- 💸  Monetization: - - 🔗  Funding links - - 📲  listen-to-click ads - - 🤝  value4value / WebMonetization - - 💎  Premium podcasts -- 📡  Publish your episodes everywhere with RSS: - - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, - Google Podcasts, Deezer, Podcast Addict, Podfriend, … - - ⚡  Broadcast your episodes instantly with WebSub -- 📥  Podcast import: move your existing podcast into Castopod -- 📤  Move your podcast out of Castopod -- 🔀  Multi-tenant: host as many podcasts as you want -- 👥  Multi-user: add contributors and set roles -- 🌎  i18n support: translated in English, French, Polish, German, - Brazilian Portuguese & Spanish… with - [more to come](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. - -It is in fact one of the only media to have stayed this way for a long time. - -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. - -With podcasting becoming more widely used, some companies are trying to shift it -towards a more controlled and centralized 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. - -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. - -## Comparison with other solutions - -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 you. - -### 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 it. - -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. - -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. - -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 journey. - -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. - -Finally, depending on your needs, Wordpress and Castopod can even live side by -side as they share the same requirements! - -### 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 was initially built around music. And later on, as the project -evolved, the ability to host podcasts was introduced. - -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, …). - -So, you should probably use Funkwhale if you want to host your music, and use -Castopod if you want to host your podcasts. - -### Castopod vs other podcast hosts - -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! - -Each of these solutions differ from one another, you may compare with the -[list of features](#features). - -That being said, there are two main differences with other podcasting solutions: - -- 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 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. - -## Contributing - -Love Castopod and would like to help? Take a look at the following documentation -to get you started. - -### Code of conduct - -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 tolerated. - -### Contributing 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. - -## Contributors ✨ - -Thanks goes to these wonderful people -([emoji key](https://allcontributors.org/docs/en/emoji-key)): - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Ewen
Ewen

🌍 🤔 💻
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
KrzysztofDomanczyk
KrzysztofDomanczyk

💻
Guy Martin
Guy Martin

🐛 💻
- - - - - - -This project follows the -[all-contributors](https://github.com/all-contributors/all-contributors) -specification. Contributions of any kind welcome! - -## Contact - -You may reach us for help or ask any question you have on: - -- [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) - -Alternatively, you can follow us on social media platforms to get news about -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 - -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). - -
- Ad Aures Logo - NLnet Logo -
- -## License - -[GNU Affero General Public License v3.0](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 - -[release]: https://code.castopod.org/adaures/castopod/-/releases -[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md -[contributions]: https://code.castopod.org/adaures/castopod/-/issues -[semantic-release]: https://github.com/semantic-release/semantic-release -[discord]: https://castopod.org/discord -[stars]: https://github.com/ad-aures/castopod/stargazers -[crowdin]: https://translate.castopod.org/project/castopod diff --git a/docs/src/zh-Hans/getting-started/auth.md b/docs/src/zh-Hans/getting-started/auth.md deleted file mode 100644 index c307588f..00000000 --- a/docs/src/zh-Hans/getting-started/auth.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -title: 验证 & 授权 -sidebarDepth: 3 ---- - -# 验证 & 授权 - -Castopod 使用 `codeigniter/shield` 处理身份验证和授权 与自定义规则。 角色和权限 -在两个级别上定义: - -1. [实例范围](#1-instance-wide-roles-and-permissions) -2. [每个播客](#2-per-podcast-roles-and-permissions) - -## 1. 实例范围的角色和权限 - -### 实例角色 - - - -| 角色 | 描述 | 权限 | -| ---------- | ---------------------------- | ------------------------------------------------------------------------------------------ | -| 超级管理员 | 拥有对 Castopod 的完全控制。 | admin.\*, podcasts.\*, users.manage, persons.manage, pages.manage, fediverse.manage-blocks | -| 管理 | 管理 Castopod 的内容。 | podcasts.create, podcasts.import, persons.manage, pages.manage | -| 播客 | Castopod 的普通用户。 | admin.access | - - - -### 实例权限 - - - -| 权限 | 描述 | -| ----------------------- | ------------------------------------------- | -| admin.access | 可以访问 Castopod 管理区域。 | -| admin.settings | 可以访问 Castopod 设置。 | -| users.manage | 可以管理 Castopod 用户。 | -| persons.manage | 可以管理人员。 | -| pages.manage | 可以管理页面。 | -| podcasts.view | 可以查看所有播客。 | -| podcasts.create | 可以创建新播客。 | -| podcasts.import | 可以导入播客。 | -| fediverse.manage-blocks | 可以阻止联邦宇宙参与者/域与 Castopod 交互。 | - - - -## 2. 每个播客角色与权限 - -### 每个播客角色 - - - -| 角色 | 描述 | 权限 | -| ------ | ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 管理员 | 完全控制播客 #{id}。 | \* | -| 编辑 | 管理播客 #{id} 的内容和出版物。 | view, edit, manage-import, manage-persons, manage-platforms, manage-publications, manage-notifications, interact-as, episodes.view, episodes.create, episodes.edit, episodes.delete, episodes.manage-persons, episodes.manage-clips, episodes.manage-publications, episodes.manage-comments | -| 作者 | 管理播客 #{id} 的内容,但不能发布。 | view, manage-persons, episodes.view, episodes.create, episodes.edit, episodes.manage-persons, episodes.manage-clips | -| 访客 | 播客 #{id} 的普通贡献者。 | view, episodes.view | - - - -### 每个播客权限 - - - -| 权限 | 描述 | -| ---------------------------- | --------------------------------------------------- | -| 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} 的剧集评论。 | - - diff --git a/docs/src/zh-Hans/index.md b/docs/src/zh-Hans/index.md deleted file mode 100644 index 50b324ee..00000000 --- a/docs/src/zh-Hans/index.md +++ /dev/null @@ -1,273 +0,0 @@ ---- -sidebarDepth: 2 ---- - -# 欢迎 👋 - -[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] - -Castopod 是一个免费的开源播客托管平台,为那些想要和听众接触与互动的播客们制作 -的。 - -Castopod 易于安装,并使用 [CodeIgniter4](https://codeigniter.com/) 构建, 这是一 -个强大的 PHP 框架,并且占用极小。 - -
- 安装 -
- -## 功能特色 - -- 🌱  免费与开源(AGPL v3 许可证) -- 🔐  专注于数据主权:你的内容、受众和分析属于你,而且只属于你 -- 🪄  播客 2.0 功能:GUID,锁定,报表,资金,章节,位置信息,人员,原声摘要 - ... -- 💬  内置社交网络: - - 🚀  Castopod 是联邦宇宙的一部分,联邦宇宙是一个去中心化的社交网络 - - ❤️  创建帖子、分享、收藏和评论剧集。 -- 📈  内置分析: - - ⚖️  符合 GDPR / CCPA / LGPD 标准 - - 🪙  标准 IABv2 受众测量 - - 🏡  本地分析,不涉及第三方 -- 📢  内置营销工具: - - ✅  SEO 开箱即用(open-graph meta-tags,JSON-LD 等) - - 📱  PWA:作为独立应用安装 - - 🎨  自定义的主题颜色 - - 🎬  从单个剧集生成随时可以共享的视频素材 - - 🔉  生成原声摘要 - - ▶️  嵌入式播放器,将你的剧集嵌入任何网站 -- 💸  货币: - - 🔗  资金链接 - - 📲  点击收听广告 - - 🤝  value4value / 网络货币化 - - 💎  高级版播客 -- 📡  使用 RSS 将你的剧集发布到任何地方: - - 📱  支持众多索引和应用程序:Podcast Index,Apple - Podcasts,Spotify,Google Podcasts,Deezer,Podcast Addict,Podfriend... - - ⚡  使用 WebSub 即时广播你的剧集 -- 📥  播客导入:将现有播客移至 Castopod -- 📤  也支持将播客移出 Castopod -- 🔀  多租户:根据需要托管任意数量的播客 -- 👥  多用户:添加贡献者并设置角色 -- 🌎  i18n 支持:翻译成英语,法语,波兰语,德语,巴西葡萄牙语和西班牙语 - ...[还有更多](https://translate.castopod.org)! - -## 创作动机 - -播客生态系统本质上是去中心化的:你可以创建自己的播客 RSS 文件,将其发布到网络上 -并在线共享。 - -事实上,它是唯一长期保持这种状态的媒体之一。 - -随着习惯的发展,越来越多的人开始接触播客:允许创作者寻找新的方式来分享他们的想 -法,或是让听众获得更好的内容。 - -随着播客的使用越来越广泛,一些公司正试图控制播客与集中化。 - -Castopod 的创建旨在提供一种开放且可持续的替代方案来托管你的播客,促进权力下放, -确保播客可以用创造力表达自己。 - -此项目由开源社区推动的,特别是 -由[联邦宇宙](https://fediverse.party/en/fediverse/) 和 -[播客 2.0](https://podcastindex.org/) 推动。 - -## 与其他解决方案的对比 - -我们相信此解决方案不一定适合所有人,它只取决于你是否需要。 因此,下面是与其他解 -决方案的比较,可帮助判断 Castopod 是否适合你。 - -### Castopod 对比 Wordpress - -Castopod 经常被称为 “播客中的 Wordpress”,因为两者有很多相似之处。 在某些方面, -确实如此。 实际上,Castopod 受到 WordPress 生态的极大启发,看到了采用社区的易用 -性以及运行它的网站数量。 - -就像 Wordpress 一样,Castopod 是免费 & 开源的,PHP 构建并使用 MySQL 数据库,可以 -在大多数 Web 服务器上轻松安装。 - -Wordpress 是创建你的网站,并使用插件扩展以获得想要内容的好办法。 这是一个成熟的 -CMS,可以帮助你在线访问任何类型的网站。 - -另一方面,Castopod 旨在专门满足播客的需求,专注于播客,而不是其他。 你不需要任何 -插件即可轻松开始播客之旅。 - -还拥有对播客的独特优化:从播客的创建和新剧集的发布一直到广播,营销和分析。 - -最后,根据你的需要,Wordpress 和 Castopod 甚至可以共存,因为他们有相同的配置环 -境! - -### Castopod 对比 Funkwhale - -Funkwhale 是一个自托管、现代界面、免费开源的音乐服务器。 就像 Castopod 一 -样,Funkwhale 也位于联邦宇宙中,这是一个去中心化的社交网络,允许两者的互联。 - -Funkwhale 最初是围绕音乐制作的。 后来,随着项目的发展,引入了托管播客的能力。 - -与 Funkwhale 不同,Castopod 是只围绕播客设计和构建的。 这样可以更简单地实现与播 -客相关的生态系统,例如播客 2.0 功能(报表、 章节、地点、人员…)。 - -因此,如果你想托管你的音乐库,你可能应该使用 Funkwhale,如果您想主持一个播客,请 -使用 Castopod。 - -### Castopod 与其他播客 - -有许多非常棒地解决方案可供你托管播客,并 -且[很多](https://podcastindex.org/apps)正在搭上播客 2.0 的便车,就像 Castopod 一 -样! - -这些解决方案各不相同,你可以对比 [功能列表](#features)。 - -话虽如此,Castopod 与其他播客解决方案有两个主要区别: - -- Castopod 是自托管的,唯一允许你控制所有数据的方案。 并且,由于是开源的,甚至可 - 以按自己的想法修改。 - -- Castopod 是目前唯一一个同时集成去中心化的,带有 ActivePub 的社交网络以及很多播 - 客 2.0 功能集成的解决方案,希望弥合两者之间的差距。 - -## 贡献 - -喜欢 Castopod 并且想帮忙吗? 请查看以下文档以帮助你入门。 请查看以下文档以帮助你 -入门。 - -### 行为准则 - -Castopod 已经通过了一项行为准则,并希望所有的参与者都能够遵循本行为准则。 请阅 -读[行为准则](https://code.castopod.org/adaures/castopod/-/blob/beta/CODE_OF_CONDUCT.md) -以便了解哪些行为被允许,哪些行为不会被容忍。 - -### 贡献指南 - -阅读我们的 [贡献指南](../contributing/guidelines.md) ,了解我们的开发过程。 提出 -错 误修正和改进想法,以及如何构建和测试 Castopod 。 - -## 贡献者 ✨ - -感谢这些了不起的人([表情符号键](https://allcontributors.org/docs/en/emoji-key)): - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Ewen
Ewen

🌍 🤔 💻
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
KrzysztofDomanczyk
KrzysztofDomanczyk

💻
Guy Martin
Guy Martin

🐛 💻
- - - - - - -此项目遵循 [所有贡献者](https://github.com/all-contributors/all-contributors) 规 -范。 欢迎任何形式的贡献! - -## 联系 - -你可以联系我们寻求帮助或提出任何问题: - -- [Discord](https://castopod.org/discord) (用于与开发人员和社区直接互动) -- [问题跟踪器](https://code.castopod.org/adaures/castopod/-/issues)(用于功能请 - 求和错误报告) - -或者,你可以在社交媒体上关注我们,以获取有关 Castopod 的新闻: - -- [podlibre.social](https://podlibre.social/@Castopod) (Mastodon 实例) -- [推特](https://twitter.com/castopod) -- [领英](https://linkedin.com/company/castopod) -- [脸书](https://www.facebook.com/castopod) - -## 赞助商 - -Castopod 的发展离不开赞助商的支持。 如果你想要帮助我们,请考 -虑[赞助 Castopod 的开发](https://opencollective.com/castopod/contribute). - -
- Ad Aures Logo - NLnet Logo -
- -## 许可证 - -[GNU Affero General Public License v3.0](https://choosealicense.com/licenses/agpl-3.0/) - -版权 ©️ 2020至今, [Audes](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 - -[release]: https://code.castopod.org/adaures/castopod/-/releases -[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md -[contributions]: https://code.castopod.org/adaures/castopod/-/issues -[semantic-release]: https://github.com/semantic-release/semantic-release -[discord]: https://castopod.org/discord -[stars]: https://github.com/ad-aures/castopod/stargazers -[crowdin]: https://translate.castopod.org/project/castopod diff --git a/docs/src/zh-Hant/getting-started/docker.md b/docs/src/zh-Hant/getting-started/docker.md deleted file mode 100644 index 12f01619..00000000 --- a/docs/src/zh-Hant/getting-started/docker.md +++ /dev/null @@ -1,160 +0,0 @@ ---- -title: Official Docker images -sidebarDepth: 3 ---- - -# Official Docker images - -Castopod pushes 3 Docker images to the Docker Hub during its automated build -process: - -- [**`castopod/castopod`**](https://hub.docker.com/r/castopod/castopod): an all - in one castopod image using nginx unit -- [**`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 - -Additionally, Castopod requires a MySQL-compatible database. A Redis database -can be added as a cache handler. - -## Supported tags - -- `develop` [unstable], latest development branch build -- `beta` [stable], latest beta version build -- `latest` [stable], latest version build -- `1.x.x` [stable], specific version build (since `1.0.0`) - -## Example usage - -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: - - ```yml - version: "3.7" - - services: - app: - image: castopod/castopod:latest - container_name: "castopod-app" - volumes: - - castopod-media:/var/www/castopod/public/media - environment: - MYSQL_DATABASE: castopod - MYSQL_USER: castopod - MYSQL_PASSWORD: changeme - CP_BASEURL: "https://castopod.example.com" - CP_ANALYTICS_SALT: changeme - CP_CACHE_HANDLER: redis - CP_REDIS_HOST: redis - CP_REDIS_PASSWORD: changeme - networks: - - castopod-app - - castopod-db - ports: - - 8000:8000 - restart: unless-stopped - - mariadb: - image: mariadb:10.5 - container_name: "castopod-mariadb" - networks: - - castopod-db - volumes: - - castopod-db:/var/lib/mysql - environment: - MYSQL_ROOT_PASSWORD: changeme - MYSQL_DATABASE: castopod - MYSQL_USER: castopod - MYSQL_PASSWORD: changeme - restart: unless-stopped - - redis: - image: redis:7.0-alpine - container_name: "castopod-redis" - command: --requirepass changeme - volumes: - - castopod-cache:/data - networks: - - castopod-app - - volumes: - castopod-media: - castopod-db: - castopod-cache: - - networks: - castopod-app: - castopod-db: - ``` - - You have to adapt some variables to your needs (e.g. `CP_BASEURL`, - `MYSQL_ROOT_PASSWORD`, `MYSQL_PASSWORD` and `CP_ANALYTICS_SALT`). - -3. Setup a reverse proxy for 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/): - - ``` - #castopod - castopod.example.com { - reverse_proxy localhost:8000 - } - ``` - -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! - -5. You're all set, start podcasting! 🎙️🚀 - -## Environment Variables - -- **castopod/castopod** and **castopod/app** - - | Variable name | Type (`default`) | Default | - | ------------------------------------- | ----------------------- | ---------------- | - | **`CP_BASEURL`** | string | `undefined` | - | **`CP_MEDIA_BASEURL`** | ?string | `CP_BASEURL` | - | **`CP_ADMIN_GATEWAY`** | ?string | `"cp-admin"` | - | **`CP_AUTH_GATEWAY`** | ?string | `"cp-auth"` | - | **`CP_ANALYTICS_SALT`** | string | `undefined` | - | **`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_REDIS_HOST`** | ?string | `"localhost"` | - | **`CP_REDIS_PASSWORD`** | ?string | `null` | - | **`CP_REDIS_PORT`** | ?number | `6379` | - | **`CP_REDIS_DATABASE`** | ?number | `0` | - | **`CP_EMAIL_SMTP_HOST`** | ?string | `undefined` | - | **`CP_EMAIL_FROM`** | ?string | `undefined` | - | **`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_ENABLE_2FA`** | ?boolean | `undefined` | - | **`CP_MEDIA_FILE_MANAGER`** | ?string | `undefined` | - | **`CP_MEDIA_S3_ENDPOINT`** | ?string | `undefined` | - | **`CP_MEDIA_S3_KEY`** | ?string | `undefined` | - | **`CP_MEDIA_S3_SECRET`** | ?string | `undefined` | - | **`CP_MEDIA_S3_REGION`** | ?string | `undefined` | - | **`CP_MEDIA_S3_BUCKET`** | ?string | `undefined` | - | **`CP_MEDIA_S3_PROTOCOL`** | ?number | `undefined` | - | **`CP_MEDIA_S3_PATH_STYLE_ENDPOINT`** | ?boolean | `undefined` | - | **`CP_MEDIA_S3_KEY_PREFIX`** | ?string | `undefined` | - | **`CP_DISABLE_HTTPS`** | ?[`0` or `1`] | `undefined` | - | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | - | **`CP_PHP_MEMORY_LIMIT`** | ?number (with suffix) | `512M` | - | **`CP_TIMEOUT`** | ?number | `900` | - -- **castopod/web-server** - - | Variable name | Type | Default | - | ---------------------- | --------------------- | ------- | - | **`CP_APP_HOSTNAME`** | ?string | `"app"` | - | **`CP_MAX_BODY_SIZE`** | ?number (with suffix) | `512M` | - | **`CP_TIMEOUT`** | ?number | `900` | diff --git a/docs/src/zh-Hant/getting-started/install.md b/docs/src/zh-Hant/getting-started/install.md deleted file mode 100644 index cdea18ec..00000000 --- a/docs/src/zh-Hant/getting-started/install.md +++ /dev/null @@ -1,238 +0,0 @@ ---- -title: Installation -sidebarDepth: 3 ---- - -# How to install 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. - -::: tip Note - -We've released official Docker images for Castopod! - -If you prefer using Docker, you may skip this and go straight to the -[docker documentation](./docker.md) for Castopod. - -::: - -## Requirements - -- PHP v8.1 or higher -- MySQL version 5.7 or higher or MariaDB version 10.2 or higher -- HTTPS support -- An [ntp-synced clock](https://wiki.debian.org/NTP) to validate federation's - incoming requests - -### PHP v8.1 or higher - -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. -- [exif](https://www.php.net/manual/en/exif.installation.php) - -Additionally, make sure that the following extensions are enabled in your PHP: - -- json (enabled by default - don't turn it off) -- xml (enabled by default - don't turn it off) -- [mysqlnd](https://php.net/manual/en/mysqlnd.install.php) - -### MySQL compatible database - -> We recommend using [MariaDB](https://mariadb.org). - -::: warning Warning - -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. - -::: - -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. - -#### Privileges - -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`. - -### (Optional) FFmpeg v4.1.8 or higher for Video Clips - -[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: - -- **FreeType 2** library for - [gd](https://www.php.net/manual/en/image.installation.php). - -### (Optional) Other recommendations - -- Redis for better cache performances. -- CDN for static files caching and better performances. -- e-mail gateway for lost passwords. - -## Install instructions - -### Pre-requisites - -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 haven’t 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): - - ```bash - * * * * * /path/to/php /path/to/castopod/spark tasks:run >> /dev/null 2>&1 - ``` - - **Note** - If you do not add this cron task, the following Castopod features - will not work: - - - Importing a podcast from an existing RSS feed - - Broadcasting social activities to your followers in the fediverse - - Broadcasting episodes to open hubs using - [WebSub](https://en.wikipedia.org/wiki/WebSub) - - Generating video clips - - [requires FFmpeg](#optional-ffmpeg-v418-or-higher-for-video-clips) - -### (recommended) Install Wizard - -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! - -::: info Note - -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. - -::: - -### Using CLI - -1. Create a `.env` file in the package root based on the `.env.example` file. -2. Initialize the database using: - - ```sh - php spark install:init-database - ``` - -3. Create the superadmin user using: - - ```sh - php spark install:create-superadmin - ``` - -4. Head on to your admin gateway to start podcasting! - -### Email/SMTP setup - -Email configuration is required for some features to work properly (eg. -retrieving your forgotten password, sending instructions to premium subscribers, -…) - -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" -``` - -#### Email config options - -| 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"` | - -### Media storage - -By default, files are saved to the `public/media` folder using the file system. -If you need to relocate the `media` folder to a different location, you can -specify it in your `.env` file as shown below: - -```ini -# […] - -media.root="media" -media.storage="/mnt/storage" -``` - -In this example, the files will be saved to the /mnt/storage/media folder. Make -sure to also update your web server configuration to reflect this change. - -### S3 - -If you prefer storing your media files on an S3 compatible storage, you may -specify it in your `.env`: - -```ini -# […] - -media.fileManager="s3" -media.s3.endpoint="your_s3_host" -media.s3.key="your_s3_key" -media.s3.secret="your_s3_secret" -media.s3.region="your_s3_region" -``` - -#### S3 config options - -| Variable name | Type | Default | -| ----------------------- | ------- | ----------- | -| **`endpoint`** | string | `undefined` | -| **`key`** | string | `undefined` | -| **`secret`** | string | `undefined` | -| **`region`** | string | `undefined` | -| **`bucket`** | string | `castopod` | -| **`protocol`** | number | `undefined` | -| **`pathStyleEndpoint`** | boolean | `false` | -| **`keyPrefix`** | string | `undefined` | - -## Community packages - -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. - -### Install with 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. - -
- - - Install Castopod with YunoHost - - -Github -Repo - -
diff --git a/docs/src/zh-Hant/getting-started/security.md b/docs/src/zh-Hant/getting-started/security.md deleted file mode 100644 index e205698d..00000000 --- a/docs/src/zh-Hant/getting-started/security.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: Security ---- - -# Security concerns - -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). - -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): - -- `writable/` folder must be **readable** and **writable**. -- `public/media/` folder must be **readable** and **writable**. -- any other file must be set to **readonly**. - -For instance, if you are using Apache or NGINX with Ubuntu you may do the -following: - -```bash -sudo chown -R root:root /path/to/castopod -sudo chown -R www-data:www-data /path/to/castopod/writable -sudo chown -R www-data:www-data /path/to/castopod/public/media -``` diff --git a/docs/src/zh-Hant/getting-started/update.md b/docs/src/zh-Hant/getting-started/update.md deleted file mode 100644 index 98e019fb..00000000 --- a/docs/src/zh-Hant/getting-started/update.md +++ /dev/null @@ -1,109 +0,0 @@ ---- -title: Update -sidebarDepth: 3 ---- - -# How to update 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 ⚡. - -## Update instructions - -0. ⚠️ Before any update, we highly recommend you backup your Castopod files and - database. - - - cf. - [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 - - - cf. - [Where can I find my 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 - - - ⚠️ 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/) - -3. On your server: - - - Remove all files except `.env` and `public/media` - - Copy the new files from the downloaded package into your server - - ::: info Note - - You may need to reset files permissions as during the install process. - Check [Security Concerns](./security.md). - - ::: - -4. Update your database schema from your `Castopod Admin` > `About` page or by - running: - - ```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! - -::: info Note - -Releases may come with additional update instructions (see -[releases page](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) - -::: - -## Fully Automated updates - -> Coming soon... 👀 - -## Frequently asked questions (FAQ) - -### Where can I find my Castopod version? - -Go to your Castopod admin panel, the version is displayed on the bottom left -corner. - -Alternatively, you can find the version in the `app > Config > Constants.php` -file. - -### I haven't updated my instance in a long time… What should I do? - -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. - -> You may want to backup your instance depending on how long you haven't updated -> Castopod. - -For example, if you're on `v1.0.0-alpha.42` and would like to upgrade to -`v1.0.0-beta.1`: - -0. (highly recommended) Make a backup of your files and database. - -1. Download the latest release, overwrite your files whilst keeping `.env` and - `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`, - `v1.0.0-alpha.45`, …, `v1.0.0-beta.1`. - -3. ✨ Enjoy your fresh instance, you're all done! - -### Should I make a backup before updating? - -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… diff --git a/docs/src/zh-Hant/index.md b/docs/src/zh-Hant/index.md deleted file mode 100644 index b63ff645..00000000 --- a/docs/src/zh-Hant/index.md +++ /dev/null @@ -1,300 +0,0 @@ ---- -sidebarDepth: 2 ---- - -# Welcome 👋 - -[![release-badge]][release] [![license-badge]][license] [![contributions-badge]][contributions] [![semantic-release-badge]][semantic-release] [![crowdin-badge]][crowdin] [![discord-badge]][discord] [![stars-badge]][stars] - -Castopod is a free & open-source hosting platform made for podcasters who want -engage and interact with their audience. - -Castopod is easy to install and was built on top of -[CodeIgniter4](https://codeigniter.com/), a powerful PHP framework with a very -small footprint. - -
- Install -
- -## Features - -- 🌱  Free & open-source (AGPL v3 License) -- 🔐  Focused on data sovereignty: your content, audience, and analytics - belong to you, and you only -- 🪄  Podcasting 2.0 features: GUID, locked, transcripts, funding, - chapters, location, persons, soundbites, … -- 💬  Built-in social network: - - 🚀  Castopod is part of the Fediverse, a decentralized social network - - ❤️  Create posts, share, favourite, and comment on episodes -- 📈  Built-in analytics: - - ⚖️  GDPR / CCPA / LGPD compliant - - 🪙  Standard IABv2 audience measurement - - 🏡  On-premises analytics, no third party involved -- 📢  Built-in marketing tools: - - ✅  SEO ready (open-graph meta-tags, JSON-LD, …) - - 📱  PWA: install as a standalone app - - 🎨  Customizable theme colors - - 🎬  Generate ready-to-share Video clips from episodes - - 🔉  Generate soundbites - - ▶️  Embeddable player, embed your episodes on any website -- 💸  Monetization: - - 🔗  Funding links - - 📲  listen-to-click ads - - 🤝  value4value / WebMonetization - - 💎  Premium podcasts -- 📡  Publish your episodes everywhere with RSS: - - 📱  On all indexes and apps: Podcast Index, Apple Podcasts, Spotify, - Google Podcasts, Deezer, Podcast Addict, Podfriend, … - - ⚡  Broadcast your episodes instantly with WebSub -- 📥  Podcast import: move your existing podcast into Castopod -- 📤  Move your podcast out of Castopod -- 🔀  Multi-tenant: host as many podcasts as you want -- 👥  Multi-user: add contributors and set roles -- 🌎  i18n support: translated in English, French, Polish, German, - Brazilian Portuguese & Spanish… with - [more to come](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. - -It is in fact one of the only media to have stayed this way for a long time. - -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. - -With podcasting becoming more widely used, some companies are trying to shift it -towards a more controlled and centralized 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. - -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. - -## Comparison with other solutions - -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 you. - -### 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 it. - -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. - -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. - -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 journey. - -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. - -Finally, depending on your needs, Wordpress and Castopod can even live side by -side as they share the same requirements! - -### 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 was initially built around music. And later on, as the project -evolved, the ability to host podcasts was introduced. - -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, …). - -So, you should probably use Funkwhale if you want to host your music, and use -Castopod if you want to host your podcasts. - -### Castopod vs other podcast hosts - -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! - -Each of these solutions differ from one another, you may compare with the -[list of features](#features). - -That being said, there are two main differences with other podcasting solutions: - -- 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 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. - -## Contributing - -Love Castopod and would like to help? Take a look at the following documentation -to get you started. - -### Code of conduct - -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 tolerated. - -### Contributing 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. - -## Contributors ✨ - -Thanks goes to these wonderful people -([emoji key](https://allcontributors.org/docs/en/emoji-key)): - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Yassine Doghri
Yassine Doghri

💻 🐛 📖 👀 🚧 🖋 🎨 ️️️️♿️ 🌍 💬 🧑‍🏫 🚇 🤔 📆 📝
Benjamin Bellamy
Benjamin Bellamy

💻 🐛 👀 🖋 🌍 💬 🚇 🤔 📝 📆 📢
Ola Hneini
Ola Hneini

💻 👀 📖 🚧 💬 🤔
Romain de Laage
Romain de Laage

💻 🚇 📖 🌍 🤔
Lyonel Bernard
Lyonel Bernard

🐛 💬 🔊 🤔
Christopher Lagonick-Weitzel
Christopher Lagonick-Weitzel

🐛 💬 🔊 🤔
Ernesto Acosta
Ernesto Acosta

🐛 🔊 🌍 💬 🤔
Ewen
Ewen

🌍 🤔 💻
Bastien Luneteau
Bastien Luneteau

💻 🐛
Cécile Ricordeau
Cécile Ricordeau

🎨
Patryk Miś
Patryk Miś

🌍
Marcin Lewandowski
Marcin Lewandowski

🐛 🤔
Sebastian Janik
Sebastian Janik

💻
Patryk Karczmarczyk
Patryk Karczmarczyk

💻
denis d
denis d

🐛 🤔
Douglas Kastle
Douglas Kastle

🐛 🤔
cExplorer
cExplorer

🐛 🌍
ImaCrea
ImaCrea

🐛 🤔
Jonas S
Jonas S

💻
LEFEBVRE Yann
LEFEBVRE Yann

🐛
Sebastian Späth
Sebastian Späth

🐛 🤔
rocky III
rocky III

🐛
Hermann Josef Eckl
Hermann Josef Eckl

🐛
Delhaye Cyrille
Delhaye Cyrille

🐛 🤔
João Leandro
João Leandro

🌍 🤔
Angelos Chouvardas
Angelos Chouvardas

🌍
Eivind
Eivind

🌍
forght
forght

🌍
glottis0q
glottis0q

🌍
ButterflyOfFire
ButterflyOfFire

🌍
Lucian I. Last
Lucian I. Last

🌍
LuuzViir
LuuzViir

🌍
CTHTC
CTHTC

🌍
Russian Retro
Russian Retro

🌍
Marek L'ach
Marek L'ach

🌍
GunChleoc
GunChleoc

🌍
GabiSnow
GabiSnow

🌍
bendaha
bendaha

🌍
Samuel Roland
Samuel Roland

🌍
Dimitri Regnier
Dimitri Regnier

🤔
irithys
irithys

🌍
Sergi
Sergi

🌍
ghose (XoseM)
ghose (XoseM)

🌍
Andreas Olsson
Andreas Olsson

🌍
leonfrom
leonfrom

🌍
agentcobra
agentcobra

🌍
Alessandro
Alessandro

🌍
liimee
liimee

🌍
Ahmed Sabouni
Ahmed Sabouni

🌍
KrzysztofDomanczyk
KrzysztofDomanczyk

💻
Guy Martin
Guy Martin

🐛 💻
- - - - - - -This project follows the -[all-contributors](https://github.com/all-contributors/all-contributors) -specification. Contributions of any kind welcome! - -## Contact - -You may reach us for help or ask any question you have on: - -- [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) - -Alternatively, you can follow us on social media platforms to get news about -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 - -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). - -
- Ad Aures Logo - NLnet Logo -
- -## License - -[GNU Affero General Public License v3.0](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 - -[release]: https://code.castopod.org/adaures/castopod/-/releases -[license]: https://code.castopod.org/adaures/castopod/-/blob/beta/LICENSE.md -[contributions]: https://code.castopod.org/adaures/castopod/-/issues -[semantic-release]: https://github.com/semantic-release/semantic-release -[discord]: https://castopod.org/discord -[stars]: https://github.com/ad-aures/castopod/stargazers -[crowdin]: https://translate.castopod.org/project/castopod diff --git a/docs/tailwind.config.cjs b/docs/tailwind.config.cjs new file mode 100644 index 00000000..8552e887 --- /dev/null +++ b/docs/tailwind.config.cjs @@ -0,0 +1,31 @@ +import starlightPlugin from "@astrojs/starlight-tailwind"; +import colors from "tailwindcss/colors"; +import defaultTheme from "tailwindcss/defaultTheme"; + +/** @type {import('tailwindcss').Config} */ +export default { + content: ["./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}"], + theme: { + extend: { + colors: { + accent: { + 50: "#F2FAF9", + 100: "#E7F9E4", + 200: "#bfe4e1", + 300: "#99d4cf", + 400: "#4db4aa", + 500: "#009486", + 600: "#008579", + 700: "#006D60", + 800: "#00564A", + 900: "#003D0B", + }, + gray: colors.stone, + }, + fontFamily: { + sans: ["Inter", ...defaultTheme.fontFamily.sans], + }, + }, + }, + plugins: [starlightPlugin()], +}; diff --git a/docs/tailwind.config.js b/docs/tailwind.config.js deleted file mode 100644 index 1c21ee6e..00000000 --- a/docs/tailwind.config.js +++ /dev/null @@ -1,24 +0,0 @@ -/* eslint-disable */ - -module.exports = { - content: ["./src/**/*.md"], - theme: { - extend: { - colors: { - pine: { - 50: "#F2FAF9", - 100: "#E7F9E4", - 200: "#bfe4e1", - 300: "#99d4cf", - 400: "#4db4aa", - 500: "#009486", - 600: "#008579", - 700: "#006D60", - 800: "#00564A", - 900: "#003D0B", - }, - }, - }, - }, - plugins: [], -}; diff --git a/docs/tsconfig.json b/docs/tsconfig.json index 53a88761..bcbf8b50 100644 --- a/docs/tsconfig.json +++ b/docs/tsconfig.json @@ -1,16 +1,3 @@ { - "compilerOptions": { - "outDir": "dist", - "target": "esnext", - "moduleResolution": "node", - "esModuleInterop": true, - "resolveJsonModule": true, - "allowJs": true, - "strict": true, - "baseUrl": ".", - "paths": { - "/@theme/*": [".vitepress/theme/*"] - } - }, - "include": ["src/**/*", ".vitepress/**/*"] + "extends": "astro/tsconfigs/strict" } diff --git a/modules/Admin/Language/.rsync-filter b/modules/Admin/Language/.rsync-filter index c6a78436..b802a93d 100644 --- a/modules/Admin/Language/.rsync-filter +++ b/modules/Admin/Language/.rsync-filter @@ -2,11 +2,11 @@ + fr/*** + pl/*** + de/*** -+ pt-BR/*** -+ nn-NO/*** ++ pt-br/*** ++ nn-no/*** + es/*** -+ zh-Hans/*** ++ zh-hans/*** + ca/*** + br/*** -+ sr-Latn/*** ++ sr-latn/*** - ** diff --git a/modules/Admin/Language/fr_CA/AboutCastopod.php b/modules/Admin/Language/fr-ca/AboutCastopod.php similarity index 100% rename from modules/Admin/Language/fr_CA/AboutCastopod.php rename to modules/Admin/Language/fr-ca/AboutCastopod.php diff --git a/modules/Admin/Language/fr_CA/Breadcrumb.php b/modules/Admin/Language/fr-ca/Breadcrumb.php similarity index 100% rename from modules/Admin/Language/fr_CA/Breadcrumb.php rename to modules/Admin/Language/fr-ca/Breadcrumb.php diff --git a/modules/Admin/Language/fr_CA/Charts.php b/modules/Admin/Language/fr-ca/Charts.php similarity index 100% rename from modules/Admin/Language/fr_CA/Charts.php rename to modules/Admin/Language/fr-ca/Charts.php diff --git a/modules/Admin/Language/fr_CA/Common.php b/modules/Admin/Language/fr-ca/Common.php similarity index 100% rename from modules/Admin/Language/fr_CA/Common.php rename to modules/Admin/Language/fr-ca/Common.php diff --git a/modules/Admin/Language/fr_CA/Countries.php b/modules/Admin/Language/fr-ca/Countries.php similarity index 100% rename from modules/Admin/Language/fr_CA/Countries.php rename to modules/Admin/Language/fr-ca/Countries.php diff --git a/modules/Admin/Language/fr_CA/Dashboard.php b/modules/Admin/Language/fr-ca/Dashboard.php similarity index 100% rename from modules/Admin/Language/fr_CA/Dashboard.php rename to modules/Admin/Language/fr-ca/Dashboard.php diff --git a/modules/Admin/Language/fr_CA/Episode.php b/modules/Admin/Language/fr-ca/Episode.php similarity index 100% rename from modules/Admin/Language/fr_CA/Episode.php rename to modules/Admin/Language/fr-ca/Episode.php diff --git a/modules/Admin/Language/fr_CA/EpisodeNavigation.php b/modules/Admin/Language/fr-ca/EpisodeNavigation.php similarity index 100% rename from modules/Admin/Language/fr_CA/EpisodeNavigation.php rename to modules/Admin/Language/fr-ca/EpisodeNavigation.php diff --git a/modules/Admin/Language/fr_CA/Fediverse.php b/modules/Admin/Language/fr-ca/Fediverse.php similarity index 100% rename from modules/Admin/Language/fr_CA/Fediverse.php rename to modules/Admin/Language/fr-ca/Fediverse.php diff --git a/modules/Admin/Language/fr_CA/Home.php b/modules/Admin/Language/fr-ca/Home.php similarity index 100% rename from modules/Admin/Language/fr_CA/Home.php rename to modules/Admin/Language/fr-ca/Home.php diff --git a/modules/Admin/Language/fr_CA/Install.php b/modules/Admin/Language/fr-ca/Install.php similarity index 100% rename from modules/Admin/Language/fr_CA/Install.php rename to modules/Admin/Language/fr-ca/Install.php diff --git a/modules/Admin/Language/fr_CA/Navigation.php b/modules/Admin/Language/fr-ca/Navigation.php similarity index 100% rename from modules/Admin/Language/fr_CA/Navigation.php rename to modules/Admin/Language/fr-ca/Navigation.php diff --git a/modules/Admin/Language/fr_CA/Notifications.php b/modules/Admin/Language/fr-ca/Notifications.php similarity index 100% rename from modules/Admin/Language/fr_CA/Notifications.php rename to modules/Admin/Language/fr-ca/Notifications.php diff --git a/modules/Admin/Language/fr_CA/Page.php b/modules/Admin/Language/fr-ca/Page.php similarity index 100% rename from modules/Admin/Language/fr_CA/Page.php rename to modules/Admin/Language/fr-ca/Page.php diff --git a/modules/Admin/Language/fr_CA/Pager.php b/modules/Admin/Language/fr-ca/Pager.php similarity index 100% rename from modules/Admin/Language/fr_CA/Pager.php rename to modules/Admin/Language/fr-ca/Pager.php diff --git a/modules/Admin/Language/fr_CA/Person.php b/modules/Admin/Language/fr-ca/Person.php similarity index 100% rename from modules/Admin/Language/fr_CA/Person.php rename to modules/Admin/Language/fr-ca/Person.php diff --git a/modules/Admin/Language/fr_CA/Platforms.php b/modules/Admin/Language/fr-ca/Platforms.php similarity index 100% rename from modules/Admin/Language/fr_CA/Platforms.php rename to modules/Admin/Language/fr-ca/Platforms.php diff --git a/modules/Admin/Language/fr_CA/Podcast.php b/modules/Admin/Language/fr-ca/Podcast.php similarity index 100% rename from modules/Admin/Language/fr_CA/Podcast.php rename to modules/Admin/Language/fr-ca/Podcast.php diff --git a/modules/Admin/Language/fr_CA/PodcastNavigation.php b/modules/Admin/Language/fr-ca/PodcastNavigation.php similarity index 100% rename from modules/Admin/Language/fr_CA/PodcastNavigation.php rename to modules/Admin/Language/fr-ca/PodcastNavigation.php diff --git a/modules/Admin/Language/fr_CA/Settings.php b/modules/Admin/Language/fr-ca/Settings.php similarity index 100% rename from modules/Admin/Language/fr_CA/Settings.php rename to modules/Admin/Language/fr-ca/Settings.php diff --git a/modules/Admin/Language/fr_CA/Soundbite.php b/modules/Admin/Language/fr-ca/Soundbite.php similarity index 100% rename from modules/Admin/Language/fr_CA/Soundbite.php rename to modules/Admin/Language/fr-ca/Soundbite.php diff --git a/modules/Admin/Language/fr_CA/Validation.php b/modules/Admin/Language/fr-ca/Validation.php similarity index 100% rename from modules/Admin/Language/fr_CA/Validation.php rename to modules/Admin/Language/fr-ca/Validation.php diff --git a/modules/Admin/Language/fr_CA/VideoClip.php b/modules/Admin/Language/fr-ca/VideoClip.php similarity index 100% rename from modules/Admin/Language/fr_CA/VideoClip.php rename to modules/Admin/Language/fr-ca/VideoClip.php diff --git a/modules/Admin/Language/fr_trad/Breadcrumb.php b/modules/Admin/Language/fr_trad/Breadcrumb.php deleted file mode 100644 index 558b90f7..00000000 --- a/modules/Admin/Language/fr_trad/Breadcrumb.php +++ /dev/null @@ -1,55 +0,0 @@ - 'breadcrumb', - config('Admin') - ->gateway => 'Home', - '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', - 'fediverse' => 'fediverse', - 'blocked-actors' => 'blocked actors', - 'blocked-domains' => 'blocked domains', - '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', -]; diff --git a/modules/Admin/Language/fr_trad/Common.php b/modules/Admin/Language/fr_trad/Common.php deleted file mode 100644 index 596c8bcd..00000000 --- a/modules/Admin/Language/fr_trad/Common.php +++ /dev/null @@ -1,51 +0,0 @@ - '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', - 'forms' => [ - 'editor' => [ - 'write' => 'Write', - 'preview' => 'Preview', - 'help' => 'Powered by markdown', - ], - 'multiSelect' => [ - 'selectText' => 'Press to select', - 'loadingText' => 'Loading…', - 'noResultsText' => 'No results found', - 'noChoicesText' => 'No choices to choose from', - 'maxItemText' => 'Cannot add more items', - ], - 'upload_file' => 'Upload a file', - 'remote_url' => 'Remote URL', - ], - 'play_episode_button' => [ - 'play' => 'Play', - 'playing' => 'Playing', - ], - 'size_limit' => 'Size limit: {0}.', - 'choose_interact' => 'Choose how to interact', - 'view' => 'View', -]; diff --git a/modules/Admin/Language/fr_trad/Episode.php b/modules/Admin/Language/fr_trad/Episode.php deleted file mode 100644 index 91313a7c..00000000 --- a/modules/Admin/Language/fr_trad/Episode.php +++ /dev/null @@ -1,213 +0,0 @@ - 'Season {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_of_comments' => '{numberOfComments, plural, - one {# comment} - other {# comments} - }', - 'all_podcast_episodes' => 'All podcast episodes', - 'back_to_podcast' => 'Go back to podcast', - 'edit' => 'Edit', - 'publish' => 'Publish', - 'publish_edit' => 'Edit publication', - 'publish_date_edit' => 'Edit publication date', - 'unpublish' => 'Unpublish', - 'publish_error' => 'Episode is already published.', - 'publish_edit_error' => 'Episode is already published.', - 'publish_cancel_error' => 'Episode is already published.', - '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!', - 'unpublish_error' => 'Episode is not published.', - 'delete' => 'Delete', - 'go_to_page' => 'Go to page', - 'create' => 'Add an episode', - 'publication_status' => [ - 'published' => 'Published', - 'with_podcast' => 'Published', - 'scheduled' => 'Scheduled', - 'not_published' => 'Not published', - ], - 'with_podcast_hint' => 'To be published at the same time as the podcast', - 'list' => [ - 'search' => [ - 'placeholder' => 'Search for an episode', - 'clear' => 'Clear search', - 'submit' => 'Search', - ], - 'number_of_episodes' => '{numberOfEpisodes, plural, - one {# episode} - other {# episodes} - }', - 'episode' => 'Episode', - 'visibility' => 'Visibility', - 'comments' => 'Comments', - 'actions' => 'Actions', - ], - 'messages' => [ - 'createSuccess' => 'Episode has been successfully created!', - 'editSuccess' => 'Episode has been successfully updated!', - '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.} - }', - 'publishCancelSuccess' => 'Episode publication successfully cancelled!', - 'unpublishBeforeDeleteTip' => 'You must unpublish the episode before deleting it.', - 'scheduleDateError' => 'Schedule date must be set!', - 'deletePublishedEpisodeError' => 'Please unpublish the episode before deleting it.', - 'deleteSuccess' => 'Episode successfully deleted!', - 'deleteError' => 'Failed to delete episode {type, select, - transcript {transcript} - chapters {chapters} - image {cover} - 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.', - 'sameSlugError' => 'An episode with the chosen slug already exists.', - ], - '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.', - 'audio_file' => 'Audio file', - 'audio_file_hint' => 'Choose an .mp3 or .m4a audio file.', - 'info_section_title' => 'Episode info', - 'cover' => 'Episode cover', - '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.', - 'title' => 'Title', - 'title_hint' => - 'Should contain a clear and concise episode name. Do not specify the episode or season numbers here.', - 'permalink' => 'Permalink', - 'season_number' => 'Season', - 'episode_number' => 'Episode', - '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', - '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', - ], - 'premium_title' => 'Premium', - 'premium' => 'Episode must be accessible to premium subscribers only', - 'parental_advisory' => [ - 'label' => 'Parental advisory', - 'hint' => 'Does the episode contain explicit content?', - 'undefined' => 'undefined', - 'clean' => 'Clean', - 'explicit' => 'Explicit', - ], - 'show_notes_section_title' => 'Show notes', - 'show_notes_section_subtitle' => - 'Up to 4000 characters, be clear and concise. Show notes help potential listeners in finding the episode.', - 'description' => 'Description', - 'description_footer' => 'Description footer', - '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.', - 'additional_files_section_title' => 'Additional files', - 'additional_files_section_subtitle' => - 'These files may be used by other platforms to provide better experience to your audience. See the {podcastNamespaceLink} for more information.', - 'location_section_title' => 'Location', - 'location_section_subtitle' => 'What place is this episode about?', - 'location_name' => 'Location name or address', - 'location_name_hint' => 'This can be a real or fictional location', - 'transcript' => 'Transcript (subtitles / closed captions)', - 'transcript_hint' => 'Only .srt are allowed.', - 'transcript_download' => 'Download transcript', - 'transcript_file' => 'Transcript file (.srt)', - 'transcript_remote_url' => 'Remote url for transcript', - 'transcript_file_delete' => 'Delete transcript file', - 'chapters' => 'Chapters', - 'chapters_hint' => 'File must be in JSON Chapters format.', - 'chapters_download' => 'Download chapters', - 'chapters_file' => 'Chapters file', - 'chapters_remote_url' => 'Remote url for chapters file', - 'chapters_file_delete' => 'Delete chapters file', - 'advanced_section_title' => 'Advanced Parameters', - 'advanced_section_subtitle' => - 'If you need RSS tags that Castopod does not handle, set them here.', - 'custom_rss' => 'Custom RSS tags for the episode', - 'custom_rss_hint' => 'This will be injected within the ❬item❭ tag.', - 'block' => 'Episode should be hidden from public catalogues', - 'block_hint' => - 'The episode show or hide status: toggling this on prevents the episode from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', - 'submit_create' => 'Create episode', - 'submit_edit' => 'Save episode', - ], - 'publish_form' => [ - 'back_to_episode_dashboard' => 'Back to episode dashboard', - 'post' => 'Your announcement post', - 'post_hint' => - "Write a message to announce the publication of your episode. The message will be broadcasted to all your followers in the fediverse and be featured in your podcast's homepage.", - 'message_placeholder' => 'Write your message…', - 'publication_date' => 'Publication date', - 'publication_method' => [ - 'now' => 'Now', - 'schedule' => 'Schedule', - 'with_podcast' => 'Publish alongside podcast', - ], - 'scheduled_publication_date' => 'Scheduled publication date', - 'scheduled_publication_date_clear' => 'Clear publication date', - 'scheduled_publication_date_hint' => - 'You can schedule the episode release by setting a future publication date. This field must be formatted as YYYY-MM-DD HH:mm', - 'submit' => 'Publish', - 'submit_edit' => 'Edit publication', - '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 episode.', - 'message_warning_submit' => 'Publish anyways', - ], - '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', - ], - '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.", - 'understand' => 'I understand, I want to unpublish the episode', - 'submit' => 'Unpublish', - ], - 'delete_form' => [ - 'disclaimer' => - "Deleting the episode will delete all media files, comments, video clips and soundbites associated with it.", - 'understand' => 'I understand, I want to delete the episode', - 'submit' => 'Delete', - ], - 'embed' => [ - 'title' => 'Embeddable player', - 'label' => - 'Pick a theme color, copy the embeddable player to clipboard, then paste it on your website.', - 'clipboard_iframe' => 'Copy embeddable player to clipboard', - 'clipboard_url' => 'Copy address to clipboard', - 'dark' => 'Dark', - 'dark-transparent' => 'Dark transparent', - 'light' => 'Light', - 'light-transparent' => 'Light transparent', - ], -]; diff --git a/modules/Admin/Language/fr_trad/Navigation.php b/modules/Admin/Language/fr_trad/Navigation.php deleted file mode 100644 index f158bccd..00000000 --- a/modules/Admin/Language/fr_trad/Navigation.php +++ /dev/null @@ -1,42 +0,0 @@ - 'Toggle sidebar', - 'go_to_website' => 'Go to website', - 'go_to_admin' => 'Go to admin', - 'dashboard' => 'Dashboard', - 'admin' => 'Home', - 'podcasts' => 'Podcasts', - 'podcast-list' => 'All podcasts', - 'podcast-create' => 'New podcast', - 'podcast-import' => 'Import a podcast', - 'persons' => 'Persons', - 'person-list' => 'All persons', - 'person-create' => 'New person', - 'fediverse' => 'Fediverse', - 'fediverse-blocked-actors' => 'Blocked accounts', - 'fediverse-blocked-domains' => 'Blocked domains', - 'users' => 'Users', - 'user-list' => 'All users', - 'user-create' => 'New user', - 'pages' => 'Pages', - 'page-list' => 'All pages', - 'page-create' => 'New Page', - 'settings' => 'Settings', - 'settings-general' => 'General', - 'settings-theme' => 'Theme', - 'admin-about' => 'About', - 'account' => [ - 'my-account' => 'My account', - 'change-password' => 'Change password', - 'logout' => 'Logout', - ], -]; diff --git a/modules/Admin/Language/fr_trad/Platforms.php b/modules/Admin/Language/fr_trad/Platforms.php deleted file mode 100644 index ab17d599..00000000 --- a/modules/Admin/Language/fr_trad/Platforms.php +++ /dev/null @@ -1,30 +0,0 @@ - 'Platforms', - 'home_url' => 'Go to {platformName} website', - 'submit_url' => 'Submit your podcast on {platformName}', - 'visible' => 'Display in podcast homepage?', - 'on_embed' => 'Display on embeddable player?', - 'remove' => 'Remove {platformName}', - 'submit' => 'Save', - 'messages' => [ - 'updateSuccess' => 'Platform links have been successfully updated!', - 'removeLinkSuccess' => 'The platform link has been removed.', - 'removeLinkError' => - 'The platform link could not be removed. Try again.', - ], - 'description' => [ - 'podcasting' => 'The podcast ID on this platform', - 'social' => 'The podcast account ID on this platform', - 'funding' => 'Call to action message', - ], -]; diff --git a/modules/Admin/Language/fr_trad/Podcast.php b/modules/Admin/Language/fr_trad/Podcast.php deleted file mode 100644 index 63c5b613..00000000 --- a/modules/Admin/Language/fr_trad/Podcast.php +++ /dev/null @@ -1,312 +0,0 @@ - 'All podcasts', - 'no_podcast' => 'No podcast found!', - 'create' => 'Create podcast', - 'import' => 'Import podcast', - 'new_episode' => 'New Episode', - 'view' => 'View podcast', - 'edit' => 'Edit podcast', - 'publish' => 'Publish podcast', - 'publish_edit' => 'Edit publication', - 'delete' => 'Delete podcast', - 'see_episodes' => 'See episodes', - 'see_contributors' => 'See contributors', - 'go_to_page' => 'Go to page', - 'latest_episodes' => 'Latest episodes', - 'see_all_episodes' => 'See all episodes', - 'draft' => 'Draft', - 'messages' => [ - 'createSuccess' => 'Podcast successfully created!', - 'editSuccess' => 'Podcast has been successfully updated!', - 'importSuccess' => 'Podcast has been successfully imported!', - 'deleteSuccess' => 'Podcast @{podcast_handle} successfully deleted!', - 'deletePodcastMediaError' => 'Failed to delete podcast {type, select, - cover {cover} - banner {banner} - other {media} - }.', - 'deleteEpisodeMediaError' => 'Failed to delete podcast episode {episode_slug} {type, select, - transcript {transcript} - chapters {chapters} - image {cover} - audio {audio} - other {media} - }.', - 'deletePodcastMediaFolderError' => 'Failed to delete podcast media folder {folder_path}. You may manually remove it from your disk.', - 'podcastFeedUpdateSuccess' => 'Successful update: {number_of_new_episodes, plural, - one {# episode was} - other {# episodes were} - } added to the podcast!', - '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!', - ], - 'form' => [ - 'identity_section_title' => 'Podcast identity', - 'identity_section_subtitle' => 'These fields allow you to get noticed.', - 'cover' => 'Podcast cover', - 'cover_size_hint' => 'Cover must be squared and at least 1400px wide and tall.', - 'banner' => 'Podcast banner', - 'banner_size_hint' => 'Banner must have a 3:1 ratio and be at least 1500px wide.', - 'banner_delete' => 'Delete podcast banner', - 'title' => 'Title', - 'handle' => 'Handle', - 'handle_hint' => - 'Used to identify the podcast. Uppercase, lowercase, numbers and underscores are accepted.', - 'type' => [ - 'label' => 'Type', - 'episodic' => 'Episodic', - 'episodic_hint' => 'If episodes are intended to be consumed without any specific order. Newest episodes will be presented first.', - 'serial' => 'Serial', - 'serial_hint' => 'If episodes are intended to be consumed in sequential order. The oldest episodes will be presented first.', - ], - 'description' => 'Description', - 'classification_section_title' => 'Classification', - 'classification_section_subtitle' => - 'These fields will impact your audience and competition.', - 'language' => 'Language', - 'category' => 'Category', - 'category_placeholder' => 'Select a category…', - 'other_categories' => 'Other categories', - 'parental_advisory' => [ - 'label' => 'Parental advisory', - 'hint' => 'Does it contain explicit content?', - 'undefined' => 'undefined', - 'clean' => 'Clean', - 'explicit' => 'Explicit', - ], - 'author_section_title' => 'Author', - 'author_section_subtitle' => 'Who is managing the podcast?', - 'owner_name' => 'Owner name', - 'owner_name_hint' => - 'For administrative use only. Visible in the public RSS feed.', - 'owner_email' => 'Owner email', - 'owner_email_hint' => - 'Will be used by most platforms to verify the podcast ownership. Visible in the public RSS feed.', - 'publisher' => 'Publisher', - 'publisher_hint' => - 'The group responsible for creating the show. Often refers to the parent company or network of a podcast. This field is sometimes labeled as ’Author’.', - 'copyright' => 'Copyright', - 'location_section_title' => 'Location', - 'location_section_subtitle' => 'What place is this podcast about?', - 'location_name' => 'Location name or address', - 'location_name_hint' => 'This can be a real place or fictional', - 'monetization_section_title' => 'Monetization', - 'monetization_section_subtitle' => - 'Earn money thanks to your audience.', - 'premium' => 'Premium', - 'premium_by_default' => 'Episodes must be set as premium by default', - 'premium_by_default_hint' => 'Podcast episodes will be marked as premium by default. You can still choose to set some episodes, trailers or bonuses as public.', - 'op3' => 'Open Podcast Prefix Project (OP3)', - 'op3_hint' => 'Value your analytics data with OP3, an open-source and trusted third party analytics service. Share, validate and compare your analytics data with the open podcasting ecosystem.', - 'op3_enable' => 'Enable OP3 analytics service', - 'op3_enable_hint' => 'For security reasons, premium episodes\' analytics data will not be shared with OP3.', - 'payment_pointer' => 'Payment Pointer for Web Monetization', - 'payment_pointer_hint' => - 'This is your where you will receive money thanks to Web Monetization', - 'advanced_section_title' => 'Advanced Parameters', - 'advanced_section_subtitle' => - 'If you need RSS tags that Castopod does not handle, set them here.', - 'custom_rss' => 'Custom RSS tags for the podcast', - 'custom_rss_hint' => 'This will be injected within the ❬channel❭ tag.', - 'new_feed_url' => 'New feed URL', - 'new_feed_url_hint' => 'Use this field when you move to another domain or podcast hosting platform. By default, the value is set to the current RSS URL if the podcast is imported.', - 'old_feed_url' => 'Old feed URL', - 'update_feed' => 'Update feed', - 'update_feed_tip' => 'Import this podcast\'s latest episodes', - 'partnership' => 'Partnership', - 'partner_id' => 'ID', - 'partner_link_url' => 'Link URL', - 'partner_image_url' => 'Image URL', - 'partner_id_hint' => 'Your own partner ID', - 'partner_link_url_hint' => 'The generic partner link address', - 'partner_image_url_hint' => 'The generic partner image address', - 'status_section_title' => 'Status', - 'block' => 'Podcast should be hidden from public catalogues', - 'block_hint' => - 'The podcast show or hide status: toggling this on prevents the entire podcast from appearing in Apple Podcasts, Google Podcasts, and any third party apps that pull shows from these directories. (Not guaranteed)', - 'complete' => 'Podcast will not be having new episodes', - 'lock' => 'Prevent podcast from being copied', - 'lock_hint' => - 'The purpose is to tell other podcast platforms whether they are allowed to import this feed. A value of yes means that any attempt to import this feed into a new platform should be rejected.', - 'submit_create' => 'Create podcast', - 'submit_edit' => 'Save podcast', - ], - 'category_options' => [ - 'uncategorized' => 'uncategorized', - 'arts' => 'Arts', - 'business' => 'Business', - 'comedy' => 'Comedy', - 'education' => 'Education', - 'fiction' => 'Fiction', - 'government' => 'Government', - 'health_and_fitness' => 'Health & Fitness', - 'history' => 'History', - 'kids_and_family' => 'Kids & Family', - 'leisure' => 'Leisure', - 'music' => 'Music', - 'news' => 'News', - 'religion_and_spirituality' => 'Religion & Spirituality', - 'science' => 'Science', - 'society_and_culture' => 'Society & Culture', - 'sports' => 'Sports', - 'technology' => 'Technology', - 'true_crime' => 'True Crime', - 'tv_and_film' => 'TV & Film', - 'books' => 'Books', - 'design' => 'Design', - 'fashion_and_beauty' => 'Fashion & Beauty', - 'food' => 'Food', - 'performing_arts' => 'Performing Arts', - 'visual_arts' => 'Visual Arts', - 'careers' => 'Careers', - 'entrepreneurship' => 'Entrepreneurship', - 'investing' => 'Investing', - 'management' => 'Management', - 'marketing' => 'Marketing', - 'non_profit' => 'Non-Profit', - 'comedy_interviews' => 'Comedy Interviews', - 'improv' => 'Improv', - 'stand_up' => 'Stand-Up', - 'courses' => 'Courses', - 'how_to' => 'How To', - 'language_learning' => 'Language Learning', - 'self_improvement' => 'Self-Improvement', - 'comedy_fiction' => 'Comedy Fiction', - 'drama' => 'Drama', - 'science_fiction' => 'Science Fiction', - 'alternative_health' => 'Alternative Health', - 'fitness' => 'Fitness', - 'medicine' => 'Medicine', - 'mental_health' => 'Mental Health', - 'nutrition' => 'Nutrition', - 'sexuality' => 'Sexuality', - 'education_for_kids' => 'Education for Kids', - 'parenting' => 'Parenting', - 'pets_and_animals' => 'Pets & Animals', - 'stories_for_kids' => 'Stories for Kids', - 'animation_and_manga' => 'Animation & Manga', - 'automotive' => 'Automotive', - 'aviation' => 'Aviation', - 'crafts' => 'Crafts', - 'games' => 'Games', - 'hobbies' => 'Hobbies', - 'home_and_garden' => 'Home & Garden', - 'video_games' => 'Video Games', - 'music_commentary' => 'Music Commentary', - 'music_history' => 'Music History', - 'music_interviews' => 'Music Interviews', - 'business_news' => 'Business News', - 'daily_news' => 'Daily News', - 'entertainment_news' => 'Entertainment News', - 'news_commentary' => 'News Commentary', - 'politics' => 'Politics', - 'sports_news' => 'Sports News', - 'tech_news' => 'Tech News', - 'buddhism' => 'Buddhism', - 'christianity' => 'Christianity', - 'hinduism' => 'Hinduism', - 'islam' => 'Islam', - 'judaism' => 'Judaism', - 'religion' => 'Religion', - 'spirituality' => 'Spirituality', - 'astronomy' => 'Astronomy', - 'chemistry' => 'Chemistry', - 'earth_sciences' => 'Earth Sciences', - 'life_sciences' => 'Life Sciences', - 'mathematics' => 'Mathematics', - 'natural_sciences' => 'Natural Sciences', - 'nature' => 'Nature', - 'physics' => 'Physics', - 'social_sciences' => 'Social Sciences', - 'documentary' => 'Documentary', - 'personal_journals' => 'Personal Journals', - 'philosophy' => 'Philosophy', - 'places_and_travel' => 'Places & Travel', - 'relationships' => 'Relationships', - 'baseball' => 'Baseball', - 'basketball' => 'Basketball', - 'cricket' => 'Cricket', - 'fantasy_sports' => 'Fantasy Sports', - 'football' => 'Football', - 'golf' => 'Golf', - 'hockey' => 'Hockey', - 'rugby' => 'Rugby', - 'running' => 'Running', - 'soccer' => 'Soccer', - 'swimming' => 'Swimming', - 'tennis' => 'Tennis', - 'volleyball' => 'Volleyball', - 'wilderness' => 'Wilderness', - 'wrestling' => 'Wrestling', - 'after_shows' => 'After Shows', - 'film_history' => 'Film History', - 'film_interviews' => 'Film Interviews', - 'film_reviews' => 'Film Reviews', - 'tv_reviews' => 'TV Reviews', - ], - 'publish_form' => [ - 'back_to_podcast_dashboard' => 'Back to podcast dashboard', - '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', - 'publication_date' => 'Publication date', - 'publication_method' => [ - 'now' => 'Now', - 'schedule' => 'Schedule', - ], - 'scheduled_publication_date' => 'Scheduled publication date', - 'scheduled_publication_date_hint' => - 'You can schedule the podcast release by setting a future publication date. This field must be formatted as YYYY-MM-DD HH:mm', - 'submit_edit' => 'Edit publication', - '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', - ], - 'publication_status_banner' => [ - 'draft_mode' => 'draft mode', - 'not_published' => 'This podcast is not yet published.', - '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', - ], - 'by' => 'By {publisher}', - 'season' => 'Season {seasonNumber}', - 'list_of_episodes_year' => '{year} episodes ({episodeCount})', - 'list_of_episodes_season' => - 'Season {seasonNumber} episodes ({episodeCount})', - 'no_episode' => 'No episode found!', - 'follow' => 'Follow', - 'followers' => '{numberOfFollowers, plural, - one {# follower} - other {# followers} - }', - 'posts' => '{numberOfPosts, plural, - one {# post} - other {# posts} - }', - 'activity' => 'Activity', - 'episodes' => 'Episodes', - 'sponsor' => 'Sponsor', - 'funding_links' => 'Funding links for {podcastTitle}', - 'find_on' => 'Find {podcastTitle} on', - 'listen_on' => 'Listen on', -]; diff --git a/modules/Admin/Language/fr_trad/PodcastNavigation.php b/modules/Admin/Language/fr_trad/PodcastNavigation.php deleted file mode 100644 index 5bf37b42..00000000 --- a/modules/Admin/Language/fr_trad/PodcastNavigation.php +++ /dev/null @@ -1,38 +0,0 @@ - 'Go to podcast page', - 'dashboard' => 'Podcast dashboard', - 'podcast-view' => 'Home', - 'podcast-edit' => 'Edit podcast', - 'podcast-persons-manage' => 'Manage persons', - 'episodes' => 'Episodes', - 'episode-list' => 'All episodes', - 'episode-create' => 'New episode', - 'analytics' => 'Analytics', - 'podcast-analytics' => 'Audience overview', - 'podcast-analytics-webpages' => 'Web pages visits', - 'podcast-analytics-locations' => 'Locations', - 'podcast-analytics-unique-listeners' => 'Unique listeners', - 'podcast-analytics-players' => 'Players', - 'podcast-analytics-listening-time' => 'Listening time', - 'podcast-analytics-time-periods' => 'Time periods', - 'premium' => 'Premium', - 'subscription-list' => 'All subscriptions', - 'subscription-create' => 'Add subscription', - 'contributors' => 'Contributors', - 'contributor-list' => 'All contributors', - 'contributor-add' => 'Add contributor', - 'platforms' => 'External platforms', - 'platforms-podcasting' => 'Podcasting', - 'platforms-social' => 'Social networks', - 'platforms-funding' => 'Funding', -]; diff --git a/modules/Admin/Language/fr_trad/Validation.php b/modules/Admin/Language/fr_trad/Validation.php deleted file mode 100644 index 3bc78cfe..00000000 --- a/modules/Admin/Language/fr_trad/Validation.php +++ /dev/null @@ -1,16 +0,0 @@ - - '{field} is either not an image, or it is not wide or tall enough.', - 'is_image_ratio' => - '{field} is either not an image or not of the right ratio.', -]; diff --git a/modules/Admin/Language/nn-NO/AboutCastopod.php b/modules/Admin/Language/nn-no/AboutCastopod.php similarity index 100% rename from modules/Admin/Language/nn-NO/AboutCastopod.php rename to modules/Admin/Language/nn-no/AboutCastopod.php diff --git a/modules/Admin/Language/nn-NO/Breadcrumb.php b/modules/Admin/Language/nn-no/Breadcrumb.php similarity index 100% rename from modules/Admin/Language/nn-NO/Breadcrumb.php rename to modules/Admin/Language/nn-no/Breadcrumb.php diff --git a/modules/Admin/Language/nn-NO/Charts.php b/modules/Admin/Language/nn-no/Charts.php similarity index 100% rename from modules/Admin/Language/nn-NO/Charts.php rename to modules/Admin/Language/nn-no/Charts.php diff --git a/modules/Admin/Language/nn-NO/Common.php b/modules/Admin/Language/nn-no/Common.php similarity index 100% rename from modules/Admin/Language/nn-NO/Common.php rename to modules/Admin/Language/nn-no/Common.php diff --git a/modules/Admin/Language/nn-NO/Countries.php b/modules/Admin/Language/nn-no/Countries.php similarity index 100% rename from modules/Admin/Language/nn-NO/Countries.php rename to modules/Admin/Language/nn-no/Countries.php diff --git a/modules/Admin/Language/nn-NO/Dashboard.php b/modules/Admin/Language/nn-no/Dashboard.php similarity index 100% rename from modules/Admin/Language/nn-NO/Dashboard.php rename to modules/Admin/Language/nn-no/Dashboard.php diff --git a/modules/Admin/Language/nn-NO/Episode.php b/modules/Admin/Language/nn-no/Episode.php similarity index 100% rename from modules/Admin/Language/nn-NO/Episode.php rename to modules/Admin/Language/nn-no/Episode.php diff --git a/modules/Admin/Language/nn-NO/EpisodeNavigation.php b/modules/Admin/Language/nn-no/EpisodeNavigation.php similarity index 100% rename from modules/Admin/Language/nn-NO/EpisodeNavigation.php rename to modules/Admin/Language/nn-no/EpisodeNavigation.php diff --git a/modules/Admin/Language/nn-NO/Fediverse.php b/modules/Admin/Language/nn-no/Fediverse.php similarity index 100% rename from modules/Admin/Language/nn-NO/Fediverse.php rename to modules/Admin/Language/nn-no/Fediverse.php diff --git a/modules/Admin/Language/nn-NO/Home.php b/modules/Admin/Language/nn-no/Home.php similarity index 100% rename from modules/Admin/Language/nn-NO/Home.php rename to modules/Admin/Language/nn-no/Home.php diff --git a/modules/Admin/Language/nn-NO/Install.php b/modules/Admin/Language/nn-no/Install.php similarity index 100% rename from modules/Admin/Language/nn-NO/Install.php rename to modules/Admin/Language/nn-no/Install.php diff --git a/modules/Admin/Language/nn-NO/Navigation.php b/modules/Admin/Language/nn-no/Navigation.php similarity index 100% rename from modules/Admin/Language/nn-NO/Navigation.php rename to modules/Admin/Language/nn-no/Navigation.php diff --git a/modules/Admin/Language/nn-NO/Notifications.php b/modules/Admin/Language/nn-no/Notifications.php similarity index 100% rename from modules/Admin/Language/nn-NO/Notifications.php rename to modules/Admin/Language/nn-no/Notifications.php diff --git a/modules/Admin/Language/nn-NO/Page.php b/modules/Admin/Language/nn-no/Page.php similarity index 100% rename from modules/Admin/Language/nn-NO/Page.php rename to modules/Admin/Language/nn-no/Page.php diff --git a/modules/Admin/Language/nn-NO/Pager.php b/modules/Admin/Language/nn-no/Pager.php similarity index 100% rename from modules/Admin/Language/nn-NO/Pager.php rename to modules/Admin/Language/nn-no/Pager.php diff --git a/modules/Admin/Language/nn-NO/Person.php b/modules/Admin/Language/nn-no/Person.php similarity index 100% rename from modules/Admin/Language/nn-NO/Person.php rename to modules/Admin/Language/nn-no/Person.php diff --git a/modules/Admin/Language/nn-NO/Platforms.php b/modules/Admin/Language/nn-no/Platforms.php similarity index 100% rename from modules/Admin/Language/nn-NO/Platforms.php rename to modules/Admin/Language/nn-no/Platforms.php diff --git a/modules/Admin/Language/nn-NO/Podcast.php b/modules/Admin/Language/nn-no/Podcast.php similarity index 100% rename from modules/Admin/Language/nn-NO/Podcast.php rename to modules/Admin/Language/nn-no/Podcast.php diff --git a/modules/Admin/Language/nn-NO/PodcastNavigation.php b/modules/Admin/Language/nn-no/PodcastNavigation.php similarity index 100% rename from modules/Admin/Language/nn-NO/PodcastNavigation.php rename to modules/Admin/Language/nn-no/PodcastNavigation.php diff --git a/modules/Admin/Language/nn-NO/Settings.php b/modules/Admin/Language/nn-no/Settings.php similarity index 100% rename from modules/Admin/Language/nn-NO/Settings.php rename to modules/Admin/Language/nn-no/Settings.php diff --git a/modules/Admin/Language/nn-NO/Soundbite.php b/modules/Admin/Language/nn-no/Soundbite.php similarity index 100% rename from modules/Admin/Language/nn-NO/Soundbite.php rename to modules/Admin/Language/nn-no/Soundbite.php diff --git a/modules/Admin/Language/nn-NO/Validation.php b/modules/Admin/Language/nn-no/Validation.php similarity index 100% rename from modules/Admin/Language/nn-NO/Validation.php rename to modules/Admin/Language/nn-no/Validation.php diff --git a/modules/Admin/Language/nn-NO/VideoClip.php b/modules/Admin/Language/nn-no/VideoClip.php similarity index 100% rename from modules/Admin/Language/nn-NO/VideoClip.php rename to modules/Admin/Language/nn-no/VideoClip.php diff --git a/modules/Admin/Language/fr_trad/AboutCastopod.php b/modules/Admin/Language/pt-br/AboutCastopod.php similarity index 100% rename from modules/Admin/Language/fr_trad/AboutCastopod.php rename to modules/Admin/Language/pt-br/AboutCastopod.php diff --git a/modules/Admin/Language/pt-BR/Breadcrumb.php b/modules/Admin/Language/pt-br/Breadcrumb.php similarity index 100% rename from modules/Admin/Language/pt-BR/Breadcrumb.php rename to modules/Admin/Language/pt-br/Breadcrumb.php diff --git a/modules/Admin/Language/pt-BR/Charts.php b/modules/Admin/Language/pt-br/Charts.php similarity index 100% rename from modules/Admin/Language/pt-BR/Charts.php rename to modules/Admin/Language/pt-br/Charts.php diff --git a/modules/Admin/Language/pt-BR/Common.php b/modules/Admin/Language/pt-br/Common.php similarity index 100% rename from modules/Admin/Language/pt-BR/Common.php rename to modules/Admin/Language/pt-br/Common.php diff --git a/modules/Admin/Language/pt-BR/Countries.php b/modules/Admin/Language/pt-br/Countries.php similarity index 100% rename from modules/Admin/Language/pt-BR/Countries.php rename to modules/Admin/Language/pt-br/Countries.php diff --git a/modules/Admin/Language/pt-BR/Dashboard.php b/modules/Admin/Language/pt-br/Dashboard.php similarity index 100% rename from modules/Admin/Language/pt-BR/Dashboard.php rename to modules/Admin/Language/pt-br/Dashboard.php diff --git a/modules/Admin/Language/pt-BR/Episode.php b/modules/Admin/Language/pt-br/Episode.php similarity index 100% rename from modules/Admin/Language/pt-BR/Episode.php rename to modules/Admin/Language/pt-br/Episode.php diff --git a/modules/Admin/Language/pt-BR/EpisodeNavigation.php b/modules/Admin/Language/pt-br/EpisodeNavigation.php similarity index 100% rename from modules/Admin/Language/pt-BR/EpisodeNavigation.php rename to modules/Admin/Language/pt-br/EpisodeNavigation.php diff --git a/modules/Admin/Language/pt-BR/Fediverse.php b/modules/Admin/Language/pt-br/Fediverse.php similarity index 100% rename from modules/Admin/Language/pt-BR/Fediverse.php rename to modules/Admin/Language/pt-br/Fediverse.php diff --git a/modules/Admin/Language/pt-BR/Home.php b/modules/Admin/Language/pt-br/Home.php similarity index 100% rename from modules/Admin/Language/pt-BR/Home.php rename to modules/Admin/Language/pt-br/Home.php diff --git a/modules/Admin/Language/pt-BR/Install.php b/modules/Admin/Language/pt-br/Install.php similarity index 100% rename from modules/Admin/Language/pt-BR/Install.php rename to modules/Admin/Language/pt-br/Install.php diff --git a/modules/Admin/Language/pt-BR/Navigation.php b/modules/Admin/Language/pt-br/Navigation.php similarity index 100% rename from modules/Admin/Language/pt-BR/Navigation.php rename to modules/Admin/Language/pt-br/Navigation.php diff --git a/modules/Admin/Language/fr_trad/Notifications.php b/modules/Admin/Language/pt-br/Notifications.php similarity index 100% rename from modules/Admin/Language/fr_trad/Notifications.php rename to modules/Admin/Language/pt-br/Notifications.php diff --git a/modules/Admin/Language/pt-BR/Page.php b/modules/Admin/Language/pt-br/Page.php similarity index 100% rename from modules/Admin/Language/pt-BR/Page.php rename to modules/Admin/Language/pt-br/Page.php diff --git a/modules/Admin/Language/pt-BR/Pager.php b/modules/Admin/Language/pt-br/Pager.php similarity index 100% rename from modules/Admin/Language/pt-BR/Pager.php rename to modules/Admin/Language/pt-br/Pager.php diff --git a/modules/Admin/Language/pt-BR/Person.php b/modules/Admin/Language/pt-br/Person.php similarity index 100% rename from modules/Admin/Language/pt-BR/Person.php rename to modules/Admin/Language/pt-br/Person.php diff --git a/modules/Admin/Language/pt-BR/Platforms.php b/modules/Admin/Language/pt-br/Platforms.php similarity index 100% rename from modules/Admin/Language/pt-BR/Platforms.php rename to modules/Admin/Language/pt-br/Platforms.php diff --git a/modules/Admin/Language/pt-BR/Podcast.php b/modules/Admin/Language/pt-br/Podcast.php similarity index 100% rename from modules/Admin/Language/pt-BR/Podcast.php rename to modules/Admin/Language/pt-br/Podcast.php diff --git a/modules/Admin/Language/pt-BR/PodcastNavigation.php b/modules/Admin/Language/pt-br/PodcastNavigation.php similarity index 100% rename from modules/Admin/Language/pt-BR/PodcastNavigation.php rename to modules/Admin/Language/pt-br/PodcastNavigation.php diff --git a/modules/Admin/Language/pt-BR/Settings.php b/modules/Admin/Language/pt-br/Settings.php similarity index 100% rename from modules/Admin/Language/pt-BR/Settings.php rename to modules/Admin/Language/pt-br/Settings.php diff --git a/modules/Admin/Language/pt-BR/Soundbite.php b/modules/Admin/Language/pt-br/Soundbite.php similarity index 100% rename from modules/Admin/Language/pt-BR/Soundbite.php rename to modules/Admin/Language/pt-br/Soundbite.php diff --git a/modules/Admin/Language/pt-BR/Validation.php b/modules/Admin/Language/pt-br/Validation.php similarity index 100% rename from modules/Admin/Language/pt-BR/Validation.php rename to modules/Admin/Language/pt-br/Validation.php diff --git a/modules/Admin/Language/pt-BR/VideoClip.php b/modules/Admin/Language/pt-br/VideoClip.php similarity index 100% rename from modules/Admin/Language/pt-BR/VideoClip.php rename to modules/Admin/Language/pt-br/VideoClip.php diff --git a/modules/Admin/Language/sr-Latn/AboutCastopod.php b/modules/Admin/Language/sr-latn/AboutCastopod.php similarity index 100% rename from modules/Admin/Language/sr-Latn/AboutCastopod.php rename to modules/Admin/Language/sr-latn/AboutCastopod.php diff --git a/modules/Admin/Language/sr-Latn/Breadcrumb.php b/modules/Admin/Language/sr-latn/Breadcrumb.php similarity index 100% rename from modules/Admin/Language/sr-Latn/Breadcrumb.php rename to modules/Admin/Language/sr-latn/Breadcrumb.php diff --git a/modules/Admin/Language/sr-Latn/Charts.php b/modules/Admin/Language/sr-latn/Charts.php similarity index 100% rename from modules/Admin/Language/sr-Latn/Charts.php rename to modules/Admin/Language/sr-latn/Charts.php diff --git a/modules/Admin/Language/sr-Latn/Common.php b/modules/Admin/Language/sr-latn/Common.php similarity index 100% rename from modules/Admin/Language/sr-Latn/Common.php rename to modules/Admin/Language/sr-latn/Common.php diff --git a/modules/Admin/Language/sr-Latn/Countries.php b/modules/Admin/Language/sr-latn/Countries.php similarity index 100% rename from modules/Admin/Language/sr-Latn/Countries.php rename to modules/Admin/Language/sr-latn/Countries.php diff --git a/modules/Admin/Language/sr-Latn/Dashboard.php b/modules/Admin/Language/sr-latn/Dashboard.php similarity index 100% rename from modules/Admin/Language/sr-Latn/Dashboard.php rename to modules/Admin/Language/sr-latn/Dashboard.php diff --git a/modules/Admin/Language/sr-Latn/Episode.php b/modules/Admin/Language/sr-latn/Episode.php similarity index 100% rename from modules/Admin/Language/sr-Latn/Episode.php rename to modules/Admin/Language/sr-latn/Episode.php diff --git a/modules/Admin/Language/sr-Latn/EpisodeNavigation.php b/modules/Admin/Language/sr-latn/EpisodeNavigation.php similarity index 100% rename from modules/Admin/Language/sr-Latn/EpisodeNavigation.php rename to modules/Admin/Language/sr-latn/EpisodeNavigation.php diff --git a/modules/Admin/Language/sr-Latn/Fediverse.php b/modules/Admin/Language/sr-latn/Fediverse.php similarity index 100% rename from modules/Admin/Language/sr-Latn/Fediverse.php rename to modules/Admin/Language/sr-latn/Fediverse.php diff --git a/modules/Admin/Language/sr-Latn/Home.php b/modules/Admin/Language/sr-latn/Home.php similarity index 100% rename from modules/Admin/Language/sr-Latn/Home.php rename to modules/Admin/Language/sr-latn/Home.php diff --git a/modules/Admin/Language/sr-Latn/Install.php b/modules/Admin/Language/sr-latn/Install.php similarity index 100% rename from modules/Admin/Language/sr-Latn/Install.php rename to modules/Admin/Language/sr-latn/Install.php diff --git a/modules/Admin/Language/sr-Latn/Navigation.php b/modules/Admin/Language/sr-latn/Navigation.php similarity index 100% rename from modules/Admin/Language/sr-Latn/Navigation.php rename to modules/Admin/Language/sr-latn/Navigation.php diff --git a/modules/Admin/Language/sr-Latn/Notifications.php b/modules/Admin/Language/sr-latn/Notifications.php similarity index 100% rename from modules/Admin/Language/sr-Latn/Notifications.php rename to modules/Admin/Language/sr-latn/Notifications.php diff --git a/modules/Admin/Language/sr-Latn/Page.php b/modules/Admin/Language/sr-latn/Page.php similarity index 100% rename from modules/Admin/Language/sr-Latn/Page.php rename to modules/Admin/Language/sr-latn/Page.php diff --git a/modules/Admin/Language/sr-Latn/Pager.php b/modules/Admin/Language/sr-latn/Pager.php similarity index 100% rename from modules/Admin/Language/sr-Latn/Pager.php rename to modules/Admin/Language/sr-latn/Pager.php diff --git a/modules/Admin/Language/sr-Latn/Person.php b/modules/Admin/Language/sr-latn/Person.php similarity index 100% rename from modules/Admin/Language/sr-Latn/Person.php rename to modules/Admin/Language/sr-latn/Person.php diff --git a/modules/Admin/Language/sr-Latn/Platforms.php b/modules/Admin/Language/sr-latn/Platforms.php similarity index 100% rename from modules/Admin/Language/sr-Latn/Platforms.php rename to modules/Admin/Language/sr-latn/Platforms.php diff --git a/modules/Admin/Language/sr-Latn/Podcast.php b/modules/Admin/Language/sr-latn/Podcast.php similarity index 100% rename from modules/Admin/Language/sr-Latn/Podcast.php rename to modules/Admin/Language/sr-latn/Podcast.php diff --git a/modules/Admin/Language/sr-Latn/PodcastNavigation.php b/modules/Admin/Language/sr-latn/PodcastNavigation.php similarity index 100% rename from modules/Admin/Language/sr-Latn/PodcastNavigation.php rename to modules/Admin/Language/sr-latn/PodcastNavigation.php diff --git a/modules/Admin/Language/sr-Latn/Settings.php b/modules/Admin/Language/sr-latn/Settings.php similarity index 100% rename from modules/Admin/Language/sr-Latn/Settings.php rename to modules/Admin/Language/sr-latn/Settings.php diff --git a/modules/Admin/Language/sr-Latn/Soundbite.php b/modules/Admin/Language/sr-latn/Soundbite.php similarity index 100% rename from modules/Admin/Language/sr-Latn/Soundbite.php rename to modules/Admin/Language/sr-latn/Soundbite.php diff --git a/modules/Admin/Language/sr-Latn/Validation.php b/modules/Admin/Language/sr-latn/Validation.php similarity index 100% rename from modules/Admin/Language/sr-Latn/Validation.php rename to modules/Admin/Language/sr-latn/Validation.php diff --git a/modules/Admin/Language/sr-Latn/VideoClip.php b/modules/Admin/Language/sr-latn/VideoClip.php similarity index 100% rename from modules/Admin/Language/sr-Latn/VideoClip.php rename to modules/Admin/Language/sr-latn/VideoClip.php diff --git a/modules/Admin/Language/sr_Latn/Validation.php b/modules/Admin/Language/sr_Latn/Validation.php deleted file mode 100644 index d83783d4..00000000 --- a/modules/Admin/Language/sr_Latn/Validation.php +++ /dev/null @@ -1,17 +0,0 @@ - - '{field} ili nije slika ili nije dovoljne dužine/visine.', - 'is_image_ratio' => - '{field} ili nije slike ili nije u pravom odnosu veličina.', - 'is_json' => '{field} contains invalid JSON.', -]; diff --git a/modules/Admin/Language/zh-Hant/AboutCastopod.php b/modules/Admin/Language/zh-Hant/AboutCastopod.php deleted file mode 100644 index 3fb62aff..00000000 --- a/modules/Admin/Language/zh-Hant/AboutCastopod.php +++ /dev/null @@ -1,22 +0,0 @@ - 'About Castopod', - 'host_name' => 'Host name', - 'version' => 'Castopod version', - 'php_version' => 'PHP version', - 'os' => 'Operating System', - 'languages' => 'Languages', - 'update_database' => 'Update database', - 'messages' => [ - 'databaseUpdateSuccess' => 'Database is up to date!', - ], -]; diff --git a/modules/Admin/Language/zh-Hant/Charts.php b/modules/Admin/Language/zh-Hant/Charts.php deleted file mode 100644 index 6ede2510..00000000 --- a/modules/Admin/Language/zh-Hant/Charts.php +++ /dev/null @@ -1,41 +0,0 @@ - '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', - '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)', - '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)', - 'total_bandwidth_by_month_limit' => 'Limited to {totalBandwidth} per month', -]; diff --git a/modules/Admin/Language/zh-Hant/Countries.php b/modules/Admin/Language/zh-Hant/Countries.php deleted file mode 100644 index 4cd5d9c8..00000000 --- a/modules/Admin/Language/zh-Hant/Countries.php +++ /dev/null @@ -1,264 +0,0 @@ - 'Andorra', - 'AE' => 'United Arab Emirates', - 'AF' => 'Afghanistan', - 'AG' => 'Antigua and Barbuda', - 'AI' => 'Anguilla', - 'AL' => 'Albania', - 'AM' => 'Armenia', - 'AO' => 'Angola', - 'AQ' => 'Antarctica', - 'AR' => 'Argentina', - 'AS' => 'American Samoa', - 'AT' => 'Austria', - 'AU' => 'Australia', - 'AW' => 'Aruba', - 'AX' => 'Åland Islands', - 'AZ' => 'Azerbaijan', - 'BA' => 'Bosnia and Herzegovina', - 'BB' => 'Barbados', - 'BD' => 'Bangladesh', - 'BE' => 'Belgium', - 'BF' => 'Burkina Faso', - 'BG' => 'Bulgaria', - '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', - 'BS' => 'Bahamas', - 'BT' => 'Bhutan', - 'BV' => 'Bouvet Island', - 'BW' => 'Botswana', - 'BY' => 'Belarus', - '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', - 'CN' => 'China', - 'CO' => 'Colombia', - 'CR' => 'Costa Rica', - 'CU' => 'Cuba', - 'CV' => 'Cape Verde', - 'CW' => 'Curaçao', - 'CX' => 'Christmas Island', - 'CY' => 'Cyprus', - 'CZ' => 'Czech Republic', - 'DE' => 'Germany', - 'DJ' => 'Djibouti', - 'DK' => 'Denmark', - 'DM' => 'Dominica', - 'DO' => 'Dominican Republic', - 'DZ' => 'Algeria', - 'EC' => 'Ecuador', - 'EE' => 'Estonia', - 'EG' => 'Egypt', - 'EH' => 'Western Sahara', - 'ER' => 'Eritrea', - 'ES' => 'Spain', - 'ET' => 'Ethiopia', - 'FI' => 'Finland', - 'FJ' => 'Fiji', - 'FK' => 'Falkland Islands (Malvinas)', - 'FM' => 'Micronesia, Federated States of', - 'FO' => 'Faroe Islands', - 'FR' => 'France', - 'GA' => 'Gabon', - 'GB' => 'United Kingdom', - 'GD' => 'Grenada', - 'GE' => 'Georgia', - 'GF' => 'French Guiana', - 'GG' => 'Guernsey', - 'GH' => 'Ghana', - 'GI' => 'Gibraltar', - 'GL' => 'Greenland', - 'GM' => 'Gambia', - 'GN' => 'Guinea', - 'GP' => 'Guadeloupe', - 'GQ' => 'Equatorial Guinea', - 'GR' => 'Greece', - 'GS' => 'South Georgia and the South Sandwich Islands', - 'GT' => 'Guatemala', - 'GU' => 'Guam', - 'GW' => 'Guinea-Bissau', - 'GY' => 'Guyana', - 'HK' => 'Hong Kong', - 'HM' => 'Heard Island and McDonald Islands', - 'HN' => 'Honduras', - 'HR' => 'Croatia', - 'HT' => 'Haiti', - 'HU' => 'Hungary', - 'ID' => 'Indonesia', - 'IE' => 'Ireland', - 'IL' => 'Israel', - 'IM' => 'Isle of Man', - 'IN' => 'India', - 'IO' => 'British Indian Ocean Territory', - 'IQ' => 'Iraq', - 'IR' => 'Iran, Islamic Republic of', - 'IS' => 'Iceland', - 'IT' => 'Italy', - 'JE' => 'Jersey', - 'JM' => 'Jamaica', - 'JO' => 'Jordan', - 'JP' => 'Japan', - 'KE' => 'Kenya', - 'KG' => 'Kyrgyzstan', - 'KH' => 'Cambodia', - '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", - 'LB' => 'Lebanon', - 'LC' => 'Saint Lucia', - 'LI' => 'Liechtenstein', - 'LK' => 'Sri Lanka', - 'LR' => 'Liberia', - 'LS' => 'Lesotho', - 'LT' => 'Lithuania', - 'LU' => 'Luxembourg', - 'LV' => 'Latvia', - 'LY' => 'Libya', - 'MA' => 'Morocco', - 'MC' => 'Monaco', - 'MD' => 'Moldova, Republic of', - 'ME' => 'Montenegro', - 'MF' => 'Saint Martin (French part)', - 'MG' => 'Madagascar', - 'MH' => 'Marshall Islands', - 'MK' => 'Macedonia, the Former Yugoslav Republic of', - 'ML' => 'Mali', - 'MM' => 'Myanmar', - 'MN' => 'Mongolia', - 'MO' => 'Macao', - 'MP' => 'Northern Mariana Islands', - 'MQ' => 'Martinique', - 'MR' => 'Mauritania', - 'MS' => 'Montserrat', - 'MT' => 'Malta', - 'MU' => 'Mauritius', - 'MV' => 'Maldives', - 'MW' => 'Malawi', - 'MX' => 'Mexico', - 'MY' => 'Malaysia', - 'MZ' => 'Mozambique', - 'N/A' => 'Not Applicable (local IP…)', - 'NA' => 'Namibia', - 'NC' => 'New Caledonia', - 'NE' => 'Niger', - 'NF' => 'Norfolk Island', - 'NG' => 'Nigeria', - 'NI' => 'Nicaragua', - 'NL' => 'Netherlands', - 'NO' => 'Norway', - 'NP' => 'Nepal', - 'NR' => 'Nauru', - 'NU' => 'Niue', - 'NZ' => 'New Zealand', - 'OM' => 'Oman', - 'PA' => 'Panama', - 'PE' => 'Peru', - 'PF' => 'French Polynesia', - 'PG' => 'Papua New Guinea', - 'PH' => 'Philippines', - 'PK' => 'Pakistan', - 'PL' => 'Poland', - 'PM' => 'Saint Pierre and Miquelon', - 'PN' => 'Pitcairn', - 'PR' => 'Puerto Rico', - 'PS' => 'Palestine, State of', - 'PT' => 'Portugal', - 'PW' => 'Palau', - 'PY' => 'Paraguay', - 'QA' => 'Qatar', - 'RE' => 'Réunion', - 'RO' => 'Romania', - 'RS' => 'Serbia', - 'RU' => 'Russian Federation', - 'RW' => 'Rwanda', - 'SA' => 'Saudi Arabia', - 'SB' => 'Solomon Islands', - 'SC' => 'Seychelles', - 'SD' => 'Sudan', - 'SE' => 'Sweden', - 'SG' => 'Singapore', - 'SH' => 'Saint Helena, Ascension and Tristan da Cunha', - 'SI' => 'Slovenia', - 'SJ' => 'Svalbard and Jan Mayen', - 'SK' => 'Slovakia', - 'SL' => 'Sierra Leone', - 'SM' => 'San Marino', - 'SN' => 'Senegal', - 'SO' => 'Somalia', - 'SR' => 'Suriname', - 'SS' => 'South Sudan', - 'ST' => 'Sao Tome and Principe', - 'SV' => 'El Salvador', - 'SX' => 'Sint Maarten (Dutch part)', - 'SY' => 'Syrian Arab Republic', - 'SZ' => 'Swaziland', - 'TC' => 'Turks and Caicos Islands', - 'TD' => 'Chad', - 'TF' => 'French Southern Territories', - 'TG' => 'Togo', - 'TH' => 'Thailand', - 'TJ' => 'Tajikistan', - 'TK' => 'Tokelau', - 'TL' => 'Timor-Leste', - 'TM' => 'Turkmenistan', - 'TN' => 'Tunisia', - 'TO' => 'Tonga', - 'TR' => 'Turkey', - 'TT' => 'Trinidad and Tobago', - 'TV' => 'Tuvalu', - 'TW' => 'Taiwan, Province of China', - 'TZ' => 'Tanzania, United Republic of', - 'UA' => 'Ukraine', - 'UG' => 'Uganda', - 'UM' => 'United States Minor Outlying Islands', - 'US' => 'United States', - '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', - 'VU' => 'Vanuatu', - 'WF' => 'Wallis and Futuna', - 'WS' => 'Samoa', - 'YE' => 'Yemen', - 'YT' => 'Mayotte', - 'ZA' => 'South Africa', - 'ZM' => 'Zambia', - 'ZW' => 'Zimbabwe', -]; diff --git a/modules/Admin/Language/zh-Hant/Dashboard.php b/modules/Admin/Language/zh-Hant/Dashboard.php deleted file mode 100644 index 881073fd..00000000 --- a/modules/Admin/Language/zh-Hant/Dashboard.php +++ /dev/null @@ -1,28 +0,0 @@ - 'Admin dashboard', - 'welcome_message' => 'Welcome to the admin area!', - 'podcasts' => [ - 'title' => 'Podcasts', - 'not_found' => 'No published podcast', - 'last_published' => 'Last published on {lastPublicationDate}', - ], - 'episodes' => [ - 'title' => 'Episodes', - 'not_found' => 'No published episode', - 'last_published' => 'Last published on {lastPublicationDate}', - ], - 'storage' => [ - 'title' => 'Storage', - 'subtitle' => '{totalUploaded} out of {totalStorage}', - ], -]; diff --git a/modules/Admin/Language/zh-Hant/EpisodeNavigation.php b/modules/Admin/Language/zh-Hant/EpisodeNavigation.php deleted file mode 100644 index 1406e301..00000000 --- a/modules/Admin/Language/zh-Hant/EpisodeNavigation.php +++ /dev/null @@ -1,23 +0,0 @@ - 'View episode page', - 'dashboard' => 'Episode dashboard', - 'episode-view' => 'Home', - 'episode-edit' => 'Edit episode', - 'episode-persons-manage' => 'Manage persons', - 'embed-add' => 'Embeddable player', - 'clips' => 'Clips', - 'video-clips-list' => 'Video clips', - 'video-clips-create' => 'New video clip', - 'soundbites-list' => 'Soundbites', - 'soundbites-create' => 'New soundbite', -]; diff --git a/modules/Admin/Language/zh-Hant/Fediverse.php b/modules/Admin/Language/zh-Hant/Fediverse.php deleted file mode 100644 index 0e4ca66d..00000000 --- a/modules/Admin/Language/zh-Hant/Fediverse.php +++ /dev/null @@ -1,32 +0,0 @@ - [ - 'actorNotFound' => 'The account could not be found!', - 'blockActorSuccess' => '{actor} has been blocked!', - 'unblockActorSuccess' => 'Actor has been unblocked!', - 'blockDomainSuccess' => '{domain} has been blocked!', - 'unblockDomainSuccess' => '{domain} has been unblocked!', - ], - 'blocked_actors' => 'Blocked accounts', - 'blocked_domains' => 'Blocked domains', - 'block_lists_form' => [ - 'handle' => 'Account handle', - 'handle_hint' => 'Input @username@domain account.', - 'domain' => 'Domain name', - 'submit' => 'Block!', - ], - 'list' => [ - 'actor' => 'Account', - 'domain' => 'Domain name', - 'unblock' => 'Unblock', - ], -]; diff --git a/modules/Admin/Language/zh-Hant/Home.php b/modules/Admin/Language/zh-Hant/Home.php deleted file mode 100644 index 3ff4c04d..00000000 --- a/modules/Admin/Language/zh-Hant/Home.php +++ /dev/null @@ -1,14 +0,0 @@ - 'All podcasts', - 'no_podcast' => 'No podcast found', -]; diff --git a/modules/Admin/Language/zh-Hant/Install.php b/modules/Admin/Language/zh-Hant/Install.php deleted file mode 100644 index 36e373a2..00000000 --- a/modules/Admin/Language/zh-Hant/Install.php +++ /dev/null @@ -1,61 +0,0 @@ - 'Manual configuration', - 'manual_config_subtitle' => - 'Create a `.env` file with your settings and refresh the page to continue installation.', - 'form' => [ - 'instance_config' => 'Instance configuration', - 'hostname' => 'Hostname', - 'media_base_url' => 'Media base URL', - 'media_base_url_hint' => - 'If you use a CDN and/or an external analytics service, you may set them here.', - 'admin_gateway' => 'Admin gateway', - 'admin_gateway_hint' => - 'The route to access the admin area (eg. https://example.com/cp-admin). It is set by default as cp-admin, we recommend you change it for security reasons.', - 'auth_gateway' => 'Auth gateway', - 'auth_gateway_hint' => - 'The route to access the authentication pages (eg. https://example.com/cp-auth). It is set by default as cp-auth, we recommend you change it for security reasons.', - 'database_config' => 'Database configuration', - 'database_config_hint' => - 'Castopod needs to connect to your MySQL (or MariaDB) database. If you do not have these required info, please contact your server administrator.', - 'db_hostname' => 'Database hostname', - 'db_name' => 'Database name', - 'db_username' => 'Database username', - 'db_password' => 'Database password', - 'db_prefix' => 'Database prefix', - 'db_prefix_hint' => - "The prefix of the Castopod table names, leave as is if you don't know what it means.", - 'cache_config' => 'Cache configuration', - 'cache_config_hint' => - 'Choose your preferred cache handler. Leave it as the default value if you have no clue what it means.', - 'cache_handler' => 'Cache handler', - 'cacheHandlerOptions' => [ - 'file' => 'File', - 'redis' => 'Redis', - 'predis' => 'Predis', - ], - 'next' => 'Next', - 'submit' => 'Finish install', - 'create_superadmin' => 'Create your superadmin account', - 'email' => 'Email', - 'username' => 'Username', - 'password' => 'Password', - ], - 'messages' => [ - 'createSuperAdminSuccess' => - 'Your superadmin account has been created successfully. Login to start podcasting!', - 'databaseConnectError' => - 'Castopod could not connect to your database. Edit your database configuration and try again.', - 'writeError' => - "Couldn't create/write the `.env` file. You must create it manually by following the `.env.example` file template in the Castopod package.", - ], -]; diff --git a/modules/Admin/Language/zh-Hant/Notifications.php b/modules/Admin/Language/zh-Hant/Notifications.php deleted file mode 100644 index 2b139d51..00000000 --- a/modules/Admin/Language/zh-Hant/Notifications.php +++ /dev/null @@ -1,19 +0,0 @@ - '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', -]; diff --git a/modules/Admin/Language/zh-Hant/Page.php b/modules/Admin/Language/zh-Hant/Page.php deleted file mode 100644 index b6f49de5..00000000 --- a/modules/Admin/Language/zh-Hant/Page.php +++ /dev/null @@ -1,30 +0,0 @@ - 'Back to home', - 'page' => 'Page', - 'all_pages' => 'All pages', - 'create' => 'New page', - 'go_to_page' => 'Go to page', - 'edit' => 'Edit page', - 'delete' => 'Delete page', - 'form' => [ - 'title' => 'Title', - 'permalink' => 'Permalink', - 'content' => 'Content', - 'submit_create' => 'Create page', - 'submit_edit' => 'Save', - ], - 'messages' => [ - 'createSuccess' => 'The page “{pageTitle}” was created successfully!', - 'editSuccess' => 'The page was successfully updated!', - ], -]; diff --git a/modules/Admin/Language/zh-Hant/Pager.php b/modules/Admin/Language/zh-Hant/Pager.php deleted file mode 100644 index e25ee638..00000000 --- a/modules/Admin/Language/zh-Hant/Pager.php +++ /dev/null @@ -1,21 +0,0 @@ - 'Page navigation', - 'first' => 'First', - 'previous' => 'Previous', - 'next' => 'Next', - 'last' => 'Last', - 'older' => 'Older', - 'newer' => 'Newer', - 'invalidTemplate' => '{0} is not a valid Pager template.', - 'invalidPaginationGroup' => '{0} is not a valid Pagination group.', -]; diff --git a/modules/Admin/Language/zh-Hant/Person.php b/modules/Admin/Language/zh-Hant/Person.php deleted file mode 100644 index a652be9f..00000000 --- a/modules/Admin/Language/zh-Hant/Person.php +++ /dev/null @@ -1,65 +0,0 @@ - 'Persons', - 'all_persons' => 'All persons', - 'no_person' => 'Nobody found!', - 'create' => 'Create a person', - 'view' => 'View person', - 'edit' => 'Edit person', - 'delete' => 'Delete person', - 'messages' => [ - 'createSuccess' => 'Person has been successfully created!', - 'editSuccess' => 'Person has been successfully updated!', - 'deleteSuccess' => 'Person has been removed!', - ], - 'form' => [ - 'avatar' => 'Avatar', - 'avatar_size_hint' => - 'Avatar must be squared and at least 400px wide and tall.', - 'full_name' => 'Full name', - 'full_name_hint' => 'This is the full name or alias of the person.', - 'unique_name' => 'Unique name', - 'unique_name_hint' => 'Used for URLs', - 'information_url' => 'Information URL', - 'information_url_hint' => - 'Url to a relevant resource of information about the person, such as a homepage or third-party profile platform.', - 'submit_create' => 'Create person', - 'submit_edit' => 'Save person', - ], - 'podcast_form' => [ - 'title' => 'Manage persons', - 'add_section_title' => 'Add persons to this podcast', - 'add_section_subtitle' => 'You may pick several persons and roles.', - 'persons' => 'Persons', - 'persons_hint' => - 'You may select one or several persons with the same roles. You need to create the persons first.', - 'roles' => 'Roles', - 'roles_hint' => - 'You may select none, one or several roles for a person.', - 'submit_add' => 'Add person(s)', - 'remove' => 'Remove', - ], - 'episode_form' => [ - 'title' => 'Manage persons', - 'add_section_title' => 'Add persons to this episode', - 'add_section_subtitle' => 'You may pick several persons and roles.', - 'persons' => 'Persons', - 'persons_hint' => - 'You may select one or several persons with the same roles. You need to create the persons first.', - 'roles' => 'Roles', - 'roles_hint' => - 'You may select none, one or several roles for a person.', - 'submit_add' => 'Add person(s)', - 'remove' => 'Remove', - ], - 'credits' => 'Credits', -]; diff --git a/modules/Admin/Language/zh-Hant/Settings.php b/modules/Admin/Language/zh-Hant/Settings.php deleted file mode 100644 index 4a70dcba..00000000 --- a/modules/Admin/Language/zh-Hant/Settings.php +++ /dev/null @@ -1,58 +0,0 @@ - 'General settings', - 'instance' => [ - 'title' => 'Instance', - 'site_icon' => 'Site icon', - 'site_icon_delete' => 'Delete site icon', - 'site_icon_hint' => 'Site icons are what you see on your browser tabs, bookmarks bar, and when you add a website as a shortcut on mobile devices.', - 'site_icon_helper' => 'Icon must be squared and at least 512px wide and tall.', - 'site_name' => 'Site name', - 'site_description' => 'Site description', - 'submit' => 'Save', - 'editSuccess' => 'Instance has been updated successfully!', - 'deleteIconSuccess' => 'Site icon has been remove successfully!', - ], - 'images' => [ - 'title' => 'Images', - 'subtitle' => 'Here you can regenerate all images based on the originals that were uploaded. To be used if you find that some images are missing. This task may take a while.', - 'regenerate' => 'Regenerate images', - 'regenerationSuccess' => 'All images have been regenerated successfully!', - ], - 'housekeeping' => [ - 'title' => 'Housekeeping', - 'subtitle' => 'Runs various housekeeping tasks. Use this feature if you ever encounter issues with media files or data integrity. These tasks may take a while.', - 'reset_counts' => 'Reset counts', - 'reset_counts_helper' => 'This option will recalculate and reset all data counts (number of followers, posts, comments, …).', - 'rewrite_media' => 'Rewrite media metadata', - 'rewrite_media_helper' => 'This option will delete all superfluous media files and recreate them (images, audio files, transcripts, chapters, …)', - '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.', - 'clear_cache' => 'Clear all cache', - 'clear_cache_helper' => 'This option will flush redis cache or writable/cache files.', - 'run' => 'Run housekeeping', - 'runSuccess' => 'Housekeeping has been run successfully!', - ], - 'theme' => [ - 'title' => 'Theme', - 'accent_section_title' => 'Accent color', - 'accent_section_subtitle' => 'Choose the color to determine the look and feel of all public pages.', - 'pine' => 'Pine', - 'crimson' => 'Crimson', - 'amber' => 'Amber', - 'lake' => 'Lake', - 'jacaranda' => 'Jacaranda', - 'onyx' => 'Onyx', - 'submit' => 'Save', - 'setInstanceThemeSuccess' => 'Theme has been updated successfully!', - ], -]; diff --git a/modules/Admin/Language/zh-Hant/Soundbite.php b/modules/Admin/Language/zh-Hant/Soundbite.php deleted file mode 100644 index a3f828fe..00000000 --- a/modules/Admin/Language/zh-Hant/Soundbite.php +++ /dev/null @@ -1,31 +0,0 @@ - [ - 'title' => 'Soundbites', - 'soundbite' => 'Soundbite', - ], - 'messages' => [ - 'createSuccess' => 'Soundbite has been successfully created!', - 'deleteSuccess' => 'Soundbite has been successfully removed!', - ], - 'form' => [ - 'title' => 'New soundbite', - 'soundbite_title' => 'Soundbite title', - 'start_time' => 'Start at', - 'duration' => 'Duration', - 'submit' => 'Create soundbite', - ], - 'play' => 'Play soundbite', - 'stop' => 'Stop soundbite', - 'create' => 'New soundbite', - 'delete' => 'Delete soundbite', -]; diff --git a/modules/Admin/Language/zh-Hant/VideoClip.php b/modules/Admin/Language/zh-Hant/VideoClip.php deleted file mode 100644 index 638de697..00000000 --- a/modules/Admin/Language/zh-Hant/VideoClip.php +++ /dev/null @@ -1,72 +0,0 @@ - [ - 'title' => 'Video clips', - 'status' => [ - 'label' => 'Status', - 'queued' => 'queued', - 'queued_hint' => 'Clip is waiting to be processed.', - 'pending' => 'pending', - 'pending_hint' => 'Clip will be generated shortly.', - 'running' => 'running', - 'running_hint' => 'Clip is being generated.', - 'failed' => 'failed', - 'failed_hint' => 'Clip could not be generated: script failure.', - 'passed' => 'passed', - 'passed_hint' => 'Clip was generated successfully!', - ], - 'clip' => 'Clip', - 'duration' => 'Job duration', - ], - 'title' => 'Video clip: {videoClipLabel}', - 'download_clip' => 'Download clip', - 'create' => 'New video clip', - 'go_to_page' => 'Go to clip page', - 'retry' => 'Retry clip generation', - 'delete' => 'Delete clip', - 'logs' => 'Job logs', - 'messages' => [ - 'alreadyExistingError' => 'The video clip you are trying to create already exists!', - 'addToQueueSuccess' => 'Video clip has been added to queue, awaiting to be created!', - 'deleteSuccess' => 'Video clip has been successfully removed!', - ], - 'format' => [ - 'landscape' => 'Landscape', - 'portrait' => 'Portrait', - 'squared' => 'Squared', - ], - 'form' => [ - 'title' => 'New video clip', - 'params_section_title' => 'Video clip parameters', - 'clip_title' => 'Clip title', - 'format' => [ - 'label' => 'Choose a format', - 'landscape_hint' => 'With a 16:9 ratio, landscape videos are great for PeerTube, Youtube and Vimeo.', - 'portrait_hint' => 'With a 9:16 ratio, portrait videos are great for TikTok, Youtube shorts and Instagram stories.', - 'squared_hint' => 'With a 1:1 ratio, squared videos are great for Mastodon, Facebook, Twitter and LinkedIn.', - ], - 'theme' => 'Select a theme', - 'start_time' => 'Start at', - 'duration' => 'Duration', - 'trim_start' => 'Trim start', - 'trim_end' => 'Trim end', - 'submit' => 'Create video clip', - ], - 'requirements' => [ - 'title' => 'Missing requirements', - 'missing' => 'You have missing requirements. Make sure to add all the required items to be allowed creating a video for this episode!', - 'ffmpeg' => 'FFmpeg', - 'gd' => 'Graphics Draw (GD)', - 'freetype' => 'Freetype library for GD', - 'transcript' => 'Transcript file (.srt)', - ], -]; diff --git a/modules/Admin/Language/zh-Hans/AboutCastopod.php b/modules/Admin/Language/zh-hans/AboutCastopod.php similarity index 100% rename from modules/Admin/Language/zh-Hans/AboutCastopod.php rename to modules/Admin/Language/zh-hans/AboutCastopod.php diff --git a/modules/Admin/Language/zh-Hans/Breadcrumb.php b/modules/Admin/Language/zh-hans/Breadcrumb.php similarity index 100% rename from modules/Admin/Language/zh-Hans/Breadcrumb.php rename to modules/Admin/Language/zh-hans/Breadcrumb.php diff --git a/modules/Admin/Language/zh-Hans/Charts.php b/modules/Admin/Language/zh-hans/Charts.php similarity index 100% rename from modules/Admin/Language/zh-Hans/Charts.php rename to modules/Admin/Language/zh-hans/Charts.php diff --git a/modules/Admin/Language/zh-Hans/Common.php b/modules/Admin/Language/zh-hans/Common.php similarity index 100% rename from modules/Admin/Language/zh-Hans/Common.php rename to modules/Admin/Language/zh-hans/Common.php diff --git a/modules/Admin/Language/zh-Hans/Countries.php b/modules/Admin/Language/zh-hans/Countries.php similarity index 100% rename from modules/Admin/Language/zh-Hans/Countries.php rename to modules/Admin/Language/zh-hans/Countries.php diff --git a/modules/Admin/Language/zh-Hans/Dashboard.php b/modules/Admin/Language/zh-hans/Dashboard.php similarity index 100% rename from modules/Admin/Language/zh-Hans/Dashboard.php rename to modules/Admin/Language/zh-hans/Dashboard.php diff --git a/modules/Admin/Language/zh-Hans/Episode.php b/modules/Admin/Language/zh-hans/Episode.php similarity index 100% rename from modules/Admin/Language/zh-Hans/Episode.php rename to modules/Admin/Language/zh-hans/Episode.php diff --git a/modules/Admin/Language/zh-Hans/EpisodeNavigation.php b/modules/Admin/Language/zh-hans/EpisodeNavigation.php similarity index 100% rename from modules/Admin/Language/zh-Hans/EpisodeNavigation.php rename to modules/Admin/Language/zh-hans/EpisodeNavigation.php diff --git a/modules/Admin/Language/zh-Hans/Fediverse.php b/modules/Admin/Language/zh-hans/Fediverse.php similarity index 100% rename from modules/Admin/Language/zh-Hans/Fediverse.php rename to modules/Admin/Language/zh-hans/Fediverse.php diff --git a/modules/Admin/Language/zh-Hans/Home.php b/modules/Admin/Language/zh-hans/Home.php similarity index 100% rename from modules/Admin/Language/zh-Hans/Home.php rename to modules/Admin/Language/zh-hans/Home.php diff --git a/modules/Admin/Language/zh-Hans/Install.php b/modules/Admin/Language/zh-hans/Install.php similarity index 100% rename from modules/Admin/Language/zh-Hans/Install.php rename to modules/Admin/Language/zh-hans/Install.php diff --git a/modules/Admin/Language/zh-Hans/Navigation.php b/modules/Admin/Language/zh-hans/Navigation.php similarity index 100% rename from modules/Admin/Language/zh-Hans/Navigation.php rename to modules/Admin/Language/zh-hans/Navigation.php diff --git a/modules/Admin/Language/zh-Hans/Notifications.php b/modules/Admin/Language/zh-hans/Notifications.php similarity index 100% rename from modules/Admin/Language/zh-Hans/Notifications.php rename to modules/Admin/Language/zh-hans/Notifications.php diff --git a/modules/Admin/Language/zh-Hans/Page.php b/modules/Admin/Language/zh-hans/Page.php similarity index 100% rename from modules/Admin/Language/zh-Hans/Page.php rename to modules/Admin/Language/zh-hans/Page.php diff --git a/modules/Admin/Language/zh-Hans/Pager.php b/modules/Admin/Language/zh-hans/Pager.php similarity index 100% rename from modules/Admin/Language/zh-Hans/Pager.php rename to modules/Admin/Language/zh-hans/Pager.php diff --git a/modules/Admin/Language/zh-Hans/Person.php b/modules/Admin/Language/zh-hans/Person.php similarity index 100% rename from modules/Admin/Language/zh-Hans/Person.php rename to modules/Admin/Language/zh-hans/Person.php diff --git a/modules/Admin/Language/zh-Hans/Platforms.php b/modules/Admin/Language/zh-hans/Platforms.php similarity index 100% rename from modules/Admin/Language/zh-Hans/Platforms.php rename to modules/Admin/Language/zh-hans/Platforms.php diff --git a/modules/Admin/Language/zh-Hans/Podcast.php b/modules/Admin/Language/zh-hans/Podcast.php similarity index 100% rename from modules/Admin/Language/zh-Hans/Podcast.php rename to modules/Admin/Language/zh-hans/Podcast.php diff --git a/modules/Admin/Language/zh-Hans/PodcastNavigation.php b/modules/Admin/Language/zh-hans/PodcastNavigation.php similarity index 100% rename from modules/Admin/Language/zh-Hans/PodcastNavigation.php rename to modules/Admin/Language/zh-hans/PodcastNavigation.php diff --git a/modules/Admin/Language/zh-Hans/Settings.php b/modules/Admin/Language/zh-hans/Settings.php similarity index 100% rename from modules/Admin/Language/zh-Hans/Settings.php rename to modules/Admin/Language/zh-hans/Settings.php diff --git a/modules/Admin/Language/zh-Hans/Soundbite.php b/modules/Admin/Language/zh-hans/Soundbite.php similarity index 100% rename from modules/Admin/Language/zh-Hans/Soundbite.php rename to modules/Admin/Language/zh-hans/Soundbite.php diff --git a/modules/Admin/Language/zh-Hans/Validation.php b/modules/Admin/Language/zh-hans/Validation.php similarity index 100% rename from modules/Admin/Language/zh-Hans/Validation.php rename to modules/Admin/Language/zh-hans/Validation.php diff --git a/modules/Admin/Language/zh-Hans/VideoClip.php b/modules/Admin/Language/zh-hans/VideoClip.php similarity index 100% rename from modules/Admin/Language/zh-Hans/VideoClip.php rename to modules/Admin/Language/zh-hans/VideoClip.php diff --git a/modules/Admin/Language/pt-BR/AboutCastopod.php b/modules/Admin/Language/zh-hant/AboutCastopod.php similarity index 100% rename from modules/Admin/Language/pt-BR/AboutCastopod.php rename to modules/Admin/Language/zh-hant/AboutCastopod.php diff --git a/modules/Admin/Language/zh-Hant/Breadcrumb.php b/modules/Admin/Language/zh-hant/Breadcrumb.php similarity index 100% rename from modules/Admin/Language/zh-Hant/Breadcrumb.php rename to modules/Admin/Language/zh-hant/Breadcrumb.php diff --git a/modules/Admin/Language/fr_trad/Charts.php b/modules/Admin/Language/zh-hant/Charts.php similarity index 100% rename from modules/Admin/Language/fr_trad/Charts.php rename to modules/Admin/Language/zh-hant/Charts.php diff --git a/modules/Admin/Language/zh-Hant/Common.php b/modules/Admin/Language/zh-hant/Common.php similarity index 100% rename from modules/Admin/Language/zh-Hant/Common.php rename to modules/Admin/Language/zh-hant/Common.php diff --git a/modules/Admin/Language/fr_trad/Countries.php b/modules/Admin/Language/zh-hant/Countries.php similarity index 100% rename from modules/Admin/Language/fr_trad/Countries.php rename to modules/Admin/Language/zh-hant/Countries.php diff --git a/modules/Admin/Language/fr_trad/Dashboard.php b/modules/Admin/Language/zh-hant/Dashboard.php similarity index 100% rename from modules/Admin/Language/fr_trad/Dashboard.php rename to modules/Admin/Language/zh-hant/Dashboard.php diff --git a/modules/Admin/Language/zh-Hant/Episode.php b/modules/Admin/Language/zh-hant/Episode.php similarity index 100% rename from modules/Admin/Language/zh-Hant/Episode.php rename to modules/Admin/Language/zh-hant/Episode.php diff --git a/modules/Admin/Language/fr_trad/EpisodeNavigation.php b/modules/Admin/Language/zh-hant/EpisodeNavigation.php similarity index 100% rename from modules/Admin/Language/fr_trad/EpisodeNavigation.php rename to modules/Admin/Language/zh-hant/EpisodeNavigation.php diff --git a/modules/Admin/Language/fr_trad/Fediverse.php b/modules/Admin/Language/zh-hant/Fediverse.php similarity index 100% rename from modules/Admin/Language/fr_trad/Fediverse.php rename to modules/Admin/Language/zh-hant/Fediverse.php diff --git a/modules/Admin/Language/fr_trad/Home.php b/modules/Admin/Language/zh-hant/Home.php similarity index 100% rename from modules/Admin/Language/fr_trad/Home.php rename to modules/Admin/Language/zh-hant/Home.php diff --git a/modules/Admin/Language/fr_trad/Install.php b/modules/Admin/Language/zh-hant/Install.php similarity index 100% rename from modules/Admin/Language/fr_trad/Install.php rename to modules/Admin/Language/zh-hant/Install.php diff --git a/modules/Admin/Language/zh-Hant/Navigation.php b/modules/Admin/Language/zh-hant/Navigation.php similarity index 100% rename from modules/Admin/Language/zh-Hant/Navigation.php rename to modules/Admin/Language/zh-hant/Navigation.php diff --git a/modules/Admin/Language/pt-BR/Notifications.php b/modules/Admin/Language/zh-hant/Notifications.php similarity index 100% rename from modules/Admin/Language/pt-BR/Notifications.php rename to modules/Admin/Language/zh-hant/Notifications.php diff --git a/modules/Admin/Language/fr_trad/Page.php b/modules/Admin/Language/zh-hant/Page.php similarity index 100% rename from modules/Admin/Language/fr_trad/Page.php rename to modules/Admin/Language/zh-hant/Page.php diff --git a/modules/Admin/Language/fr_trad/Pager.php b/modules/Admin/Language/zh-hant/Pager.php similarity index 100% rename from modules/Admin/Language/fr_trad/Pager.php rename to modules/Admin/Language/zh-hant/Pager.php diff --git a/modules/Admin/Language/fr_trad/Person.php b/modules/Admin/Language/zh-hant/Person.php similarity index 100% rename from modules/Admin/Language/fr_trad/Person.php rename to modules/Admin/Language/zh-hant/Person.php diff --git a/modules/Admin/Language/zh-Hant/Platforms.php b/modules/Admin/Language/zh-hant/Platforms.php similarity index 100% rename from modules/Admin/Language/zh-Hant/Platforms.php rename to modules/Admin/Language/zh-hant/Platforms.php diff --git a/modules/Admin/Language/zh-Hant/Podcast.php b/modules/Admin/Language/zh-hant/Podcast.php similarity index 100% rename from modules/Admin/Language/zh-Hant/Podcast.php rename to modules/Admin/Language/zh-hant/Podcast.php diff --git a/modules/Admin/Language/zh-Hant/PodcastNavigation.php b/modules/Admin/Language/zh-hant/PodcastNavigation.php similarity index 100% rename from modules/Admin/Language/zh-Hant/PodcastNavigation.php rename to modules/Admin/Language/zh-hant/PodcastNavigation.php diff --git a/modules/Admin/Language/fr_trad/Settings.php b/modules/Admin/Language/zh-hant/Settings.php similarity index 100% rename from modules/Admin/Language/fr_trad/Settings.php rename to modules/Admin/Language/zh-hant/Settings.php diff --git a/modules/Admin/Language/fr_trad/Soundbite.php b/modules/Admin/Language/zh-hant/Soundbite.php similarity index 100% rename from modules/Admin/Language/fr_trad/Soundbite.php rename to modules/Admin/Language/zh-hant/Soundbite.php diff --git a/modules/Admin/Language/zh-Hant/Validation.php b/modules/Admin/Language/zh-hant/Validation.php similarity index 100% rename from modules/Admin/Language/zh-Hant/Validation.php rename to modules/Admin/Language/zh-hant/Validation.php diff --git a/modules/Admin/Language/fr_trad/VideoClip.php b/modules/Admin/Language/zh-hant/VideoClip.php similarity index 100% rename from modules/Admin/Language/fr_trad/VideoClip.php rename to modules/Admin/Language/zh-hant/VideoClip.php diff --git a/modules/Auth/Commands/RolesDoc.php b/modules/Auth/Commands/RolesDoc.php index 00732a53..6e78d9b0 100644 --- a/modules/Auth/Commands/RolesDoc.php +++ b/modules/Auth/Commands/RolesDoc.php @@ -43,15 +43,13 @@ class RolesDoc extends BaseCommand public function run(array $params): void { // loop over all files in path - $defaultFile = glob(ROOTPATH . 'docs/src/getting-started/auth.md'); - $localizedFiles = glob(ROOTPATH . 'docs/src/**/getting-started/auth.md'); + $files = glob(ROOTPATH . 'docs/src/content/docs/**/getting-started/auth.mdx'); - if (! $localizedFiles) { - $localizedFiles = []; + if (! $files) { + $files = []; } - $files = array_merge($defaultFile, $localizedFiles); - CLI::write(implode(', ', $files)); + CLI::write(implode(PHP_EOL, $files)); if ($files === []) { return; @@ -67,7 +65,7 @@ class RolesDoc extends BaseCommand $fileContents = file_get_contents($file); foreach (self::COMMENT_BLOCK_IDS as $key => $block_id) { - $pattern = '/()[\S\s]*()/'; + $pattern = '/(\{\/\*\s' . $block_id . ':START.*\*\/\})[\S\s]*(\{\/\*\s' . $block_id . ':END.*\*\/\})/'; $handleInjectMethod = 'handle' . str_replace(' ', '', ucwords(str_replace(['-', '_'], ' ', $key))); @@ -164,7 +162,7 @@ class RolesDoc extends BaseCommand $converter = new HtmlConverter(); $converter->getEnvironment() ->addConverter(new TableConverter()); - $markdownTable = $converter->convert($table->generate()); + $markdownTable = str_replace(['{', '}'], ['\{', '\}'], $converter->convert($table->generate())); // insert table between block comments $newFileContents = preg_replace( @@ -182,7 +180,11 @@ class RolesDoc extends BaseCommand private function detectLocaleFromPath(string $fileKey): string { - preg_match('~docs\/src\/(?:([a-z]{2}(?:-[A-Za-z]{2,})?)\/)getting-started\/auth\.md~', $fileKey, $match); + preg_match( + '~docs\/src\/content\/docs\/(?:([a-z]{2}(?:-[A-Za-z]{2,})?)\/)getting-started\/auth\.mdx~', + $fileKey, + $match + ); if ($match === []) { return 'en'; diff --git a/modules/Auth/Language/ar/Auth.php b/modules/Auth/Language/ar/Auth.php index 725b760b..b366563a 100644 --- a/modules/Auth/Language/ar/Auth.php +++ b/modules/Auth/Language/ar/Auth.php @@ -72,14 +72,16 @@ return [ '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 dashboards and analytics of podcast #{id}\'s episodes.', - 'episodes.create' => 'Can create episodes for podcast #{id}.', - 'episodes.edit' => 'Can edit episodes of podcast #{id}.', - 'episodes.delete' => 'Can delete episodes of podcast #{id}.', - 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', - 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', - 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', - 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + 'episodes' => [ + 'view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'create' => 'Can create episodes for podcast #{id}.', + 'edit' => 'Can edit episodes of podcast #{id}.', + 'delete' => 'Can delete episodes of podcast #{id}.', + 'manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], ], // missing keys diff --git a/modules/Auth/Language/br/Auth.php b/modules/Auth/Language/br/Auth.php index 8bd51692..9730b849 100644 --- a/modules/Auth/Language/br/Auth.php +++ b/modules/Auth/Language/br/Auth.php @@ -72,14 +72,16 @@ return [ 'manage-publications' => 'Gallout a ra embann ar podkast #{id}.', 'manage-notifications' => 'Gallout a ra gwelet kemennoù ar podkast #{id} ha lakaat anezho evel lennet.', 'interact-as' => 'Gallout a ra ober traoù gant identelezh ar podkast #{id}: ouzhpennañ ur gemennadenn d\'ar re garetañ, rannañ anezhi pe respont dezhi.', - 'episodes.view' => 'Gallout a ra gwelet taolennoù-stur ha muzulioù heklev rannoù ar podkast #{id}.', - 'episodes.create' => 'Gallout a ra krouiñ rannoù evit podkast #{id}.', - 'episodes.edit' => 'Gallout a ra kemmañ rannoù ar podkast #{id}.', - 'episodes.delete' => 'Gallout a ra lemel rannoù ar podkast #{id}.', - 'episodes.manage-persons' => 'Gallout a ra merañ emellerien·ezed ar podkast #{id}.', - 'episodes.manage-clips' => 'Gallout a ra merañ klipoù video pe tennadoù son ar podkast #{id}.', - 'episodes.manage-publications' => 'Gallout a ra embann pe diembann rannoù ha kemennadennoù ar podkast #{id}.', - 'episodes.manage-comments' => 'Gallout a ra krouiñ/lemel evezhiadennoù evit rannoù ar podkast #{id}.', + 'episodes' => [ + 'view' => 'Gallout a ra gwelet taolennoù-stur ha muzulioù heklev rannoù ar podkast #{id}.', + 'create' => 'Gallout a ra krouiñ rannoù evit podkast #{id}.', + 'edit' => 'Gallout a ra kemmañ rannoù ar podkast #{id}.', + 'delete' => 'Gallout a ra lemel rannoù ar podkast #{id}.', + 'manage-persons' => 'Gallout a ra merañ emellerien·ezed ar podkast #{id}.', + 'manage-clips' => 'Gallout a ra merañ klipoù video pe tennadoù son ar podkast #{id}.', + 'manage-publications' => 'Gallout a ra embann pe diembann rannoù ha kemennadennoù ar podkast #{id}.', + 'manage-comments' => 'Gallout a ra krouiñ/lemel evezhiadennoù evit rannoù ar podkast #{id}.', + ], ], // missing keys diff --git a/modules/Auth/Language/ca/Auth.php b/modules/Auth/Language/ca/Auth.php index 9e14a56c..1b90c08b 100644 --- a/modules/Auth/Language/ca/Auth.php +++ b/modules/Auth/Language/ca/Auth.php @@ -72,16 +72,17 @@ return [ 'manage-publications' => 'Pot publicar el podcast #{id}.', 'manage-notifications' => 'Pot veure i marcar les notificacions com a llegides per al podcast #{id}.', 'interact-as' => 'Pot interactuar en nom del podcast #{id} per marcar les publicacions com a preferides, compartir-les o respondre-hi.', - 'episodes.view' => 'Pot veure taulers i estadístiques dels episodis del podcast #{id}.', - 'episodes.create' => 'Pot crear episodis per al podcast #{id}.', - 'episodes.edit' => 'Pot editar episodis del podcast #{id}.', - 'episodes.delete' => 'Pot suprimir episodis del podcast #{id}.', - 'episodes.manage-persons' => 'Pot gestionar persones d\'episodi del podcast #{id}.', - 'episodes.manage-clips' => 'Pot gestionar clips de vídeo o fragments de so del pòdcast #{id}.', - 'episodes.manage-publications' => 'Pot publicar/anul·lar la publicació d\'episodis i publicacions del pòdcast #{id}.', - 'episodes.manage-comments' => 'Pot crear/eliminar comentaris d\'episodi del pòdcast #{id}.', + 'episodes' => [ + 'view' => 'Pot veure taulers i estadístiques dels episodis del podcast #{id}.', + 'create' => 'Pot crear episodis per al podcast #{id}.', + 'edit' => 'Pot editar episodis del podcast #{id}.', + 'delete' => 'Pot suprimir episodis del podcast #{id}.', + 'manage-persons' => 'Pot gestionar persones d\'episodi del podcast #{id}.', + 'manage-clips' => 'Pot gestionar clips de vídeo o fragments de so del pòdcast #{id}.', + 'manage-publications' => 'Pot publicar/anul·lar la publicació d\'episodis i publicacions del pòdcast #{id}.', + 'manage-comments' => 'Pot crear/eliminar comentaris d\'episodi del pòdcast #{id}.', + ], ], - // missing keys 'code' => 'El teu codi de 6 dígits', diff --git a/modules/Auth/Language/da/Auth.php b/modules/Auth/Language/da/Auth.php index 725b760b..b366563a 100644 --- a/modules/Auth/Language/da/Auth.php +++ b/modules/Auth/Language/da/Auth.php @@ -72,14 +72,16 @@ return [ '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 dashboards and analytics of podcast #{id}\'s episodes.', - 'episodes.create' => 'Can create episodes for podcast #{id}.', - 'episodes.edit' => 'Can edit episodes of podcast #{id}.', - 'episodes.delete' => 'Can delete episodes of podcast #{id}.', - 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', - 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', - 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', - 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + 'episodes' => [ + 'view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'create' => 'Can create episodes for podcast #{id}.', + 'edit' => 'Can edit episodes of podcast #{id}.', + 'delete' => 'Can delete episodes of podcast #{id}.', + 'manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], ], // missing keys diff --git a/modules/Auth/Language/de/Auth.php b/modules/Auth/Language/de/Auth.php index 407c8a25..e35619ca 100644 --- a/modules/Auth/Language/de/Auth.php +++ b/modules/Auth/Language/de/Auth.php @@ -72,14 +72,16 @@ return [ 'manage-publications' => 'Kann Podcast #{id} veröffentlichen.', 'manage-notifications' => 'Kann Benachrichtigungen des Podcasts #{id} einsehen und als gelesen markieren.', 'interact-as' => 'Kann als Podcast #{id} interagieren, um Beiträge zu favorisieren, zu teilen oder diese zu beantworten.', - 'episodes.view' => 'Kann Dashboards und Analysen von Episoden des Podcasts #{id} einsehen.', - 'episodes.create' => 'Kann Folgen für Podcast #{id} erstellen.', - 'episodes.edit' => 'Kann Folgen von Podcast #{id} bearbeiten.', - 'episodes.delete' => 'Kann Folgen von Podcast #{id} löschen.', - 'episodes.manage-persons' => 'Kann Personen von Episoden des Podcasts #{id} verwalten.', - 'episodes.manage-clips' => 'Kann Videoclips und Soundbites des Podcasts #{id} verwalten.', - 'episodes.manage-publications' => 'Kann Episoden und Posts von Podcast #{id} veröffentlichen/zurückziehen.', - 'episodes.manage-comments' => 'Kann Kommentare von Folgen des Podcasts #{id} erstellen und löschen.', + 'episodes' => [ + 'view' => 'Kann Dashboards und Analysen von Episoden des Podcasts #{id} einsehen.', + 'create' => 'Kann Folgen für Podcast #{id} erstellen.', + 'edit' => 'Kann Folgen von Podcast #{id} bearbeiten.', + 'delete' => 'Kann Folgen von Podcast #{id} löschen.', + 'manage-persons' => 'Kann Personen von Episoden des Podcasts #{id} verwalten.', + 'manage-clips' => 'Kann Videoclips und Soundbites des Podcasts #{id} verwalten.', + 'manage-publications' => 'Kann Episoden und Posts von Podcast #{id} veröffentlichen/zurückziehen.', + 'manage-comments' => 'Kann Kommentare von Folgen des Podcasts #{id} erstellen und löschen.', + ], ], // missing keys diff --git a/modules/Auth/Language/el/Auth.php b/modules/Auth/Language/el/Auth.php index 50417442..1ba3c9ae 100644 --- a/modules/Auth/Language/el/Auth.php +++ b/modules/Auth/Language/el/Auth.php @@ -72,14 +72,16 @@ return [ '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 dashboards and analytics of podcast #{id}\'s episodes.', - 'episodes.create' => 'Can create episodes for podcast #{id}.', - 'episodes.edit' => 'Can edit episodes of podcast #{id}.', - 'episodes.delete' => 'Can delete episodes of podcast #{id}.', - 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', - 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', - 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', - 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + 'episodes' => [ + 'view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'create' => 'Can create episodes for podcast #{id}.', + 'edit' => 'Can edit episodes of podcast #{id}.', + 'delete' => 'Can delete episodes of podcast #{id}.', + 'manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], ], // missing keys diff --git a/modules/Auth/Language/en/Auth.php b/modules/Auth/Language/en/Auth.php index 725b760b..b366563a 100644 --- a/modules/Auth/Language/en/Auth.php +++ b/modules/Auth/Language/en/Auth.php @@ -72,14 +72,16 @@ return [ '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 dashboards and analytics of podcast #{id}\'s episodes.', - 'episodes.create' => 'Can create episodes for podcast #{id}.', - 'episodes.edit' => 'Can edit episodes of podcast #{id}.', - 'episodes.delete' => 'Can delete episodes of podcast #{id}.', - 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', - 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', - 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', - 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + 'episodes' => [ + 'view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'create' => 'Can create episodes for podcast #{id}.', + 'edit' => 'Can edit episodes of podcast #{id}.', + 'delete' => 'Can delete episodes of podcast #{id}.', + 'manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], ], // missing keys diff --git a/modules/Auth/Language/es/Auth.php b/modules/Auth/Language/es/Auth.php index 4158f59e..9f82a3cc 100644 --- a/modules/Auth/Language/es/Auth.php +++ b/modules/Auth/Language/es/Auth.php @@ -72,14 +72,16 @@ return [ 'manage-publications' => 'Puede publicar el podcast #{id}.', 'manage-notifications' => 'Puede ver y marcar las notificaciones como leídas para podcast #{id}.', 'interact-as' => 'Puede interactuar como el podcast #{id} para marcar como favarito, compartir o responder a las publicaciones.', - 'episodes.view' => 'Puede ver el panel de control y analíticas del episodio #{id}.', - 'episodes.create' => 'Puede crear episodios para el podcast #{id}.', - 'episodes.edit' => 'Puede editar episodios del podcast #{id}.', - 'episodes.delete' => 'Puede borrar episodios del podcast #{id}.', - 'episodes.manage-persons' => 'Puede administrar las personas de los episodios del podcast #{id}.', - 'episodes.manage-clips' => 'Puedes administrar video clips o sonidos del podcast #{id}.', - 'episodes.manage-publications' => 'Puede publicar/despublicar episodios y publicaciones del podcast #{id}.', - 'episodes.manage-comments' => 'Puede crear/eliminar los comentarios de episodio del podcast #{id}.', + 'episodes' => [ + 'view' => 'Puede ver el panel de control y analíticas del episodio #{id}.', + 'create' => 'Puede crear episodios para el podcast #{id}.', + 'edit' => 'Puede editar episodios del podcast #{id}.', + 'delete' => 'Puede borrar episodios del podcast #{id}.', + 'manage-persons' => 'Puede administrar las personas de los episodios del podcast #{id}.', + 'manage-clips' => 'Puedes administrar video clips o sonidos del podcast #{id}.', + 'manage-publications' => 'Puede publicar/despublicar episodios y publicaciones del podcast #{id}.', + 'manage-comments' => 'Puede crear/eliminar los comentarios de episodio del podcast #{id}.', + ], ], // missing keys diff --git a/modules/Auth/Language/eu/Auth.php b/modules/Auth/Language/eu/Auth.php index 725b760b..b366563a 100644 --- a/modules/Auth/Language/eu/Auth.php +++ b/modules/Auth/Language/eu/Auth.php @@ -72,14 +72,16 @@ return [ '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 dashboards and analytics of podcast #{id}\'s episodes.', - 'episodes.create' => 'Can create episodes for podcast #{id}.', - 'episodes.edit' => 'Can edit episodes of podcast #{id}.', - 'episodes.delete' => 'Can delete episodes of podcast #{id}.', - 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', - 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', - 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', - 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + 'episodes' => [ + 'view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'create' => 'Can create episodes for podcast #{id}.', + 'edit' => 'Can edit episodes of podcast #{id}.', + 'delete' => 'Can delete episodes of podcast #{id}.', + 'manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], ], // missing keys diff --git a/modules/Auth/Language/fa/Auth.php b/modules/Auth/Language/fa/Auth.php index 725b760b..b366563a 100644 --- a/modules/Auth/Language/fa/Auth.php +++ b/modules/Auth/Language/fa/Auth.php @@ -72,14 +72,16 @@ return [ '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 dashboards and analytics of podcast #{id}\'s episodes.', - 'episodes.create' => 'Can create episodes for podcast #{id}.', - 'episodes.edit' => 'Can edit episodes of podcast #{id}.', - 'episodes.delete' => 'Can delete episodes of podcast #{id}.', - 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', - 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', - 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', - 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + 'episodes' => [ + 'view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'create' => 'Can create episodes for podcast #{id}.', + 'edit' => 'Can edit episodes of podcast #{id}.', + 'delete' => 'Can delete episodes of podcast #{id}.', + 'manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], ], // missing keys diff --git a/modules/Auth/Language/zh-Hant/Auth.php b/modules/Auth/Language/fr-ca/Auth.php similarity index 83% rename from modules/Auth/Language/zh-Hant/Auth.php rename to modules/Auth/Language/fr-ca/Auth.php index 725b760b..b366563a 100644 --- a/modules/Auth/Language/zh-Hant/Auth.php +++ b/modules/Auth/Language/fr-ca/Auth.php @@ -72,14 +72,16 @@ return [ '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 dashboards and analytics of podcast #{id}\'s episodes.', - 'episodes.create' => 'Can create episodes for podcast #{id}.', - 'episodes.edit' => 'Can edit episodes of podcast #{id}.', - 'episodes.delete' => 'Can delete episodes of podcast #{id}.', - 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', - 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', - 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', - 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + 'episodes' => [ + 'view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'create' => 'Can create episodes for podcast #{id}.', + 'edit' => 'Can edit episodes of podcast #{id}.', + 'delete' => 'Can delete episodes of podcast #{id}.', + 'manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], ], // missing keys diff --git a/modules/Auth/Language/fr_CA/Contributor.php b/modules/Auth/Language/fr-ca/Contributor.php similarity index 100% rename from modules/Auth/Language/fr_CA/Contributor.php rename to modules/Auth/Language/fr-ca/Contributor.php diff --git a/modules/Auth/Language/fr_CA/MyAccount.php b/modules/Auth/Language/fr-ca/MyAccount.php similarity index 100% rename from modules/Auth/Language/fr_CA/MyAccount.php rename to modules/Auth/Language/fr-ca/MyAccount.php diff --git a/modules/Auth/Language/fr_CA/User.php b/modules/Auth/Language/fr-ca/User.php similarity index 100% rename from modules/Auth/Language/fr_CA/User.php rename to modules/Auth/Language/fr-ca/User.php diff --git a/modules/Auth/Language/fr/Auth.php b/modules/Auth/Language/fr/Auth.php index abc4a96d..4afdf596 100644 --- a/modules/Auth/Language/fr/Auth.php +++ b/modules/Auth/Language/fr/Auth.php @@ -72,14 +72,16 @@ return [ 'manage-publications' => 'Peut publier le podcast #{id}.', 'manage-notifications' => 'Peut afficher et marquer les notifications comme lues pour le podcast #{id}.', 'interact-as' => 'Peut interagir en tant que podcast #{id} pour mettre en favori, partager ou répondre aux messages.', - 'episodes.view' => 'Peut voir le tableau de bord et les statistiques du podcast #{id}.', - 'episodes.create' => 'Peut créer des épisodes pour le podcast #{id}.', - 'episodes.edit' => 'Peut modifier les épisodes du podcast #{id}.', - 'episodes.delete' => 'Peut supprimer les épisodes du podcast #{id}.', - 'episodes.manage-persons' => 'Peut gérer les intervenants des épisodes du podcast #{id}.', - 'episodes.manage-clips' => 'Permet de gérer les clips vidéo ou les parties sonores du podcast #{id}.', - 'episodes.manage-publications' => 'Peut publier/dépublier des épisodes et des messages de podcast #{id}.', - 'episodes.manage-comments' => 'Peut créer/supprimer les commentaires de l\'épisode du podcast #{id}.', + 'episodes' => [ + 'view' => 'Peut voir le tableau de bord et les statistiques du podcast #{id}.', + 'create' => 'Peut créer des épisodes pour le podcast #{id}.', + 'edit' => 'Peut modifier les épisodes du podcast #{id}.', + 'delete' => 'Peut supprimer les épisodes du podcast #{id}.', + 'manage-persons' => 'Peut gérer les intervenants des épisodes du podcast #{id}.', + 'manage-clips' => 'Permet de gérer les clips vidéo ou les parties sonores du podcast #{id}.', + 'manage-publications' => 'Peut publier/dépublier des épisodes et des messages de podcast #{id}.', + 'manage-comments' => 'Peut créer/supprimer les commentaires de l\'épisode du podcast #{id}.', + ], ], // missing keys diff --git a/modules/Auth/Language/fr2/Auth.php b/modules/Auth/Language/fr2/Auth.php index 725b760b..b366563a 100644 --- a/modules/Auth/Language/fr2/Auth.php +++ b/modules/Auth/Language/fr2/Auth.php @@ -72,14 +72,16 @@ return [ '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 dashboards and analytics of podcast #{id}\'s episodes.', - 'episodes.create' => 'Can create episodes for podcast #{id}.', - 'episodes.edit' => 'Can edit episodes of podcast #{id}.', - 'episodes.delete' => 'Can delete episodes of podcast #{id}.', - 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', - 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', - 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', - 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + 'episodes' => [ + 'view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'create' => 'Can create episodes for podcast #{id}.', + 'edit' => 'Can edit episodes of podcast #{id}.', + 'delete' => 'Can delete episodes of podcast #{id}.', + 'manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], ], // missing keys diff --git a/modules/Auth/Language/fr_trad/Auth.php b/modules/Auth/Language/fr_trad/Auth.php deleted file mode 100644 index a47932e3..00000000 --- a/modules/Auth/Language/fr_trad/Auth.php +++ /dev/null @@ -1,94 +0,0 @@ - [ - 'owner' => [ - 'title' => 'Instance Owner', - 'description' => 'The Castopod owner.', - ], - 'superadmin' => [ - 'title' => 'Super admin', - 'description' => 'Has complete control over Castopod.', - ], - 'manager' => [ - 'title' => 'Manager', - 'description' => 'Manages Castopod\'s content.', - ], - 'podcaster' => [ - 'title' => 'Podcaster', - 'description' => 'General users of Castopod.', - ], - ], - 'instance_permissions' => [ - '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.', - ], - 'podcast_groups' => [ - 'owner' => [ - 'title' => 'Podcast Owner', - 'description' => 'The podcast owner.', - ], - 'admin' => [ - 'title' => 'Admin', - 'description' => 'Has complete control of podcast #{id}.', - ], - 'editor' => [ - 'title' => 'Editor', - 'description' => 'Manages content and publications of podcast #{id}.', - ], - 'author' => [ - 'title' => 'Author', - 'description' => 'Manages content of podcast #{id} but cannot publish them.', - ], - 'guest' => [ - 'title' => 'Guest', - 'description' => 'General contributor of the podcast #{id}.', - ], - ], - 'podcast_permissions' => [ - '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 dashboards and analytics of podcast #{id}\'s episodes.', - 'episodes.create' => 'Can create episodes for podcast #{id}.', - 'episodes.edit' => 'Can edit episodes of podcast #{id}.', - 'episodes.delete' => 'Can delete episodes of podcast #{id}.', - 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', - 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', - 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', - 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', - ], - - // missing keys - 'code' => 'Your 6-digit code', - - 'notEnoughPrivilege' => 'You do not have sufficient permissions to access that page.', - 'set_password' => 'Set your password', - - // Welcome email - 'welcomeSubject' => 'You\'ve been invited to {siteName}', - 'emailWelcomeMailBody' => 'An account was created for you on {domain}, click on the login link below to set your password. The link is valid for {numberOfHours} hours after this email was sent.', -]; diff --git a/modules/Auth/Language/gd/Auth.php b/modules/Auth/Language/gd/Auth.php index bd2f24b2..2ff1f7d8 100644 --- a/modules/Auth/Language/gd/Auth.php +++ b/modules/Auth/Language/gd/Auth.php @@ -72,14 +72,16 @@ return [ 'manage-publications' => '’S urrainn dhaibh am pod-chraoladh #{id} fhoillseachadh.', 'manage-notifications' => 'Chì iad brathan a’ phod-chraolaidh #{id} agus ’s urrainn dhaibh comharra a chur gun deach an leughadh.', 'interact-as' => '’S urrainn dhaibh eadar-ghabhail ’na phod-chraoladh #{id} airson annsachdan, co-roinneadh is freagairtean do phostaichean.', - 'episodes.view' => 'Chì iad deas-bhùird is anailiseachd do dh’eapasodan a’ phod-chraolaidh #{id}.', - 'episodes.create' => '’S urrainn dhaibh eapasodan a chruthachadh dhan phod-chraoladh #{id}.', - 'episodes.edit' => '’S urrainn dhaibh eapasodan a’ phod-chraolaidh #{id} a dheasachadh.', - 'episodes.delete' => '’S urrainn dhaibh eapasodan a’ phod-chraolaidh #{id} a sguabadh às.', - 'episodes.manage-persons' => '’S urrainn dhaibh daoine nan eapasodan aig a’ phod-chraoladh #{id} a stiùireadh.', - 'episodes.manage-clips' => '’S urrainn dhaibh cliopaichean video no blasan-fuaime aig a’ phod-chraoladh #{id} a stiùireadh.', - 'episodes.manage-publications' => '’S urrainn dhaibh eapasodan is postaichean a’ phod-chraolaidh #{id} fhoillseachadh/neo-fhoillseachadh.', - 'episodes.manage-comments' => '’S urrainn dhaibh beachdan air eapasod a’ phod-chraolaidh #{id} a chruthachadh/a thoirt air falbh.', + 'episodes' => [ + 'view' => 'Chì iad deas-bhùird is anailiseachd do dh’eapasodan a’ phod-chraolaidh #{id}.', + 'create' => '’S urrainn dhaibh eapasodan a chruthachadh dhan phod-chraoladh #{id}.', + 'edit' => '’S urrainn dhaibh eapasodan a’ phod-chraolaidh #{id} a dheasachadh.', + 'delete' => '’S urrainn dhaibh eapasodan a’ phod-chraolaidh #{id} a sguabadh às.', + 'manage-persons' => '’S urrainn dhaibh daoine nan eapasodan aig a’ phod-chraoladh #{id} a stiùireadh.', + 'manage-clips' => '’S urrainn dhaibh cliopaichean video no blasan-fuaime aig a’ phod-chraoladh #{id} a stiùireadh.', + 'manage-publications' => '’S urrainn dhaibh eapasodan is postaichean a’ phod-chraolaidh #{id} fhoillseachadh/neo-fhoillseachadh.', + 'manage-comments' => '’S urrainn dhaibh beachdan air eapasod a’ phod-chraolaidh #{id} a chruthachadh/a thoirt air falbh.', + ], ], // missing keys diff --git a/modules/Auth/Language/gl/Auth.php b/modules/Auth/Language/gl/Auth.php index 798fc535..15902033 100644 --- a/modules/Auth/Language/gl/Auth.php +++ b/modules/Auth/Language/gl/Auth.php @@ -72,14 +72,16 @@ return [ 'manage-publications' => 'Pode publicar o podcast #{id}.', 'manage-notifications' => 'Pode ver e marcar as notificacións como lidas no podcast #{id}.', 'interact-as' => 'Pode actuar como o podcast #{id} para compartir, favorecer ou responder a publicacións.', - 'episodes.view' => 'Pode ver os taboleiros e estatísticas dos episodios do podcast #{id}.', - 'episodes.create' => 'Pode crear episodios para o podcast #{id}.', - 'episodes.edit' => 'Pode editar os episodios do podcast #{id}.', - 'episodes.delete' => 'Pode eliminar episodios do podcast #{id}.', - 'episodes.manage-persons' => 'Pode xestionar as persoas do episodio do podcast #{id}.', - 'episodes.manage-clips' => 'Pode xestionar os clips de vídeo e extractos de audio do podcast #{id}.', - 'episodes.manage-publications' => 'Pode publicar/retirar episodios e publicacións do podcast #{id}.', - 'episodes.manage-comments' => 'Pode crear/eliminar comentarios dos episodios do podcast #{id}.', + 'episodes' => [ + 'view' => 'Pode ver os taboleiros e estatísticas dos episodios do podcast #{id}.', + 'create' => 'Pode crear episodios para o podcast #{id}.', + 'edit' => 'Pode editar os episodios do podcast #{id}.', + 'delete' => 'Pode eliminar episodios do podcast #{id}.', + 'manage-persons' => 'Pode xestionar as persoas do episodio do podcast #{id}.', + 'manage-clips' => 'Pode xestionar os clips de vídeo e extractos de audio do podcast #{id}.', + 'manage-publications' => 'Pode publicar/retirar episodios e publicacións do podcast #{id}.', + 'manage-comments' => 'Pode crear/eliminar comentarios dos episodios do podcast #{id}.', + ], ], // missing keys diff --git a/modules/Auth/Language/id/Auth.php b/modules/Auth/Language/id/Auth.php index 725b760b..b366563a 100644 --- a/modules/Auth/Language/id/Auth.php +++ b/modules/Auth/Language/id/Auth.php @@ -72,14 +72,16 @@ return [ '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 dashboards and analytics of podcast #{id}\'s episodes.', - 'episodes.create' => 'Can create episodes for podcast #{id}.', - 'episodes.edit' => 'Can edit episodes of podcast #{id}.', - 'episodes.delete' => 'Can delete episodes of podcast #{id}.', - 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', - 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', - 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', - 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + 'episodes' => [ + 'view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'create' => 'Can create episodes for podcast #{id}.', + 'edit' => 'Can edit episodes of podcast #{id}.', + 'delete' => 'Can delete episodes of podcast #{id}.', + 'manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], ], // missing keys diff --git a/modules/Auth/Language/it/Auth.php b/modules/Auth/Language/it/Auth.php index 725b760b..b366563a 100644 --- a/modules/Auth/Language/it/Auth.php +++ b/modules/Auth/Language/it/Auth.php @@ -72,14 +72,16 @@ return [ '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 dashboards and analytics of podcast #{id}\'s episodes.', - 'episodes.create' => 'Can create episodes for podcast #{id}.', - 'episodes.edit' => 'Can edit episodes of podcast #{id}.', - 'episodes.delete' => 'Can delete episodes of podcast #{id}.', - 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', - 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', - 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', - 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + 'episodes' => [ + 'view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'create' => 'Can create episodes for podcast #{id}.', + 'edit' => 'Can edit episodes of podcast #{id}.', + 'delete' => 'Can delete episodes of podcast #{id}.', + 'manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], ], // missing keys diff --git a/modules/Auth/Language/ja/Auth.php b/modules/Auth/Language/ja/Auth.php index 725b760b..b366563a 100644 --- a/modules/Auth/Language/ja/Auth.php +++ b/modules/Auth/Language/ja/Auth.php @@ -72,14 +72,16 @@ return [ '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 dashboards and analytics of podcast #{id}\'s episodes.', - 'episodes.create' => 'Can create episodes for podcast #{id}.', - 'episodes.edit' => 'Can edit episodes of podcast #{id}.', - 'episodes.delete' => 'Can delete episodes of podcast #{id}.', - 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', - 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', - 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', - 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + 'episodes' => [ + 'view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'create' => 'Can create episodes for podcast #{id}.', + 'edit' => 'Can edit episodes of podcast #{id}.', + 'delete' => 'Can delete episodes of podcast #{id}.', + 'manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], ], // missing keys diff --git a/modules/Auth/Language/kk/Auth.php b/modules/Auth/Language/kk/Auth.php index 725b760b..b366563a 100644 --- a/modules/Auth/Language/kk/Auth.php +++ b/modules/Auth/Language/kk/Auth.php @@ -72,14 +72,16 @@ return [ '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 dashboards and analytics of podcast #{id}\'s episodes.', - 'episodes.create' => 'Can create episodes for podcast #{id}.', - 'episodes.edit' => 'Can edit episodes of podcast #{id}.', - 'episodes.delete' => 'Can delete episodes of podcast #{id}.', - 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', - 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', - 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', - 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + 'episodes' => [ + 'view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'create' => 'Can create episodes for podcast #{id}.', + 'edit' => 'Can edit episodes of podcast #{id}.', + 'delete' => 'Can delete episodes of podcast #{id}.', + 'manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], ], // missing keys diff --git a/modules/Auth/Language/ko/Auth.php b/modules/Auth/Language/ko/Auth.php index 725b760b..0273c5ca 100644 --- a/modules/Auth/Language/ko/Auth.php +++ b/modules/Auth/Language/ko/Auth.php @@ -72,14 +72,16 @@ return [ '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 dashboards and analytics of podcast #{id}\'s episodes.', - 'episodes.create' => 'Can create episodes for podcast #{id}.', - 'episodes.edit' => 'Can edit episodes of podcast #{id}.', - 'episodes.delete' => 'Can delete episodes of podcast #{id}.', - 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', - 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', - 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', - 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + 'episodes'=> [ + 'view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'create' => 'Can create episodes for podcast #{id}.', + 'edit' => 'Can edit episodes of podcast #{id}.', + 'delete' => 'Can delete episodes of podcast #{id}.', + 'manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], ], // missing keys diff --git a/modules/Auth/Language/nl/Auth.php b/modules/Auth/Language/nl/Auth.php index 80faa4e8..31521984 100644 --- a/modules/Auth/Language/nl/Auth.php +++ b/modules/Auth/Language/nl/Auth.php @@ -72,14 +72,16 @@ return [ 'manage-publications' => 'Kan podcast #{id} publiceren.', 'manage-notifications' => 'Kan meldingen bekijken en markeren als gelezen voor podcast #{id}.', 'interact-as' => 'Kan als podcast #{id} handelen om te favorieten, te delen of te reageren op berichten.', - 'episodes.view' => 'Kan dashboard en analyses van de afleveringen van podcast #{id} zien.', - 'episodes.create' => 'Kan afleveringen voor podcast #{id} aanmaken.', - 'episodes.edit' => 'Kan afleveringen van podcast #{id} wijzigen.', - 'episodes.delete' => 'Kan afleveringen van podcast #{id} verwijderen.', - 'episodes.manage-persons' => 'Kan aflevering personen van podcast #{id} beheren.', - 'episodes.manage-clips' => 'Kan videoclips of soundbites van podcast #{id} beheren.', - 'episodes.manage-publications' => 'Kan afleveringen en berichten van podcast #{id} publiceren/depubliceren.', - 'episodes.manage-comments' => 'Kan opmerkingen van aflevering van podcast van #{id} maken of verwijderen.', + 'episodes' => [ + 'view' => 'Kan dashboard en analyses van de afleveringen van podcast #{id} zien.', + 'create' => 'Kan afleveringen voor podcast #{id} aanmaken.', + 'edit' => 'Kan afleveringen van podcast #{id} wijzigen.', + 'delete' => 'Kan afleveringen van podcast #{id} verwijderen.', + 'manage-persons' => 'Kan aflevering personen van podcast #{id} beheren.', + 'manage-clips' => 'Kan videoclips of soundbites van podcast #{id} beheren.', + 'manage-publications' => 'Kan afleveringen en berichten van podcast #{id} publiceren/depubliceren.', + 'manage-comments' => 'Kan opmerkingen van aflevering van podcast van #{id} maken of verwijderen.', + ], ], // missing keys diff --git a/modules/Auth/Language/nn-NO/Auth.php b/modules/Auth/Language/nn-no/Auth.php similarity index 82% rename from modules/Auth/Language/nn-NO/Auth.php rename to modules/Auth/Language/nn-no/Auth.php index d359ffcb..ba1c57f9 100644 --- a/modules/Auth/Language/nn-NO/Auth.php +++ b/modules/Auth/Language/nn-no/Auth.php @@ -72,14 +72,16 @@ return [ 'manage-publications' => 'Kan publisera podkasten #{id}.', 'manage-notifications' => 'Kan lesa og merka varsel som lesne for podkasten #{id}.', 'interact-as' => 'Kan merka podkasten #{id} som favoritt, dela og svara på innlegg.', - 'episodes.view' => 'Kan sjå styringspanelet og analysedata for episodane av podkasten #{id}.', - 'episodes.create' => 'Kan laga epoisodar for podkasten #{id}.', - 'episodes.edit' => 'Kan redigera episodane av podkasten #{id}.', - 'episodes.delete' => 'Kan sletta episodar av podkasten #{id}.', - 'episodes.manage-persons' => 'Kan handtera bidragsytarar til episodar av podkasten #{id}.', - 'episodes.manage-clips' => 'Kan handtera film- og lydklypp av podkasten #{id}.', - 'episodes.manage-publications' => 'Kan publisera og avpublisera episodar og innlegg for podkasten #{id}.', - 'episodes.manage-comments' => 'Kan skriva og sletta kommentarar til episodane av podkasten #{id}.', + 'episodes' => [ + 'view' => 'Kan sjå styringspanelet og analysedata for episodane av podkasten #{id}.', + 'create' => 'Kan laga epoisodar for podkasten #{id}.', + 'edit' => 'Kan redigera episodane av podkasten #{id}.', + 'delete' => 'Kan sletta episodar av podkasten #{id}.', + 'manage-persons' => 'Kan handtera bidragsytarar til episodar av podkasten #{id}.', + 'manage-clips' => 'Kan handtera film- og lydklypp av podkasten #{id}.', + 'manage-publications' => 'Kan publisera og avpublisera episodar og innlegg for podkasten #{id}.', + 'manage-comments' => 'Kan skriva og sletta kommentarar til episodane av podkasten #{id}.', + ], ], // missing keys diff --git a/modules/Auth/Language/nn-NO/Contributor.php b/modules/Auth/Language/nn-no/Contributor.php similarity index 100% rename from modules/Auth/Language/nn-NO/Contributor.php rename to modules/Auth/Language/nn-no/Contributor.php diff --git a/modules/Auth/Language/nn-NO/MyAccount.php b/modules/Auth/Language/nn-no/MyAccount.php similarity index 100% rename from modules/Auth/Language/nn-NO/MyAccount.php rename to modules/Auth/Language/nn-no/MyAccount.php diff --git a/modules/Auth/Language/nn-NO/User.php b/modules/Auth/Language/nn-no/User.php similarity index 100% rename from modules/Auth/Language/nn-NO/User.php rename to modules/Auth/Language/nn-no/User.php diff --git a/modules/Auth/Language/oc/Auth.php b/modules/Auth/Language/oc/Auth.php index 725b760b..b366563a 100644 --- a/modules/Auth/Language/oc/Auth.php +++ b/modules/Auth/Language/oc/Auth.php @@ -72,14 +72,16 @@ return [ '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 dashboards and analytics of podcast #{id}\'s episodes.', - 'episodes.create' => 'Can create episodes for podcast #{id}.', - 'episodes.edit' => 'Can edit episodes of podcast #{id}.', - 'episodes.delete' => 'Can delete episodes of podcast #{id}.', - 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', - 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', - 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', - 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + 'episodes' => [ + 'view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'create' => 'Can create episodes for podcast #{id}.', + 'edit' => 'Can edit episodes of podcast #{id}.', + 'delete' => 'Can delete episodes of podcast #{id}.', + 'manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], ], // missing keys diff --git a/modules/Auth/Language/pl/Auth.php b/modules/Auth/Language/pl/Auth.php index 725b760b..b366563a 100644 --- a/modules/Auth/Language/pl/Auth.php +++ b/modules/Auth/Language/pl/Auth.php @@ -72,14 +72,16 @@ return [ '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 dashboards and analytics of podcast #{id}\'s episodes.', - 'episodes.create' => 'Can create episodes for podcast #{id}.', - 'episodes.edit' => 'Can edit episodes of podcast #{id}.', - 'episodes.delete' => 'Can delete episodes of podcast #{id}.', - 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', - 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', - 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', - 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + 'episodes' => [ + 'view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'create' => 'Can create episodes for podcast #{id}.', + 'edit' => 'Can edit episodes of podcast #{id}.', + 'delete' => 'Can delete episodes of podcast #{id}.', + 'manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], ], // missing keys diff --git a/modules/Auth/Language/pt-BR/Auth.php b/modules/Auth/Language/pt-br/Auth.php similarity index 82% rename from modules/Auth/Language/pt-BR/Auth.php rename to modules/Auth/Language/pt-br/Auth.php index 154870ca..2637625b 100644 --- a/modules/Auth/Language/pt-BR/Auth.php +++ b/modules/Auth/Language/pt-br/Auth.php @@ -72,14 +72,16 @@ return [ 'manage-publications' => 'Pode publicar podcast #{id}.', 'manage-notifications' => 'Pode ver e marcar notificações como lidas para o podcast #{id}.', 'interact-as' => 'Pode interagir com o podcast #{id} para favorito, compartilhar ou responder às publicações.', - 'episodes.view' => 'Pode ver painéis e análises de episódios de podcast #{id}.', - 'episodes.create' => 'Pode criar episódios para o podcast #{id}.', - 'episodes.edit' => 'Pode editar episódios de podcast #{id}.', - 'episodes.delete' => 'Pode excluir episódios do podcast #{id}.', - 'episodes.manage-persons' => 'Pode gerenciar pessoas de episódios do podcast #{id}.', - 'episodes.manage-clips' => 'Pode gerenciar clipes de vídeo ou sons de episódios do podcast #{id}.', - 'episodes.manage-publications' => 'Pode publicar/remover a publicação de episódios e postagens de podcast #{id}.', - 'episodes.manage-comments' => 'Pode criar/remover comentários de episódio do podcast #{id}.', + 'episodes' => [ + 'view' => 'Pode ver painéis e análises de episódios de podcast #{id}.', + 'create' => 'Pode criar episódios para o podcast #{id}.', + 'edit' => 'Pode editar episódios de podcast #{id}.', + 'delete' => 'Pode excluir episódios do podcast #{id}.', + 'manage-persons' => 'Pode gerenciar pessoas de episódios do podcast #{id}.', + 'manage-clips' => 'Pode gerenciar clipes de vídeo ou sons de episódios do podcast #{id}.', + 'manage-publications' => 'Pode publicar/remover a publicação de episódios e postagens de podcast #{id}.', + 'manage-comments' => 'Pode criar/remover comentários de episódio do podcast #{id}.', + ], ], // missing keys diff --git a/modules/Auth/Language/pt-BR/Contributor.php b/modules/Auth/Language/pt-br/Contributor.php similarity index 100% rename from modules/Auth/Language/pt-BR/Contributor.php rename to modules/Auth/Language/pt-br/Contributor.php diff --git a/modules/Auth/Language/pt-BR/MyAccount.php b/modules/Auth/Language/pt-br/MyAccount.php similarity index 100% rename from modules/Auth/Language/pt-BR/MyAccount.php rename to modules/Auth/Language/pt-br/MyAccount.php diff --git a/modules/Auth/Language/pt-BR/User.php b/modules/Auth/Language/pt-br/User.php similarity index 100% rename from modules/Auth/Language/pt-BR/User.php rename to modules/Auth/Language/pt-br/User.php diff --git a/modules/Auth/Language/pt/Auth.php b/modules/Auth/Language/pt/Auth.php index 725b760b..b366563a 100644 --- a/modules/Auth/Language/pt/Auth.php +++ b/modules/Auth/Language/pt/Auth.php @@ -72,14 +72,16 @@ return [ '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 dashboards and analytics of podcast #{id}\'s episodes.', - 'episodes.create' => 'Can create episodes for podcast #{id}.', - 'episodes.edit' => 'Can edit episodes of podcast #{id}.', - 'episodes.delete' => 'Can delete episodes of podcast #{id}.', - 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', - 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', - 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', - 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + 'episodes' => [ + 'view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'create' => 'Can create episodes for podcast #{id}.', + 'edit' => 'Can edit episodes of podcast #{id}.', + 'delete' => 'Can delete episodes of podcast #{id}.', + 'manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], ], // missing keys diff --git a/modules/Auth/Language/ro/Auth.php b/modules/Auth/Language/ro/Auth.php index 725b760b..b366563a 100644 --- a/modules/Auth/Language/ro/Auth.php +++ b/modules/Auth/Language/ro/Auth.php @@ -72,14 +72,16 @@ return [ '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 dashboards and analytics of podcast #{id}\'s episodes.', - 'episodes.create' => 'Can create episodes for podcast #{id}.', - 'episodes.edit' => 'Can edit episodes of podcast #{id}.', - 'episodes.delete' => 'Can delete episodes of podcast #{id}.', - 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', - 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', - 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', - 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + 'episodes' => [ + 'view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'create' => 'Can create episodes for podcast #{id}.', + 'edit' => 'Can edit episodes of podcast #{id}.', + 'delete' => 'Can delete episodes of podcast #{id}.', + 'manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], ], // missing keys diff --git a/modules/Auth/Language/ru/Auth.php b/modules/Auth/Language/ru/Auth.php index 725b760b..b366563a 100644 --- a/modules/Auth/Language/ru/Auth.php +++ b/modules/Auth/Language/ru/Auth.php @@ -72,14 +72,16 @@ return [ '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 dashboards and analytics of podcast #{id}\'s episodes.', - 'episodes.create' => 'Can create episodes for podcast #{id}.', - 'episodes.edit' => 'Can edit episodes of podcast #{id}.', - 'episodes.delete' => 'Can delete episodes of podcast #{id}.', - 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', - 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', - 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', - 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + 'episodes' => [ + 'view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'create' => 'Can create episodes for podcast #{id}.', + 'edit' => 'Can edit episodes of podcast #{id}.', + 'delete' => 'Can delete episodes of podcast #{id}.', + 'manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], ], // missing keys diff --git a/modules/Auth/Language/sk/Auth.php b/modules/Auth/Language/sk/Auth.php index 725b760b..b366563a 100644 --- a/modules/Auth/Language/sk/Auth.php +++ b/modules/Auth/Language/sk/Auth.php @@ -72,14 +72,16 @@ return [ '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 dashboards and analytics of podcast #{id}\'s episodes.', - 'episodes.create' => 'Can create episodes for podcast #{id}.', - 'episodes.edit' => 'Can edit episodes of podcast #{id}.', - 'episodes.delete' => 'Can delete episodes of podcast #{id}.', - 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', - 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', - 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', - 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + 'episodes' => [ + 'view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'create' => 'Can create episodes for podcast #{id}.', + 'edit' => 'Can edit episodes of podcast #{id}.', + 'delete' => 'Can delete episodes of podcast #{id}.', + 'manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], ], // missing keys diff --git a/modules/Auth/Language/sr-Latn/Auth.php b/modules/Auth/Language/sr-latn/Auth.php similarity index 82% rename from modules/Auth/Language/sr-Latn/Auth.php rename to modules/Auth/Language/sr-latn/Auth.php index 325856d4..82d4174f 100644 --- a/modules/Auth/Language/sr-Latn/Auth.php +++ b/modules/Auth/Language/sr-latn/Auth.php @@ -72,14 +72,16 @@ return [ 'manage-publications' => 'Može objaviti podkast #{id}.', 'manage-notifications' => 'Može videti obaveštenja i označiti ih kao pročitana za podkast #{id}.', 'interact-as' => 'Može da komunicira kao podkast #{id} i deli, odgovara na i stavlja u omiljene postove.', - 'episodes.view' => 'Može videti upravljačku tablu i analitiku epizoda podkasta #{id}.', - 'episodes.create' => 'Može napraviti epizode podkasta #{id}.', - 'episodes.edit' => 'Može uređivati epizode podkasta #{id}.', - 'episodes.delete' => 'Može obrisati epizode podkasta #{id}.', - 'episodes.manage-persons' => 'Može upravljati osobama na epizodama podkasta #{id}.', - 'episodes.manage-clips' => 'Može upravljati video klipovima i zvučnim isečcima podkasta #{id}.', - 'episodes.manage-publications' => 'Može da objavi/poništi objavljivanje epizoda i postova podkasta #{id}.', - 'episodes.manage-comments' => 'Može dodati/obrisati komentar na epizodi podkasta #{id}.', + 'episodes' => [ + 'view' => 'Može videti upravljačku tablu i analitiku epizoda podkasta #{id}.', + 'create' => 'Može napraviti epizode podkasta #{id}.', + 'edit' => 'Može uređivati epizode podkasta #{id}.', + 'delete' => 'Može obrisati epizode podkasta #{id}.', + 'manage-persons' => 'Može upravljati osobama na epizodama podkasta #{id}.', + 'manage-clips' => 'Može upravljati video klipovima i zvučnim isečcima podkasta #{id}.', + 'manage-publications' => 'Može da objavi/poništi objavljivanje epizoda i postova podkasta #{id}.', + 'manage-comments' => 'Može dodati/obrisati komentar na epizodi podkasta #{id}.', + ], ], // missing keys diff --git a/modules/Auth/Language/sr-Latn/Contributor.php b/modules/Auth/Language/sr-latn/Contributor.php similarity index 100% rename from modules/Auth/Language/sr-Latn/Contributor.php rename to modules/Auth/Language/sr-latn/Contributor.php diff --git a/modules/Auth/Language/sr-Latn/MyAccount.php b/modules/Auth/Language/sr-latn/MyAccount.php similarity index 100% rename from modules/Auth/Language/sr-Latn/MyAccount.php rename to modules/Auth/Language/sr-latn/MyAccount.php diff --git a/modules/Auth/Language/sr-Latn/User.php b/modules/Auth/Language/sr-latn/User.php similarity index 100% rename from modules/Auth/Language/sr-Latn/User.php rename to modules/Auth/Language/sr-latn/User.php diff --git a/modules/Auth/Language/sr_Latn/Auth.php b/modules/Auth/Language/sr_Latn/Auth.php deleted file mode 100644 index 325856d4..00000000 --- a/modules/Auth/Language/sr_Latn/Auth.php +++ /dev/null @@ -1,93 +0,0 @@ - [ - 'owner' => [ - 'title' => 'Vlasnik instance', - 'description' => 'Vlasnik Castopoda.', - ], - 'superadmin' => [ - 'title' => 'Super administrator', - 'description' => 'Ima kompletnu kontrolu nad Castopod-om.', - ], - 'manager' => [ - 'title' => 'Menadžer', - 'description' => 'Upravlja sadržajem na Castopod-u.', - ], - 'podcaster' => [ - 'title' => 'Podkaster', - 'description' => 'Opšti korisnici Castopod-a.', - ], - ], - 'instance_permissions' => [ - 'admin.access' => 'Može pristupiti administratorskom delu Castopod-a.', - 'admin.settings' => 'Može pristupiti podešavanjima Castopod-a.', - 'users.manage' => 'Može upravljati korisnicima Castopod-a.', - 'persons.manage' => 'Može upravljati osobama.', - 'pages.manage' => 'Može upravljati stranicama.', - 'podcasts.view' => 'Može videti sve podkaste.', - 'podcasts.create' => 'Može napraviti nove podkaste.', - 'podcasts.import' => 'Može uvesti nove podkaste.', - 'fediverse.manage-blocks' => 'Može blokirati interakciju Castopoda i fedivers naloga/domena.', - ], - 'podcast_groups' => [ - 'owner' => [ - 'title' => 'Vlasnik podkasta', - 'description' => 'Vlasnik podkasta.', - ], - 'admin' => [ - 'title' => 'Administrator', - 'description' => 'Ima kompletnu kontrolu nad podkastom #{id}.', - ], - 'editor' => [ - 'title' => 'Urednik', - 'description' => 'Upravlja sadržajem i objavama podkasta #{id}.', - ], - 'author' => [ - 'title' => 'Autor', - 'description' => 'Upravlja sadržajem podkasta #{id} ali ne može da ga objavi.', - ], - 'guest' => [ - 'title' => 'Gost', - 'description' => 'Saradnik na podkastu #{id}.', - ], - ], - 'podcast_permissions' => [ - 'view' => 'Može videti upravljačku tablu i analitiku podkasta #{id}.', - 'edit' => 'Može uređivati podkast #{id}.', - 'delete' => 'Može obrisati podkast #{id}.', - 'manage-import' => 'Može sinhronizovati uvezen podkast #{id}.', - 'manage-persons' => 'Može upravljati pretplatama na podkast #{id}.', - 'manage-subscriptions' => 'Može upravljati pretplatama na podkast #{id}.', - 'manage-contributors' => 'Može upravljati saradnicima na podkastu #{id}.', - 'manage-platforms' => 'Može ubaciti/izbaciti veze ka platformama podkasta #{id}.', - 'manage-publications' => 'Može objaviti podkast #{id}.', - 'manage-notifications' => 'Može videti obaveštenja i označiti ih kao pročitana za podkast #{id}.', - 'interact-as' => 'Može da komunicira kao podkast #{id} i deli, odgovara na i stavlja u omiljene postove.', - 'episodes.view' => 'Može videti upravljačku tablu i analitiku epizoda podkasta #{id}.', - 'episodes.create' => 'Može napraviti epizode podkasta #{id}.', - 'episodes.edit' => 'Može uređivati epizode podkasta #{id}.', - 'episodes.delete' => 'Može obrisati epizode podkasta #{id}.', - 'episodes.manage-persons' => 'Može upravljati osobama na epizodama podkasta #{id}.', - 'episodes.manage-clips' => 'Može upravljati video klipovima i zvučnim isečcima podkasta #{id}.', - 'episodes.manage-publications' => 'Može da objavi/poništi objavljivanje epizoda i postova podkasta #{id}.', - 'episodes.manage-comments' => 'Može dodati/obrisati komentar na epizodi podkasta #{id}.', - ], - - // missing keys - 'code' => 'Vaša šestocifrena šifra', - - 'set_password' => 'Podesi lozinku', - - // Welcome email - 'welcomeSubject' => 'Pozvani ste na {siteName}', - 'emailWelcomeMailBody' => 'Za vas je napravljen nalog na {domain}, kliknite na link za prijavu ispod da biste postavili lozinku. Veza je važeća {numberOfHours} sati nakon slanja ove e-pošte.', -]; diff --git a/modules/Auth/Language/sr_Latn/Contributor.php b/modules/Auth/Language/sr_Latn/Contributor.php deleted file mode 100644 index 39bcbdb9..00000000 --- a/modules/Auth/Language/sr_Latn/Contributor.php +++ /dev/null @@ -1,47 +0,0 @@ - 'Saradnici podkasta', - 'view' => "{username} doprinos {podcastTitle}", - 'add' => 'Dodaj saradnika', - 'add_contributor' => 'Dodaj saradnike za {0}', - 'edit_role' => 'Uredi ulogu za {0}', - 'edit' => 'Izmeni', - 'remove' => 'Ukloni', - 'list' => [ - 'username' => 'Korisničko ime', - 'role' => 'Uloga', - ], - 'form' => [ - 'user' => 'Korisnik', - 'user_placeholder' => 'Izaberi korisnika…', - 'role' => 'Uloga', - 'role_placeholder' => 'Dodaj ulogu…', - 'submit_add' => 'Dodaj saradnika', - 'submit_edit' => 'Ažuriraj ulogu', - ], - 'delete_form' => [ - 'title' => 'Ukloni {contributor}', - 'disclaimer' => - 'Obrisaćete {contributor} iz saradnika. Oni neće moći više da pristupe "{podcastTitle}".', - 'understand' => 'Razumem, želim da uklonim {contributor} iz "{podcastTitle}"', - 'submit' => 'Ukloni', - ], - 'messages' => [ - 'editSuccess' => 'Uloga uspešno promenjena!', - 'editOwnerError' => "Ne možete urediti vlasnika podkasta!", - 'removeOwnerError' => "Ne možete ukloniti vlasnika podkasta!", - 'removeSuccess' => - 'Uspešno ste uklonili {username} iz {podcastTitle}', - 'alreadyAddedError' => - "Saradnik kojeg pokušavate dodati je već dodat!", - ], -]; diff --git a/modules/Auth/Language/sr_Latn/MyAccount.php b/modules/Auth/Language/sr_Latn/MyAccount.php deleted file mode 100644 index 5fa13d74..00000000 --- a/modules/Auth/Language/sr_Latn/MyAccount.php +++ /dev/null @@ -1,18 +0,0 @@ - 'Infromacije o mom nalogu', - 'changePassword' => 'Promeni moju lozinku', - 'messages' => [ - 'wrongPasswordError' => "Uneli ste pogrešnu lozinku, probajte ponovo.", - 'passwordChangeSuccess' => 'Lozinka je uspešno promenjena!', - ], -]; diff --git a/modules/Auth/Language/sr_Latn/User.php b/modules/Auth/Language/sr_Latn/User.php deleted file mode 100644 index 5e128ed8..00000000 --- a/modules/Auth/Language/sr_Latn/User.php +++ /dev/null @@ -1,60 +0,0 @@ - "Uredi {username} uloge", - 'ban' => 'Zabrani', - 'unban' => 'Ukini zabranu', - 'delete' => 'Obriši', - 'create' => 'Novi korisnik', - 'view' => "Informacije o korisniku {username}", - 'all_users' => 'Svi korisnici', - 'list' => [ - 'user' => 'Korisnik', - 'role' => 'Uloga', - 'banned' => 'Zabranjen?', - ], - 'form' => [ - 'email' => 'E-pošta', - 'username' => 'Korisničko ime', - 'password' => 'Lozinka', - 'new_password' => 'Nova lozinka', - 'role' => 'Uloga', - 'roles' => 'Uloge', - 'permissions' => 'Dozvole', - 'submit_create' => 'Kreiraj korisnika', - 'submit_edit' => 'Sačuvaj', - 'submit_password_change' => 'Promeni!', - ], - 'delete_form' => [ - 'title' => 'Ukloni korisnika {user}', - 'disclaimer' => - "Spremate se da trajno uklonite korisnika {user}. Korisnik neće moći više da pristupi administratorskoj zoni.", - 'understand' => 'Shvatam, želim da trajno uklonim korisnika {user}', - 'submit' => 'Obriši', - ], - 'messages' => [ - 'createSuccess' => - 'Korisnik je uspešno kreiran! Poruka dobrodošlice je poslata E-poštom korisniku {username}. Ona sadrži vezu za prijavu a od njih će biti zatraženo resetovanje lozinke nakon prve autentifikacije.', - 'roleEditSuccess' => - "Uloge korisnika {username} su uspešno ažurirane.", - 'banSuccess' => 'Korisnik {username} je zabranjen.', - 'unbanSuccess' => 'Korisniku {username} je skinuta zabrana.', - 'editOwnerError' => - 'Korisnik {username} je vlasnik instance, prosto ne možete dirati vlasnika…', - 'banSuperAdminError' => - 'Korisnik {username} je super administrator, prosto ne možete zabraniti super administratora…', - 'deleteOwnerError' => - 'Korisnik {username} je vlasnik instance, prosto ne možete obrisati vlasnika…', - 'deleteSuperAdminError' => - 'Korisnik {username} je super administrator, prosto ne možete obrisati super administratora…', - 'deleteSuccess' => 'Korisnik {username} je obrisan.', - ], -]; diff --git a/modules/Auth/Language/sv/Auth.php b/modules/Auth/Language/sv/Auth.php index 59bbe7aa..386853fe 100644 --- a/modules/Auth/Language/sv/Auth.php +++ b/modules/Auth/Language/sv/Auth.php @@ -72,14 +72,16 @@ return [ 'manage-publications' => 'Kan publicera podcast #{id}.', 'manage-notifications' => 'Can view and mark notifications as read for podcast #{id}.', 'interact-as' => 'Kan interagera som podcasten #{id} för att favorita, dela eller svara på inlägg.', - 'episodes.view' => 'Kan visa instrumentpaneler och analyser av podcast #{id}s avsnitt.', - 'episodes.create' => 'Kan skapa avsnitt för podcast #{id}.', - 'episodes.edit' => 'Kan redigera avsnitt av podcast #{id}.', - 'episodes.delete' => 'Kan ta bort avsnitt av podcast #{id}.', - 'episodes.manage-persons' => 'Kan hantera avsnittpersoner i podcast #{id}.', - 'episodes.manage-clips' => 'Kan hantera videoklipp eller ljudklipp från podcasten #{id}.', - 'episodes.manage-publications' => 'Kan publicera/avpublicera avsnitt och inlägg i podcast #{id}.', - 'episodes.manage-comments' => 'Kan skapa/ta bort avsnitt kommentarer från podcasten #{id}.', + 'episodes' => [ + 'view' => 'Kan visa instrumentpaneler och analyser av podcast #{id}s avsnitt.', + 'create' => 'Kan skapa avsnitt för podcast #{id}.', + 'edit' => 'Kan redigera avsnitt av podcast #{id}.', + 'delete' => 'Kan ta bort avsnitt av podcast #{id}.', + 'manage-persons' => 'Kan hantera avsnittpersoner i podcast #{id}.', + 'manage-clips' => 'Kan hantera videoklipp eller ljudklipp från podcasten #{id}.', + 'manage-publications' => 'Kan publicera/avpublicera avsnitt och inlägg i podcast #{id}.', + 'manage-comments' => 'Kan skapa/ta bort avsnitt kommentarer från podcasten #{id}.', + ], ], // missing keys diff --git a/modules/Auth/Language/uk/Auth.php b/modules/Auth/Language/uk/Auth.php index 725b760b..b366563a 100644 --- a/modules/Auth/Language/uk/Auth.php +++ b/modules/Auth/Language/uk/Auth.php @@ -72,14 +72,16 @@ return [ '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 dashboards and analytics of podcast #{id}\'s episodes.', - 'episodes.create' => 'Can create episodes for podcast #{id}.', - 'episodes.edit' => 'Can edit episodes of podcast #{id}.', - 'episodes.delete' => 'Can delete episodes of podcast #{id}.', - 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', - 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', - 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', - 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + 'episodes' => [ + 'view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'create' => 'Can create episodes for podcast #{id}.', + 'edit' => 'Can edit episodes of podcast #{id}.', + 'delete' => 'Can delete episodes of podcast #{id}.', + 'manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], ], // missing keys diff --git a/modules/Auth/Language/zh-Hant/Contributor.php b/modules/Auth/Language/zh-Hant/Contributor.php deleted file mode 100644 index c70badc0..00000000 --- a/modules/Auth/Language/zh-Hant/Contributor.php +++ /dev/null @@ -1,47 +0,0 @@ - 'Podcast contributors', - 'view' => "{username}'s contribution to {podcastTitle}", - 'add' => 'Add contributor', - 'add_contributor' => 'Add a contributor for {0}', - 'edit_role' => 'Update role for {0}', - 'edit' => 'Edit', - 'remove' => 'Remove', - 'list' => [ - 'username' => 'Username', - 'role' => 'Role', - ], - 'form' => [ - 'user' => 'User', - 'user_placeholder' => 'Select a user…', - 'role' => 'Role', - 'role_placeholder' => 'Select its role…', - 'submit_add' => 'Add contributor', - 'submit_edit' => 'Update role', - ], - 'delete_form' => [ - 'title' => 'Remove {contributor}', - 'disclaimer' => - 'You are about to remove {contributor} from contributors. They will not be able to access "{podcastTitle}" anymore.', - 'understand' => 'I understand, I want to remove {contributor} from "{podcastTitle}"', - 'submit' => 'Remove', - ], - 'messages' => [ - 'editSuccess' => 'Role successfully changed!', - 'editOwnerError' => "You can't edit the podcast owner!", - 'removeOwnerError' => "You can't remove the podcast owner!", - 'removeSuccess' => - 'You have successfully removed {username} from {podcastTitle}', - 'alreadyAddedError' => - "The contributor you're trying to add has already been added!", - ], -]; diff --git a/modules/Auth/Language/zh-Hant/MyAccount.php b/modules/Auth/Language/zh-Hant/MyAccount.php deleted file mode 100644 index 6ebbb30e..00000000 --- a/modules/Auth/Language/zh-Hant/MyAccount.php +++ /dev/null @@ -1,18 +0,0 @@ - 'My account info', - 'changePassword' => 'Change my password', - 'messages' => [ - 'wrongPasswordError' => "You've entered the wrong password, try again.", - 'passwordChangeSuccess' => 'Password has been successfully changed!', - ], -]; diff --git a/modules/Auth/Language/zh-Hant/User.php b/modules/Auth/Language/zh-Hant/User.php deleted file mode 100644 index 32ec560c..00000000 --- a/modules/Auth/Language/zh-Hant/User.php +++ /dev/null @@ -1,60 +0,0 @@ - "Edit {username}'s role", - 'ban' => 'Ban', - 'unban' => 'Unban', - 'delete' => 'Delete', - 'create' => 'New user', - 'view' => "{username}'s info", - 'all_users' => 'All users', - 'list' => [ - 'user' => 'User', - 'role' => 'Role', - 'banned' => 'Banned?', - ], - 'form' => [ - 'email' => 'Email', - 'username' => 'Username', - 'password' => 'Password', - 'new_password' => 'New Password', - 'role' => 'Role', - 'roles' => 'Roles', - 'permissions' => 'Permissions', - 'submit_create' => 'Create user', - 'submit_edit' => 'Save', - 'submit_password_change' => 'Change!', - ], - 'delete_form' => [ - 'title' => 'Delete {user}', - 'disclaimer' => - "You are about to delete {user} permanently. They will not be able to access the admin area anymore.", - 'understand' => 'I understand, I want to delete {user} permanently', - 'submit' => 'Delete', - ], - 'messages' => [ - 'createSuccess' => - 'User created successfully! A welcome email was sent to {username} with a login link, they will be prompted with a password reset upon first authentication.', - 'roleEditSuccess' => - "{username}'s roles have been successfully updated.", - 'banSuccess' => '{username} has been banned.', - 'unbanSuccess' => '{username} has been unbanned.', - 'editOwnerError' => - '{username} is the instance owner, one does not simply touch the owner…', - 'banSuperAdminError' => - '{username} is a superadmin, one does not simply ban a superadmin…', - 'deleteOwnerError' => - '{username} is the instance owner, one does not simply delete the owner…', - 'deleteSuperAdminError' => - '{username} is a superadmin, one does not simply delete a superadmin…', - 'deleteSuccess' => '{username} has been deleted.', - ], -]; diff --git a/modules/Auth/Language/zh-Hans/Auth.php b/modules/Auth/Language/zh-hans/Auth.php similarity index 83% rename from modules/Auth/Language/zh-Hans/Auth.php rename to modules/Auth/Language/zh-hans/Auth.php index 89f14530..b3d371e5 100644 --- a/modules/Auth/Language/zh-Hans/Auth.php +++ b/modules/Auth/Language/zh-hans/Auth.php @@ -72,14 +72,16 @@ return [ '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} 的剧集评论。', + 'episodes' => [ + 'view' => '可以查看播客 #{id} 的仪表板和分析。', + 'create' => '可以为播客 #{id} 创建剧集。', + 'edit' => '可以编辑播客 #{id} 的剧集。', + 'delete' => '可以删除播客 #{id} 的剧集。', + 'manage-persons' => '可以管理播客 #{id} 的剧集人。', + 'manage-clips' => '可以管理播客 #{id} 的视频剪辑或声音片段。', + 'manage-publications' => '可以发布/取消发布播客 #{id} 的剧集和帖子。', + 'manage-comments' => '可以创建/删除播客 #{id} 的剧集评论。', + ], ], // missing keys diff --git a/modules/Auth/Language/zh-Hans/Contributor.php b/modules/Auth/Language/zh-hans/Contributor.php similarity index 100% rename from modules/Auth/Language/zh-Hans/Contributor.php rename to modules/Auth/Language/zh-hans/Contributor.php diff --git a/modules/Auth/Language/zh-Hans/MyAccount.php b/modules/Auth/Language/zh-hans/MyAccount.php similarity index 100% rename from modules/Auth/Language/zh-Hans/MyAccount.php rename to modules/Auth/Language/zh-hans/MyAccount.php diff --git a/modules/Auth/Language/zh-Hans/User.php b/modules/Auth/Language/zh-hans/User.php similarity index 100% rename from modules/Auth/Language/zh-Hans/User.php rename to modules/Auth/Language/zh-hans/User.php diff --git a/modules/Auth/Language/fr_CA/Auth.php b/modules/Auth/Language/zh-hant/Auth.php similarity index 83% rename from modules/Auth/Language/fr_CA/Auth.php rename to modules/Auth/Language/zh-hant/Auth.php index 725b760b..b366563a 100644 --- a/modules/Auth/Language/fr_CA/Auth.php +++ b/modules/Auth/Language/zh-hant/Auth.php @@ -72,14 +72,16 @@ return [ '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 dashboards and analytics of podcast #{id}\'s episodes.', - 'episodes.create' => 'Can create episodes for podcast #{id}.', - 'episodes.edit' => 'Can edit episodes of podcast #{id}.', - 'episodes.delete' => 'Can delete episodes of podcast #{id}.', - 'episodes.manage-persons' => 'Can manage episode persons of podcast #{id}.', - 'episodes.manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', - 'episodes.manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', - 'episodes.manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + 'episodes' => [ + 'view' => 'Can view dashboards and analytics of podcast #{id}\'s episodes.', + 'create' => 'Can create episodes for podcast #{id}.', + 'edit' => 'Can edit episodes of podcast #{id}.', + 'delete' => 'Can delete episodes of podcast #{id}.', + 'manage-persons' => 'Can manage episode persons of podcast #{id}.', + 'manage-clips' => 'Can manage video clips or soundbites of podcast #{id}.', + 'manage-publications' => 'Can publish/unpublish episodes and posts of podcast #{id}.', + 'manage-comments' => 'Can create/remove episode comments of podcast #{id}.', + ], ], // missing keys diff --git a/modules/Auth/Language/fr_trad/Contributor.php b/modules/Auth/Language/zh-hant/Contributor.php similarity index 100% rename from modules/Auth/Language/fr_trad/Contributor.php rename to modules/Auth/Language/zh-hant/Contributor.php diff --git a/modules/Auth/Language/fr_trad/MyAccount.php b/modules/Auth/Language/zh-hant/MyAccount.php similarity index 100% rename from modules/Auth/Language/fr_trad/MyAccount.php rename to modules/Auth/Language/zh-hant/MyAccount.php diff --git a/modules/Auth/Language/fr_trad/User.php b/modules/Auth/Language/zh-hant/User.php similarity index 100% rename from modules/Auth/Language/fr_trad/User.php rename to modules/Auth/Language/zh-hant/User.php diff --git a/modules/Install/Language/.rsync-filter b/modules/Install/Language/.rsync-filter index c6a78436..b802a93d 100644 --- a/modules/Install/Language/.rsync-filter +++ b/modules/Install/Language/.rsync-filter @@ -2,11 +2,11 @@ + fr/*** + pl/*** + de/*** -+ pt-BR/*** -+ nn-NO/*** ++ pt-br/*** ++ nn-no/*** + es/*** -+ zh-Hans/*** ++ zh-hans/*** + ca/*** + br/*** -+ sr-Latn/*** ++ sr-latn/*** - ** diff --git a/modules/Install/Language/fr_CA/Install.php b/modules/Install/Language/fr-ca/Install.php similarity index 100% rename from modules/Install/Language/fr_CA/Install.php rename to modules/Install/Language/fr-ca/Install.php diff --git a/modules/Install/Language/nn-NO/Install.php b/modules/Install/Language/nn-no/Install.php similarity index 100% rename from modules/Install/Language/nn-NO/Install.php rename to modules/Install/Language/nn-no/Install.php diff --git a/modules/Install/Language/pt-BR/Install.php b/modules/Install/Language/pt-br/Install.php similarity index 100% rename from modules/Install/Language/pt-BR/Install.php rename to modules/Install/Language/pt-br/Install.php diff --git a/modules/Install/Language/sr-Latn/Install.php b/modules/Install/Language/sr-latn/Install.php similarity index 100% rename from modules/Install/Language/sr-Latn/Install.php rename to modules/Install/Language/sr-latn/Install.php diff --git a/modules/Install/Language/zh-Hant/Install.php b/modules/Install/Language/zh-Hant/Install.php deleted file mode 100644 index 45d26085..00000000 --- a/modules/Install/Language/zh-Hant/Install.php +++ /dev/null @@ -1,62 +0,0 @@ - 'Castopod installer', - 'manual_config' => 'Manual configuration', - 'manual_config_subtitle' => - 'Create a `.env` file with your settings and refresh the page to continue installation.', - 'form' => [ - 'instance_config' => 'Instance configuration', - 'hostname' => 'Hostname', - 'media_base_url' => 'Media base URL', - 'media_base_url_hint' => - 'If you use a CDN and/or an external analytics service, you may set them here.', - 'admin_gateway' => 'Admin gateway', - 'admin_gateway_hint' => - 'The route to access the admin area (eg. https://example.com/cp-admin). It is set by default as cp-admin, we recommend you change it for security reasons.', - 'auth_gateway' => 'Auth gateway', - 'auth_gateway_hint' => - 'The route to access the authentication pages (eg. https://example.com/cp-auth). It is set by default as cp-auth, we recommend you change it for security reasons.', - 'database_config' => 'Database configuration', - 'database_config_hint' => - 'Castopod needs to connect to your MySQL (or MariaDB) database. If you do not have these required info, please contact your server administrator.', - 'db_hostname' => 'Database hostname', - 'db_name' => 'Database name', - 'db_username' => 'Database username', - 'db_password' => 'Database password', - 'db_prefix' => 'Database prefix', - 'db_prefix_hint' => - "The prefix of the Castopod table names, leave as is if you don't know what it means.", - 'cache_config' => 'Cache configuration', - 'cache_config_hint' => - 'Choose your preferred cache handler. Leave it as the default value if you have no clue what it means.', - 'cache_handler' => 'Cache handler', - 'cacheHandlerOptions' => [ - 'file' => 'File', - 'redis' => 'Redis', - 'predis' => 'Predis', - ], - 'next' => 'Next', - 'submit' => 'Finish install', - 'create_superadmin' => 'Create your Super Admin account', - 'email' => 'Email', - 'username' => 'Username', - 'password' => 'Password', - ], - 'messages' => [ - 'createSuperAdminSuccess' => - 'Your superadmin account has been created successfully. Login to start podcasting!', - 'databaseConnectError' => - 'Castopod could not connect to your database. Edit your database configuration and try again.', - 'writeError' => - "Couldn't create/write the `.env` file. You must create it manually by following the `.env.example` file template in the Castopod package.", - ], -]; diff --git a/modules/Install/Language/zh-Hans/Install.php b/modules/Install/Language/zh-hans/Install.php similarity index 100% rename from modules/Install/Language/zh-Hans/Install.php rename to modules/Install/Language/zh-hans/Install.php diff --git a/modules/Install/Language/fr_trad/Install.php b/modules/Install/Language/zh-hant/Install.php similarity index 100% rename from modules/Install/Language/fr_trad/Install.php rename to modules/Install/Language/zh-hant/Install.php diff --git a/modules/PodcastImport/Language/fr_CA/PodcastImport.php b/modules/PodcastImport/Language/fr-ca/PodcastImport.php similarity index 100% rename from modules/PodcastImport/Language/fr_CA/PodcastImport.php rename to modules/PodcastImport/Language/fr-ca/PodcastImport.php diff --git a/modules/PodcastImport/Language/fr_trad/PodcastImport.php b/modules/PodcastImport/Language/fr_trad/PodcastImport.php deleted file mode 100644 index 7c3ef67d..00000000 --- a/modules/PodcastImport/Language/fr_trad/PodcastImport.php +++ /dev/null @@ -1,37 +0,0 @@ - - '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.', - 'old_podcast_section_title' => 'The podcast to import', - 'old_podcast_section_subtitle' => - 'Make sure you own the rights for this podcast before importing it. Copying and broadcasting a podcast without the proper rights is piracy and is liable to prosecution.', - 'imported_feed_url' => 'Feed URL', - 'imported_feed_url_hint' => 'The feed must be in xml or rss format.', - 'new_podcast_section_title' => 'The new podcast', - 'advanced_params_section_title' => 'Advanced parameters', - 'advanced_params_section_subtitle' => - 'Keep the default values if you have no idea of what the fields are for.', - 'slug_field' => 'Field to be used to calculate episode slug', - 'description_field' => - 'Source field used for episode description / show notes', - 'force_renumber' => 'Force episodes renumbering', - 'force_renumber_hint' => - 'Use this if your podcast does not have episode numbers but wish to set them during import.', - 'season_number' => 'Season number', - 'season_number_hint' => - 'Use this if your podcast does not have a season number but wish to set one during import. Leave blank otherwise.', - 'max_episodes' => 'Maximum number of episodes to import', - 'max_episodes_hint' => 'Leave blank to import all episodes', - 'lock_import' => - 'This feed is protected. You cannot import it. If you are the owner, unprotect it on the origin platform.', - 'submit' => 'Import podcast', -]; diff --git a/modules/PodcastImport/Language/nn-NO/PodcastImport.php b/modules/PodcastImport/Language/nn-no/PodcastImport.php similarity index 100% rename from modules/PodcastImport/Language/nn-NO/PodcastImport.php rename to modules/PodcastImport/Language/nn-no/PodcastImport.php diff --git a/modules/PodcastImport/Language/pt-BR/PodcastImport.php b/modules/PodcastImport/Language/pt-br/PodcastImport.php similarity index 100% rename from modules/PodcastImport/Language/pt-BR/PodcastImport.php rename to modules/PodcastImport/Language/pt-br/PodcastImport.php diff --git a/modules/PodcastImport/Language/sr-Latn/PodcastImport.php b/modules/PodcastImport/Language/sr-latn/PodcastImport.php similarity index 100% rename from modules/PodcastImport/Language/sr-Latn/PodcastImport.php rename to modules/PodcastImport/Language/sr-latn/PodcastImport.php diff --git a/modules/PodcastImport/Language/sr_Latn/PodcastImport.php b/modules/PodcastImport/Language/sr_Latn/PodcastImport.php deleted file mode 100644 index 504175b7..00000000 --- a/modules/PodcastImport/Language/sr_Latn/PodcastImport.php +++ /dev/null @@ -1,66 +0,0 @@ - [ - 'disclaimer' => 'Uvoz', - 'text' => '{podcastTitle} se trenutno uvozi.', - 'cta' => 'Pogledaj status uvoza', - ], - 'old_podcast_section_title' => 'Podkast koji se uvozi', - 'old_podcast_legal_disclaimer_title' => 'Pravno odricanje od odgovornosti', - 'old_podcast_legal_disclaimer' => - 'Uverite se da posedujete prava za ovaj podkast pre nego što ga uvezete. Kopiranje i emitovanje podkasta bez odgovarajućih prava je piraterija i podložno je krivičnom gonjenju.', - 'imported_feed_url' => 'URL snabdevača', - 'imported_feed_url_hint' => 'Snabdevač mora biti u xml ili rss formatu.', - 'new_podcast_section_title' => 'Novi podkast', - 'lock_import' => - 'Ovaj snabdevač je zaštićen. Ne možete ga uvesti. Ukoliko ste vlasnik, otključajte snabdevač na originalnoj platformi na kojoj ste ga napravili.', - 'submit' => 'Dodaj uvoz na čekanje', - 'queue' => [ - 'status' => [ - 'label' => 'Status', - 'queued' => 'čekanje', - 'queued_hint' => 'Zadatak uvoza čeka na obradu.', - 'canceled' => 'otkazano', - 'canceled_hint' => 'Zadatak uvoza je otkazan.', - 'running' => 'u toku', - 'running_hint' => 'Zadatak uvoza se procesuira.', - 'failed' => 'nije uspеlo', - 'failed_hint' => 'Zadatak uvoza nije mogao da se završi: greška skripte.', - 'passed' => 'pauzirano', - 'passed_hint' => 'Zadatak uvoza uspešno obavljen!', - ], - 'feed' => 'Snabdevač', - 'duration' => 'Trajanje uvoza', - 'imported_episodes' => 'Uvežene epizode', - 'imported_episodes_hint' => '{newlyImportedCount} novo uvežena, {alreadyImportedCount} već uveženih.', - 'actions' => [ - 'cancel' => 'Otkaži', - 'retry' => 'Pokušaj ponovo', - 'delete' => 'Obriši', - ], - ], - 'syncForm' => [ - 'title' => 'Sinhronizuj snabdevače', - 'feed_url' => 'URL snabdevača', - 'feed_url_hint' => 'URL veza snabdevača koju želite da sinhronizujete sa trenutnim podkastom.', - 'submit' => 'Dodaj u redosled', - ], - 'messages' => [ - 'canceled' => 'Zadatak uvoza uspešno otkazan!', - 'notRunning' => 'Nije moguće otkazati zadatak uvoza jer isti nije u toku.', - 'alreadyRunning' => 'Zadatak uvoza je u toku. Možete ga otkazati pre ponovnog pokušaja.', - 'retried' => 'Zadatak uvoza je na čekanju, biće pokušan ponovo uskoro!', - 'deleted' => 'Zadatak uvoza uspešno obrisan!', - 'importTaskQueued' => 'Novi zadatak je na čekanju, uvoz će krenuti uskoro!', - 'syncTaskQueued' => 'Novi zadatak uvoza je na čekanju, sinhronizacija će početi uskoro!', - ], -]; diff --git a/modules/PodcastImport/Language/zh-Hans/PodcastImport.php b/modules/PodcastImport/Language/zh-hans/PodcastImport.php similarity index 100% rename from modules/PodcastImport/Language/zh-Hans/PodcastImport.php rename to modules/PodcastImport/Language/zh-hans/PodcastImport.php diff --git a/modules/PodcastImport/Language/zh-Hant/PodcastImport.php b/modules/PodcastImport/Language/zh-hant/PodcastImport.php similarity index 100% rename from modules/PodcastImport/Language/zh-Hant/PodcastImport.php rename to modules/PodcastImport/Language/zh-hant/PodcastImport.php diff --git a/modules/PremiumPodcasts/Language/fr_CA/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/fr-ca/PremiumPodcasts.php similarity index 100% rename from modules/PremiumPodcasts/Language/fr_CA/PremiumPodcasts.php rename to modules/PremiumPodcasts/Language/fr-ca/PremiumPodcasts.php diff --git a/modules/PremiumPodcasts/Language/fr_CA/Subscription.php b/modules/PremiumPodcasts/Language/fr-ca/Subscription.php similarity index 100% rename from modules/PremiumPodcasts/Language/fr_CA/Subscription.php rename to modules/PremiumPodcasts/Language/fr-ca/Subscription.php diff --git a/modules/PremiumPodcasts/Language/nn-NO/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/nn-no/PremiumPodcasts.php similarity index 100% rename from modules/PremiumPodcasts/Language/nn-NO/PremiumPodcasts.php rename to modules/PremiumPodcasts/Language/nn-no/PremiumPodcasts.php diff --git a/modules/PremiumPodcasts/Language/nn-NO/Subscription.php b/modules/PremiumPodcasts/Language/nn-no/Subscription.php similarity index 100% rename from modules/PremiumPodcasts/Language/nn-NO/Subscription.php rename to modules/PremiumPodcasts/Language/nn-no/Subscription.php diff --git a/modules/PremiumPodcasts/Language/pt-BR/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/pt-br/PremiumPodcasts.php similarity index 100% rename from modules/PremiumPodcasts/Language/pt-BR/PremiumPodcasts.php rename to modules/PremiumPodcasts/Language/pt-br/PremiumPodcasts.php diff --git a/modules/PremiumPodcasts/Language/pt-BR/Subscription.php b/modules/PremiumPodcasts/Language/pt-br/Subscription.php similarity index 100% rename from modules/PremiumPodcasts/Language/pt-BR/Subscription.php rename to modules/PremiumPodcasts/Language/pt-br/Subscription.php diff --git a/modules/PremiumPodcasts/Language/sr-Latn/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/sr-latn/PremiumPodcasts.php similarity index 100% rename from modules/PremiumPodcasts/Language/sr-Latn/PremiumPodcasts.php rename to modules/PremiumPodcasts/Language/sr-latn/PremiumPodcasts.php diff --git a/modules/PremiumPodcasts/Language/sr-Latn/Subscription.php b/modules/PremiumPodcasts/Language/sr-latn/Subscription.php similarity index 100% rename from modules/PremiumPodcasts/Language/sr-Latn/Subscription.php rename to modules/PremiumPodcasts/Language/sr-latn/Subscription.php diff --git a/modules/PremiumPodcasts/Language/sr_Latn/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/sr_Latn/PremiumPodcasts.php deleted file mode 100644 index 6da5e74e..00000000 --- a/modules/PremiumPodcasts/Language/sr_Latn/PremiumPodcasts.php +++ /dev/null @@ -1,34 +0,0 @@ - 'Podcast sadrži premijerne epizode', - 'episode_is_premium' => 'Epizoda je premijum, dostupna je samo premijum pretplatnicima', - 'unlock_episode' => 'Ova epizoda je samo za premijum pretplatnike. Klikni da je otključaš!', - 'banner_unlock' => 'Ovaj podkast sadrži premijum epizode, dostupne samo premijum pretplatnicima.', - 'banner_lock' => 'Podkast je otključan, uživajte u premijum epizodama!', - 'subscribe' => 'Pretplatite se', - 'lock' => 'Zaključaj', - 'unlock' => 'Otključaj', - 'unlock_form' => [ - 'title' => 'Premijum sadržaj', - 'subtitle' => 'Ovaj podkat sadrži zaključane premijum epizode! Da li imate ključ?', - 'token' => 'Unesite ključ', - 'token_hint' => 'Ako ste pretplaćeni na {podcastTitle}, možete kopirati ključ koji vam je poslat na E poštu i zalepiti ga ovde.', - 'submit' => 'Otključaj sve epizode!', - 'call_to_action' => 'Otključaj sve epizode {podcastTitle}:', - 'subscribe_cta' => 'Pretplati se sada!', - ], - 'messages' => [ - 'unlockSuccess' => 'Podkast je uspešno otključan, uživajte u premijum epizodama!', - 'unlockBadAttempt' => 'Izgleda da vaš ključ ne radi…', - 'lockSuccess' => 'Podkast je uspešno zaključan!', - ], -]; diff --git a/modules/PremiumPodcasts/Language/sr_Latn/Subscription.php b/modules/PremiumPodcasts/Language/sr_Latn/Subscription.php deleted file mode 100644 index 0fbeb3aa..00000000 --- a/modules/PremiumPodcasts/Language/sr_Latn/Subscription.php +++ /dev/null @@ -1,100 +0,0 @@ - 'Podkast pretplate', - 'add' => 'Nova pretplata', - 'view' => 'Pogledaj pretplatu', - 'edit' => 'Uredi pretplatu', - 'regenerate_token' => 'Regeneriši token', - 'suspend' => 'Ukini pretplatu', - 'resume' => 'Nastavi pretplatu', - 'delete' => 'Obriši pretplatu', - 'status' => [ - 'active' => 'Aktivno', - 'suspended' => 'Ukinuto', - 'expired' => 'Isteklo', - ], - 'list' => [ - 'number' => 'Broj', - 'email' => 'E-pošta', - 'expiration_date' => 'Datum Isteka', - 'unlimited' => 'Neograničeno', - 'downloads' => 'Preuzimanja', - 'status' => 'Status', - ], - 'form' => [ - 'email' => 'E-pošta', - 'expiration_date' => 'Datum Isteka', - 'expiration_date_hint' => 'Datum i vreme kada pretplata ističe. Ostavite prazno za neograničenu pretplatu.', - 'submit_create' => 'Napravi pretplatu', - 'submit_edit' => 'Uredi pretplatu', - ], - 'form_link_add' => [ - 'link' => 'Veza strane za pretplate', - 'link_hint' => 'Ovo će dodati poziv na akciju na veb lokaciji koji poziva slušaoce da se pretplate na podkast.', - 'submit' => 'Sačuvaj vezu', - ], - 'suspend_form' => [ - 'disclaimer' => 'Obustavljanje pretplate će ograničiti pretplatniku pristup premijum sadržaju. I dalje ćete moći da uklonite obustavu nakon toga.', - 'reason' => 'Razlog', - 'reason_placeholder' => 'Zašto ukidate pretplatu?', - "submit" => 'Ukini pretplatu', - ], - 'delete_form' => [ - 'disclaimer' => 'Brisanje {subscriber} pretplate će ukloniti svu analitiku vezanu za tog pretplatnika.', - 'understand' => 'Razumem, želim da trajno ukinem pretplatu', - 'submit' => 'Ukloni pretplatu', - ], - 'messages' => [ - 'addSuccess' => 'Nova pretplata dodata! Poruka dobrodođlice je poslata {subscriber} putem E-pošte.', - 'addError' => 'Nije moguće dodati pretplatu.', - 'editSuccess' => 'Datum isteka pretplate je ažuriran! Poruka je poslata {subscriber} putem E-pošte.', - 'editError' => 'Nije moguće urediti pretplatu.', - 'regenerateTokenSuccess' => 'Token regenerisan! Novi token je poslat {subscriber} putem E-pošte.', - 'regenerateTokenError' => 'Token nije moguće regenerisati.', - 'deleteSuccess' => 'Pretplata je uklonjena! Poruka je poslata {subscriber} putem E-pošte.', - 'deleteError' => 'Nije moguće ukloniti pretplatu.', - 'suspendSuccess' => 'Pretplata je ukinuta! Poruka je poslata {subscriber} putem E-pošte.', - 'suspendError' => 'Nije moguće prekinuti pretplatu.', - 'resumeSuccess' => 'Pretplana je obnovljena! Poruka je poslata {subscriber} putem E-pošte.', - 'resumeError' => 'Nije moguće obnoviti pretplatu.', - 'linkSaveSuccess' => 'Veza za pretplatu je uspešno sačuvana! Pojaviće se na Veb strani kao poziv na akciju!', - 'linkRemoveSuccess' => 'Veza za pretplatu je uspešno uklonjena!', - ], - 'emails' => [ - 'greeting' => 'Hej,', - 'token' => 'Vaš token: {0}', - 'unique_feed_link' => 'Vaša jedinstvena veza sa fidom: {0}', - 'how_to_use' => 'Kako se koristi?', - 'two_ways' => 'Imate dva načina kako možete otključati premijum epizode:', - 'import_into_app' => 'Kopirajte svoj jedinstveni url fid u svoju omiljenu aplikaciju za podkaste (uvezite ga kao privatni fid da biste sprečili otkrivanje vaših akreditiva).', - 'go_to_website' => 'Idite na {podcastWebsite} veb stranicu i otključajte podkast koristeći vaš token.', - 'welcome_subject' => 'Dobrodošli na {podcastTitle}', - 'welcome' => 'Pretplatili ste se na {podcastTitle}, hvala vam i dobrodošli!', - 'welcome_token_title' => 'Evo vaših akreditiva kojima otključavate premijum epizode ovog podkasta:', - 'welcome_expires' => 'Vaša pretplata ističe {0}.', - 'welcome_never_expires' => 'Vaša pretplata je podešena tako da ne može da istekne.', - 'reset_subject' => 'Vaš token je resetovan!', - 'reset_token' => 'Vaš pristup {podcastTitle} je resetovan!', - 'reset_token_title' => 'Nove akreditive su kreirane kako bi ste pristupili premijum epizodama podkasta:', - 'edited_subject' => 'Vaša pretplata je ažurirana!', - 'edited_expires' => 'Vaša pretplata na {podcastTitle} ističe {expiresAt}.', - 'edited_never_expires' => 'Vaša pretplata na {podcastTitle} je podešena tako da nikad ne istekne!', - 'suspended_subject' => 'Vaša pretplata je ukinuta!', - 'suspended' => 'Vaša pretplata na {podcastTitle} je ukinuta! Više ne možete pristupiti premijum epizodama ovog podkasta.', - 'suspended_reason' => 'Razlog: {0}', - 'resumed_subject' => 'Vaša pretplata je ponovo pokrenuta!', - 'resumed' => 'Vaša pretplata na {podcastTitle} je ponovo pokrenuta! Sada ponovo možete pristupiti premijum epizodama ovog podkasta.', - 'deleted_subject' => 'Vaša pretplata je uklonjena!', - 'deleted' => 'Vaša pretplata na {podcastTitle} je uklonjena! Vipe ne možete pristupiti premijum epizodama ovog podkasta.', - 'footer' => '{castopod} hostovan na {host}', - ], -]; diff --git a/modules/PremiumPodcasts/Language/zh-Hant/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/zh-Hant/PremiumPodcasts.php deleted file mode 100644 index 18c0dd4e..00000000 --- a/modules/PremiumPodcasts/Language/zh-Hant/PremiumPodcasts.php +++ /dev/null @@ -1,34 +0,0 @@ - 'Podcast contains premium episodes', - 'episode_is_premium' => 'Episode is premium, only available to premium subscribers', - 'unlock_episode' => 'This episode is for premium subscribers only. Click to unlock it!', - 'banner_unlock' => 'This podcast contains premium episodes, only available to premium subscribers.', - 'banner_lock' => 'Podcast is unlocked, enjoy the premium episodes!', - 'subscribe' => 'Subscribe', - 'lock' => 'Lock', - 'unlock' => 'Unlock', - 'unlock_form' => [ - 'title' => 'Premium content', - 'subtitle' => 'This podcast contains locked premium episodes! Do you have the key to unlock them?', - 'token' => 'Enter your key', - 'token_hint' => 'If you are subscribed to {podcastTitle}, you may copy the key that was sent to you via email and paste it here.', - 'submit' => 'Unlock all episodes!', - 'call_to_action' => 'Unlock all episodes of {podcastTitle}:', - 'subscribe_cta' => 'Subscribe now!', - ], - 'messages' => [ - 'unlockSuccess' => 'Podcast was successfully unlocked! Enjoy the premium episodes!', - 'unlockBadAttempt' => 'Your key does not seem to be working…', - 'lockSuccess' => 'Podcast was successfully locked!', - ], -]; diff --git a/modules/PremiumPodcasts/Language/zh-Hant/Subscription.php b/modules/PremiumPodcasts/Language/zh-Hant/Subscription.php deleted file mode 100644 index e83f0cb2..00000000 --- a/modules/PremiumPodcasts/Language/zh-Hant/Subscription.php +++ /dev/null @@ -1,100 +0,0 @@ - 'Podcast subscriptions', - 'add' => 'New subscription', - 'view' => 'View subscription', - 'edit' => 'Edit subscription', - 'regenerate_token' => 'Regenerate token', - 'suspend' => 'Suspend subscription', - 'resume' => 'Resume subscription', - 'delete' => 'Delete subscription', - 'status' => [ - 'active' => 'Active', - 'suspended' => 'Suspended', - 'expired' => 'Expired', - ], - 'list' => [ - 'number' => 'Number', - 'email' => 'Email', - 'expiration_date' => 'Expiration date', - 'unlimited' => 'Unlimited', - 'downloads' => 'Downloads', - 'status' => 'Status', - ], - 'form' => [ - 'email' => 'Email', - 'expiration_date' => 'Expiration date', - 'expiration_date_hint' => 'The date and time at which the subscription expires. Leave empty for an unlimited subscription.', - 'submit_create' => 'Create subscription', - 'submit_edit' => 'Edit subscription', - ], - 'form_link_add' => [ - 'link' => 'Subscription page link', - 'link_hint' => 'This will add a call to action in the website inviting listeners to subscribe to the podcast.', - 'submit' => 'Save link', - ], - 'suspend_form' => [ - 'disclaimer' => 'Suspending the subscription will restrict the subscriber from having access to the premium content. You will still be able to lift the suspension afterwards.', - 'reason' => 'Reason', - 'reason_placeholder' => 'Why are you suspending the subscription?', - "submit" => 'Suspend subscription', - ], - 'delete_form' => [ - 'disclaimer' => 'Deleting {subscriber}\'s subscription will remove all analytics data associated with it.', - 'understand' => 'I understand, remove the subscription permanently', - 'submit' => 'Remove subscription', - ], - 'messages' => [ - 'addSuccess' => 'New subscription added! A welcome email was sent to {subscriber}.', - 'addError' => 'Subscription could not be added.', - 'editSuccess' => 'Subscription expiry date was updated! An email was sent to {subscriber}.', - 'editError' => 'Subscription could not be edited.', - 'regenerateTokenSuccess' => 'Token regenerated! An email was sent to {subscriber} with the new token.', - 'regenerateTokenError' => 'Token could not be regenerated.', - 'deleteSuccess' => 'Subscription was removed! An email was sent to {subscriber}.', - 'deleteError' => 'Subscription could not be removed.', - 'suspendSuccess' => 'Subscription was suspended! An email was sent to {subscriber}.', - 'suspendError' => 'Subscription could not be suspended.', - 'resumeSuccess' => 'Subscription was resumed! An email was sent to {subscriber}.', - 'resumeError' => 'Subscription could not be resumed.', - 'linkSaveSuccess' => 'Subscription link was saved successfully! It will appear in the website as a Call To Action!', - 'linkRemoveSuccess' => 'Subscription link was removed successfully!', - ], - 'emails' => [ - 'greeting' => 'Hey,', - 'token' => 'Your token: {0}', - 'unique_feed_link' => 'Your unique feed link: {0}', - 'how_to_use' => 'How to use?', - 'two_ways' => 'You have two ways of unlocking the premium episodes:', - 'import_into_app' => 'Copy your unique feed url inside your favourite podcast app (import it as a private feed to prevent exposing your credentials).', - 'go_to_website' => 'Go to {podcastWebsite}\'s website and unlock the podcast with your token.', - 'welcome_subject' => 'Welcome to {podcastTitle}', - 'welcome' => 'You have subscribed to {podcastTitle}, thank you and welcome aboard!', - 'welcome_token_title' => 'Here are your credentials to unlock the podcast\'s premium episodes:', - 'welcome_expires' => 'Your subscription was set to expire on {0}.', - 'welcome_never_expires' => 'Your subscription was set to never expire.', - 'reset_subject' => 'Your token was reset!', - 'reset_token' => 'Your access to {podcastTitle} has been reset!', - 'reset_token_title' => 'New credentials have been generated for you to unlock the podcast\'s premium episodes:', - 'edited_subject' => 'Your subscription has been updated!', - 'edited_expires' => 'Your subscription for {podcastTitle} was set to expire on {expiresAt}.', - 'edited_never_expires' => 'Your subscription for {podcastTitle} was set to never expire!', - 'suspended_subject' => 'Your subscription has been suspended!', - 'suspended' => 'Your subscription for {podcastTitle} has been suspended! You can no longer access the podcast\'s premium episodes.', - 'suspended_reason' => 'That is for the following reason: {0}', - 'resumed_subject' => 'Your subscription has been resumed!', - 'resumed' => 'Your subscription for {podcastTitle} has been resumed! You may access the podcast\'s premium episodes again.', - 'deleted_subject' => 'Your subscription has been removed!', - 'deleted' => 'Your subscription for {podcastTitle} has been removed! You no longer have access to the podcast\'s premium episodes.', - 'footer' => '{castopod} hosted on {host}', - ], -]; diff --git a/modules/PremiumPodcasts/Language/zh-Hans/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/zh-hans/PremiumPodcasts.php similarity index 100% rename from modules/PremiumPodcasts/Language/zh-Hans/PremiumPodcasts.php rename to modules/PremiumPodcasts/Language/zh-hans/PremiumPodcasts.php diff --git a/modules/PremiumPodcasts/Language/zh-Hans/Subscription.php b/modules/PremiumPodcasts/Language/zh-hans/Subscription.php similarity index 100% rename from modules/PremiumPodcasts/Language/zh-Hans/Subscription.php rename to modules/PremiumPodcasts/Language/zh-hans/Subscription.php diff --git a/modules/PremiumPodcasts/Language/fr_trad/PremiumPodcasts.php b/modules/PremiumPodcasts/Language/zh-hant/PremiumPodcasts.php similarity index 100% rename from modules/PremiumPodcasts/Language/fr_trad/PremiumPodcasts.php rename to modules/PremiumPodcasts/Language/zh-hant/PremiumPodcasts.php diff --git a/modules/PremiumPodcasts/Language/fr_trad/Subscription.php b/modules/PremiumPodcasts/Language/zh-hant/Subscription.php similarity index 100% rename from modules/PremiumPodcasts/Language/fr_trad/Subscription.php rename to modules/PremiumPodcasts/Language/zh-hant/Subscription.php diff --git a/postcss.config.cjs b/postcss.config.cjs index 3af612e6..bf17a435 100644 --- a/postcss.config.cjs +++ b/postcss.config.cjs @@ -6,7 +6,7 @@ module.exports = { require("tailwindcss/nesting")(require("postcss-nesting")), require("tailwindcss"), require("postcss-preset-env")({ - stage: 1, + stage: 4, features: { "nesting-rules": false }, }), ...(process.env.NODE_ENV === "production"