chore: update CI to v4.6.3 + all php and js dependencies

This commit is contained in:
Yassine Doghri 2025-08-25 18:09:41 +00:00
parent 96b2df15b0
commit 346c00e7b5
206 changed files with 6265 additions and 5362 deletions

20
.gitignore vendored
View File

@ -67,7 +67,7 @@ writable/uploads/*
!writable/uploads/index.html
writable/debugbar/*
!writable/debugbar/.gitkeep
!writable/debugbar/index.html
php_errors.log
@ -107,15 +107,15 @@ _modules/*
.idea/
*.iml
# Netbeans
nbproject/
build/
nbbuild/
dist/
nbdist/
nbactions.xml
nb-configuration.xml
.nb-gradle/
# NetBeans
/nbproject/
/build/
/nbbuild/
/dist/
/nbdist/
/nbactions.xml
/nb-configuration.xml
/.nb-gradle/
# Sublime Text
*.tmlanguage.cache

View File

@ -146,12 +146,10 @@ To see your changes, go to:
- `http://localhost:8080/` for the Castopod website
- `http://localhost:8080/cp-admin` for the Castopod admin:
- email: **admin@castopod.local**
- password: **castopod**
- `http://localhost:8888/` for the phpmyadmin interface:
- username: **castopod**
- password: **castopod**
@ -294,7 +292,6 @@ You do not wish to use the VSCode devcontainer? No problem!
```
3. (optional) Populate the database with test data:
- Populate with fake podcast analytics:
```bash

View File

@ -16,8 +16,6 @@ use CodeIgniter\Config\AutoloadConfig;
*
* NOTE: If you use an identical key in $psr4 or $classmap, then
* the values in this file will overwrite the framework's values.
*
* @immutable
*/
class Autoload extends AutoloadConfig
{

View File

@ -80,7 +80,7 @@ class Cache extends BaseConfig
* Your file storage preferences can be specified below, if you are using
* the File driver.
*
* @var array<string, string|int|null>
* @var array{storePath?: string, mode?: int}
*/
public array $file = [
'storePath' => WRITEPATH . 'cache/',
@ -97,7 +97,7 @@ class Cache extends BaseConfig
*
* @see https://codeigniter.com/user_guide/libraries/caching.html#memcached
*
* @var array<string, string|int|bool>
* @var array{host?: string, port?: int, weight?: int, raw?: bool}
*/
public array $memcached = [
'host' => '127.0.0.1',
@ -113,7 +113,7 @@ class Cache extends BaseConfig
* Your Redis server can be specified below, if you are using
* the Redis or Predis drivers.
*
* @var array<string, string|int|null>
* @var array{host?: string, password?: string|null, port?: int, timeout?: int, database?: int}
*/
public array $redis = [
'host' => '127.0.0.1',

View File

@ -85,7 +85,7 @@ class Cookie extends BaseConfig
* (empty string) means default SameSite attribute set by browsers (`Lax`)
* will be set on cookies. If set to `None`, `$secure` must also be set.
*
* @phpstan-var 'None'|'Lax'|'Strict'|''
* @var ''|'Lax'|'None'|'Strict'
*/
public string $samesite = 'Lax';

View File

@ -4,9 +4,6 @@ declare(strict_types=1);
namespace Config;
/**
* @immutable
*/
class DocTypes
{
/**

View File

@ -56,7 +56,8 @@ Events::on('pre_system', static function (): void {
// Hot Reload route - for framework use on the hot reloader.
if (ENVIRONMENT === 'development') {
service('routes')->get('__hot-reload', static function (): void {
(new HotReloader())->run();
new HotReloader()
->run();
});
}
}

View File

@ -67,7 +67,10 @@ class Filters extends BaseConfig
/**
* List of filter aliases that are always applied before and after every request.
*
* @var array<string, array<string, array<string, string|array<string>>>>|array<string, list<string>>
* @var array{
* before: array<string, array{except: list<string>|string}>|list<string>,
* after: array<string, array{except: list<string>|string}>|list<string>
* }
*/
public array $globals = [
'before' => [

View File

@ -6,6 +6,7 @@ namespace Config;
use CodeIgniter\Config\BaseConfig;
use CodeIgniter\Log\Handlers\FileHandler;
use CodeIgniter\Log\Handlers\HandlerInterface;
class Logger extends BaseConfig
{
@ -75,7 +76,7 @@ class Logger extends BaseConfig
* Handlers are executed in the order defined in this array, starting with
* the handler on top and continuing down.
*
* @var array<class-string, array<string, int|list<string>|string>>
* @var array<class-string<HandlerInterface>, array<string, int|list<string>|string>>
*/
public array $handlers = [
/*

View File

@ -12,8 +12,6 @@ namespace Config;
*
* When working with mime types, please make sure you have the ´fileinfo´ extension enabled to reliably detect the
* media types.
*
* @immutable
*/
class Mimes
{
@ -281,7 +279,8 @@ class Mimes
'srt' => ['application/x-subrip', 'text/srt', 'text/plain', 'application/octet-stream'],
'vtt' => ['text/vtt', 'text/plain'],
'ico' => ['image/x-icon', 'image/x-ico', 'image/vnd.microsoft.icon'],
'stl' => ['application/sla', 'application/vnd.ms-pki.stl', 'application/x-navistyle'],
'stl' => ['application/sla', 'application/vnd.ms-pki.stl', 'application/x-navistyle', 'model/stl',
'application/octet-stream', ],
];
/**

View File

@ -11,8 +11,6 @@ use CodeIgniter\Modules\Modules as BaseModules;
*
* NOTE: This class is required prior to Autoloader instantiation,
* and does not extend BaseConfig.
*
* @immutable
*/
class Modules extends BaseModules
{

View File

@ -9,8 +9,6 @@ namespace Config;
*
* NOTE: This class does not extend BaseConfig for performance reasons.
* So you cannot replace the property values with Environment Variables.
*
* @immutable
*/
class Optimize
{

View File

@ -5,7 +5,7 @@ declare(strict_types=1);
use CodeIgniter\Router\RouteCollection;
/**
* @var RouteCollection $routes
* @var RouteCollection
*
* --------------------------------------------------------------------
* Placeholder definitions

View File

@ -9,9 +9,11 @@ use App\Libraries\HtmlHead;
use App\Libraries\Negotiate;
use App\Libraries\Router;
use CodeIgniter\Config\BaseService;
use CodeIgniter\HTTP\Negotiate as CodeIgniterHTTPNegotiate;
use CodeIgniter\HTTP\Request;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\Router\RouteCollectionInterface;
use CodeIgniter\Router\Router as CodeIgniterRouter;
/**
* Services Configuration file.
@ -33,7 +35,7 @@ class Services extends BaseService
?RouteCollectionInterface $routes = null,
?Request $request = null,
bool $getShared = true,
): Router {
): CodeIgniterRouter {
if ($getShared) {
return static::getSharedInstance('router', $routes, $request);
}
@ -48,8 +50,10 @@ class Services extends BaseService
* The Negotiate class provides the content negotiation features for working the request to determine correct
* language, encoding, charset, and more.
*/
public static function negotiator(?RequestInterface $request = null, bool $getShared = true): Negotiate
{
public static function negotiator(
?RequestInterface $request = null,
bool $getShared = true,
): CodeIgniterHTTPNegotiate {
if ($getShared) {
return static::getSharedInstance('negotiator', $request);
}

View File

@ -33,8 +33,10 @@ class CreditsController extends BaseController
'content_markdown' => '',
]);
$allPodcasts = (new PodcastModel())->findAll();
$allCredits = (new CreditModel())->findAll();
$allPodcasts = new PodcastModel()
->findAll();
$allCredits = new CreditModel()
->findAll();
// Unlike the carpenter, we make a tree from a table:
$personGroup = null;

View File

@ -65,7 +65,7 @@ class EpisodeAudioController extends Controller
}
if (
! ($podcast = (new PodcastModel())->getPodcastByHandle($params[0])) instanceof Podcast
! ($podcast = new PodcastModel()->getPodcastByHandle($params[0])) instanceof Podcast
) {
throw PageNotFoundException::forPageNotFound();
}
@ -73,7 +73,7 @@ class EpisodeAudioController extends Controller
$this->podcast = $podcast;
if (
! ($episode = (new EpisodeModel())->getEpisodeBySlug($params[0], $params[1])) instanceof Episode
! ($episode = new EpisodeModel()->getEpisodeBySlug($params[0], $params[1])) instanceof Episode
) {
throw PageNotFoundException::forPageNotFound();
}
@ -108,7 +108,7 @@ class EpisodeAudioController extends Controller
}
// check if there's a valid subscription for the provided token
if (! ($subscription = (new SubscriptionModel())->validateSubscription(
if (! ($subscription = new SubscriptionModel()->validateSubscription(
$this->episode->podcast->handle,
$token,
)) instanceof Subscription) {

View File

@ -44,7 +44,7 @@ class EpisodeCommentController extends BaseController
}
if (
! ($podcast = (new PodcastModel())->getPodcastByHandle($params[0])) instanceof Podcast
! ($podcast = new PodcastModel()->getPodcastByHandle($params[0])) instanceof Podcast
) {
throw PageNotFoundException::forPageNotFound();
}
@ -53,7 +53,7 @@ class EpisodeCommentController extends BaseController
$this->actor = $podcast->actor;
if (
! ($episode = (new EpisodeModel())->getEpisodeBySlug($params[0], $params[1])) instanceof Episode
! ($episode = new EpisodeModel()->getEpisodeBySlug($params[0], $params[1])) instanceof Episode
) {
throw PageNotFoundException::forPageNotFound();
}
@ -61,7 +61,7 @@ class EpisodeCommentController extends BaseController
$this->episode = $episode;
if (
! ($comment = (new EpisodeCommentModel())->getCommentById($params[2])) instanceof EpisodeComment
! ($comment = new EpisodeCommentModel()->getCommentById($params[2])) instanceof EpisodeComment
) {
throw PageNotFoundException::forPageNotFound();
}

View File

@ -41,7 +41,7 @@ class EpisodeController extends BaseController
}
if (
! ($podcast = (new PodcastModel())->getPodcastByHandle($params[0])) instanceof Podcast
! ($podcast = new PodcastModel()->getPodcastByHandle($params[0])) instanceof Podcast
) {
throw PageNotFoundException::forPageNotFound();
}
@ -49,7 +49,7 @@ class EpisodeController extends BaseController
$this->podcast = $podcast;
if (
! ($episode = (new EpisodeModel())->getEpisodeBySlug($params[0], $params[1])) instanceof Episode
! ($episode = new EpisodeModel()->getEpisodeBySlug($params[0], $params[1])) instanceof Episode
) {
throw PageNotFoundException::forPageNotFound();
}
@ -87,9 +87,8 @@ class EpisodeController extends BaseController
'episode' => $this->episode,
];
$secondsToNextUnpublishedEpisode = (new EpisodeModel())->getSecondsToNextUnpublishedEpisode(
$this->podcast->id,
);
$secondsToNextUnpublishedEpisode = new EpisodeModel()
->getSecondsToNextUnpublishedEpisode($this->podcast->id);
if (auth()->loggedIn()) {
helper('form');
@ -133,9 +132,8 @@ class EpisodeController extends BaseController
'episode' => $this->episode,
];
$secondsToNextUnpublishedEpisode = (new EpisodeModel())->getSecondsToNextUnpublishedEpisode(
$this->podcast->id,
);
$secondsToNextUnpublishedEpisode = new EpisodeModel()
->getSecondsToNextUnpublishedEpisode($this->podcast->id);
if (auth()->loggedIn()) {
helper('form');
@ -189,9 +187,8 @@ class EpisodeController extends BaseController
$data['chapters'] = $chapters;
}
$secondsToNextUnpublishedEpisode = (new EpisodeModel())->getSecondsToNextUnpublishedEpisode(
$this->podcast->id,
);
$secondsToNextUnpublishedEpisode = new EpisodeModel()
->getSecondsToNextUnpublishedEpisode($this->podcast->id);
if (auth()->loggedIn()) {
helper('form');
@ -250,9 +247,8 @@ class EpisodeController extends BaseController
}
}
$secondsToNextUnpublishedEpisode = (new EpisodeModel())->getSecondsToNextUnpublishedEpisode(
$this->podcast->id,
);
$secondsToNextUnpublishedEpisode = new EpisodeModel()
->getSecondsToNextUnpublishedEpisode($this->podcast->id);
if (auth()->loggedIn()) {
helper('form');
@ -306,9 +302,8 @@ class EpisodeController extends BaseController
'themeData' => $themeData,
];
$secondsToNextUnpublishedEpisode = (new EpisodeModel())->getSecondsToNextUnpublishedEpisode(
$this->podcast->id,
);
$secondsToNextUnpublishedEpisode = new EpisodeModel()
->getSecondsToNextUnpublishedEpisode($this->podcast->id);
// The page cache is set to a decade so it is deleted manually upon podcast update
return view('embed', $data, [
@ -410,7 +405,7 @@ class EpisodeController extends BaseController
$orderedItems = [];
if ($paginatedComments !== null) {
foreach ($paginatedComments as $comment) {
$orderedItems[] = (new NoteObject($comment))->toArray();
$orderedItems[] = new NoteObject($comment)->toArray();
}
}

View File

@ -26,7 +26,8 @@ class EpisodePreviewController extends BaseController
}
// find episode by previewUUID
$episode = (new EpisodeModel())->getEpisodeByPreviewId($params[0]);
$episode = new EpisodeModel()
->getEpisodeByPreviewId($params[0]);
if (! $episode instanceof Episode) {
throw PageNotFoundException::forPageNotFound();

View File

@ -33,7 +33,8 @@ class FeedController extends Controller
public function index(string $podcastHandle): ResponseInterface
{
$podcast = (new PodcastModel())->where('handle', $podcastHandle)
$podcast = new PodcastModel()
->where('handle', $podcastHandle)
->first();
if (! $podcast instanceof Podcast) {
throw PageNotFoundException::forPageNotFound();
@ -68,7 +69,8 @@ class FeedController extends Controller
$subscription = null;
$token = $this->request->getGet('token');
if ($token) {
$subscription = (new SubscriptionModel())->validateSubscription($podcastHandle, $token);
$subscription = new SubscriptionModel()
->validateSubscription($podcastHandle, $token);
}
$cacheName = implode(
@ -85,9 +87,8 @@ class FeedController extends Controller
$found = get_rss_feed($podcast, $serviceSlug, $subscription, $token);
// The page cache is set to expire after next episode publication or a decade by default so it is deleted manually upon podcast update
$secondsToNextUnpublishedEpisode = (new EpisodeModel())->getSecondsToNextUnpublishedEpisode(
$podcast->id,
);
$secondsToNextUnpublishedEpisode = new EpisodeModel()
->getSecondsToNextUnpublishedEpisode($podcast->id);
cache()
->save($cacheName, $found, $secondsToNextUnpublishedEpisode ?: DECADE);

View File

@ -25,7 +25,8 @@ class HomeController extends BaseController
'sort',
) : 'activity';
$allPodcasts = (new PodcastModel())->getAllPodcasts($sortBy);
$allPodcasts = new PodcastModel()
->getAllPodcasts($sortBy);
// check if there's only one podcast to redirect user to it
if (count($allPodcasts) === 1) {

View File

@ -43,7 +43,7 @@ class MapController extends BaseController
{
$cacheName = 'episodes_markers';
if (! ($found = cache($cacheName))) {
$episodes = (new EpisodeModel())
$episodes = new EpisodeModel()
->where('`published_at` <= UTC_TIMESTAMP()', null, false)
->where('location_geo is not', null)
->findAll();

View File

@ -24,7 +24,8 @@ class PageController extends BaseController
throw PageNotFoundException::forPageNotFound();
}
$page = (new PageModel())->where('slug', $params[0])->first();
$page = new PageModel()
->where('slug', $params[0])->first();
if (! $page instanceof Page) {
throw PageNotFoundException::forPageNotFound();
}

View File

@ -35,7 +35,7 @@ class PodcastController extends BaseController
}
if (
! ($podcast = (new PodcastModel())->getPodcastByHandle($params[0])) instanceof Podcast
! ($podcast = new PodcastModel()->getPodcastByHandle($params[0])) instanceof Podcast
) {
throw PageNotFoundException::forPageNotFound();
}
@ -78,7 +78,8 @@ class PodcastController extends BaseController
set_podcast_metatags($this->podcast, 'activity');
$data = [
'podcast' => $this->podcast,
'posts' => (new PostModel())->getActorPublishedPosts($this->podcast->actor_id),
'posts' => new PostModel()
->getActorPublishedPosts($this->podcast->actor_id),
];
// if user is logged in then send to the authenticated activity view
@ -88,9 +89,8 @@ class PodcastController extends BaseController
return view('podcast/activity', $data);
}
$secondsToNextUnpublishedEpisode = (new EpisodeModel())->getSecondsToNextUnpublishedEpisode(
$this->podcast->id,
);
$secondsToNextUnpublishedEpisode = new EpisodeModel()
->getSecondsToNextUnpublishedEpisode($this->podcast->id);
return view('podcast/activity', $data, [
'cache' => $secondsToNextUnpublishedEpisode ?: DECADE,
@ -120,7 +120,8 @@ class PodcastController extends BaseController
);
if (! ($cachedView = cache($cacheName))) {
$stats = (new EpisodeModel())->getPodcastStats($this->podcast->id);
$stats = new EpisodeModel()
->getPodcastStats($this->podcast->id);
set_podcast_metatags($this->podcast, 'about');
$data = [
@ -135,9 +136,8 @@ class PodcastController extends BaseController
return view('podcast/about', $data);
}
$secondsToNextUnpublishedEpisode = (new EpisodeModel())->getSecondsToNextUnpublishedEpisode(
$this->podcast->id,
);
$secondsToNextUnpublishedEpisode = new EpisodeModel()
->getSecondsToNextUnpublishedEpisode($this->podcast->id);
return view('podcast/about', $data, [
'cache' => $secondsToNextUnpublishedEpisode ?: DECADE,
@ -156,7 +156,8 @@ class PodcastController extends BaseController
$seasonQuery = $this->request->getGet('season');
if (! $yearQuery && ! $seasonQuery) {
$defaultQuery = (new PodcastModel())->getDefaultQuery($this->podcast->id);
$defaultQuery = new PodcastModel()
->getDefaultQuery($this->podcast->id);
if ($defaultQuery) {
if ($defaultQuery['type'] === 'season') {
$seasonQuery = $defaultQuery['data']['season_number'];
@ -241,21 +242,16 @@ class PodcastController extends BaseController
'podcast' => $this->podcast,
'episodesNav' => $episodesNavigation,
'activeQuery' => $activeQuery,
'episodes' => (new EpisodeModel())->getPodcastEpisodes(
$this->podcast->id,
$this->podcast->type,
$yearQuery,
$seasonQuery,
),
'episodes' => new EpisodeModel()
->getPodcastEpisodes($this->podcast->id, $this->podcast->type, $yearQuery, $seasonQuery),
];
if (auth()->loggedIn()) {
return view('podcast/episodes', $data);
}
$secondsToNextUnpublishedEpisode = (new EpisodeModel())->getSecondsToNextUnpublishedEpisode(
$this->podcast->id,
);
$secondsToNextUnpublishedEpisode = new EpisodeModel()
->getSecondsToNextUnpublishedEpisode($this->podcast->id);
return view('podcast/episodes', $data, [
'cache' => $secondsToNextUnpublishedEpisode ?: DECADE,
'cache_name' => $cacheName,
@ -291,7 +287,7 @@ class PodcastController extends BaseController
$orderedItems = [];
if ($paginatedEpisodes !== null) {
foreach ($paginatedEpisodes as $episode) {
$orderedItems[] = (new PodcastEpisode($episode))->toArray();
$orderedItems[] = new PodcastEpisode($episode)->toArray();
}
}

View File

@ -47,7 +47,7 @@ class PostController extends FediversePostController
{
if (
! ($podcast = (new PodcastModel())->getPodcastByHandle($params[0])) instanceof Podcast
! ($podcast = new PodcastModel()->getPodcastByHandle($params[0])) instanceof Podcast
) {
throw PageNotFoundException::forPageNotFound();
}
@ -62,7 +62,7 @@ class PostController extends FediversePostController
}
if (
! ($post = (new PostModel())->getPostById($params[1])) instanceof CastopodPost
! ($post = new PostModel()->getPostById($params[1])) instanceof CastopodPost
) {
throw PageNotFoundException::forPageNotFound();
}
@ -143,7 +143,7 @@ class PostController extends FediversePostController
if (
$episodeUri &&
($params = extract_params_from_episode_uri(new URI($episodeUri))) &&
($episode = (new EpisodeModel())->getEpisodeBySlug($params['podcastHandle'], $params['episodeSlug']))
($episode = new EpisodeModel()->getEpisodeBySlug($params['podcastHandle'], $params['episodeSlug']))
) {
$newPost->episode_id = $episode->id;
}
@ -216,7 +216,8 @@ class PostController extends FediversePostController
#[Override]
public function reblogAction(): RedirectResponse
{
(new PostModel())->toggleReblog(interact_as_actor(), $this->post);
new PostModel()
->toggleReblog(interact_as_actor(), $this->post);
return redirect()->back();
}

View File

@ -82,7 +82,7 @@ class WebmanifestController extends Controller
public function podcastManifest(string $podcastHandle): ResponseInterface
{
if (
! ($podcast = (new PodcastModel())->getPodcastByHandle($podcastHandle)) instanceof Podcast
! ($podcast = new PodcastModel()->getPodcastByHandle($podcastHandle)) instanceof Podcast
) {
throw PageNotFoundException::forPageNotFound();
}

View File

@ -22,7 +22,7 @@ class DevSuperadminSeeder extends Seeder
#[Override]
public function run(): void
{
if ((new UserModel())->where('is_owner', true)->first() instanceof User) {
if (new UserModel()->where('is_owner', true)->first() instanceof User) {
return;
}

View File

@ -43,13 +43,14 @@ class FakePodcastsAnalyticsSeeder extends Seeder
JSON_THROW_ON_ERROR,
);
$podcast = (new PodcastModel())->first();
$podcast = new PodcastModel()
->first();
if (! $podcast instanceof Podcast) {
throw new Exception("COULD NOT POPULATE DATABASE:\n\tCreate a podcast with episodes first.\n");
}
$firstEpisode = (new EpisodeModel())
$firstEpisode = new EpisodeModel()
->selectMin('published_at')
->first();
@ -69,7 +70,7 @@ class FakePodcastsAnalyticsSeeder extends Seeder
$analyticsPodcastsByPlayer = [];
$analyticsPodcastsByRegion = [];
$episodes = (new EpisodeModel())
$episodes = new EpisodeModel()
->where('podcast_id', $podcast->id)
->where('`published_at` <= UTC_TIMESTAMP()', null, false)
->findAll();

View File

@ -185,13 +185,14 @@ class FakeWebsiteAnalyticsSeeder extends Seeder
#[Override]
public function run(): void
{
$podcast = (new PodcastModel())->first();
$podcast = new PodcastModel()
->first();
if (! $podcast instanceof Podcast) {
throw new Exception("COULD NOT POPULATE DATABASE:\n\tCreate a podcast with episodes first.\n");
}
$firstEpisode = (new EpisodeModel())
$firstEpisode = new EpisodeModel()
->selectMin('published_at')
->first();
@ -208,7 +209,7 @@ class FakeWebsiteAnalyticsSeeder extends Seeder
$websiteByEntryPage = [];
$websiteByReferer = [];
$episodes = (new EpisodeModel())
$episodes = new EpisodeModel()
->where('podcast_id', $podcast->id)
->where('`published_at` <= UTC_TIMESTAMP()', null, false)
->findAll();

View File

@ -37,7 +37,8 @@ class Actor extends FediverseActor
}
if (! $this->podcast instanceof Podcast) {
$this->podcast = (new PodcastModel())->getPodcastByActorId($this->id);
$this->podcast = new PodcastModel()
->getPodcastByActorId($this->id);
}
return $this->podcast;

View File

@ -42,6 +42,7 @@ class Category extends Entity
return null;
}
return (new CategoryModel())->getCategoryById($this->parent_id);
return new CategoryModel()
->getCategoryById($this->parent_id);
}
}

View File

@ -110,18 +110,21 @@ class BaseClip extends Entity
public function getPodcast(): ?Podcast
{
return (new PodcastModel())->getPodcastById($this->podcast_id);
return new PodcastModel()
->getPodcastById($this->podcast_id);
}
public function getEpisode(): ?Episode
{
return (new EpisodeModel())->getEpisodeById($this->episode_id);
return new EpisodeModel()
->getEpisodeById($this->episode_id);
}
public function getUser(): ?User
{
/** @var ?User */
return (new UserModel())->find($this->created_by);
return new UserModel()
->find($this->created_by);
}
public function setMedia(File $file, string $fileKey): static
@ -131,7 +134,8 @@ class BaseClip extends Entity
->setFile($file);
$this->getMedia()
->updated_by = $this->attributes['updated_by'];
(new MediaModel('audio'))->updateMedia($this->getMedia());
new MediaModel('audio')
->updateMedia($this->getMedia());
} else {
$media = new Audio([
'file_key' => $fileKey,
@ -142,7 +146,7 @@ class BaseClip extends Entity
]);
$media->setFile($file);
$this->attributes['media_id'] = (new MediaModel())->saveMedia($media);
$this->attributes['media_id'] = new MediaModel()->saveMedia($media);
}
return $this;
@ -151,7 +155,8 @@ class BaseClip extends Entity
public function getMedia(): Audio | Video | null
{
if ($this->media_id !== null && $this->media === null) {
$this->media = (new MediaModel($this->type))->getMediaById($this->media_id);
$this->media = new MediaModel($this->type)
->getMediaById($this->media_id);
}
return $this->media;

View File

@ -81,7 +81,7 @@ class VideoClip extends BaseClip
]);
$video->setFile($file);
$this->attributes['media_id'] = (new MediaModel('video'))->saveMedia($video);
$this->attributes['media_id'] = new MediaModel('video')->saveMedia($video);
return $this;
}

View File

@ -60,7 +60,8 @@ class Credit extends Entity
}
if (! $this->person instanceof Person) {
$this->person = (new PersonModel())->getPersonById($this->person_id);
$this->person = new PersonModel()
->getPersonById($this->person_id);
}
return $this->person;
@ -73,7 +74,8 @@ class Credit extends Entity
}
if (! $this->podcast instanceof Podcast) {
$this->podcast = (new PodcastModel())->getPodcastById($this->podcast_id);
$this->podcast = new PodcastModel()
->getPodcastById($this->podcast_id);
}
return $this->podcast;
@ -86,7 +88,8 @@ class Credit extends Entity
}
if (! $this->episode instanceof Episode) {
$this->episode = (new EpisodeModel())->getPublishedEpisodeById($this->podcast_id, $this->episode_id);
$this->episode = new EpisodeModel()
->getPublishedEpisodeById($this->podcast_id, $this->episode_id);
}
return $this->episode;

View File

@ -213,7 +213,8 @@ class Episode extends Entity
->setFile($file);
$this->getCover()
->updated_by = $this->attributes['updated_by'];
(new MediaModel('image'))->updateMedia($this->getCover());
new MediaModel('image')
->updateMedia($this->getCover());
} else {
$cover = new Image([
'file_key' => 'podcasts/' . $this->getPodcast()->handle . '/' . $this->attributes['slug'] . '.' . $file->getExtension(),
@ -224,7 +225,7 @@ class Episode extends Entity
]);
$cover->setFile($file);
$this->attributes['cover_id'] = (new MediaModel('image'))->saveMedia($cover);
$this->attributes['cover_id'] = new MediaModel('image')->saveMedia($cover);
}
return $this;
@ -243,7 +244,8 @@ class Episode extends Entity
return $this->cover;
}
$this->cover = (new MediaModel('image'))->getMediaById($this->cover_id);
$this->cover = new MediaModel('image')
->getMediaById($this->cover_id);
return $this->cover;
}
@ -259,7 +261,8 @@ class Episode extends Entity
->setFile($file);
$this->getAudio()
->updated_by = $this->attributes['updated_by'];
(new MediaModel('audio'))->updateMedia($this->getAudio());
new MediaModel('audio')
->updateMedia($this->getAudio());
} else {
$audio = new Audio([
'file_key' => 'podcasts/' . $this->getPodcast()->handle . '/' . $file->getRandomName(),
@ -270,7 +273,7 @@ class Episode extends Entity
]);
$audio->setFile($file);
$this->attributes['audio_id'] = (new MediaModel())->saveMedia($audio);
$this->attributes['audio_id'] = new MediaModel()->saveMedia($audio);
}
return $this;
@ -279,7 +282,8 @@ class Episode extends Entity
public function getAudio(): Audio
{
if (! $this->audio instanceof Audio) {
$this->audio = (new MediaModel('audio'))->getMediaById($this->audio_id);
$this->audio = new MediaModel('audio')
->getMediaById($this->audio_id);
}
return $this->audio;
@ -296,7 +300,8 @@ class Episode extends Entity
->setFile($file);
$this->getTranscript()
->updated_by = $this->attributes['updated_by'];
(new MediaModel('transcript'))->updateMedia($this->getTranscript());
new MediaModel('transcript')
->updateMedia($this->getTranscript());
} else {
$transcript = new Transcript([
'file_key' => 'podcasts/' . $this->getPodcast()->handle . '/' . $this->attributes['slug'] . '-transcript.' . $file->getExtension(),
@ -307,7 +312,7 @@ class Episode extends Entity
]);
$transcript->setFile($file);
$this->attributes['transcript_id'] = (new MediaModel('transcript'))->saveMedia($transcript);
$this->attributes['transcript_id'] = new MediaModel('transcript')->saveMedia($transcript);
}
return $this;
@ -316,7 +321,8 @@ class Episode extends Entity
public function getTranscript(): ?Transcript
{
if ($this->transcript_id !== null && ! $this->transcript instanceof Transcript) {
$this->transcript = (new MediaModel('transcript'))->getMediaById($this->transcript_id);
$this->transcript = new MediaModel('transcript')
->getMediaById($this->transcript_id);
}
return $this->transcript;
@ -333,7 +339,8 @@ class Episode extends Entity
->setFile($file);
$this->getChapters()
->updated_by = $this->attributes['updated_by'];
(new MediaModel('chapters'))->updateMedia($this->getChapters());
new MediaModel('chapters')
->updateMedia($this->getChapters());
} else {
$chapters = new Chapters([
'file_key' => 'podcasts/' . $this->getPodcast()->handle . '/' . $this->attributes['slug'] . '-chapters' . '.' . $file->getExtension(),
@ -344,7 +351,7 @@ class Episode extends Entity
]);
$chapters->setFile($file);
$this->attributes['chapters_id'] = (new MediaModel('chapters'))->saveMedia($chapters);
$this->attributes['chapters_id'] = new MediaModel('chapters')->saveMedia($chapters);
}
return $this;
@ -353,7 +360,8 @@ class Episode extends Entity
public function getChapters(): ?Chapters
{
if ($this->chapters_id !== null && ! $this->chapters instanceof Chapters) {
$this->chapters = (new MediaModel('chapters'))->getMediaById($this->chapters_id);
$this->chapters = new MediaModel('chapters')
->getMediaById($this->chapters_id);
}
return $this->chapters;
@ -395,7 +403,8 @@ class Episode extends Entity
}
if ($this->persons === null) {
$this->persons = (new PersonModel())->getEpisodePersons($this->podcast_id, $this->id);
$this->persons = new PersonModel()
->getEpisodePersons($this->podcast_id, $this->id);
}
return $this->persons;
@ -413,7 +422,8 @@ class Episode extends Entity
}
if ($this->soundbites === null) {
$this->soundbites = (new ClipModel())->getEpisodeSoundbites($this->getPodcast()->id, $this->id);
$this->soundbites = new ClipModel()
->getEpisodeSoundbites($this->getPodcast()->id, $this->id);
}
return $this->soundbites;
@ -429,7 +439,8 @@ class Episode extends Entity
}
if ($this->posts === null) {
$this->posts = (new PostModel())->getEpisodePosts($this->id);
$this->posts = new PostModel()
->getEpisodePosts($this->id);
}
return $this->posts;
@ -445,7 +456,8 @@ class Episode extends Entity
}
if ($this->comments === null) {
$this->comments = (new EpisodeCommentModel())->getEpisodeComments($this->id);
$this->comments = new EpisodeCommentModel()
->getEpisodeComments($this->id);
}
return $this->comments;
@ -467,7 +479,8 @@ class Episode extends Entity
public function getPodcast(): ?Podcast
{
return (new PodcastModel())->getPodcastById($this->podcast_id);
return new PodcastModel()
->getPodcastById($this->podcast_id);
}
public function setDescriptionMarkdown(string $descriptionMarkdown): static
@ -563,7 +576,7 @@ class Episode extends Entity
{
if ($this->preview_id === null) {
// generate preview id
if (! $previewUUID = (new EpisodeModel())->setEpisodePreviewId($this->id)) {
if (! $previewUUID = new EpisodeModel()->setEpisodePreviewId($this->id)) {
throw new Exception('Could not set episode preview id');
}
@ -582,6 +595,7 @@ class Episode extends Entity
throw new RuntimeException('Episode must be created before getting number of video clips.');
}
return (new ClipModel())->getClipCount($this->podcast_id, $this->id);
return new ClipModel()
->getClipCount($this->podcast_id, $this->id);
}
}

View File

@ -80,7 +80,8 @@ class EpisodeComment extends UuidEntity
}
if (! $this->episode instanceof Episode) {
$this->episode = (new EpisodeModel())->getEpisodeById($this->episode_id);
$this->episode = new EpisodeModel()
->getEpisodeById($this->episode_id);
}
return $this->episode;
@ -113,7 +114,8 @@ class EpisodeComment extends UuidEntity
}
if ($this->replies === null) {
$this->replies = (new EpisodeCommentModel())->getCommentReplies($this->id);
$this->replies = new EpisodeCommentModel()
->getCommentReplies($this->id);
}
return $this->replies;

View File

@ -67,7 +67,8 @@ class Person extends Entity
->setFile($file);
$this->getAvatar()
->updated_by = $this->attributes['updated_by'];
(new MediaModel('image'))->updateMedia($this->getAvatar());
new MediaModel('image')
->updateMedia($this->getAvatar());
} else {
$avatar = new Image([
'file_key' => 'persons/' . $this->attributes['unique_name'] . '.' . $file->getExtension(),
@ -78,7 +79,7 @@ class Person extends Entity
]);
$avatar->setFile($file);
$this->attributes['avatar_id'] = (new MediaModel('image'))->saveMedia($avatar);
$this->attributes['avatar_id'] = new MediaModel('image')->saveMedia($avatar);
}
return $this;
@ -91,7 +92,8 @@ class Person extends Entity
}
if (! $this->avatar instanceof Image) {
$this->avatar = (new MediaModel('image'))->getMediaById($this->avatar_id);
$this->avatar = new MediaModel('image')
->getMediaById($this->avatar_id);
}
return $this->avatar;
@ -107,11 +109,12 @@ class Person extends Entity
}
if ($this->roles === null) {
$this->roles = (new PersonModel())->getPersonRoles(
$this->id,
(int) $this->attributes['podcast_id'],
array_key_exists('episode_id', $this->attributes) ? (int) $this->attributes['episode_id'] : null,
);
$this->roles = new PersonModel()
->getPersonRoles(
$this->id,
(int) $this->attributes['podcast_id'],
array_key_exists('episode_id', $this->attributes) ? (int) $this->attributes['episode_id'] : null,
);
}
return $this->roles;

View File

@ -226,7 +226,8 @@ class Podcast extends Entity
->setFile($file);
$this->getCover()
->updated_by = $this->attributes['updated_by'];
(new MediaModel('image'))->updateMedia($this->getCover());
new MediaModel('image')
->updateMedia($this->getCover());
} else {
$cover = new Image([
'file_key' => 'podcasts/' . $this->attributes['handle'] . '/cover.' . $file->getExtension(),
@ -237,7 +238,7 @@ class Podcast extends Entity
]);
$cover->setFile($file);
$this->attributes['cover_id'] = (new MediaModel('image'))->saveMedia($cover);
$this->attributes['cover_id'] = new MediaModel('image')->saveMedia($cover);
}
return $this;
@ -246,7 +247,8 @@ class Podcast extends Entity
public function getCover(): Image
{
if (! $this->cover instanceof Image) {
$cover = (new MediaModel('image'))->getMediaById($this->cover_id);
$cover = new MediaModel('image')
->getMediaById($this->cover_id);
if (! $cover instanceof Image) {
throw new Exception('Could not retrieve podcast cover.');
@ -269,7 +271,8 @@ class Podcast extends Entity
->setFile($file);
$this->getBanner()
->updated_by = $this->attributes['updated_by'];
(new MediaModel('image'))->updateMedia($this->getBanner());
new MediaModel('image')
->updateMedia($this->getBanner());
} else {
$banner = new Image([
'file_key' => 'podcasts/' . $this->attributes['handle'] . '/banner.' . $file->getExtension(),
@ -280,7 +283,7 @@ class Podcast extends Entity
]);
$banner->setFile($file);
$this->attributes['banner_id'] = (new MediaModel('image'))->saveMedia($banner);
$this->attributes['banner_id'] = new MediaModel('image')->saveMedia($banner);
}
return $this;
@ -293,7 +296,8 @@ class Podcast extends Entity
}
if (! $this->banner instanceof Image) {
$this->banner = (new MediaModel('image'))->getMediaById($this->banner_id);
$this->banner = new MediaModel('image')
->getMediaById($this->banner_id);
}
return $this->banner;
@ -321,7 +325,8 @@ class Podcast extends Entity
}
if ($this->episodes === null) {
$this->episodes = (new EpisodeModel())->getPodcastEpisodes($this->id, $this->type);
$this->episodes = new EpisodeModel()
->getPodcastEpisodes($this->id, $this->type);
}
return $this->episodes;
@ -336,7 +341,8 @@ class Podcast extends Entity
throw new RuntimeException('Podcast must be created before getting number of episodes.');
}
return (new EpisodeModel())->getPodcastEpisodesCount($this->id);
return new EpisodeModel()
->getPodcastEpisodesCount($this->id);
}
/**
@ -351,7 +357,8 @@ class Podcast extends Entity
}
if ($this->persons === null) {
$this->persons = (new PersonModel())->getPodcastPersons($this->id);
$this->persons = new PersonModel()
->getPodcastPersons($this->id);
}
return $this->persons;
@ -367,7 +374,8 @@ class Podcast extends Entity
}
if (! $this->category instanceof Category) {
$this->category = (new CategoryModel())->getCategoryById($this->category_id);
$this->category = new CategoryModel()
->getCategoryById($this->category_id);
}
return $this->category;
@ -385,7 +393,8 @@ class Podcast extends Entity
}
if ($this->subscriptions === null) {
$this->subscriptions = (new SubscriptionModel())->getPodcastSubscriptions($this->id);
$this->subscriptions = new SubscriptionModel()
->getPodcastSubscriptions($this->id);
}
return $this->subscriptions;
@ -403,7 +412,8 @@ class Podcast extends Entity
}
if ($this->contributors === null) {
$this->contributors = (new UserModel())->getPodcastContributors($this->id);
$this->contributors = new UserModel()
->getPodcastContributors($this->id);
}
return $this->contributors;
@ -468,7 +478,8 @@ class Podcast extends Entity
}
if ($this->podcasting_platforms === null) {
$this->podcasting_platforms = (new PlatformModel())->getPlatforms($this->id, 'podcasting');
$this->podcasting_platforms = new PlatformModel()
->getPlatforms($this->id, 'podcasting');
}
return $this->podcasting_platforms;
@ -486,7 +497,8 @@ class Podcast extends Entity
}
if ($this->social_platforms === null) {
$this->social_platforms = (new PlatformModel())->getPlatforms($this->id, 'social');
$this->social_platforms = new PlatformModel()
->getPlatforms($this->id, 'social');
}
return $this->social_platforms;
@ -504,7 +516,8 @@ class Podcast extends Entity
}
if ($this->funding_platforms === null) {
$this->funding_platforms = (new PlatformModel())->getPlatforms($this->id, 'funding');
$this->funding_platforms = new PlatformModel()
->getPlatforms($this->id, 'funding');
}
return $this->funding_platforms;
@ -520,7 +533,8 @@ class Podcast extends Entity
}
if ($this->other_categories === null) {
$this->other_categories = (new CategoryModel())->getPodcastCategories($this->id);
$this->other_categories = new CategoryModel()
->getPodcastCategories($this->id);
}
return $this->other_categories;
@ -581,6 +595,7 @@ class Podcast extends Entity
public function getIsPremium(): bool
{
// podcast is premium if at least one of its episodes is set as premium
return (new EpisodeModel())->doesPodcastHavePremiumEpisodes($this->id);
return new EpisodeModel()
->doesPodcastHavePremiumEpisodes($this->id);
}
}

View File

@ -50,7 +50,8 @@ class Post extends FediversePost
}
if (! $this->episode instanceof Episode) {
$this->episode = (new EpisodeModel())->getEpisodeById($this->episode_id);
$this->episode = new EpisodeModel()
->getEpisodeById($this->episode_id);
}
return $this->episode;

View File

@ -18,7 +18,8 @@ if (! function_exists('render_page_links')) {
*/
function render_page_links(?string $class = null, ?string $podcastHandle = null): string
{
$pages = (new PageModel())->findAll();
$pages = new PageModel()
->findAll();
$links = anchor(route_to('home'), lang('Common.home'), [
'class' => 'px-2 py-1 underline hover:no-underline',
]);

View File

@ -63,7 +63,7 @@ if (! function_exists('get_rss_feed')) {
}
// the last build date corresponds to the creation of the feed.xml cache
$channel->addChild('lastBuildDate', (new Time('now'))->format(DATE_RFC1123));
$channel->addChild('lastBuildDate', new Time('now')->format(DATE_RFC1123));
$channel->addChild('generator', 'Castopod - https://castopod.org/');
$channel->addChild('docs', 'https://cyber.harvard.edu/rss/rss.html');
@ -74,7 +74,8 @@ if (! function_exists('get_rss_feed')) {
$podcast->guid = $uuid->uuid5('ead4c236-bf58-58c6-a2c6-a6b28d128cb6', $podcast->feed_url)
->toString();
(new PodcastModel())->save($podcast);
new PodcastModel()
->save($podcast);
}
$channel->addChild('guid', $podcast->guid, RssFeed::PODCAST_NAMESPACE);

View File

@ -22,6 +22,7 @@ class Services extends BaseService
public static function components(bool $getShared = true): ComponentRenderer
{
if ($getShared) {
/** @phpstan-ignore return.type */
return self::getSharedInstance('components');
}

View File

@ -162,15 +162,11 @@ class ClipModel extends Model
return (int) $result[0]['id'];
}
public function deleteVideoClip(int $podcastId, int $episodeId, int $clipId): BaseResult | bool
public function deleteVideoClip(int $clipId): BaseResult | bool
{
$this->clearVideoClipCache($clipId);
return $this->delete([
'podcast_id' => $podcastId,
'episode_id' => $episodeId,
'id' => $clipId,
]);
return $this->delete($clipId);
}
public function getClipCount(int $podcastId, int $episodeId): int
@ -240,11 +236,7 @@ class ClipModel extends Model
{
$this->clearSoundbiteCache($podcastId, $episodeId, $clipId);
return $this->delete([
'podcast_id' => $podcastId,
'episode_id' => $episodeId,
'id' => $clipId,
]);
return $this->delete($clipId);
}
public function clearSoundbiteCache(int $podcastId, int $episodeId, int $clipId): void

View File

@ -86,11 +86,13 @@ class EpisodeCommentModel extends UuidModel
}
if ($comment->in_reply_to_id === null) {
(new EpisodeModel())->builder()
new EpisodeModel()
->builder()
->where('id', $comment->episode_id)
->increment('comments_count');
} else {
(new self())->builder()
new self()
->builder()
->where('id', service('uuid')->fromString($comment->in_reply_to_id)->getBytes())
->increment('replies_count');
}
@ -180,7 +182,8 @@ class EpisodeCommentModel extends UuidModel
->where('id', $comment->episode_id)
->decrement('comments_count');
} else {
(new self())->builder()
new self()
->builder()
->where('id', service('uuid')->fromString($comment->in_reply_to_id)->getBytes())
->decrement('replies_count');
}

