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

View File

@ -146,12 +146,10 @@ To see your changes, go to:
- `http://localhost:8080/` for the Castopod website - `http://localhost:8080/` for the Castopod website
- `http://localhost:8080/cp-admin` for the Castopod admin: - `http://localhost:8080/cp-admin` for the Castopod admin:
- email: **admin@castopod.local** - email: **admin@castopod.local**
- password: **castopod** - password: **castopod**
- `http://localhost:8888/` for the phpmyadmin interface: - `http://localhost:8888/` for the phpmyadmin interface:
- username: **castopod** - username: **castopod**
- password: **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: 3. (optional) Populate the database with test data:
- Populate with fake podcast analytics: - Populate with fake podcast analytics:
```bash ```bash

View File

@ -16,8 +16,6 @@ use CodeIgniter\Config\AutoloadConfig;
* *
* NOTE: If you use an identical key in $psr4 or $classmap, then * NOTE: If you use an identical key in $psr4 or $classmap, then
* the values in this file will overwrite the framework's values. * the values in this file will overwrite the framework's values.
*
* @immutable
*/ */
class Autoload extends AutoloadConfig 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 * Your file storage preferences can be specified below, if you are using
* the File driver. * the File driver.
* *
* @var array<string, string|int|null> * @var array{storePath?: string, mode?: int}
*/ */
public array $file = [ public array $file = [
'storePath' => WRITEPATH . 'cache/', 'storePath' => WRITEPATH . 'cache/',
@ -97,7 +97,7 @@ class Cache extends BaseConfig
* *
* @see https://codeigniter.com/user_guide/libraries/caching.html#memcached * @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 = [ public array $memcached = [
'host' => '127.0.0.1', 'host' => '127.0.0.1',
@ -113,7 +113,7 @@ class Cache extends BaseConfig
* Your Redis server can be specified below, if you are using * Your Redis server can be specified below, if you are using
* the Redis or Predis drivers. * 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 = [ public array $redis = [
'host' => '127.0.0.1', '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`) * (empty string) means default SameSite attribute set by browsers (`Lax`)
* will be set on cookies. If set to `None`, `$secure` must also be set. * 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'; public string $samesite = 'Lax';

View File

@ -4,9 +4,6 @@ declare(strict_types=1);
namespace Config; namespace Config;
/**
* @immutable
*/
class DocTypes 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. // Hot Reload route - for framework use on the hot reloader.
if (ENVIRONMENT === 'development') { if (ENVIRONMENT === 'development') {
service('routes')->get('__hot-reload', static function (): void { 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. * 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 = [ public array $globals = [
'before' => [ 'before' => [

View File

@ -6,6 +6,7 @@ namespace Config;
use CodeIgniter\Config\BaseConfig; use CodeIgniter\Config\BaseConfig;
use CodeIgniter\Log\Handlers\FileHandler; use CodeIgniter\Log\Handlers\FileHandler;
use CodeIgniter\Log\Handlers\HandlerInterface;
class Logger extends BaseConfig class Logger extends BaseConfig
{ {
@ -75,7 +76,7 @@ class Logger extends BaseConfig
* Handlers are executed in the order defined in this array, starting with * Handlers are executed in the order defined in this array, starting with
* the handler on top and continuing down. * 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 = [ 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 * When working with mime types, please make sure you have the ´fileinfo´ extension enabled to reliably detect the
* media types. * media types.
*
* @immutable
*/ */
class Mimes class Mimes
{ {
@ -281,7 +279,8 @@ class Mimes
'srt' => ['application/x-subrip', 'text/srt', 'text/plain', 'application/octet-stream'], 'srt' => ['application/x-subrip', 'text/srt', 'text/plain', 'application/octet-stream'],
'vtt' => ['text/vtt', 'text/plain'], 'vtt' => ['text/vtt', 'text/plain'],
'ico' => ['image/x-icon', 'image/x-ico', 'image/vnd.microsoft.icon'], '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, * NOTE: This class is required prior to Autoloader instantiation,
* and does not extend BaseConfig. * and does not extend BaseConfig.
*
* @immutable
*/ */
class Modules extends BaseModules class Modules extends BaseModules
{ {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -33,7 +33,8 @@ class FeedController extends Controller
public function index(string $podcastHandle): ResponseInterface public function index(string $podcastHandle): ResponseInterface
{ {
$podcast = (new PodcastModel())->where('handle', $podcastHandle) $podcast = new PodcastModel()
->where('handle', $podcastHandle)
->first(); ->first();
if (! $podcast instanceof Podcast) { if (! $podcast instanceof Podcast) {
throw PageNotFoundException::forPageNotFound(); throw PageNotFoundException::forPageNotFound();
@ -68,7 +69,8 @@ class FeedController extends Controller
$subscription = null; $subscription = null;
$token = $this->request->getGet('token'); $token = $this->request->getGet('token');
if ($token) { if ($token) {
$subscription = (new SubscriptionModel())->validateSubscription($podcastHandle, $token); $subscription = new SubscriptionModel()
->validateSubscription($podcastHandle, $token);
} }
$cacheName = implode( $cacheName = implode(
@ -85,9 +87,8 @@ class FeedController extends Controller
$found = get_rss_feed($podcast, $serviceSlug, $subscription, $token); $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 // 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( $secondsToNextUnpublishedEpisode = new EpisodeModel()
$podcast->id, ->getSecondsToNextUnpublishedEpisode($podcast->id);
);
cache() cache()
->save($cacheName, $found, $secondsToNextUnpublishedEpisode ?: DECADE); ->save($cacheName, $found, $secondsToNextUnpublishedEpisode ?: DECADE);

View File

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

View File

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

View File

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

View File

@ -35,7 +35,7 @@ class PodcastController extends BaseController
} }
if ( if (
! ($podcast = (new PodcastModel())->getPodcastByHandle($params[0])) instanceof Podcast ! ($podcast = new PodcastModel()->getPodcastByHandle($params[0])) instanceof Podcast
) { ) {
throw PageNotFoundException::forPageNotFound(); throw PageNotFoundException::forPageNotFound();
} }
@ -78,7 +78,8 @@ class PodcastController extends BaseController
set_podcast_metatags($this->podcast, 'activity'); set_podcast_metatags($this->podcast, 'activity');
$data = [ $data = [
'podcast' => $this->podcast, '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 // 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); return view('podcast/activity', $data);
} }
$secondsToNextUnpublishedEpisode = (new EpisodeModel())->getSecondsToNextUnpublishedEpisode( $secondsToNextUnpublishedEpisode = new EpisodeModel()
$this->podcast->id, ->getSecondsToNextUnpublishedEpisode($this->podcast->id);
);
return view('podcast/activity', $data, [ return view('podcast/activity', $data, [
'cache' => $secondsToNextUnpublishedEpisode ?: DECADE, 'cache' => $secondsToNextUnpublishedEpisode ?: DECADE,
@ -120,7 +120,8 @@ class PodcastController extends BaseController
); );
if (! ($cachedView = cache($cacheName))) { if (! ($cachedView = cache($cacheName))) {
$stats = (new EpisodeModel())->getPodcastStats($this->podcast->id); $stats = new EpisodeModel()
->getPodcastStats($this->podcast->id);
set_podcast_metatags($this->podcast, 'about'); set_podcast_metatags($this->podcast, 'about');
$data = [ $data = [
@ -135,9 +136,8 @@ class PodcastController extends BaseController
return view('podcast/about', $data); return view('podcast/about', $data);
} }
$secondsToNextUnpublishedEpisode = (new EpisodeModel())->getSecondsToNextUnpublishedEpisode( $secondsToNextUnpublishedEpisode = new EpisodeModel()
$this->podcast->id, ->getSecondsToNextUnpublishedEpisode($this->podcast->id);
);
return view('podcast/about', $data, [ return view('podcast/about', $data, [
'cache' => $secondsToNextUnpublishedEpisode ?: DECADE, 'cache' => $secondsToNextUnpublishedEpisode ?: DECADE,
@ -156,7 +156,8 @@ class PodcastController extends BaseController
$seasonQuery = $this->request->getGet('season'); $seasonQuery = $this->request->getGet('season');
if (! $yearQuery && ! $seasonQuery) { if (! $yearQuery && ! $seasonQuery) {
$defaultQuery = (new PodcastModel())->getDefaultQuery($this->podcast->id); $defaultQuery = new PodcastModel()
->getDefaultQuery($this->podcast->id);
if ($defaultQuery) { if ($defaultQuery) {
if ($defaultQuery['type'] === 'season') { if ($defaultQuery['type'] === 'season') {
$seasonQuery = $defaultQuery['data']['season_number']; $seasonQuery = $defaultQuery['data']['season_number'];
@ -241,21 +242,16 @@ class PodcastController extends BaseController
'podcast' => $this->podcast, 'podcast' => $this->podcast,
'episodesNav' => $episodesNavigation, 'episodesNav' => $episodesNavigation,
'activeQuery' => $activeQuery, 'activeQuery' => $activeQuery,
'episodes' => (new EpisodeModel())->getPodcastEpisodes( 'episodes' => new EpisodeModel()
$this->podcast->id, ->getPodcastEpisodes($this->podcast->id, $this->podcast->type, $yearQuery, $seasonQuery),
$this->podcast->type,
$yearQuery,
$seasonQuery,
),
]; ];
if (auth()->loggedIn()) { if (auth()->loggedIn()) {
return view('podcast/episodes', $data); return view('podcast/episodes', $data);
} }
$secondsToNextUnpublishedEpisode = (new EpisodeModel())->getSecondsToNextUnpublishedEpisode( $secondsToNextUnpublishedEpisode = new EpisodeModel()
$this->podcast->id, ->getSecondsToNextUnpublishedEpisode($this->podcast->id);
);
return view('podcast/episodes', $data, [ return view('podcast/episodes', $data, [
'cache' => $secondsToNextUnpublishedEpisode ?: DECADE, 'cache' => $secondsToNextUnpublishedEpisode ?: DECADE,
'cache_name' => $cacheName, 'cache_name' => $cacheName,
@ -291,7 +287,7 @@ class PodcastController extends BaseController
$orderedItems = []; $orderedItems = [];
if ($paginatedEpisodes !== null) { if ($paginatedEpisodes !== null) {
foreach ($paginatedEpisodes as $episode) { 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 ( if (
! ($podcast = (new PodcastModel())->getPodcastByHandle($params[0])) instanceof Podcast ! ($podcast = new PodcastModel()->getPodcastByHandle($params[0])) instanceof Podcast
) { ) {
throw PageNotFoundException::forPageNotFound(); throw PageNotFoundException::forPageNotFound();
} }
@ -62,7 +62,7 @@ class PostController extends FediversePostController
} }
if ( if (
! ($post = (new PostModel())->getPostById($params[1])) instanceof CastopodPost ! ($post = new PostModel()->getPostById($params[1])) instanceof CastopodPost
) { ) {
throw PageNotFoundException::forPageNotFound(); throw PageNotFoundException::forPageNotFound();
} }
@ -143,7 +143,7 @@ class PostController extends FediversePostController
if ( if (
$episodeUri && $episodeUri &&
($params = extract_params_from_episode_uri(new URI($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; $newPost->episode_id = $episode->id;
} }
@ -216,7 +216,8 @@ class PostController extends FediversePostController
#[Override] #[Override]
public function reblogAction(): RedirectResponse public function reblogAction(): RedirectResponse
{ {
(new PostModel())->toggleReblog(interact_as_actor(), $this->post); new PostModel()
->toggleReblog(interact_as_actor(), $this->post);
return redirect()->back(); return redirect()->back();
} }

View File

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

View File

@ -22,7 +22,7 @@ class DevSuperadminSeeder extends Seeder
#[Override] #[Override]
public function run(): void 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; return;
} }

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -213,7 +213,8 @@ class Episode extends Entity
->setFile($file); ->setFile($file);
$this->getCover() $this->getCover()
->updated_by = $this->attributes['updated_by']; ->updated_by = $this->attributes['updated_by'];
(new MediaModel('image'))->updateMedia($this->getCover()); new MediaModel('image')
->updateMedia($this->getCover());
} else { } else {
$cover = new Image([ $cover = new Image([
'file_key' => 'podcasts/' . $this->getPodcast()->handle . '/' . $this->attributes['slug'] . '.' . $file->getExtension(), 'file_key' => 'podcasts/' . $this->getPodcast()->handle . '/' . $this->attributes['slug'] . '.' . $file->getExtension(),
@ -224,7 +225,7 @@ class Episode extends Entity
]); ]);
$cover->setFile($file); $cover->setFile($file);
$this->attributes['cover_id'] = (new MediaModel('image'))->saveMedia($cover); $this->attributes['cover_id'] = new MediaModel('image')->saveMedia($cover);
} }
return $this; return $this;
@ -243,7 +244,8 @@ class Episode extends Entity
return $this->cover; return $this->cover;
} }
$this->cover = (new MediaModel('image'))->getMediaById($this->cover_id); $this->cover = new MediaModel('image')
->getMediaById($this->cover_id);
return $this->cover; return $this->cover;
} }
@ -259,7 +261,8 @@ class Episode extends Entity
->setFile($file); ->setFile($file);
$this->getAudio() $this->getAudio()
->updated_by = $this->attributes['updated_by']; ->updated_by = $this->attributes['updated_by'];
(new MediaModel('audio'))->updateMedia($this->getAudio()); new MediaModel('audio')
->updateMedia($this->getAudio());
} else { } else {
$audio = new Audio([ $audio = new Audio([
'file_key' => 'podcasts/' . $this->getPodcast()->handle . '/' . $file->getRandomName(), 'file_key' => 'podcasts/' . $this->getPodcast()->handle . '/' . $file->getRandomName(),
@ -270,7 +273,7 @@ class Episode extends Entity
]); ]);
$audio->setFile($file); $audio->setFile($file);
$this->attributes['audio_id'] = (new MediaModel())->saveMedia($audio); $this->attributes['audio_id'] = new MediaModel()->saveMedia($audio);
} }
return $this; return $this;
@ -279,7 +282,8 @@ class Episode extends Entity
public function getAudio(): Audio public function getAudio(): Audio
{ {
if (! $this->audio instanceof 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; return $this->audio;
@ -296,7 +300,8 @@ class Episode extends Entity
->setFile($file); ->setFile($file);
$this->getTranscript() $this->getTranscript()
->updated_by = $this->attributes['updated_by']; ->updated_by = $this->attributes['updated_by'];
(new MediaModel('transcript'))->updateMedia($this->getTranscript()); new MediaModel('transcript')
->updateMedia($this->getTranscript());
} else { } else {
$transcript = new Transcript([ $transcript = new Transcript([
'file_key' => 'podcasts/' . $this->getPodcast()->handle . '/' . $this->attributes['slug'] . '-transcript.' . $file->getExtension(), 'file_key' => 'podcasts/' . $this->getPodcast()->handle . '/' . $this->attributes['slug'] . '-transcript.' . $file->getExtension(),
@ -307,7 +312,7 @@ class Episode extends Entity
]); ]);
$transcript->setFile($file); $transcript->setFile($file);
$this->attributes['transcript_id'] = (new MediaModel('transcript'))->saveMedia($transcript); $this->attributes['transcript_id'] = new MediaModel('transcript')->saveMedia($transcript);
} }
return $this; return $this;
@ -316,7 +321,8 @@ class Episode extends Entity
public function getTranscript(): ?Transcript public function getTranscript(): ?Transcript
{ {
if ($this->transcript_id !== null && ! $this->transcript instanceof 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; return $this->transcript;
@ -333,7 +339,8 @@ class Episode extends Entity
->setFile($file); ->setFile($file);
$this->getChapters() $this->getChapters()
->updated_by = $this->attributes['updated_by']; ->updated_by = $this->attributes['updated_by'];
(new MediaModel('chapters'))->updateMedia($this->getChapters()); new MediaModel('chapters')
->updateMedia($this->getChapters());
} else { } else {
$chapters = new Chapters([ $chapters = new Chapters([
'file_key' => 'podcasts/' . $this->getPodcast()->handle . '/' . $this->attributes['slug'] . '-chapters' . '.' . $file->getExtension(), 'file_key' => 'podcasts/' . $this->getPodcast()->handle . '/' . $this->attributes['slug'] . '-chapters' . '.' . $file->getExtension(),
@ -344,7 +351,7 @@ class Episode extends Entity
]); ]);
$chapters->setFile($file); $chapters->setFile($file);
$this->attributes['chapters_id'] = (new MediaModel('chapters'))->saveMedia($chapters); $this->attributes['chapters_id'] = new MediaModel('chapters')->saveMedia($chapters);
} }
return $this; return $this;
@ -353,7 +360,8 @@ class Episode extends Entity
public function getChapters(): ?Chapters public function getChapters(): ?Chapters
{ {
if ($this->chapters_id !== null && ! $this->chapters instanceof 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; return $this->chapters;
@ -395,7 +403,8 @@ class Episode extends Entity
} }
if ($this->persons === null) { 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; return $this->persons;
@ -413,7 +422,8 @@ class Episode extends Entity
} }
if ($this->soundbites === null) { 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; return $this->soundbites;
@ -429,7 +439,8 @@ class Episode extends Entity
} }
if ($this->posts === null) { if ($this->posts === null) {
$this->posts = (new PostModel())->getEpisodePosts($this->id); $this->posts = new PostModel()
->getEpisodePosts($this->id);
} }
return $this->posts; return $this->posts;
@ -445,7 +456,8 @@ class Episode extends Entity
} }
if ($this->comments === null) { if ($this->comments === null) {
$this->comments = (new EpisodeCommentModel())->getEpisodeComments($this->id); $this->comments = new EpisodeCommentModel()
->getEpisodeComments($this->id);
} }
return $this->comments; return $this->comments;
@ -467,7 +479,8 @@ class Episode extends Entity
public function getPodcast(): ?Podcast public function getPodcast(): ?Podcast
{ {
return (new PodcastModel())->getPodcastById($this->podcast_id); return new PodcastModel()
->getPodcastById($this->podcast_id);
} }
public function setDescriptionMarkdown(string $descriptionMarkdown): static public function setDescriptionMarkdown(string $descriptionMarkdown): static
@ -563,7 +576,7 @@ class Episode extends Entity
{ {
if ($this->preview_id === null) { if ($this->preview_id === null) {
// generate preview id // 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'); 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.'); 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) { if (! $this->episode instanceof Episode) {
$this->episode = (new EpisodeModel())->getEpisodeById($this->episode_id); $this->episode = new EpisodeModel()
->getEpisodeById($this->episode_id);
} }
return $this->episode; return $this->episode;
@ -113,7 +114,8 @@ class EpisodeComment extends UuidEntity
} }
if ($this->replies === null) { if ($this->replies === null) {
$this->replies = (new EpisodeCommentModel())->getCommentReplies($this->id); $this->replies = new EpisodeCommentModel()
->getCommentReplies($this->id);
} }
return $this->replies; return $this->replies;

View File

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

View File

@ -226,7 +226,8 @@ class Podcast extends Entity
->setFile($file); ->setFile($file);
$this->getCover() $this->getCover()
->updated_by = $this->attributes['updated_by']; ->updated_by = $this->attributes['updated_by'];
(new MediaModel('image'))->updateMedia($this->getCover()); new MediaModel('image')
->updateMedia($this->getCover());
} else { } else {
$cover = new Image([ $cover = new Image([
'file_key' => 'podcasts/' . $this->attributes['handle'] . '/cover.' . $file->getExtension(), 'file_key' => 'podcasts/' . $this->attributes['handle'] . '/cover.' . $file->getExtension(),
@ -237,7 +238,7 @@ class Podcast extends Entity
]); ]);
$cover->setFile($file); $cover->setFile($file);
$this->attributes['cover_id'] = (new MediaModel('image'))->saveMedia($cover); $this->attributes['cover_id'] = new MediaModel('image')->saveMedia($cover);
} }
return $this; return $this;
@ -246,7 +247,8 @@ class Podcast extends Entity
public function getCover(): Image public function getCover(): Image
{ {
if (! $this->cover instanceof 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) { if (! $cover instanceof Image) {
throw new Exception('Could not retrieve podcast cover.'); throw new Exception('Could not retrieve podcast cover.');
@ -269,7 +271,8 @@ class Podcast extends Entity
->setFile($file); ->setFile($file);
$this->getBanner() $this->getBanner()
->updated_by = $this->attributes['updated_by']; ->updated_by = $this->attributes['updated_by'];
(new MediaModel('image'))->updateMedia($this->getBanner()); new MediaModel('image')
->updateMedia($this->getBanner());
} else { } else {
$banner = new Image([ $banner = new Image([
'file_key' => 'podcasts/' . $this->attributes['handle'] . '/banner.' . $file->getExtension(), 'file_key' => 'podcasts/' . $this->attributes['handle'] . '/banner.' . $file->getExtension(),
@ -280,7 +283,7 @@ class Podcast extends Entity
]); ]);
$banner->setFile($file); $banner->setFile($file);
$this->attributes['banner_id'] = (new MediaModel('image'))->saveMedia($banner); $this->attributes['banner_id'] = new MediaModel('image')->saveMedia($banner);
} }
return $this; return $this;
@ -293,7 +296,8 @@ class Podcast extends Entity
} }
if (! $this->banner instanceof Image) { 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; return $this->banner;
@ -321,7 +325,8 @@ class Podcast extends Entity
} }
if ($this->episodes === null) { 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; return $this->episodes;
@ -336,7 +341,8 @@ class Podcast extends Entity
throw new RuntimeException('Podcast must be created before getting number of episodes.'); 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) { if ($this->persons === null) {
$this->persons = (new PersonModel())->getPodcastPersons($this->id); $this->persons = new PersonModel()
->getPodcastPersons($this->id);
} }
return $this->persons; return $this->persons;
@ -367,7 +374,8 @@ class Podcast extends Entity
} }
if (! $this->category instanceof Category) { if (! $this->category instanceof Category) {
$this->category = (new CategoryModel())->getCategoryById($this->category_id); $this->category = new CategoryModel()
->getCategoryById($this->category_id);
} }
return $this->category; return $this->category;
@ -385,7 +393,8 @@ class Podcast extends Entity
} }
if ($this->subscriptions === null) { if ($this->subscriptions === null) {
$this->subscriptions = (new SubscriptionModel())->getPodcastSubscriptions($this->id); $this->subscriptions = new SubscriptionModel()
->getPodcastSubscriptions($this->id);
} }
return $this->subscriptions; return $this->subscriptions;
@ -403,7 +412,8 @@ class Podcast extends Entity
} }
if ($this->contributors === null) { if ($this->contributors === null) {
$this->contributors = (new UserModel())->getPodcastContributors($this->id); $this->contributors = new UserModel()
->getPodcastContributors($this->id);
} }
return $this->contributors; return $this->contributors;
@ -468,7 +478,8 @@ class Podcast extends Entity
} }
if ($this->podcasting_platforms === null) { 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; return $this->podcasting_platforms;
@ -486,7 +497,8 @@ class Podcast extends Entity
} }
if ($this->social_platforms === null) { 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; return $this->social_platforms;
@ -504,7 +516,8 @@ class Podcast extends Entity
} }
if ($this->funding_platforms === null) { 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; return $this->funding_platforms;
@ -520,7 +533,8 @@ class Podcast extends Entity
} }
if ($this->other_categories === null) { 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; return $this->other_categories;
@ -581,6 +595,7 @@ class Podcast extends Entity
public function getIsPremium(): bool public function getIsPremium(): bool
{ {
// podcast is premium if at least one of its episodes is set as premium // 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) { if (! $this->episode instanceof Episode) {
$this->episode = (new EpisodeModel())->getEpisodeById($this->episode_id); $this->episode = new EpisodeModel()
->getEpisodeById($this->episode_id);
} }
return $this->episode; 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 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'), [ $links = anchor(route_to('home'), lang('Common.home'), [
'class' => 'px-2 py-1 underline hover:no-underline', '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 // 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('generator', 'Castopod - https://castopod.org/');
$channel->addChild('docs', 'https://cyber.harvard.edu/rss/rss.html'); $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) $podcast->guid = $uuid->uuid5('ead4c236-bf58-58c6-a2c6-a6b28d128cb6', $podcast->feed_url)
->toString(); ->toString();
(new PodcastModel())->save($podcast); new PodcastModel()
->save($podcast);
} }
$channel->addChild('guid', $podcast->guid, RssFeed::PODCAST_NAMESPACE); $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 public static function components(bool $getShared = true): ComponentRenderer
{ {
if ($getShared) { if ($getShared) {
/** @phpstan-ignore return.type */
return self::getSharedInstance('components'); return self::getSharedInstance('components');
} }

View File

@ -162,15 +162,11 @@ class ClipModel extends Model
return (int) $result[0]['id']; 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); $this->clearVideoClipCache($clipId);
return $this->delete([ return $this->delete($clipId);
'podcast_id' => $podcastId,
'episode_id' => $episodeId,
'id' => $clipId,
]);
} }
public function getClipCount(int $podcastId, int $episodeId): int public function getClipCount(int $podcastId, int $episodeId): int
@ -240,11 +236,7 @@ class ClipModel extends Model
{ {
$this->clearSoundbiteCache($podcastId, $episodeId, $clipId); $this->clearSoundbiteCache($podcastId, $episodeId, $clipId);
return $this->delete([ return $this->delete($clipId);
'podcast_id' => $podcastId,
'episode_id' => $episodeId,
'id' => $clipId,
]);
} }
public function clearSoundbiteCache(int $podcastId, int $episodeId, int $clipId): void 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) { if ($comment->in_reply_to_id === null) {
(new EpisodeModel())->builder() new EpisodeModel()
->builder()
->where('id', $comment->episode_id) ->where('id', $comment->episode_id)
->increment('comments_count'); ->increment('comments_count');
} else { } else {
(new self())->builder() new self()
->builder()
->where('id', service('uuid')->fromString($comment->in_reply_to_id)->getBytes()) ->where('id', service('uuid')->fromString($comment->in_reply_to_id)->getBytes())
->increment('replies_count'); ->increment('replies_count');
} }
@ -180,7 +182,8 @@ class EpisodeCommentModel extends UuidModel
->where('id', $comment->episode_id) ->where('id', $comment->episode_id)
->decrement('comments_count'); ->decrement('comments_count');
} else { } else {
(new self())->builder() new self()
->builder()
->where('id', service('uuid')->fromString($comment->in_reply_to_id)->getBytes()) ->where('id', service('uuid')->fromString($comment->in_reply_to_id)->getBytes())
->decrement('replies_count'); ->decrement('replies_count');
} }

View File

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

View File

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

View File

@ -297,7 +297,8 @@ class PersonModel extends Model
cache() cache()
->delete("podcast#{$podcastId}_persons"); ->delete("podcast#{$podcastId}_persons");
(new PodcastModel())->clearCache([ new PodcastModel()
->clearCache([
'id' => $podcastId, 'id' => $podcastId,
]); ]);
@ -339,7 +340,8 @@ class PersonModel extends Model
cache()->deleteMatching("podcast#{$podcastId}_person#{$personId}*"); cache()->deleteMatching("podcast#{$podcastId}_person#{$personId}*");
cache() cache()
->delete("podcast#{$podcastId}_persons"); ->delete("podcast#{$podcastId}_persons");
(new PodcastModel())->clearCache([ new PodcastModel()
->clearCache([
'id' => $podcastId, 'id' => $podcastId,
]); ]);
@ -363,7 +365,8 @@ class PersonModel extends Model
if ($personIds !== []) { if ($personIds !== []) {
cache() cache()
->delete("podcast#{$podcastId}_episode#{$episodeId}_persons"); ->delete("podcast#{$podcastId}_episode#{$episodeId}_persons");
(new EpisodeModel())->clearCache([ new EpisodeModel()
->clearCache([
'id' => $episodeId, 'id' => $episodeId,
]); ]);
@ -404,7 +407,8 @@ class PersonModel extends Model
cache()->deleteMatching("podcast#{$podcastId}_episode#{$episodeId}_person#{$personId}*"); cache()->deleteMatching("podcast#{$podcastId}_episode#{$episodeId}_person#{$personId}*");
cache() cache()
->delete("podcast#{$podcastId}_episode#{$episodeId}_persons"); ->delete("podcast#{$podcastId}_episode#{$episodeId}_persons");
(new EpisodeModel())->clearCache([ new EpisodeModel()
->clearCache([
'id' => $episodeId, 'id' => $episodeId,
]); ]);

View File

@ -309,7 +309,8 @@ class PodcastModel extends Model
]; ];
} }
$secondsToNextUnpublishedEpisode = (new EpisodeModel())->getSecondsToNextUnpublishedEpisode($podcastId); $secondsToNextUnpublishedEpisode = new EpisodeModel()
->getSecondsToNextUnpublishedEpisode($podcastId);
cache() cache()
->save($cacheName, $defaultQuery, $secondsToNextUnpublishedEpisode ?: DECADE); ->save($cacheName, $defaultQuery, $secondsToNextUnpublishedEpisode ?: DECADE);
@ -325,7 +326,8 @@ class PodcastModel extends Model
*/ */
public function clearCache(array $data): array 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 // delete cache for users' podcasts
cache() cache()
@ -389,7 +391,8 @@ class PodcastModel extends Model
$domain = $domain =
$url->getHost() . ($url->getPort() ? ':' . $url->getPort() : ''); $url->getHost() . ($url->getPort() ? ':' . $url->getPort() : '');
$actorId = (new ActorModel())->insert( $actorId = new ActorModel()
->insert(
[ [
'uri' => url_to('podcast-activity', $username), 'uri' => url_to('podcast-activity', $username),
'username' => $username, 'username' => $username,
@ -417,10 +420,12 @@ class PodcastModel extends Model
*/ */
protected function setActorAvatar(array $data): array 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) { if ($podcast instanceof Podcast) {
$podcastActor = (new ActorModel())->find($podcast->actor_id); $podcastActor = new ActorModel()
->find($podcast->actor_id);
if (! $podcastActor instanceof Actor) { if (! $podcastActor instanceof Actor) {
return $data; return $data;
@ -429,7 +434,8 @@ class PodcastModel extends Model
$podcastActor->avatar_image_url = $podcast->cover->federation_url; $podcastActor->avatar_image_url = $podcast->cover->federation_url;
$podcastActor->avatar_image_mimetype = $podcast->cover->federation_mimetype; $podcastActor->avatar_image_mimetype = $podcast->cover->federation_mimetype;
(new ActorModel())->update($podcast->actor_id, $podcastActor); new ActorModel()
->update($podcast->actor_id, $podcastActor);
} }
return $data; return $data;
@ -442,7 +448,8 @@ class PodcastModel extends Model
*/ */
protected function updatePodcastActor(array $data): array 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) { if ($podcast instanceof Podcast) {
$actorModel = new ActorModel(); $actorModel = new ActorModel();

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -9,38 +9,38 @@
"php": "^8.4", "php": "^8.4",
"adaures/ipcat-php": "^v1.0.0", "adaures/ipcat-php": "^v1.0.0",
"adaures/podcast-persons-taxonomy": "^v1.0.1", "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", "chrisjean/php-ico": "^1.0.4",
"cocur/slugify": "^v4.6.0", "cocur/slugify": "^v4.6.0",
"codeigniter4/framework": "v4.6.0", "codeigniter4/framework": "4.6.3",
"codeigniter4/settings": "v2.2.0", "codeigniter4/settings": "v2.2.0",
"codeigniter4/shield": "v1.1.0", "codeigniter4/shield": "1.2.0",
"codeigniter4/tasks": "dev-develop", "codeigniter4/tasks": "dev-develop",
"geoip2/geoip2": "v3.1.0", "geoip2/geoip2": "3.2.0",
"james-heinrich/getid3": "^2.0.0-beta6", "james-heinrich/getid3": "^2.0.0-beta6",
"league/commonmark": "^2.6.1", "league/commonmark": "^2.7.1",
"league/html-to-markdown": "5.1.1", "league/html-to-markdown": "5.1.1",
"melbahja/seo": "^v2.1.1", "melbahja/seo": "^v2.1.1",
"michalsn/codeigniter4-uuid": "v1.1.0", "michalsn/codeigniter4-uuid": "1.3.0",
"mpratt/embera": "^2.0.42", "mpratt/embera": "^2.0.42",
"opawg/user-agents-v2-php": "dev-main", "opawg/user-agents-v2-php": "dev-main",
"phpseclib/phpseclib": "~2.0.48", "phpseclib/phpseclib": "~2.0.48",
"vlucas/phpdotenv": "v5.6.1", "vlucas/phpdotenv": "5.6.2",
"whichbrowser/parser": "^v2.1.8", "whichbrowser/parser": "^v2.1.8",
"yassinedoghri/codeigniter-vite": "^v1.1.0", "yassinedoghri/codeigniter-vite": "^v1.1.0",
"yassinedoghri/php-icons": "^v1.2.0", "yassinedoghri/php-icons": "1.3.0",
"yassinedoghri/podcast-feed": "dev-main" "yassinedoghri/podcast-feed": "dev-main"
}, },
"require-dev": { "require-dev": {
"captainhook/captainhook": "^5.25.0", "captainhook/captainhook": "^5.25.11",
"codeigniter/phpstan-codeigniter": "v1.5.3", "codeigniter/phpstan-codeigniter": "1.5.4",
"mikey179/vfsstream": "^v1.6.12", "mikey179/vfsstream": "^v1.6.12",
"phpstan/extension-installer": "^1.4.3", "phpstan/extension-installer": "^1.4.3",
"phpstan/phpstan": "^2.1.8", "phpstan/phpstan": "^2.1.22",
"phpunit/phpunit": "^11.5.12", "phpunit/phpunit": "^12.3.6",
"rector/rector": "^2.0.10", "rector/rector": "^2.1.4",
"symplify/coding-standard": "^12.2.3", "symplify/coding-standard": "^12.4.3",
"symplify/easy-coding-standard": "^12.5.8" "symplify/easy-coding-standard": "^12.5.24"
}, },
"autoload": { "autoload": {
"psr-4": { "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 **Note** - If you do not add this cron task, the following Castopod features
will not work: will not work:
- Importing a podcast from an existing RSS feed - Importing a podcast from an existing RSS feed
- Broadcasting social activities to your followers in the fediverse - Broadcasting social activities to your followers in the fediverse
- Broadcasting episodes to open hubs using - 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 0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
database. database.
- cf. - cf.
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating) [Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
1. Go to the 1. Go to the
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and [releases page](https://code.castopod.org/adaures/castopod/-/releases) and
see if your instance is up to date with the latest Castopod version see if your instance is up to date with the latest Castopod version
- cf. - cf.
[Where can I find my Castopod version?](#where-can-i-find-my-castopod-version) [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 2. Download the latest release package named `Castopod Package`, you may choose
between the `zip` or `tar.gz` archives between the `zip` or `tar.gz` archives
- ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
- Note that you can also download the latest package from - Note that you can also download the latest package from
[castopod.org](https://castopod.org/) [castopod.org](https://castopod.org/)
3. On your server: 3. On your server:
- Remove all files except `.env` and `public/media` - Remove all files except `.env` and `public/media`
- Copy the new files from the downloaded package into your server - 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 **Note** - If you do not add this cron task, the following Castopod features
will not work: will not work:
- Importing a podcast from an existing RSS feed - Importing a podcast from an existing RSS feed
- Broadcasting social activities to your followers in the fediverse - Broadcasting social activities to your followers in the fediverse
- Broadcasting episodes to open hubs using - 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 0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
database. database.
- cf. - cf.
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating) [Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
1. Go to the 1. Go to the
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and [releases page](https://code.castopod.org/adaures/castopod/-/releases) and
see if your instance is up to date with the latest Castopod version see if your instance is up to date with the latest Castopod version
- cf. - cf.
[Where can I find my Castopod version?](#where-can-i-find-my-castopod-version) [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 2. Download the latest release package named `Castopod Package`, you may choose
between the `zip` or `tar.gz` archives between the `zip` or `tar.gz` archives
- ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
- Note that you can also download the latest package from - Note that you can also download the latest package from
[castopod.org](https://castopod.org/) [castopod.org](https://castopod.org/)
3. On your server: 3. On your server:
- Remove all files except `.env` and `public/media` - Remove all files except `.env` and `public/media`
- Copy the new files from the downloaded package into your server - 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 **Note** - If you do not add this cron task, the following Castopod features
will not work: will not work:
- Importing a podcast from an existing RSS feed - Importing a podcast from an existing RSS feed
- Broadcasting social activities to your followers in the fediverse - Broadcasting social activities to your followers in the fediverse
- Broadcasting episodes to open hubs using - 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 0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
database. database.
- cf. - cf.
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating) [Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
1. Go to the 1. Go to the
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and [releases page](https://code.castopod.org/adaures/castopod/-/releases) and
see if your instance is up to date with the latest Castopod version see if your instance is up to date with the latest Castopod version
- cf. - cf.
[Where can I find my Castopod version?](#where-can-i-find-my-castopod-version) [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 2. Download the latest release package named `Castopod Package`, you may choose
between the `zip` or `tar.gz` archives between the `zip` or `tar.gz` archives
- ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
- Note that you can also download the latest package from - Note that you can also download the latest package from
[castopod.org](https://castopod.org/) [castopod.org](https://castopod.org/)
3. On your server: 3. On your server:
- Remove all files except `.env` and `public/media` - Remove all files except `.env` and `public/media`
- Copy the new files from the downloaded package into your server - 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 **Note** - If you do not add this cron task, the following Castopod features
will not work: will not work:
- Importing a podcast from an existing RSS feed - Importing a podcast from an existing RSS feed
- Broadcasting social activities to your followers in the fediverse - Broadcasting social activities to your followers in the fediverse
- Broadcasting episodes to open hubs using - 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 0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
database. database.
- cf. - cf.
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating) [Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
1. Go to the 1. Go to the
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and [releases page](https://code.castopod.org/adaures/castopod/-/releases) and
see if your instance is up to date with the latest Castopod version see if your instance is up to date with the latest Castopod version
- cf. - cf.
[Where can I find my Castopod version?](#where-can-i-find-my-castopod-version) [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 2. Download the latest release package named `Castopod Package`, you may choose
between the `zip` or `tar.gz` archives between the `zip` or `tar.gz` archives
- ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
- Note that you can also download the latest package from - Note that you can also download the latest package from
[castopod.org](https://castopod.org/) [castopod.org](https://castopod.org/)
3. On your server: 3. On your server:
- Remove all files except `.env` and `public/media` - Remove all files except `.env` and `public/media`
- Copy the new files from the downloaded package into your server - 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 **Hinweis** - Wenn Sie diese Cron-Aufgabe nicht hinzufügen, funktionieren die
folgenden Castopod-Funktionen nicht: folgenden Castopod-Funktionen nicht:
- Einen Podcast aus einem vorhandenen RSS-Feed importieren - Einen Podcast aus einem vorhandenen RSS-Feed importieren
- Sende soziale Aktivitäten an deine Follower im Fediversum - Sende soziale Aktivitäten an deine Follower im Fediversum
- Übertragungen von Episoden zu open hubs mit - Ü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 0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
database. database.
- cf. - cf.
[Da li treba da napravim rezervnu kopiju pre ažuriranja?](#should-i-make-a-backup-before-updating) [Da li treba da napravim rezervnu kopiju pre ažuriranja?](#should-i-make-a-backup-before-updating)
1. Go to the 1. Go to the
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and [releases page](https://code.castopod.org/adaures/castopod/-/releases) and
see if your instance is up to date with the latest Castopod version see if your instance is up to date with the latest Castopod version
- cf. - cf.
[Gde mogu da pronađem moju verziju Castopod-a?](#where-can-i-find-my-castopod-version) [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 2. Download the latest release package named `Castopod Package`, you may choose
between the `zip` or `tar.gz` archives between the `zip` or `tar.gz` archives
- ⚠️ Uverite se da ste preuzeli Castopod paket a **NE** izvorni kod - ⚠️ Uverite se da ste preuzeli Castopod paket a **NE** izvorni kod
- Note that you can also download the latest package from - Note that you can also download the latest package from
[castopod.org](https://castopod.org/) [castopod.org](https://castopod.org/)
3. Na vašem serveru: 3. Na vašem serveru:
- Remove all files except `.env` and `public/media` - Remove all files except `.env` and `public/media`
- Copy the new files from the downloaded package into your server - 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 **Note** - If you do not add this cron task, the following Castopod features
will not work: will not work:
- Importing a podcast from an existing RSS feed - Importing a podcast from an existing RSS feed
- Broadcasting social activities to your followers in the fediverse - Broadcasting social activities to your followers in the fediverse
- Broadcasting episodes to open hubs using - 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 0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
database. database.
- cf. - cf.
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating) [Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
1. Go to the 1. Go to the
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and [releases page](https://code.castopod.org/adaures/castopod/-/releases) and
see if your instance is up to date with the latest Castopod version see if your instance is up to date with the latest Castopod version
- cf. - cf.
[Where can I find my Castopod version?](#where-can-i-find-my-castopod-version) [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 2. Download the latest release package named `Castopod Package`, you may choose
between the `zip` or `tar.gz` archives between the `zip` or `tar.gz` archives
- ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
- Note that you can also download the latest package from - Note that you can also download the latest package from
[castopod.org](https://castopod.org/) [castopod.org](https://castopod.org/)
3. On your server: 3. On your server:
- Remove all files except `.env` and `public/media` - Remove all files except `.env` and `public/media`
- Copy the new files from the downloaded package into your server - 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 **Note** - If you do not add this cron task, the following Castopod features
will not work: will not work:
- Importing a podcast from an existing RSS feed - Importing a podcast from an existing RSS feed
- Broadcasting social activities to your followers in the fediverse - Broadcasting social activities to your followers in the fediverse
- Broadcasting episodes to open hubs using - 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 0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
database. database.
- cf. - cf.
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating) [Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
1. Go to the 1. Go to the
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and [releases page](https://code.castopod.org/adaures/castopod/-/releases) and
see if your instance is up to date with the latest Castopod version see if your instance is up to date with the latest Castopod version
- cf. - cf.
[Where can I find my Castopod version?](#where-can-i-find-my-castopod-version) [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 2. Download the latest release package named `Castopod Package`, you may choose
between the `zip` or `tar.gz` archives between the `zip` or `tar.gz` archives
- ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
- Note that you can also download the latest package from - Note that you can also download the latest package from
[castopod.org](https://castopod.org/) [castopod.org](https://castopod.org/)
3. On your server: 3. On your server:
- Remove all files except `.env` and `public/media` - Remove all files except `.env` and `public/media`
- Copy the new files from the downloaded package into your server - 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 2. add a manifest.json file
<FileTree> <FileTree>
- hello-world - hello-world
- **manifest.json** - **manifest.json**
@ -51,7 +50,6 @@ project generated for you!
3. add the Plugin.php class 3. add the Plugin.php class
<FileTree> <FileTree>
- hello-world - hello-world
- manifest.json - manifest.json
- **Plugin.php** - **Plugin.php**

View File

@ -85,7 +85,6 @@ extensiones:
**Note** - If you do not add this cron task, the following Castopod features **Note** - If you do not add this cron task, the following Castopod features
will not work: will not work:
- Importing a podcast from an existing RSS feed - Importing a podcast from an existing RSS feed
- Broadcasting social activities to your followers in the fediverse - Broadcasting social activities to your followers in the fediverse
- Broadcasting episodes to open hubs using - 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 0. ⚠️ Antes de cualquier actualización, te recomendamos que respaldes tus
archivos de Castopod y base de datos. archivos de Castopod y base de datos.
- cf. - cf.
[¿Debería hacer una copia de seguridad antes de actualizar?](#should-i-make-a-backup-before-updating) [¿Debería hacer una copia de seguridad antes de actualizar?](#should-i-make-a-backup-before-updating)
1. Vaya a la página de 1. Vaya a la página de
[lanzamientos](https://code.castopod.org/adaures/castopod/-/releases) y vea [lanzamientos](https://code.castopod.org/adaures/castopod/-/releases) y vea
si su instancia está actualizada con la última versión de Castopod si su instancia está actualizada con la última versión de Castopod
- cf. - cf.
[¿Dónde puedo encontrar mi versión de Castopod?](#where-can-i-find-my-castopod-version) [¿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 2. Descargue el último paquete de lanzamiento llamado `Paquete Castopod`, puede
elegir entre los archivos `zip` o `tar.gz` elegir entre los archivos `zip` o `tar.gz`
- ⚠️ Asegúrate de descargar el paquete de Castopod y **NO** el código fuente - ⚠️ 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 - Ten en cuenta que también puedes descargar el último paquete de
[castopod.org](https://castopod.org/) [castopod.org](https://castopod.org/)
3. En tu servidor: 3. En tu servidor:
- Eliminar todos los archivos excepto `.env` y la carpeta `public/media` - Eliminar todos los archivos excepto `.env` y la carpeta `public/media`
- Copie los nuevos archivos del paquete descargado en su servidor - 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 **Note** - If you do not add this cron task, the following Castopod features
will not work: will not work:
- Importing a podcast from an existing RSS feed - Importing a podcast from an existing RSS feed
- Broadcasting social activities to your followers in the fediverse - Broadcasting social activities to your followers in the fediverse
- Broadcasting episodes to open hubs using - 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 0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
database. database.
- cf. - cf.
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating) [Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
1. Go to the 1. Go to the
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and [releases page](https://code.castopod.org/adaures/castopod/-/releases) and
see if your instance is up to date with the latest Castopod version see if your instance is up to date with the latest Castopod version
- cf. - cf.
[Where can I find my Castopod version?](#where-can-i-find-my-castopod-version) [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 2. Download the latest release package named `Castopod Package`, you may choose
between the `zip` or `tar.gz` archives between the `zip` or `tar.gz` archives
- ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
- Note that you can also download the latest package from - Note that you can also download the latest package from
[castopod.org](https://castopod.org/) [castopod.org](https://castopod.org/)
3. On your server: 3. On your server:
- Remove all files except `.env` and `public/media` - Remove all files except `.env` and `public/media`
- Copy the new files from the downloaded package into your server - 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 **Note** - If you do not add this cron task, the following Castopod features
will not work: will not work:
- Importing a podcast from an existing RSS feed - Importing a podcast from an existing RSS feed
- Broadcasting social activities to your followers in the fediverse - Broadcasting social activities to your followers in the fediverse
- Broadcasting episodes to open hubs using - 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 0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
database. database.
- cf. - cf.
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating) [Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
1. Go to the 1. Go to the
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and [releases page](https://code.castopod.org/adaures/castopod/-/releases) and
see if your instance is up to date with the latest Castopod version see if your instance is up to date with the latest Castopod version
- cf. - cf.
[Where can I find my Castopod version?](#where-can-i-find-my-castopod-version) [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 2. Download the latest release package named `Castopod Package`, you may choose
between the `zip` or `tar.gz` archives between the `zip` or `tar.gz` archives
- ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
- Note that you can also download the latest package from - Note that you can also download the latest package from
[castopod.org](https://castopod.org/) [castopod.org](https://castopod.org/)
3. On your server: 3. On your server:
- Remove all files except `.env` and `public/media` - Remove all files except `.env` and `public/media`
- Copy the new files from the downloaded package into your server - 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 **Note** - If you do not add this cron task, the following Castopod features
will not work: will not work:
- Importing a podcast from an existing RSS feed - Importing a podcast from an existing RSS feed
- Broadcasting social activities to your followers in the fediverse - Broadcasting social activities to your followers in the fediverse
- Broadcasting episodes to open hubs using - 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 0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
database. database.
- cf. - cf.
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating) [Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
1. Go to the 1. Go to the
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and [releases page](https://code.castopod.org/adaures/castopod/-/releases) and
see if your instance is up to date with the latest Castopod version see if your instance is up to date with the latest Castopod version
- cf. - cf.
[Where can I find my Castopod version?](#where-can-i-find-my-castopod-version) [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 2. Download the latest release package named `Castopod Package`, you may choose
between the `zip` or `tar.gz` archives between the `zip` or `tar.gz` archives
- ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
- Note that you can also download the latest package from - Note that you can also download the latest package from
[castopod.org](https://castopod.org/) [castopod.org](https://castopod.org/)
3. On your server: 3. On your server:
- Remove all files except `.env` and `public/media` - Remove all files except `.env` and `public/media`
- Copy the new files from the downloaded package into your server - 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 **Note** - If you do not add this cron task, the following Castopod features
will not work: will not work:
- Importing a podcast from an existing RSS feed - Importing a podcast from an existing RSS feed
- Broadcasting social activities to your followers in the fediverse - Broadcasting social activities to your followers in the fediverse
- Broadcasting episodes to open hubs using - 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 0. ⚠️ Avant toute mise à jour, nous vous recommandons fortement de sauvegarder
vos fichiers Castopod et la base de données . vos fichiers Castopod et la base de données .
- cf. - cf.
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating) [Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
1. Allez à la page 1. Allez à la page
[des versions](https://code.castopod.org/adaures/castopod/-/releases) et [des versions](https://code.castopod.org/adaures/castopod/-/releases) et
vérifiez si votre instance est à jour avec la dernière version de Castopod vérifiez si votre instance est à jour avec la dernière version de Castopod
- cf. - cf.
[Where can I find my Castopod version?](#where-can-i-find-my-castopod-version) [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 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` 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 - ⚠️ Assurez-vous de bien télécharger le paquet Castopod et **NON** le code
source source
- Notez que vous pouvez également télécharger le dernier paquet depuis - Notez que vous pouvez également télécharger le dernier paquet depuis
[castopod.org](https://castopod.org/) [castopod.org](https://castopod.org/)
3. Sur votre serveur: 3. Sur votre serveur:
- Supprimer tous les fichiers sauf `.env` et `public/media` - Supprimer tous les fichiers sauf `.env` et `public/media`
- Copiez les nouveaux fichiers du paquet téléchargé sur votre serveur - 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 **Note** - If you do not add this cron task, the following Castopod features
will not work: will not work:
- Importing a podcast from an existing RSS feed - Importing a podcast from an existing RSS feed
- Broadcasting social activities to your followers in the fediverse - Broadcasting social activities to your followers in the fediverse
- Broadcasting episodes to open hubs using - 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 0. ⚠️ Avant toute mise à jour, nous vous recommandons fortement de sauvegarder
vos fichiers Castopod et la base de données . vos fichiers Castopod et la base de données .
- cf. - cf.
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating) [Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
1. Go to the 1. Go to the
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and [releases page](https://code.castopod.org/adaures/castopod/-/releases) and
see if your instance is up to date with the latest Castopod version see if your instance is up to date with the latest Castopod version
- cf. - cf.
[Where can I find my Castopod version?](#where-can-i-find-my-castopod-version) [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 2. Download the latest release package named `Castopod Package`, you may choose
between the `zip` or `tar.gz` archives between the `zip` or `tar.gz` archives
- ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
- Note that you can also download the latest package from - Note that you can also download the latest package from
[castopod.org](https://castopod.org/) [castopod.org](https://castopod.org/)
3. Sur votre serveur: 3. Sur votre serveur:
- Supprimer tous les fichiers sauf `.env` et `public/media` - Supprimer tous les fichiers sauf `.env` et `public/media`
- Copiez les nouveaux fichiers du paquet téléchargé sur votre serveur - 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 **Note** - If you do not add this cron task, the following Castopod features
will not work: will not work:
- Importing a podcast from an existing RSS feed - Importing a podcast from an existing RSS feed
- Broadcasting social activities to your followers in the fediverse - Broadcasting social activities to your followers in the fediverse
- Broadcasting episodes to open hubs using - 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 0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
database. database.
- cf. - cf.
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating) [Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
1. Go to the 1. Go to the
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and [releases page](https://code.castopod.org/adaures/castopod/-/releases) and
see if your instance is up to date with the latest Castopod version see if your instance is up to date with the latest Castopod version
- cf. - cf.
[Where can I find my Castopod version?](#where-can-i-find-my-castopod-version) [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 2. Download the latest release package named `Castopod Package`, you may choose
between the `zip` or `tar.gz` archives between the `zip` or `tar.gz` archives
- ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
- Note that you can also download the latest package from - Note that you can also download the latest package from
[castopod.org](https://castopod.org/) [castopod.org](https://castopod.org/)
3. On your server: 3. On your server:
- Remove all files except `.env` and `public/media` - Remove all files except `.env` and `public/media`
- Copy the new files from the downloaded package into your server - 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 **Note** - If you do not add this cron task, the following Castopod features
will not work: will not work:
- Importing a podcast from an existing RSS feed - Importing a podcast from an existing RSS feed
- Broadcasting social activities to your followers in the fediverse - Broadcasting social activities to your followers in the fediverse
- Broadcasting episodes to open hubs using - 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 0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
database. database.
- cf. - cf.
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating) [Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
1. Go to the 1. Go to the
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and [releases page](https://code.castopod.org/adaures/castopod/-/releases) and
see if your instance is up to date with the latest Castopod version see if your instance is up to date with the latest Castopod version
- cf. - cf.
[Where can I find my Castopod version?](#where-can-i-find-my-castopod-version) [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 2. Download the latest release package named `Castopod Package`, you may choose
between the `zip` or `tar.gz` archives between the `zip` or `tar.gz` archives
- ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
- Note that you can also download the latest package from - Note that you can also download the latest package from
[castopod.org](https://castopod.org/) [castopod.org](https://castopod.org/)
3. On your server: 3. On your server:
- Remove all files except `.env` and `public/media` - Remove all files except `.env` and `public/media`
- Copy the new files from the downloaded package into your server - 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 **Note** - If you do not add this cron task, the following Castopod features
will not work: will not work:
- Importing a podcast from an existing RSS feed - Importing a podcast from an existing RSS feed
- Broadcasting social activities to your followers in the fediverse - Broadcasting social activities to your followers in the fediverse
- Broadcasting episodes to open hubs using - 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 0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
database. database.
- cf. - cf.
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating) [Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
1. Go to the 1. Go to the
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and [releases page](https://code.castopod.org/adaures/castopod/-/releases) and
see if your instance is up to date with the latest Castopod version see if your instance is up to date with the latest Castopod version
- cf. - cf.
[Where can I find my Castopod version?](#where-can-i-find-my-castopod-version) [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 2. Download the latest release package named `Castopod Package`, you may choose
between the `zip` or `tar.gz` archives between the `zip` or `tar.gz` archives
- ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
- Note that you can also download the latest package from - Note that you can also download the latest package from
[castopod.org](https://castopod.org/) [castopod.org](https://castopod.org/)
3. On your server: 3. On your server:
- Remove all files except `.env` and `public/media` - Remove all files except `.env` and `public/media`
- Copy the new files from the downloaded package into your server - 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 **Note** - If you do not add this cron task, the following Castopod features
will not work: will not work:
- Importing a podcast from an existing RSS feed - Importing a podcast from an existing RSS feed
- Broadcasting social activities to your followers in the fediverse - Broadcasting social activities to your followers in the fediverse
- Broadcasting episodes to open hubs using - 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 0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
database. database.
- cf. - cf.
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating) [Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
1. Go to the 1. Go to the
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and [releases page](https://code.castopod.org/adaures/castopod/-/releases) and
see if your instance is up to date with the latest Castopod version see if your instance is up to date with the latest Castopod version
- cf. - cf.
[Where can I find my Castopod version?](#where-can-i-find-my-castopod-version) [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 2. Download the latest release package named `Castopod Package`, you may choose
between the `zip` or `tar.gz` archives between the `zip` or `tar.gz` archives
- ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
- Note that you can also download the latest package from - Note that you can also download the latest package from
[castopod.org](https://castopod.org/) [castopod.org](https://castopod.org/)
3. On your server: 3. On your server:
- Remove all files except `.env` and `public/media` - Remove all files except `.env` and `public/media`
- Copy the new files from the downloaded package into your server - 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 **Note** - If you do not add this cron task, the following Castopod features
will not work: will not work:
- Importing a podcast from an existing RSS feed - Importing a podcast from an existing RSS feed
- Broadcasting social activities to your followers in the fediverse - Broadcasting social activities to your followers in the fediverse
- Broadcasting episodes to open hubs using - 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 0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
database. database.
- cf. - cf.
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating) [Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
1. Go to the 1. Go to the
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and [releases page](https://code.castopod.org/adaures/castopod/-/releases) and
see if your instance is up to date with the latest Castopod version see if your instance is up to date with the latest Castopod version
- cf. - cf.
[Where can I find my Castopod version?](#where-can-i-find-my-castopod-version) [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 2. Download the latest release package named `Castopod Package`, you may choose
between the `zip` or `tar.gz` archives between the `zip` or `tar.gz` archives
- ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
- Note that you can also download the latest package from - Note that you can also download the latest package from
[castopod.org](https://castopod.org/) [castopod.org](https://castopod.org/)
3. On your server: 3. On your server:
- Remove all files except `.env` and `public/media` - Remove all files except `.env` and `public/media`
- Copy the new files from the downloaded package into your server - 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 **Note** - If you do not add this cron task, the following Castopod features
will not work: will not work:
- Importing a podcast from an existing RSS feed - Importing a podcast from an existing RSS feed
- Broadcasting social activities to your followers in the fediverse - Broadcasting social activities to your followers in the fediverse
- Broadcasting episodes to open hubs using - 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 0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
database. database.
- cf. - cf.
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating) [Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
1. Go to the 1. Go to the
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and [releases page](https://code.castopod.org/adaures/castopod/-/releases) and
see if your instance is up to date with the latest Castopod version see if your instance is up to date with the latest Castopod version
- cf. - cf.
[Where can I find my Castopod version?](#where-can-i-find-my-castopod-version) [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 2. Download the latest release package named `Castopod Package`, you may choose
between the `zip` or `tar.gz` archives between the `zip` or `tar.gz` archives
- ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
- Note that you can also download the latest package from - Note that you can also download the latest package from
[castopod.org](https://castopod.org/) [castopod.org](https://castopod.org/)
3. On your server: 3. On your server:
- Remove all files except `.env` and `public/media` - Remove all files except `.env` and `public/media`
- Copy the new files from the downloaded package into your server - 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 **Note** - If you do not add this cron task, the following Castopod features
will not work: will not work:
- Importing a podcast from an existing RSS feed - Importing a podcast from an existing RSS feed
- Broadcasting social activities to your followers in the fediverse - Broadcasting social activities to your followers in the fediverse
- Broadcasting episodes to open hubs using - 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 0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
database. database.
- cf. - cf.
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating) [Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
1. Go to the 1. Go to the
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and [releases page](https://code.castopod.org/adaures/castopod/-/releases) and
see if your instance is up to date with the latest Castopod version see if your instance is up to date with the latest Castopod version
- cf. - cf.
[Where can I find my Castopod version?](#where-can-i-find-my-castopod-version) [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 2. Download the latest release package named `Castopod Package`, you may choose
between the `zip` or `tar.gz` archives between the `zip` or `tar.gz` archives
- ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
- Note that you can also download the latest package from - Note that you can also download the latest package from
[castopod.org](https://castopod.org/) [castopod.org](https://castopod.org/)
3. On your server: 3. On your server:
- Remove all files except `.env` and `public/media` - Remove all files except `.env` and `public/media`
- Copy the new files from the downloaded package into your server - 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 **Note** - If you do not add this cron task, the following Castopod features
will not work: will not work:
- Importing a podcast from an existing RSS feed - Importing a podcast from an existing RSS feed
- Broadcasting social activities to your followers in the fediverse - Broadcasting social activities to your followers in the fediverse
- Broadcasting episodes to open hubs using - 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 0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
database. database.
- cf. - cf.
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating) [Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
1. Go to the 1. Go to the
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and [releases page](https://code.castopod.org/adaures/castopod/-/releases) and
see if your instance is up to date with the latest Castopod version see if your instance is up to date with the latest Castopod version
- cf. - cf.
[Where can I find my Castopod version?](#where-can-i-find-my-castopod-version) [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 2. Download the latest release package named `Castopod Package`, you may choose
between the `zip` or `tar.gz` archives between the `zip` or `tar.gz` archives
- ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code - ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
- Note that you can also download the latest package from - Note that you can also download the latest package from
[castopod.org](https://castopod.org/) [castopod.org](https://castopod.org/)
3. On your server: 3. On your server:
- Remove all files except `.env` and `public/media` - Remove all files except `.env` and `public/media`
- Copy the new files from the downloaded package into your server - 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