View File

@ -368,13 +368,15 @@ class EpisodeModel extends UuidModel
public function resetCommentsCount(): int | false
{
$episodeCommentsCount = (new EpisodeCommentModel())->builder()
$episodeCommentsCount = new EpisodeCommentModel()
->builder()
->select('episode_id, COUNT(*) as `comments_count`')
->where('in_reply_to_id', null)
->groupBy('episode_id')
->getCompiledSelect();
$episodePostsRepliesCount = (new PostModel())->builder()
$episodePostsRepliesCount = new PostModel()
->builder()
->select('fediverse_posts.episode_id as episode_id, COUNT(*) as `comments_count`')
->join('fediverse_posts as fp', 'fediverse_posts.id = fp.in_reply_to_id')
->where('fediverse_posts.in_reply_to_id', null)
@ -390,7 +392,8 @@ class EpisodeModel extends UuidModel
$countsPerEpisodeId = $query->getResultArray();
if ($countsPerEpisodeId !== []) {
return (new self())->updateBatch($countsPerEpisodeId, 'id');
return new self()
->updateBatch($countsPerEpisodeId, 'id');
}
return 0;
@ -429,7 +432,8 @@ class EpisodeModel extends UuidModel
}
/** @var ?Episode $episode */
$episode = (new self())->find($episodeId);
$episode = new self()
->find($episodeId);
if (! $episode instanceof Episode) {
return $data;
@ -523,7 +527,8 @@ class EpisodeModel extends UuidModel
}
/** @var ?Episode $episode */
$episode = (new self())->find($episodeId);
$episode = new self()
->find($episodeId);
if (! $episode instanceof Episode) {
return $data;

View File

@ -56,7 +56,8 @@ class LikeModel extends UuidModel
'comment_id' => $comment->id,
]);
(new EpisodeCommentModel())->builder()
new EpisodeCommentModel()
->builder()
->where('id', service('uuid')->fromString($comment->id)->getBytes())
->increment('likes_count');
@ -91,7 +92,8 @@ class LikeModel extends UuidModel
{
$this->db->transStart();
(new EpisodeCommentModel())->builder()
new EpisodeCommentModel()
->builder()
->where('id', service('uuid') ->fromString($comment->id) ->getBytes())
->decrement('likes_count');

View File

@ -297,9 +297,10 @@ class PersonModel extends Model
cache()
->delete("podcast#{$podcastId}_persons");
(new PodcastModel())->clearCache([
'id' => $podcastId,
]);
new PodcastModel()
->clearCache([
'id' => $podcastId,
]);
$data = [];
foreach ($personIds as $personId) {
@ -339,9 +340,10 @@ class PersonModel extends Model
cache()->deleteMatching("podcast#{$podcastId}_person#{$personId}*");
cache()
->delete("podcast#{$podcastId}_persons");
(new PodcastModel())->clearCache([
'id' => $podcastId,
]);
new PodcastModel()
->clearCache([
'id' => $podcastId,
]);
return $this->db->table('podcasts_persons')
->delete([
@ -363,9 +365,10 @@ class PersonModel extends Model
if ($personIds !== []) {
cache()
->delete("podcast#{$podcastId}_episode#{$episodeId}_persons");
(new EpisodeModel())->clearCache([
'id' => $episodeId,
]);
new EpisodeModel()
->clearCache([
'id' => $episodeId,
]);
$data = [];
foreach ($personIds as $personId) {
@ -404,9 +407,10 @@ class PersonModel extends Model
cache()->deleteMatching("podcast#{$podcastId}_episode#{$episodeId}_person#{$personId}*");
cache()
->delete("podcast#{$podcastId}_episode#{$episodeId}_persons");
(new EpisodeModel())->clearCache([
'id' => $episodeId,
]);
new EpisodeModel()
->clearCache([
'id' => $episodeId,
]);
return $this->db->table('episodes_persons')
->delete([

View File

@ -309,7 +309,8 @@ class PodcastModel extends Model
];
}
$secondsToNextUnpublishedEpisode = (new EpisodeModel())->getSecondsToNextUnpublishedEpisode($podcastId);
$secondsToNextUnpublishedEpisode = new EpisodeModel()
->getSecondsToNextUnpublishedEpisode($podcastId);
cache()
->save($cacheName, $defaultQuery, $secondsToNextUnpublishedEpisode ?: DECADE);
@ -325,7 +326,8 @@ class PodcastModel extends Model
*/
public function clearCache(array $data): array
{
$podcast = (new self())->find((int) (is_array($data['id']) ? $data['id'][0] : $data['id']));
$podcast = new self()
->find((int) (is_array($data['id']) ? $data['id'][0] : $data['id']));
// delete cache for users' podcasts
cache()
@ -389,21 +391,22 @@ class PodcastModel extends Model
$domain =
$url->getHost() . ($url->getPort() ? ':' . $url->getPort() : '');
$actorId = (new ActorModel())->insert(
[
'uri' => url_to('podcast-activity', $username),
'username' => $username,
'domain' => $domain,
'private_key' => $privatekey,
'public_key' => $publickey,
'display_name' => $data['data']['title'],
'summary' => $data['data']['description_html'],
'inbox_url' => url_to('inbox', $username),
'outbox_url' => url_to('outbox', $username),
'followers_url' => url_to('followers', $username),
],
true,
);
$actorId = new ActorModel()
->insert(
[
'uri' => url_to('podcast-activity', $username),
'username' => $username,
'domain' => $domain,
'private_key' => $privatekey,
'public_key' => $publickey,
'display_name' => $data['data']['title'],
'summary' => $data['data']['description_html'],
'inbox_url' => url_to('inbox', $username),
'outbox_url' => url_to('outbox', $username),
'followers_url' => url_to('followers', $username),
],
true,
);
$data['data']['actor_id'] = $actorId;
@ -417,10 +420,12 @@ class PodcastModel extends Model
*/
protected function setActorAvatar(array $data): array
{
$podcast = (new self())->find((int) (is_array($data['id']) ? $data['id'][0] : $data['id']));
$podcast = new self()
->find((int) (is_array($data['id']) ? $data['id'][0] : $data['id']));
if ($podcast instanceof Podcast) {
$podcastActor = (new ActorModel())->find($podcast->actor_id);
$podcastActor = new ActorModel()
->find($podcast->actor_id);
if (! $podcastActor instanceof Actor) {
return $data;
@ -429,7 +434,8 @@ class PodcastModel extends Model
$podcastActor->avatar_image_url = $podcast->cover->federation_url;
$podcastActor->avatar_image_mimetype = $podcast->cover->federation_mimetype;
(new ActorModel())->update($podcast->actor_id, $podcastActor);
new ActorModel()
->update($podcast->actor_id, $podcastActor);
}
return $data;
@ -442,7 +448,8 @@ class PodcastModel extends Model
*/
protected function updatePodcastActor(array $data): array
{
$podcast = (new self())->find((int) (is_array($data['id']) ? $data['id'][0] : $data['id']));
$podcast = new self()
->find((int) (is_array($data['id']) ? $data['id'][0] : $data['id']));
if ($podcast instanceof Podcast) {
$actorModel = new ActorModel();

View File

@ -32,21 +32,21 @@ class Checkbox extends FormComponent
in_array($this->getValue(), ['yes', 'true', 'on', '1'], true),
);
$hint = $this->hint === '' ? '' : (new Hint([
$hint = $this->hint === '' ? '' : new Hint([
'class' => 'ml-1',
'slot' => $this->hint,
]))->render();
])->render();
$this->mergeClass('inline-flex items-start gap-x-2');
$helperText = '';
if ($this->helper !== '') {
$helperId = $this->name . 'Help';
$helperText = (new Helper([
$helperText = new Helper([
'id' => $helperId,
'slot' => $this->helper,
'class' => '-mt-1',
]))->render();
])->render();
$this->attributes['aria-describedby'] = $helperId;
}

View File

@ -44,10 +44,10 @@ class Field extends Component
$helperText = '';
if ($this->helper !== '') {
$helperId = $this->name . 'Help';
$helperText = (new Helper([
$helperText = new Helper([
'id' => $helperId,
'slot' => $this->helper,
]))->render();
])->render();
$this->attributes['aria-describedby'] = $helperId;
}

View File

@ -31,10 +31,10 @@ class Label extends Component
lang('Common.optional') .
')</small>' : '';
$hint = $this->hint === '' ? '' : (new Hint([
$hint = $this->hint === '' ? '' : new Hint([
'class' => 'ml-1',
'slot' => $this->hint,
]))->render();
])->render();
$this->attributes['for'] = $this->for;

View File

@ -41,23 +41,23 @@ class RadioGroup extends FormComponent
'isRequired' => var_export($this->isRequired, true),
];
$options .= (new RadioButton($radioButtonData))->render();
$options .= new RadioButton($radioButtonData)->render();
}
$helperText = '';
if ($this->helper !== '') {
$helperId = $this->name . 'Help';
$helperText = (new Helper([
$helperText = new Helper([
'id' => $helperId,
'slot' => $this->helper,
]))->render();
])->render();
$this->attributes['aria-describedby'] = $helperId;
}
$hint = $this->hint === '' ? '' : (new Hint([
$hint = $this->hint === '' ? '' : new Hint([
'class' => 'ml-1',
'slot' => $this->hint,
]))->render();
])->render();
return <<<HTML
<fieldset {$this->getStringifiedAttributes()}>

View File

@ -36,19 +36,19 @@ class Toggler extends FormComponent
in_array($this->getValue(), ['yes', 'true', 'on', '1'], true),
);
$hint = $this->hint === '' ? '' : (new Hint([
$hint = $this->hint === '' ? '' : new Hint([
'class' => 'ml-1',
'slot' => $this->hint,
]))->render();
])->render();
$helperText = '';
if ($this->helper !== '') {
$helperId = $this->name . 'Help';
$helperText = (new Helper([
$helperText = new Helper([
'id' => $helperId,
'slot' => $this->helper,
'class' => '-mt-1',
]))->render();
])->render();
$this->attributes['aria-describedby'] = $helperId;
}

View File

@ -3,7 +3,7 @@
--main-text-color: #555;
--dark-text-color: #222;
--light-text-color: #c7c7c7;
--brand-primary-color: #e06e3f;
--brand-primary-color: #dc4814;
--light-bg-color: #ededee;
--dark-bg-color: #404040;
}
@ -84,7 +84,7 @@ p.lead {
text-align: center;
padding: calc(4px + 0.2083vw);
width: 100%;
margin-top: -2.14rem;
top: 0;
position: fixed;
}

View File

@ -27,7 +27,7 @@ $errorId = uniqid('error', true);
<!-- Header -->
<div class="header">
<div class="environment">
Displayed at <?= esc(date('H:i:sa')) ?> &mdash;
Displayed at <?= esc(date('H:i:s')) ?> &mdash;
PHP: <?= esc(PHP_VERSION) ?> &mdash;
CodeIgniter: <?= esc(CodeIgniter::CI_VERSION) ?> --
Environment: <?= ENVIRONMENT ?>

View File

@ -9,38 +9,38 @@
"php": "^8.4",
"adaures/ipcat-php": "^v1.0.0",
"adaures/podcast-persons-taxonomy": "^v1.0.1",
"aws/aws-sdk-php": "^3.342.5",
"aws/aws-sdk-php": "^3.356.3",
"chrisjean/php-ico": "^1.0.4",
"cocur/slugify": "^v4.6.0",
"codeigniter4/framework": "v4.6.0",
"codeigniter4/framework": "4.6.3",
"codeigniter4/settings": "v2.2.0",
"codeigniter4/shield": "v1.1.0",
"codeigniter4/shield": "1.2.0",
"codeigniter4/tasks": "dev-develop",
"geoip2/geoip2": "v3.1.0",
"geoip2/geoip2": "3.2.0",
"james-heinrich/getid3": "^2.0.0-beta6",
"league/commonmark": "^2.6.1",
"league/commonmark": "^2.7.1",
"league/html-to-markdown": "5.1.1",
"melbahja/seo": "^v2.1.1",
"michalsn/codeigniter4-uuid": "v1.1.0",
"michalsn/codeigniter4-uuid": "1.3.0",
"mpratt/embera": "^2.0.42",
"opawg/user-agents-v2-php": "dev-main",
"phpseclib/phpseclib": "~2.0.48",
"vlucas/phpdotenv": "v5.6.1",
"vlucas/phpdotenv": "5.6.2",
"whichbrowser/parser": "^v2.1.8",
"yassinedoghri/codeigniter-vite": "^v1.1.0",
"yassinedoghri/php-icons": "^v1.2.0",
"yassinedoghri/php-icons": "1.3.0",
"yassinedoghri/podcast-feed": "dev-main"
},
"require-dev": {
"captainhook/captainhook": "^5.25.0",
"codeigniter/phpstan-codeigniter": "v1.5.3",
"captainhook/captainhook": "^5.25.11",
"codeigniter/phpstan-codeigniter": "1.5.4",
"mikey179/vfsstream": "^v1.6.12",
"phpstan/extension-installer": "^1.4.3",
"phpstan/phpstan": "^2.1.8",
"phpunit/phpunit": "^11.5.12",
"rector/rector": "^2.0.10",
"symplify/coding-standard": "^12.2.3",
"symplify/easy-coding-standard": "^12.5.8"
"phpstan/phpstan": "^2.1.22",
"phpunit/phpunit": "^12.3.6",
"rector/rector": "^2.1.4",
"symplify/coding-standard": "^12.4.3",
"symplify/easy-coding-standard": "^12.5.24"
},
"autoload": {
"psr-4": {

2756
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -82,7 +82,6 @@ want to generate Video Clips. The following extensions must be installed:
**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

View File

@ -12,26 +12,22 @@ improvements ⚡.
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

View File

@ -82,7 +82,6 @@ want to generate Video Clips. The following extensions must be installed:
**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

View File

@ -12,26 +12,22 @@ improvements ⚡.
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

View File

@ -82,7 +82,6 @@ want to generate Video Clips. The following extensions must be installed:
**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

View File

@ -12,26 +12,22 @@ d'errors 🐛 i millores de rendiment ⚡.
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

View File

@ -82,7 +82,6 @@ want to generate Video Clips. The following extensions must be installed:
**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

View File

@ -12,26 +12,22 @@ improvements ⚡.
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

View File

@ -86,7 +86,6 @@ nicht installiert: %s:
**Hinweis** - Wenn Sie diese Cron-Aufgabe nicht hinzufügen, funktionieren die
folgenden Castopod-Funktionen nicht:
- Einen Podcast aus einem vorhandenen RSS-Feed importieren
- Sende soziale Aktivitäten an deine Follower im Fediversum
- Übertragungen von Episoden zu open hubs mit

View File

@ -12,26 +12,22 @@ improvements ⚡.
0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
database.
- cf.
[Da li treba da napravim rezervnu kopiju pre ažuriranja?](#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.
[Gde mogu da pronađem moju verziju Castopod-a?](#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
- ⚠️ Uverite se da ste preuzeli Castopod paket a **NE** izvorni kod
- Note that you can also download the latest package from
[castopod.org](https://castopod.org/)
3. Na vašem serveru:
- Remove all files except `.env` and `public/media`
- Copy the new files from the downloaded package into your server

View File

@ -82,7 +82,6 @@ want to generate Video Clips. The following extensions must be installed:
**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

View File

@ -12,26 +12,22 @@ improvements ⚡.
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

View File

@ -82,7 +82,6 @@ want to generate Video Clips. The following extensions must be installed:
**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

View File

@ -12,26 +12,22 @@ improvements ⚡.
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

View File

@ -40,7 +40,6 @@ project generated for you!
2. add a manifest.json file
<FileTree>
- hello-world
- **manifest.json**
@ -51,7 +50,6 @@ project generated for you!
3. add the Plugin.php class
<FileTree>
- hello-world
- manifest.json
- **Plugin.php**

View File

@ -85,7 +85,6 @@ extensiones:
**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

View File

@ -12,26 +12,22 @@ de errores 🐛 y mejoras de rendimiento ⚡.
0. ⚠️ Antes de cualquier actualización, te recomendamos que respaldes tus
archivos de Castopod y base de datos.
- cf.
[¿Debería hacer una copia de seguridad antes de actualizar?](#should-i-make-a-backup-before-updating)
1. Vaya a la página de
[lanzamientos](https://code.castopod.org/adaures/castopod/-/releases) y vea
si su instancia está actualizada con la última versión de Castopod
- cf.
[¿Dónde puedo encontrar mi versión de Castopod?](#where-can-i-find-my-castopod-version)
2. Descargue el último paquete de lanzamiento llamado `Paquete Castopod`, puede
elegir entre los archivos `zip` o `tar.gz`
- ⚠️ Asegúrate de descargar el paquete de Castopod y **NO** el código fuente
- Ten en cuenta que también puedes descargar el último paquete de
[castopod.org](https://castopod.org/)
3. En tu servidor:
- Eliminar todos los archivos excepto `.env` y la carpeta `public/media`
- Copie los nuevos archivos del paquete descargado en su servidor

View File

@ -82,7 +82,6 @@ want to generate Video Clips. The following extensions must be installed:
**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

View File

@ -12,26 +12,22 @@ improvements ⚡.
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

View File

@ -82,7 +82,6 @@ want to generate Video Clips. The following extensions must be installed:
**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

View File

@ -12,26 +12,22 @@ improvements ⚡.
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

View File

@ -82,7 +82,6 @@ want to generate Video Clips. The following extensions must be installed:
**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

View File

@ -12,26 +12,22 @@ improvements ⚡.
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

View File

@ -87,7 +87,6 @@ installées :
**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

View File

@ -12,27 +12,23 @@ corrections de bugs 🐛 et des améliorations de performance ⚡.
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. Allez à la page
[des versions](https://code.castopod.org/adaures/castopod/-/releases) et
vérifiez si votre instance est à jour avec la dernière version de Castopod
- cf.
[Where can I find my Castopod version?](#where-can-i-find-my-castopod-version)
2. Téléchargez la dernière version du paquet nommé `Castopod Package`. Vous
pouvez choisir entre les archives au format `zip` ou `tar.gz`
- ⚠️ Assurez-vous de bien télécharger le paquet Castopod et **NON** le code
source
- Notez que vous pouvez également télécharger le dernier paquet depuis
[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

View File

@ -86,7 +86,6 @@ installées :
**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

View File

@ -12,26 +12,22 @@ corrections de bugs 🐛 et des améliorations de performance ⚡.
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

View File

@ -82,7 +82,6 @@ want to generate Video Clips. The following extensions must be installed:
**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

View File

@ -12,26 +12,22 @@ improvements ⚡.
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

View File

@ -82,7 +82,6 @@ want to generate Video Clips. The following extensions must be installed:
**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

View File

@ -12,26 +12,22 @@ improvements ⚡.
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

View File

@ -82,7 +82,6 @@ want to generate Video Clips. The following extensions must be installed:
**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

View File

@ -12,26 +12,22 @@ improvements ⚡.
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

View File

@ -82,7 +82,6 @@ want to generate Video Clips. The following extensions must be installed:
**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

View File

@ -12,26 +12,22 @@ improvements ⚡.
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

View File

@ -82,7 +82,6 @@ want to generate Video Clips. The following extensions must be installed:
**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

View File

@ -12,26 +12,22 @@ improvements ⚡.
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

View File

@ -82,7 +82,6 @@ want to generate Video Clips. The following extensions must be installed:
**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

View File

@ -12,26 +12,22 @@ improvements ⚡.
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

View File

@ -82,7 +82,6 @@ want to generate Video Clips. The following extensions must be installed:
**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

View File

@ -12,26 +12,22 @@ improvements ⚡.
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

View File

@ -82,7 +82,6 @@ want to generate Video Clips. The following extensions must be installed:
**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

View File

@ -12,26 +12,22 @@ improvements ⚡.
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

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