mirror of
https://code.castopod.org/adaures/castopod
synced 2025-08-26 14:29:28 +00:00
chore: update CI to v4.6.3 + all php and js dependencies
This commit is contained in:
parent
96b2df15b0
commit
346c00e7b5
20
.gitignore
vendored
20
.gitignore
vendored
@ -67,7 +67,7 @@ writable/uploads/*
|
||||
!writable/uploads/index.html
|
||||
|
||||
writable/debugbar/*
|
||||
!writable/debugbar/.gitkeep
|
||||
!writable/debugbar/index.html
|
||||
|
||||
php_errors.log
|
||||
|
||||
@ -107,15 +107,15 @@ _modules/*
|
||||
.idea/
|
||||
*.iml
|
||||
|
||||
# Netbeans
|
||||
nbproject/
|
||||
build/
|
||||
nbbuild/
|
||||
dist/
|
||||
nbdist/
|
||||
nbactions.xml
|
||||
nb-configuration.xml
|
||||
.nb-gradle/
|
||||
# NetBeans
|
||||
/nbproject/
|
||||
/build/
|
||||
/nbbuild/
|
||||
/dist/
|
||||
/nbdist/
|
||||
/nbactions.xml
|
||||
/nb-configuration.xml
|
||||
/.nb-gradle/
|
||||
|
||||
# Sublime Text
|
||||
*.tmlanguage.cache
|
||||
|
@ -146,12 +146,10 @@ To see your changes, go to:
|
||||
|
||||
- `http://localhost:8080/` for the Castopod website
|
||||
- `http://localhost:8080/cp-admin` for the Castopod admin:
|
||||
|
||||
- email: **admin@castopod.local**
|
||||
- password: **castopod**
|
||||
|
||||
- `http://localhost:8888/` for the phpmyadmin interface:
|
||||
|
||||
- username: **castopod**
|
||||
- password: **castopod**
|
||||
|
||||
@ -294,7 +292,6 @@ You do not wish to use the VSCode devcontainer? No problem!
|
||||
```
|
||||
|
||||
3. (optional) Populate the database with test data:
|
||||
|
||||
- Populate with fake podcast analytics:
|
||||
|
||||
```bash
|
||||
|
@ -16,8 +16,6 @@ use CodeIgniter\Config\AutoloadConfig;
|
||||
*
|
||||
* NOTE: If you use an identical key in $psr4 or $classmap, then
|
||||
* the values in this file will overwrite the framework's values.
|
||||
*
|
||||
* @immutable
|
||||
*/
|
||||
class Autoload extends AutoloadConfig
|
||||
{
|
||||
|
@ -80,7 +80,7 @@ class Cache extends BaseConfig
|
||||
* Your file storage preferences can be specified below, if you are using
|
||||
* the File driver.
|
||||
*
|
||||
* @var array<string, string|int|null>
|
||||
* @var array{storePath?: string, mode?: int}
|
||||
*/
|
||||
public array $file = [
|
||||
'storePath' => WRITEPATH . 'cache/',
|
||||
@ -97,7 +97,7 @@ class Cache extends BaseConfig
|
||||
*
|
||||
* @see https://codeigniter.com/user_guide/libraries/caching.html#memcached
|
||||
*
|
||||
* @var array<string, string|int|bool>
|
||||
* @var array{host?: string, port?: int, weight?: int, raw?: bool}
|
||||
*/
|
||||
public array $memcached = [
|
||||
'host' => '127.0.0.1',
|
||||
@ -113,7 +113,7 @@ class Cache extends BaseConfig
|
||||
* Your Redis server can be specified below, if you are using
|
||||
* the Redis or Predis drivers.
|
||||
*
|
||||
* @var array<string, string|int|null>
|
||||
* @var array{host?: string, password?: string|null, port?: int, timeout?: int, database?: int}
|
||||
*/
|
||||
public array $redis = [
|
||||
'host' => '127.0.0.1',
|
||||
|
@ -85,7 +85,7 @@ class Cookie extends BaseConfig
|
||||
* (empty string) means default SameSite attribute set by browsers (`Lax`)
|
||||
* will be set on cookies. If set to `None`, `$secure` must also be set.
|
||||
*
|
||||
* @phpstan-var 'None'|'Lax'|'Strict'|''
|
||||
* @var ''|'Lax'|'None'|'Strict'
|
||||
*/
|
||||
public string $samesite = 'Lax';
|
||||
|
||||
|
@ -4,9 +4,6 @@ declare(strict_types=1);
|
||||
|
||||
namespace Config;
|
||||
|
||||
/**
|
||||
* @immutable
|
||||
*/
|
||||
class DocTypes
|
||||
{
|
||||
/**
|
||||
|
@ -56,7 +56,8 @@ Events::on('pre_system', static function (): void {
|
||||
// Hot Reload route - for framework use on the hot reloader.
|
||||
if (ENVIRONMENT === 'development') {
|
||||
service('routes')->get('__hot-reload', static function (): void {
|
||||
(new HotReloader())->run();
|
||||
new HotReloader()
|
||||
->run();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -67,7 +67,10 @@ class Filters extends BaseConfig
|
||||
/**
|
||||
* List of filter aliases that are always applied before and after every request.
|
||||
*
|
||||
* @var array<string, array<string, array<string, string|array<string>>>>|array<string, list<string>>
|
||||
* @var array{
|
||||
* before: array<string, array{except: list<string>|string}>|list<string>,
|
||||
* after: array<string, array{except: list<string>|string}>|list<string>
|
||||
* }
|
||||
*/
|
||||
public array $globals = [
|
||||
'before' => [
|
||||
|
@ -6,6 +6,7 @@ namespace Config;
|
||||
|
||||
use CodeIgniter\Config\BaseConfig;
|
||||
use CodeIgniter\Log\Handlers\FileHandler;
|
||||
use CodeIgniter\Log\Handlers\HandlerInterface;
|
||||
|
||||
class Logger extends BaseConfig
|
||||
{
|
||||
@ -75,7 +76,7 @@ class Logger extends BaseConfig
|
||||
* Handlers are executed in the order defined in this array, starting with
|
||||
* the handler on top and continuing down.
|
||||
*
|
||||
* @var array<class-string, array<string, int|list<string>|string>>
|
||||
* @var array<class-string<HandlerInterface>, array<string, int|list<string>|string>>
|
||||
*/
|
||||
public array $handlers = [
|
||||
/*
|
||||
|
@ -12,8 +12,6 @@ namespace Config;
|
||||
*
|
||||
* When working with mime types, please make sure you have the ´fileinfo´ extension enabled to reliably detect the
|
||||
* media types.
|
||||
*
|
||||
* @immutable
|
||||
*/
|
||||
class Mimes
|
||||
{
|
||||
@ -281,7 +279,8 @@ class Mimes
|
||||
'srt' => ['application/x-subrip', 'text/srt', 'text/plain', 'application/octet-stream'],
|
||||
'vtt' => ['text/vtt', 'text/plain'],
|
||||
'ico' => ['image/x-icon', 'image/x-ico', 'image/vnd.microsoft.icon'],
|
||||
'stl' => ['application/sla', 'application/vnd.ms-pki.stl', 'application/x-navistyle'],
|
||||
'stl' => ['application/sla', 'application/vnd.ms-pki.stl', 'application/x-navistyle', 'model/stl',
|
||||
'application/octet-stream', ],
|
||||
];
|
||||
|
||||
/**
|
||||
|
@ -11,8 +11,6 @@ use CodeIgniter\Modules\Modules as BaseModules;
|
||||
*
|
||||
* NOTE: This class is required prior to Autoloader instantiation,
|
||||
* and does not extend BaseConfig.
|
||||
*
|
||||
* @immutable
|
||||
*/
|
||||
class Modules extends BaseModules
|
||||
{
|
||||
|
@ -9,8 +9,6 @@ namespace Config;
|
||||
*
|
||||
* NOTE: This class does not extend BaseConfig for performance reasons.
|
||||
* So you cannot replace the property values with Environment Variables.
|
||||
*
|
||||
* @immutable
|
||||
*/
|
||||
class Optimize
|
||||
{
|
||||
|
@ -5,7 +5,7 @@ declare(strict_types=1);
|
||||
use CodeIgniter\Router\RouteCollection;
|
||||
|
||||
/**
|
||||
* @var RouteCollection $routes
|
||||
* @var RouteCollection
|
||||
*
|
||||
* --------------------------------------------------------------------
|
||||
* Placeholder definitions
|
||||
|
@ -9,9 +9,11 @@ use App\Libraries\HtmlHead;
|
||||
use App\Libraries\Negotiate;
|
||||
use App\Libraries\Router;
|
||||
use CodeIgniter\Config\BaseService;
|
||||
use CodeIgniter\HTTP\Negotiate as CodeIgniterHTTPNegotiate;
|
||||
use CodeIgniter\HTTP\Request;
|
||||
use CodeIgniter\HTTP\RequestInterface;
|
||||
use CodeIgniter\Router\RouteCollectionInterface;
|
||||
use CodeIgniter\Router\Router as CodeIgniterRouter;
|
||||
|
||||
/**
|
||||
* Services Configuration file.
|
||||
@ -33,7 +35,7 @@ class Services extends BaseService
|
||||
?RouteCollectionInterface $routes = null,
|
||||
?Request $request = null,
|
||||
bool $getShared = true,
|
||||
): Router {
|
||||
): CodeIgniterRouter {
|
||||
if ($getShared) {
|
||||
return static::getSharedInstance('router', $routes, $request);
|
||||
}
|
||||
@ -48,8 +50,10 @@ class Services extends BaseService
|
||||
* The Negotiate class provides the content negotiation features for working the request to determine correct
|
||||
* language, encoding, charset, and more.
|
||||
*/
|
||||
public static function negotiator(?RequestInterface $request = null, bool $getShared = true): Negotiate
|
||||
{
|
||||
public static function negotiator(
|
||||
?RequestInterface $request = null,
|
||||
bool $getShared = true,
|
||||
): CodeIgniterHTTPNegotiate {
|
||||
if ($getShared) {
|
||||
return static::getSharedInstance('negotiator', $request);
|
||||
}
|
||||
|
@ -33,8 +33,10 @@ class CreditsController extends BaseController
|
||||
'content_markdown' => '',
|
||||
]);
|
||||
|
||||
$allPodcasts = (new PodcastModel())->findAll();
|
||||
$allCredits = (new CreditModel())->findAll();
|
||||
$allPodcasts = new PodcastModel()
|
||||
->findAll();
|
||||
$allCredits = new CreditModel()
|
||||
->findAll();
|
||||
|
||||
// Unlike the carpenter, we make a tree from a table:
|
||||
$personGroup = null;
|
||||
|
@ -65,7 +65,7 @@ class EpisodeAudioController extends Controller
|
||||
}
|
||||
|
||||
if (
|
||||
! ($podcast = (new PodcastModel())->getPodcastByHandle($params[0])) instanceof Podcast
|
||||
! ($podcast = new PodcastModel()->getPodcastByHandle($params[0])) instanceof Podcast
|
||||
) {
|
||||
throw PageNotFoundException::forPageNotFound();
|
||||
}
|
||||
@ -73,7 +73,7 @@ class EpisodeAudioController extends Controller
|
||||
$this->podcast = $podcast;
|
||||
|
||||
if (
|
||||
! ($episode = (new EpisodeModel())->getEpisodeBySlug($params[0], $params[1])) instanceof Episode
|
||||
! ($episode = new EpisodeModel()->getEpisodeBySlug($params[0], $params[1])) instanceof Episode
|
||||
) {
|
||||
throw PageNotFoundException::forPageNotFound();
|
||||
}
|
||||
@ -108,7 +108,7 @@ class EpisodeAudioController extends Controller
|
||||
}
|
||||
|
||||
// check if there's a valid subscription for the provided token
|
||||
if (! ($subscription = (new SubscriptionModel())->validateSubscription(
|
||||
if (! ($subscription = new SubscriptionModel()->validateSubscription(
|
||||
$this->episode->podcast->handle,
|
||||
$token,
|
||||
)) instanceof Subscription) {
|
||||
|
@ -44,7 +44,7 @@ class EpisodeCommentController extends BaseController
|
||||
}
|
||||
|
||||
if (
|
||||
! ($podcast = (new PodcastModel())->getPodcastByHandle($params[0])) instanceof Podcast
|
||||
! ($podcast = new PodcastModel()->getPodcastByHandle($params[0])) instanceof Podcast
|
||||
) {
|
||||
throw PageNotFoundException::forPageNotFound();
|
||||
}
|
||||
@ -53,7 +53,7 @@ class EpisodeCommentController extends BaseController
|
||||
$this->actor = $podcast->actor;
|
||||
|
||||
if (
|
||||
! ($episode = (new EpisodeModel())->getEpisodeBySlug($params[0], $params[1])) instanceof Episode
|
||||
! ($episode = new EpisodeModel()->getEpisodeBySlug($params[0], $params[1])) instanceof Episode
|
||||
) {
|
||||
throw PageNotFoundException::forPageNotFound();
|
||||
}
|
||||
@ -61,7 +61,7 @@ class EpisodeCommentController extends BaseController
|
||||
$this->episode = $episode;
|
||||
|
||||
if (
|
||||
! ($comment = (new EpisodeCommentModel())->getCommentById($params[2])) instanceof EpisodeComment
|
||||
! ($comment = new EpisodeCommentModel()->getCommentById($params[2])) instanceof EpisodeComment
|
||||
) {
|
||||
throw PageNotFoundException::forPageNotFound();
|
||||
}
|
||||
|
@ -41,7 +41,7 @@ class EpisodeController extends BaseController
|
||||
}
|
||||
|
||||
if (
|
||||
! ($podcast = (new PodcastModel())->getPodcastByHandle($params[0])) instanceof Podcast
|
||||
! ($podcast = new PodcastModel()->getPodcastByHandle($params[0])) instanceof Podcast
|
||||
) {
|
||||
throw PageNotFoundException::forPageNotFound();
|
||||
}
|
||||
@ -49,7 +49,7 @@ class EpisodeController extends BaseController
|
||||
$this->podcast = $podcast;
|
||||
|
||||
if (
|
||||
! ($episode = (new EpisodeModel())->getEpisodeBySlug($params[0], $params[1])) instanceof Episode
|
||||
! ($episode = new EpisodeModel()->getEpisodeBySlug($params[0], $params[1])) instanceof Episode
|
||||
) {
|
||||
throw PageNotFoundException::forPageNotFound();
|
||||
}
|
||||
@ -87,9 +87,8 @@ class EpisodeController extends BaseController
|
||||
'episode' => $this->episode,
|
||||
];
|
||||
|
||||
$secondsToNextUnpublishedEpisode = (new EpisodeModel())->getSecondsToNextUnpublishedEpisode(
|
||||
$this->podcast->id,
|
||||
);
|
||||
$secondsToNextUnpublishedEpisode = new EpisodeModel()
|
||||
->getSecondsToNextUnpublishedEpisode($this->podcast->id);
|
||||
|
||||
if (auth()->loggedIn()) {
|
||||
helper('form');
|
||||
@ -133,9 +132,8 @@ class EpisodeController extends BaseController
|
||||
'episode' => $this->episode,
|
||||
];
|
||||
|
||||
$secondsToNextUnpublishedEpisode = (new EpisodeModel())->getSecondsToNextUnpublishedEpisode(
|
||||
$this->podcast->id,
|
||||
);
|
||||
$secondsToNextUnpublishedEpisode = new EpisodeModel()
|
||||
->getSecondsToNextUnpublishedEpisode($this->podcast->id);
|
||||
|
||||
if (auth()->loggedIn()) {
|
||||
helper('form');
|
||||
@ -189,9 +187,8 @@ class EpisodeController extends BaseController
|
||||
$data['chapters'] = $chapters;
|
||||
}
|
||||
|
||||
$secondsToNextUnpublishedEpisode = (new EpisodeModel())->getSecondsToNextUnpublishedEpisode(
|
||||
$this->podcast->id,
|
||||
);
|
||||
$secondsToNextUnpublishedEpisode = new EpisodeModel()
|
||||
->getSecondsToNextUnpublishedEpisode($this->podcast->id);
|
||||
|
||||
if (auth()->loggedIn()) {
|
||||
helper('form');
|
||||
@ -250,9 +247,8 @@ class EpisodeController extends BaseController
|
||||
}
|
||||
}
|
||||
|
||||
$secondsToNextUnpublishedEpisode = (new EpisodeModel())->getSecondsToNextUnpublishedEpisode(
|
||||
$this->podcast->id,
|
||||
);
|
||||
$secondsToNextUnpublishedEpisode = new EpisodeModel()
|
||||
->getSecondsToNextUnpublishedEpisode($this->podcast->id);
|
||||
|
||||
if (auth()->loggedIn()) {
|
||||
helper('form');
|
||||
@ -306,9 +302,8 @@ class EpisodeController extends BaseController
|
||||
'themeData' => $themeData,
|
||||
];
|
||||
|
||||
$secondsToNextUnpublishedEpisode = (new EpisodeModel())->getSecondsToNextUnpublishedEpisode(
|
||||
$this->podcast->id,
|
||||
);
|
||||
$secondsToNextUnpublishedEpisode = new EpisodeModel()
|
||||
->getSecondsToNextUnpublishedEpisode($this->podcast->id);
|
||||
|
||||
// The page cache is set to a decade so it is deleted manually upon podcast update
|
||||
return view('embed', $data, [
|
||||
@ -410,7 +405,7 @@ class EpisodeController extends BaseController
|
||||
$orderedItems = [];
|
||||
if ($paginatedComments !== null) {
|
||||
foreach ($paginatedComments as $comment) {
|
||||
$orderedItems[] = (new NoteObject($comment))->toArray();
|
||||
$orderedItems[] = new NoteObject($comment)->toArray();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -26,7 +26,8 @@ class EpisodePreviewController extends BaseController
|
||||
}
|
||||
|
||||
// find episode by previewUUID
|
||||
$episode = (new EpisodeModel())->getEpisodeByPreviewId($params[0]);
|
||||
$episode = new EpisodeModel()
|
||||
->getEpisodeByPreviewId($params[0]);
|
||||
|
||||
if (! $episode instanceof Episode) {
|
||||
throw PageNotFoundException::forPageNotFound();
|
||||
|
@ -33,7 +33,8 @@ class FeedController extends Controller
|
||||
|
||||
public function index(string $podcastHandle): ResponseInterface
|
||||
{
|
||||
$podcast = (new PodcastModel())->where('handle', $podcastHandle)
|
||||
$podcast = new PodcastModel()
|
||||
->where('handle', $podcastHandle)
|
||||
->first();
|
||||
if (! $podcast instanceof Podcast) {
|
||||
throw PageNotFoundException::forPageNotFound();
|
||||
@ -68,7 +69,8 @@ class FeedController extends Controller
|
||||
$subscription = null;
|
||||
$token = $this->request->getGet('token');
|
||||
if ($token) {
|
||||
$subscription = (new SubscriptionModel())->validateSubscription($podcastHandle, $token);
|
||||
$subscription = new SubscriptionModel()
|
||||
->validateSubscription($podcastHandle, $token);
|
||||
}
|
||||
|
||||
$cacheName = implode(
|
||||
@ -85,9 +87,8 @@ class FeedController extends Controller
|
||||
$found = get_rss_feed($podcast, $serviceSlug, $subscription, $token);
|
||||
|
||||
// The page cache is set to expire after next episode publication or a decade by default so it is deleted manually upon podcast update
|
||||
$secondsToNextUnpublishedEpisode = (new EpisodeModel())->getSecondsToNextUnpublishedEpisode(
|
||||
$podcast->id,
|
||||
);
|
||||
$secondsToNextUnpublishedEpisode = new EpisodeModel()
|
||||
->getSecondsToNextUnpublishedEpisode($podcast->id);
|
||||
|
||||
cache()
|
||||
->save($cacheName, $found, $secondsToNextUnpublishedEpisode ?: DECADE);
|
||||
|
@ -25,7 +25,8 @@ class HomeController extends BaseController
|
||||
'sort',
|
||||
) : 'activity';
|
||||
|
||||
$allPodcasts = (new PodcastModel())->getAllPodcasts($sortBy);
|
||||
$allPodcasts = new PodcastModel()
|
||||
->getAllPodcasts($sortBy);
|
||||
|
||||
// check if there's only one podcast to redirect user to it
|
||||
if (count($allPodcasts) === 1) {
|
||||
|
@ -43,7 +43,7 @@ class MapController extends BaseController
|
||||
{
|
||||
$cacheName = 'episodes_markers';
|
||||
if (! ($found = cache($cacheName))) {
|
||||
$episodes = (new EpisodeModel())
|
||||
$episodes = new EpisodeModel()
|
||||
->where('`published_at` <= UTC_TIMESTAMP()', null, false)
|
||||
->where('location_geo is not', null)
|
||||
->findAll();
|
||||
|
@ -24,7 +24,8 @@ class PageController extends BaseController
|
||||
throw PageNotFoundException::forPageNotFound();
|
||||
}
|
||||
|
||||
$page = (new PageModel())->where('slug', $params[0])->first();
|
||||
$page = new PageModel()
|
||||
->where('slug', $params[0])->first();
|
||||
if (! $page instanceof Page) {
|
||||
throw PageNotFoundException::forPageNotFound();
|
||||
}
|
||||
|
@ -35,7 +35,7 @@ class PodcastController extends BaseController
|
||||
}
|
||||
|
||||
if (
|
||||
! ($podcast = (new PodcastModel())->getPodcastByHandle($params[0])) instanceof Podcast
|
||||
! ($podcast = new PodcastModel()->getPodcastByHandle($params[0])) instanceof Podcast
|
||||
) {
|
||||
throw PageNotFoundException::forPageNotFound();
|
||||
}
|
||||
@ -78,7 +78,8 @@ class PodcastController extends BaseController
|
||||
set_podcast_metatags($this->podcast, 'activity');
|
||||
$data = [
|
||||
'podcast' => $this->podcast,
|
||||
'posts' => (new PostModel())->getActorPublishedPosts($this->podcast->actor_id),
|
||||
'posts' => new PostModel()
|
||||
->getActorPublishedPosts($this->podcast->actor_id),
|
||||
];
|
||||
|
||||
// if user is logged in then send to the authenticated activity view
|
||||
@ -88,9 +89,8 @@ class PodcastController extends BaseController
|
||||
return view('podcast/activity', $data);
|
||||
}
|
||||
|
||||
$secondsToNextUnpublishedEpisode = (new EpisodeModel())->getSecondsToNextUnpublishedEpisode(
|
||||
$this->podcast->id,
|
||||
);
|
||||
$secondsToNextUnpublishedEpisode = new EpisodeModel()
|
||||
->getSecondsToNextUnpublishedEpisode($this->podcast->id);
|
||||
|
||||
return view('podcast/activity', $data, [
|
||||
'cache' => $secondsToNextUnpublishedEpisode ?: DECADE,
|
||||
@ -120,7 +120,8 @@ class PodcastController extends BaseController
|
||||
);
|
||||
|
||||
if (! ($cachedView = cache($cacheName))) {
|
||||
$stats = (new EpisodeModel())->getPodcastStats($this->podcast->id);
|
||||
$stats = new EpisodeModel()
|
||||
->getPodcastStats($this->podcast->id);
|
||||
|
||||
set_podcast_metatags($this->podcast, 'about');
|
||||
$data = [
|
||||
@ -135,9 +136,8 @@ class PodcastController extends BaseController
|
||||
return view('podcast/about', $data);
|
||||
}
|
||||
|
||||
$secondsToNextUnpublishedEpisode = (new EpisodeModel())->getSecondsToNextUnpublishedEpisode(
|
||||
$this->podcast->id,
|
||||
);
|
||||
$secondsToNextUnpublishedEpisode = new EpisodeModel()
|
||||
->getSecondsToNextUnpublishedEpisode($this->podcast->id);
|
||||
|
||||
return view('podcast/about', $data, [
|
||||
'cache' => $secondsToNextUnpublishedEpisode ?: DECADE,
|
||||
@ -156,7 +156,8 @@ class PodcastController extends BaseController
|
||||
$seasonQuery = $this->request->getGet('season');
|
||||
|
||||
if (! $yearQuery && ! $seasonQuery) {
|
||||
$defaultQuery = (new PodcastModel())->getDefaultQuery($this->podcast->id);
|
||||
$defaultQuery = new PodcastModel()
|
||||
->getDefaultQuery($this->podcast->id);
|
||||
if ($defaultQuery) {
|
||||
if ($defaultQuery['type'] === 'season') {
|
||||
$seasonQuery = $defaultQuery['data']['season_number'];
|
||||
@ -241,21 +242,16 @@ class PodcastController extends BaseController
|
||||
'podcast' => $this->podcast,
|
||||
'episodesNav' => $episodesNavigation,
|
||||
'activeQuery' => $activeQuery,
|
||||
'episodes' => (new EpisodeModel())->getPodcastEpisodes(
|
||||
$this->podcast->id,
|
||||
$this->podcast->type,
|
||||
$yearQuery,
|
||||
$seasonQuery,
|
||||
),
|
||||
'episodes' => new EpisodeModel()
|
||||
->getPodcastEpisodes($this->podcast->id, $this->podcast->type, $yearQuery, $seasonQuery),
|
||||
];
|
||||
|
||||
if (auth()->loggedIn()) {
|
||||
return view('podcast/episodes', $data);
|
||||
}
|
||||
|
||||
$secondsToNextUnpublishedEpisode = (new EpisodeModel())->getSecondsToNextUnpublishedEpisode(
|
||||
$this->podcast->id,
|
||||
);
|
||||
$secondsToNextUnpublishedEpisode = new EpisodeModel()
|
||||
->getSecondsToNextUnpublishedEpisode($this->podcast->id);
|
||||
return view('podcast/episodes', $data, [
|
||||
'cache' => $secondsToNextUnpublishedEpisode ?: DECADE,
|
||||
'cache_name' => $cacheName,
|
||||
@ -291,7 +287,7 @@ class PodcastController extends BaseController
|
||||
$orderedItems = [];
|
||||
if ($paginatedEpisodes !== null) {
|
||||
foreach ($paginatedEpisodes as $episode) {
|
||||
$orderedItems[] = (new PodcastEpisode($episode))->toArray();
|
||||
$orderedItems[] = new PodcastEpisode($episode)->toArray();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -47,7 +47,7 @@ class PostController extends FediversePostController
|
||||
{
|
||||
|
||||
if (
|
||||
! ($podcast = (new PodcastModel())->getPodcastByHandle($params[0])) instanceof Podcast
|
||||
! ($podcast = new PodcastModel()->getPodcastByHandle($params[0])) instanceof Podcast
|
||||
) {
|
||||
throw PageNotFoundException::forPageNotFound();
|
||||
}
|
||||
@ -62,7 +62,7 @@ class PostController extends FediversePostController
|
||||
}
|
||||
|
||||
if (
|
||||
! ($post = (new PostModel())->getPostById($params[1])) instanceof CastopodPost
|
||||
! ($post = new PostModel()->getPostById($params[1])) instanceof CastopodPost
|
||||
) {
|
||||
throw PageNotFoundException::forPageNotFound();
|
||||
}
|
||||
@ -143,7 +143,7 @@ class PostController extends FediversePostController
|
||||
if (
|
||||
$episodeUri &&
|
||||
($params = extract_params_from_episode_uri(new URI($episodeUri))) &&
|
||||
($episode = (new EpisodeModel())->getEpisodeBySlug($params['podcastHandle'], $params['episodeSlug']))
|
||||
($episode = new EpisodeModel()->getEpisodeBySlug($params['podcastHandle'], $params['episodeSlug']))
|
||||
) {
|
||||
$newPost->episode_id = $episode->id;
|
||||
}
|
||||
@ -216,7 +216,8 @@ class PostController extends FediversePostController
|
||||
#[Override]
|
||||
public function reblogAction(): RedirectResponse
|
||||
{
|
||||
(new PostModel())->toggleReblog(interact_as_actor(), $this->post);
|
||||
new PostModel()
|
||||
->toggleReblog(interact_as_actor(), $this->post);
|
||||
|
||||
return redirect()->back();
|
||||
}
|
||||
|
@ -82,7 +82,7 @@ class WebmanifestController extends Controller
|
||||
public function podcastManifest(string $podcastHandle): ResponseInterface
|
||||
{
|
||||
if (
|
||||
! ($podcast = (new PodcastModel())->getPodcastByHandle($podcastHandle)) instanceof Podcast
|
||||
! ($podcast = new PodcastModel()->getPodcastByHandle($podcastHandle)) instanceof Podcast
|
||||
) {
|
||||
throw PageNotFoundException::forPageNotFound();
|
||||
}
|
||||
|
@ -22,7 +22,7 @@ class DevSuperadminSeeder extends Seeder
|
||||
#[Override]
|
||||
public function run(): void
|
||||
{
|
||||
if ((new UserModel())->where('is_owner', true)->first() instanceof User) {
|
||||
if (new UserModel()->where('is_owner', true)->first() instanceof User) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -43,13 +43,14 @@ class FakePodcastsAnalyticsSeeder extends Seeder
|
||||
JSON_THROW_ON_ERROR,
|
||||
);
|
||||
|
||||
$podcast = (new PodcastModel())->first();
|
||||
$podcast = new PodcastModel()
|
||||
->first();
|
||||
|
||||
if (! $podcast instanceof Podcast) {
|
||||
throw new Exception("COULD NOT POPULATE DATABASE:\n\tCreate a podcast with episodes first.\n");
|
||||
}
|
||||
|
||||
$firstEpisode = (new EpisodeModel())
|
||||
$firstEpisode = new EpisodeModel()
|
||||
->selectMin('published_at')
|
||||
->first();
|
||||
|
||||
@ -69,7 +70,7 @@ class FakePodcastsAnalyticsSeeder extends Seeder
|
||||
$analyticsPodcastsByPlayer = [];
|
||||
$analyticsPodcastsByRegion = [];
|
||||
|
||||
$episodes = (new EpisodeModel())
|
||||
$episodes = new EpisodeModel()
|
||||
->where('podcast_id', $podcast->id)
|
||||
->where('`published_at` <= UTC_TIMESTAMP()', null, false)
|
||||
->findAll();
|
||||
|
@ -185,13 +185,14 @@ class FakeWebsiteAnalyticsSeeder extends Seeder
|
||||
#[Override]
|
||||
public function run(): void
|
||||
{
|
||||
$podcast = (new PodcastModel())->first();
|
||||
$podcast = new PodcastModel()
|
||||
->first();
|
||||
|
||||
if (! $podcast instanceof Podcast) {
|
||||
throw new Exception("COULD NOT POPULATE DATABASE:\n\tCreate a podcast with episodes first.\n");
|
||||
}
|
||||
|
||||
$firstEpisode = (new EpisodeModel())
|
||||
$firstEpisode = new EpisodeModel()
|
||||
->selectMin('published_at')
|
||||
->first();
|
||||
|
||||
@ -208,7 +209,7 @@ class FakeWebsiteAnalyticsSeeder extends Seeder
|
||||
$websiteByEntryPage = [];
|
||||
$websiteByReferer = [];
|
||||
|
||||
$episodes = (new EpisodeModel())
|
||||
$episodes = new EpisodeModel()
|
||||
->where('podcast_id', $podcast->id)
|
||||
->where('`published_at` <= UTC_TIMESTAMP()', null, false)
|
||||
->findAll();
|
||||
|
@ -37,7 +37,8 @@ class Actor extends FediverseActor
|
||||
}
|
||||
|
||||
if (! $this->podcast instanceof Podcast) {
|
||||
$this->podcast = (new PodcastModel())->getPodcastByActorId($this->id);
|
||||
$this->podcast = new PodcastModel()
|
||||
->getPodcastByActorId($this->id);
|
||||
}
|
||||
|
||||
return $this->podcast;
|
||||
|
@ -42,6 +42,7 @@ class Category extends Entity
|
||||
return null;
|
||||
}
|
||||
|
||||
return (new CategoryModel())->getCategoryById($this->parent_id);
|
||||
return new CategoryModel()
|
||||
->getCategoryById($this->parent_id);
|
||||
}
|
||||
}
|
||||
|
@ -110,18 +110,21 @@ class BaseClip extends Entity
|
||||
|
||||
public function getPodcast(): ?Podcast
|
||||
{
|
||||
return (new PodcastModel())->getPodcastById($this->podcast_id);
|
||||
return new PodcastModel()
|
||||
->getPodcastById($this->podcast_id);
|
||||
}
|
||||
|
||||
public function getEpisode(): ?Episode
|
||||
{
|
||||
return (new EpisodeModel())->getEpisodeById($this->episode_id);
|
||||
return new EpisodeModel()
|
||||
->getEpisodeById($this->episode_id);
|
||||
}
|
||||
|
||||
public function getUser(): ?User
|
||||
{
|
||||
/** @var ?User */
|
||||
return (new UserModel())->find($this->created_by);
|
||||
return new UserModel()
|
||||
->find($this->created_by);
|
||||
}
|
||||
|
||||
public function setMedia(File $file, string $fileKey): static
|
||||
@ -131,7 +134,8 @@ class BaseClip extends Entity
|
||||
->setFile($file);
|
||||
$this->getMedia()
|
||||
->updated_by = $this->attributes['updated_by'];
|
||||
(new MediaModel('audio'))->updateMedia($this->getMedia());
|
||||
new MediaModel('audio')
|
||||
->updateMedia($this->getMedia());
|
||||
} else {
|
||||
$media = new Audio([
|
||||
'file_key' => $fileKey,
|
||||
@ -142,7 +146,7 @@ class BaseClip extends Entity
|
||||
]);
|
||||
$media->setFile($file);
|
||||
|
||||
$this->attributes['media_id'] = (new MediaModel())->saveMedia($media);
|
||||
$this->attributes['media_id'] = new MediaModel()->saveMedia($media);
|
||||
}
|
||||
|
||||
return $this;
|
||||
@ -151,7 +155,8 @@ class BaseClip extends Entity
|
||||
public function getMedia(): Audio | Video | null
|
||||
{
|
||||
if ($this->media_id !== null && $this->media === null) {
|
||||
$this->media = (new MediaModel($this->type))->getMediaById($this->media_id);
|
||||
$this->media = new MediaModel($this->type)
|
||||
->getMediaById($this->media_id);
|
||||
}
|
||||
|
||||
return $this->media;
|
||||
|
@ -81,7 +81,7 @@ class VideoClip extends BaseClip
|
||||
]);
|
||||
$video->setFile($file);
|
||||
|
||||
$this->attributes['media_id'] = (new MediaModel('video'))->saveMedia($video);
|
||||
$this->attributes['media_id'] = new MediaModel('video')->saveMedia($video);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
@ -60,7 +60,8 @@ class Credit extends Entity
|
||||
}
|
||||
|
||||
if (! $this->person instanceof Person) {
|
||||
$this->person = (new PersonModel())->getPersonById($this->person_id);
|
||||
$this->person = new PersonModel()
|
||||
->getPersonById($this->person_id);
|
||||
}
|
||||
|
||||
return $this->person;
|
||||
@ -73,7 +74,8 @@ class Credit extends Entity
|
||||
}
|
||||
|
||||
if (! $this->podcast instanceof Podcast) {
|
||||
$this->podcast = (new PodcastModel())->getPodcastById($this->podcast_id);
|
||||
$this->podcast = new PodcastModel()
|
||||
->getPodcastById($this->podcast_id);
|
||||
}
|
||||
|
||||
return $this->podcast;
|
||||
@ -86,7 +88,8 @@ class Credit extends Entity
|
||||
}
|
||||
|
||||
if (! $this->episode instanceof Episode) {
|
||||
$this->episode = (new EpisodeModel())->getPublishedEpisodeById($this->podcast_id, $this->episode_id);
|
||||
$this->episode = new EpisodeModel()
|
||||
->getPublishedEpisodeById($this->podcast_id, $this->episode_id);
|
||||
}
|
||||
|
||||
return $this->episode;
|
||||
|
@ -213,7 +213,8 @@ class Episode extends Entity
|
||||
->setFile($file);
|
||||
$this->getCover()
|
||||
->updated_by = $this->attributes['updated_by'];
|
||||
(new MediaModel('image'))->updateMedia($this->getCover());
|
||||
new MediaModel('image')
|
||||
->updateMedia($this->getCover());
|
||||
} else {
|
||||
$cover = new Image([
|
||||
'file_key' => 'podcasts/' . $this->getPodcast()->handle . '/' . $this->attributes['slug'] . '.' . $file->getExtension(),
|
||||
@ -224,7 +225,7 @@ class Episode extends Entity
|
||||
]);
|
||||
$cover->setFile($file);
|
||||
|
||||
$this->attributes['cover_id'] = (new MediaModel('image'))->saveMedia($cover);
|
||||
$this->attributes['cover_id'] = new MediaModel('image')->saveMedia($cover);
|
||||
}
|
||||
|
||||
return $this;
|
||||
@ -243,7 +244,8 @@ class Episode extends Entity
|
||||
return $this->cover;
|
||||
}
|
||||
|
||||
$this->cover = (new MediaModel('image'))->getMediaById($this->cover_id);
|
||||
$this->cover = new MediaModel('image')
|
||||
->getMediaById($this->cover_id);
|
||||
|
||||
return $this->cover;
|
||||
}
|
||||
@ -259,7 +261,8 @@ class Episode extends Entity
|
||||
->setFile($file);
|
||||
$this->getAudio()
|
||||
->updated_by = $this->attributes['updated_by'];
|
||||
(new MediaModel('audio'))->updateMedia($this->getAudio());
|
||||
new MediaModel('audio')
|
||||
->updateMedia($this->getAudio());
|
||||
} else {
|
||||
$audio = new Audio([
|
||||
'file_key' => 'podcasts/' . $this->getPodcast()->handle . '/' . $file->getRandomName(),
|
||||
@ -270,7 +273,7 @@ class Episode extends Entity
|
||||
]);
|
||||
$audio->setFile($file);
|
||||
|
||||
$this->attributes['audio_id'] = (new MediaModel())->saveMedia($audio);
|
||||
$this->attributes['audio_id'] = new MediaModel()->saveMedia($audio);
|
||||
}
|
||||
|
||||
return $this;
|
||||
@ -279,7 +282,8 @@ class Episode extends Entity
|
||||
public function getAudio(): Audio
|
||||
{
|
||||
if (! $this->audio instanceof Audio) {
|
||||
$this->audio = (new MediaModel('audio'))->getMediaById($this->audio_id);
|
||||
$this->audio = new MediaModel('audio')
|
||||
->getMediaById($this->audio_id);
|
||||
}
|
||||
|
||||
return $this->audio;
|
||||
@ -296,7 +300,8 @@ class Episode extends Entity
|
||||
->setFile($file);
|
||||
$this->getTranscript()
|
||||
->updated_by = $this->attributes['updated_by'];
|
||||
(new MediaModel('transcript'))->updateMedia($this->getTranscript());
|
||||
new MediaModel('transcript')
|
||||
->updateMedia($this->getTranscript());
|
||||
} else {
|
||||
$transcript = new Transcript([
|
||||
'file_key' => 'podcasts/' . $this->getPodcast()->handle . '/' . $this->attributes['slug'] . '-transcript.' . $file->getExtension(),
|
||||
@ -307,7 +312,7 @@ class Episode extends Entity
|
||||
]);
|
||||
$transcript->setFile($file);
|
||||
|
||||
$this->attributes['transcript_id'] = (new MediaModel('transcript'))->saveMedia($transcript);
|
||||
$this->attributes['transcript_id'] = new MediaModel('transcript')->saveMedia($transcript);
|
||||
}
|
||||
|
||||
return $this;
|
||||
@ -316,7 +321,8 @@ class Episode extends Entity
|
||||
public function getTranscript(): ?Transcript
|
||||
{
|
||||
if ($this->transcript_id !== null && ! $this->transcript instanceof Transcript) {
|
||||
$this->transcript = (new MediaModel('transcript'))->getMediaById($this->transcript_id);
|
||||
$this->transcript = new MediaModel('transcript')
|
||||
->getMediaById($this->transcript_id);
|
||||
}
|
||||
|
||||
return $this->transcript;
|
||||
@ -333,7 +339,8 @@ class Episode extends Entity
|
||||
->setFile($file);
|
||||
$this->getChapters()
|
||||
->updated_by = $this->attributes['updated_by'];
|
||||
(new MediaModel('chapters'))->updateMedia($this->getChapters());
|
||||
new MediaModel('chapters')
|
||||
->updateMedia($this->getChapters());
|
||||
} else {
|
||||
$chapters = new Chapters([
|
||||
'file_key' => 'podcasts/' . $this->getPodcast()->handle . '/' . $this->attributes['slug'] . '-chapters' . '.' . $file->getExtension(),
|
||||
@ -344,7 +351,7 @@ class Episode extends Entity
|
||||
]);
|
||||
$chapters->setFile($file);
|
||||
|
||||
$this->attributes['chapters_id'] = (new MediaModel('chapters'))->saveMedia($chapters);
|
||||
$this->attributes['chapters_id'] = new MediaModel('chapters')->saveMedia($chapters);
|
||||
}
|
||||
|
||||
return $this;
|
||||
@ -353,7 +360,8 @@ class Episode extends Entity
|
||||
public function getChapters(): ?Chapters
|
||||
{
|
||||
if ($this->chapters_id !== null && ! $this->chapters instanceof Chapters) {
|
||||
$this->chapters = (new MediaModel('chapters'))->getMediaById($this->chapters_id);
|
||||
$this->chapters = new MediaModel('chapters')
|
||||
->getMediaById($this->chapters_id);
|
||||
}
|
||||
|
||||
return $this->chapters;
|
||||
@ -395,7 +403,8 @@ class Episode extends Entity
|
||||
}
|
||||
|
||||
if ($this->persons === null) {
|
||||
$this->persons = (new PersonModel())->getEpisodePersons($this->podcast_id, $this->id);
|
||||
$this->persons = new PersonModel()
|
||||
->getEpisodePersons($this->podcast_id, $this->id);
|
||||
}
|
||||
|
||||
return $this->persons;
|
||||
@ -413,7 +422,8 @@ class Episode extends Entity
|
||||
}
|
||||
|
||||
if ($this->soundbites === null) {
|
||||
$this->soundbites = (new ClipModel())->getEpisodeSoundbites($this->getPodcast()->id, $this->id);
|
||||
$this->soundbites = new ClipModel()
|
||||
->getEpisodeSoundbites($this->getPodcast()->id, $this->id);
|
||||
}
|
||||
|
||||
return $this->soundbites;
|
||||
@ -429,7 +439,8 @@ class Episode extends Entity
|
||||
}
|
||||
|
||||
if ($this->posts === null) {
|
||||
$this->posts = (new PostModel())->getEpisodePosts($this->id);
|
||||
$this->posts = new PostModel()
|
||||
->getEpisodePosts($this->id);
|
||||
}
|
||||
|
||||
return $this->posts;
|
||||
@ -445,7 +456,8 @@ class Episode extends Entity
|
||||
}
|
||||
|
||||
if ($this->comments === null) {
|
||||
$this->comments = (new EpisodeCommentModel())->getEpisodeComments($this->id);
|
||||
$this->comments = new EpisodeCommentModel()
|
||||
->getEpisodeComments($this->id);
|
||||
}
|
||||
|
||||
return $this->comments;
|
||||
@ -467,7 +479,8 @@ class Episode extends Entity
|
||||
|
||||
public function getPodcast(): ?Podcast
|
||||
{
|
||||
return (new PodcastModel())->getPodcastById($this->podcast_id);
|
||||
return new PodcastModel()
|
||||
->getPodcastById($this->podcast_id);
|
||||
}
|
||||
|
||||
public function setDescriptionMarkdown(string $descriptionMarkdown): static
|
||||
@ -563,7 +576,7 @@ class Episode extends Entity
|
||||
{
|
||||
if ($this->preview_id === null) {
|
||||
// generate preview id
|
||||
if (! $previewUUID = (new EpisodeModel())->setEpisodePreviewId($this->id)) {
|
||||
if (! $previewUUID = new EpisodeModel()->setEpisodePreviewId($this->id)) {
|
||||
throw new Exception('Could not set episode preview id');
|
||||
}
|
||||
|
||||
@ -582,6 +595,7 @@ class Episode extends Entity
|
||||
throw new RuntimeException('Episode must be created before getting number of video clips.');
|
||||
}
|
||||
|
||||
return (new ClipModel())->getClipCount($this->podcast_id, $this->id);
|
||||
return new ClipModel()
|
||||
->getClipCount($this->podcast_id, $this->id);
|
||||
}
|
||||
}
|
||||
|
@ -80,7 +80,8 @@ class EpisodeComment extends UuidEntity
|
||||
}
|
||||
|
||||
if (! $this->episode instanceof Episode) {
|
||||
$this->episode = (new EpisodeModel())->getEpisodeById($this->episode_id);
|
||||
$this->episode = new EpisodeModel()
|
||||
->getEpisodeById($this->episode_id);
|
||||
}
|
||||
|
||||
return $this->episode;
|
||||
@ -113,7 +114,8 @@ class EpisodeComment extends UuidEntity
|
||||
}
|
||||
|
||||
if ($this->replies === null) {
|
||||
$this->replies = (new EpisodeCommentModel())->getCommentReplies($this->id);
|
||||
$this->replies = new EpisodeCommentModel()
|
||||
->getCommentReplies($this->id);
|
||||
}
|
||||
|
||||
return $this->replies;
|
||||
|
@ -67,7 +67,8 @@ class Person extends Entity
|
||||
->setFile($file);
|
||||
$this->getAvatar()
|
||||
->updated_by = $this->attributes['updated_by'];
|
||||
(new MediaModel('image'))->updateMedia($this->getAvatar());
|
||||
new MediaModel('image')
|
||||
->updateMedia($this->getAvatar());
|
||||
} else {
|
||||
$avatar = new Image([
|
||||
'file_key' => 'persons/' . $this->attributes['unique_name'] . '.' . $file->getExtension(),
|
||||
@ -78,7 +79,7 @@ class Person extends Entity
|
||||
]);
|
||||
$avatar->setFile($file);
|
||||
|
||||
$this->attributes['avatar_id'] = (new MediaModel('image'))->saveMedia($avatar);
|
||||
$this->attributes['avatar_id'] = new MediaModel('image')->saveMedia($avatar);
|
||||
}
|
||||
|
||||
return $this;
|
||||
@ -91,7 +92,8 @@ class Person extends Entity
|
||||
}
|
||||
|
||||
if (! $this->avatar instanceof Image) {
|
||||
$this->avatar = (new MediaModel('image'))->getMediaById($this->avatar_id);
|
||||
$this->avatar = new MediaModel('image')
|
||||
->getMediaById($this->avatar_id);
|
||||
}
|
||||
|
||||
return $this->avatar;
|
||||
@ -107,11 +109,12 @@ class Person extends Entity
|
||||
}
|
||||
|
||||
if ($this->roles === null) {
|
||||
$this->roles = (new PersonModel())->getPersonRoles(
|
||||
$this->id,
|
||||
(int) $this->attributes['podcast_id'],
|
||||
array_key_exists('episode_id', $this->attributes) ? (int) $this->attributes['episode_id'] : null,
|
||||
);
|
||||
$this->roles = new PersonModel()
|
||||
->getPersonRoles(
|
||||
$this->id,
|
||||
(int) $this->attributes['podcast_id'],
|
||||
array_key_exists('episode_id', $this->attributes) ? (int) $this->attributes['episode_id'] : null,
|
||||
);
|
||||
}
|
||||
|
||||
return $this->roles;
|
||||
|
@ -226,7 +226,8 @@ class Podcast extends Entity
|
||||
->setFile($file);
|
||||
$this->getCover()
|
||||
->updated_by = $this->attributes['updated_by'];
|
||||
(new MediaModel('image'))->updateMedia($this->getCover());
|
||||
new MediaModel('image')
|
||||
->updateMedia($this->getCover());
|
||||
} else {
|
||||
$cover = new Image([
|
||||
'file_key' => 'podcasts/' . $this->attributes['handle'] . '/cover.' . $file->getExtension(),
|
||||
@ -237,7 +238,7 @@ class Podcast extends Entity
|
||||
]);
|
||||
$cover->setFile($file);
|
||||
|
||||
$this->attributes['cover_id'] = (new MediaModel('image'))->saveMedia($cover);
|
||||
$this->attributes['cover_id'] = new MediaModel('image')->saveMedia($cover);
|
||||
}
|
||||
|
||||
return $this;
|
||||
@ -246,7 +247,8 @@ class Podcast extends Entity
|
||||
public function getCover(): Image
|
||||
{
|
||||
if (! $this->cover instanceof Image) {
|
||||
$cover = (new MediaModel('image'))->getMediaById($this->cover_id);
|
||||
$cover = new MediaModel('image')
|
||||
->getMediaById($this->cover_id);
|
||||
|
||||
if (! $cover instanceof Image) {
|
||||
throw new Exception('Could not retrieve podcast cover.');
|
||||
@ -269,7 +271,8 @@ class Podcast extends Entity
|
||||
->setFile($file);
|
||||
$this->getBanner()
|
||||
->updated_by = $this->attributes['updated_by'];
|
||||
(new MediaModel('image'))->updateMedia($this->getBanner());
|
||||
new MediaModel('image')
|
||||
->updateMedia($this->getBanner());
|
||||
} else {
|
||||
$banner = new Image([
|
||||
'file_key' => 'podcasts/' . $this->attributes['handle'] . '/banner.' . $file->getExtension(),
|
||||
@ -280,7 +283,7 @@ class Podcast extends Entity
|
||||
]);
|
||||
$banner->setFile($file);
|
||||
|
||||
$this->attributes['banner_id'] = (new MediaModel('image'))->saveMedia($banner);
|
||||
$this->attributes['banner_id'] = new MediaModel('image')->saveMedia($banner);
|
||||
}
|
||||
|
||||
return $this;
|
||||
@ -293,7 +296,8 @@ class Podcast extends Entity
|
||||
}
|
||||
|
||||
if (! $this->banner instanceof Image) {
|
||||
$this->banner = (new MediaModel('image'))->getMediaById($this->banner_id);
|
||||
$this->banner = new MediaModel('image')
|
||||
->getMediaById($this->banner_id);
|
||||
}
|
||||
|
||||
return $this->banner;
|
||||
@ -321,7 +325,8 @@ class Podcast extends Entity
|
||||
}
|
||||
|
||||
if ($this->episodes === null) {
|
||||
$this->episodes = (new EpisodeModel())->getPodcastEpisodes($this->id, $this->type);
|
||||
$this->episodes = new EpisodeModel()
|
||||
->getPodcastEpisodes($this->id, $this->type);
|
||||
}
|
||||
|
||||
return $this->episodes;
|
||||
@ -336,7 +341,8 @@ class Podcast extends Entity
|
||||
throw new RuntimeException('Podcast must be created before getting number of episodes.');
|
||||
}
|
||||
|
||||
return (new EpisodeModel())->getPodcastEpisodesCount($this->id);
|
||||
return new EpisodeModel()
|
||||
->getPodcastEpisodesCount($this->id);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -351,7 +357,8 @@ class Podcast extends Entity
|
||||
}
|
||||
|
||||
if ($this->persons === null) {
|
||||
$this->persons = (new PersonModel())->getPodcastPersons($this->id);
|
||||
$this->persons = new PersonModel()
|
||||
->getPodcastPersons($this->id);
|
||||
}
|
||||
|
||||
return $this->persons;
|
||||
@ -367,7 +374,8 @@ class Podcast extends Entity
|
||||
}
|
||||
|
||||
if (! $this->category instanceof Category) {
|
||||
$this->category = (new CategoryModel())->getCategoryById($this->category_id);
|
||||
$this->category = new CategoryModel()
|
||||
->getCategoryById($this->category_id);
|
||||
}
|
||||
|
||||
return $this->category;
|
||||
@ -385,7 +393,8 @@ class Podcast extends Entity
|
||||
}
|
||||
|
||||
if ($this->subscriptions === null) {
|
||||
$this->subscriptions = (new SubscriptionModel())->getPodcastSubscriptions($this->id);
|
||||
$this->subscriptions = new SubscriptionModel()
|
||||
->getPodcastSubscriptions($this->id);
|
||||
}
|
||||
|
||||
return $this->subscriptions;
|
||||
@ -403,7 +412,8 @@ class Podcast extends Entity
|
||||
}
|
||||
|
||||
if ($this->contributors === null) {
|
||||
$this->contributors = (new UserModel())->getPodcastContributors($this->id);
|
||||
$this->contributors = new UserModel()
|
||||
->getPodcastContributors($this->id);
|
||||
}
|
||||
|
||||
return $this->contributors;
|
||||
@ -468,7 +478,8 @@ class Podcast extends Entity
|
||||
}
|
||||
|
||||
if ($this->podcasting_platforms === null) {
|
||||
$this->podcasting_platforms = (new PlatformModel())->getPlatforms($this->id, 'podcasting');
|
||||
$this->podcasting_platforms = new PlatformModel()
|
||||
->getPlatforms($this->id, 'podcasting');
|
||||
}
|
||||
|
||||
return $this->podcasting_platforms;
|
||||
@ -486,7 +497,8 @@ class Podcast extends Entity
|
||||
}
|
||||
|
||||
if ($this->social_platforms === null) {
|
||||
$this->social_platforms = (new PlatformModel())->getPlatforms($this->id, 'social');
|
||||
$this->social_platforms = new PlatformModel()
|
||||
->getPlatforms($this->id, 'social');
|
||||
}
|
||||
|
||||
return $this->social_platforms;
|
||||
@ -504,7 +516,8 @@ class Podcast extends Entity
|
||||
}
|
||||
|
||||
if ($this->funding_platforms === null) {
|
||||
$this->funding_platforms = (new PlatformModel())->getPlatforms($this->id, 'funding');
|
||||
$this->funding_platforms = new PlatformModel()
|
||||
->getPlatforms($this->id, 'funding');
|
||||
}
|
||||
|
||||
return $this->funding_platforms;
|
||||
@ -520,7 +533,8 @@ class Podcast extends Entity
|
||||
}
|
||||
|
||||
if ($this->other_categories === null) {
|
||||
$this->other_categories = (new CategoryModel())->getPodcastCategories($this->id);
|
||||
$this->other_categories = new CategoryModel()
|
||||
->getPodcastCategories($this->id);
|
||||
}
|
||||
|
||||
return $this->other_categories;
|
||||
@ -581,6 +595,7 @@ class Podcast extends Entity
|
||||
public function getIsPremium(): bool
|
||||
{
|
||||
// podcast is premium if at least one of its episodes is set as premium
|
||||
return (new EpisodeModel())->doesPodcastHavePremiumEpisodes($this->id);
|
||||
return new EpisodeModel()
|
||||
->doesPodcastHavePremiumEpisodes($this->id);
|
||||
}
|
||||
}
|
||||
|
@ -50,7 +50,8 @@ class Post extends FediversePost
|
||||
}
|
||||
|
||||
if (! $this->episode instanceof Episode) {
|
||||
$this->episode = (new EpisodeModel())->getEpisodeById($this->episode_id);
|
||||
$this->episode = new EpisodeModel()
|
||||
->getEpisodeById($this->episode_id);
|
||||
}
|
||||
|
||||
return $this->episode;
|
||||
|
@ -18,7 +18,8 @@ if (! function_exists('render_page_links')) {
|
||||
*/
|
||||
function render_page_links(?string $class = null, ?string $podcastHandle = null): string
|
||||
{
|
||||
$pages = (new PageModel())->findAll();
|
||||
$pages = new PageModel()
|
||||
->findAll();
|
||||
$links = anchor(route_to('home'), lang('Common.home'), [
|
||||
'class' => 'px-2 py-1 underline hover:no-underline',
|
||||
]);
|
||||
|
@ -63,7 +63,7 @@ if (! function_exists('get_rss_feed')) {
|
||||
}
|
||||
|
||||
// the last build date corresponds to the creation of the feed.xml cache
|
||||
$channel->addChild('lastBuildDate', (new Time('now'))->format(DATE_RFC1123));
|
||||
$channel->addChild('lastBuildDate', new Time('now')->format(DATE_RFC1123));
|
||||
$channel->addChild('generator', 'Castopod - https://castopod.org/');
|
||||
$channel->addChild('docs', 'https://cyber.harvard.edu/rss/rss.html');
|
||||
|
||||
@ -74,7 +74,8 @@ if (! function_exists('get_rss_feed')) {
|
||||
$podcast->guid = $uuid->uuid5('ead4c236-bf58-58c6-a2c6-a6b28d128cb6', $podcast->feed_url)
|
||||
->toString();
|
||||
|
||||
(new PodcastModel())->save($podcast);
|
||||
new PodcastModel()
|
||||
->save($podcast);
|
||||
}
|
||||
|
||||
$channel->addChild('guid', $podcast->guid, RssFeed::PODCAST_NAMESPACE);
|
||||
|
@ -22,6 +22,7 @@ class Services extends BaseService
|
||||
public static function components(bool $getShared = true): ComponentRenderer
|
||||
{
|
||||
if ($getShared) {
|
||||
/** @phpstan-ignore return.type */
|
||||
return self::getSharedInstance('components');
|
||||
}
|
||||
|
||||
|
@ -162,15 +162,11 @@ class ClipModel extends Model
|
||||
return (int) $result[0]['id'];
|
||||
}
|
||||
|
||||
public function deleteVideoClip(int $podcastId, int $episodeId, int $clipId): BaseResult | bool
|
||||
public function deleteVideoClip(int $clipId): BaseResult | bool
|
||||
{
|
||||
$this->clearVideoClipCache($clipId);
|
||||
|
||||
return $this->delete([
|
||||
'podcast_id' => $podcastId,
|
||||
'episode_id' => $episodeId,
|
||||
'id' => $clipId,
|
||||
]);
|
||||
return $this->delete($clipId);
|
||||
}
|
||||
|
||||
public function getClipCount(int $podcastId, int $episodeId): int
|
||||
@ -240,11 +236,7 @@ class ClipModel extends Model
|
||||
{
|
||||
$this->clearSoundbiteCache($podcastId, $episodeId, $clipId);
|
||||
|
||||
return $this->delete([
|
||||
'podcast_id' => $podcastId,
|
||||
'episode_id' => $episodeId,
|
||||
'id' => $clipId,
|
||||
]);
|
||||
return $this->delete($clipId);
|
||||
}
|
||||
|
||||
public function clearSoundbiteCache(int $podcastId, int $episodeId, int $clipId): void
|
||||
|
@ -86,11 +86,13 @@ class EpisodeCommentModel extends UuidModel
|
||||
}
|
||||
|
||||
if ($comment->in_reply_to_id === null) {
|
||||
(new EpisodeModel())->builder()
|
||||
new EpisodeModel()
|
||||
->builder()
|
||||
->where('id', $comment->episode_id)
|
||||
->increment('comments_count');
|
||||
} else {
|
||||
(new self())->builder()
|
||||
new self()
|
||||
->builder()
|
||||
->where('id', service('uuid')->fromString($comment->in_reply_to_id)->getBytes())
|
||||
->increment('replies_count');
|
||||
}
|
||||
@ -180,7 +182,8 @@ class EpisodeCommentModel extends UuidModel
|
||||
->where('id', $comment->episode_id)
|
||||
->decrement('comments_count');
|
||||
} else {
|
||||
(new self())->builder()
|
||||
new self()
|
||||
->builder()
|
||||
->where('id', service('uuid')->fromString($comment->in_reply_to_id)->getBytes())
|
||||
->decrement('replies_count');
|
||||
}
|
||||
|
@ -368,13 +368,15 @@ class EpisodeModel extends UuidModel
|
||||
|
||||
public function resetCommentsCount(): int | false
|
||||
{
|
||||
$episodeCommentsCount = (new EpisodeCommentModel())->builder()
|
||||
$episodeCommentsCount = new EpisodeCommentModel()
|
||||
->builder()
|
||||
->select('episode_id, COUNT(*) as `comments_count`')
|
||||
->where('in_reply_to_id', null)
|
||||
->groupBy('episode_id')
|
||||
->getCompiledSelect();
|
||||
|
||||
$episodePostsRepliesCount = (new PostModel())->builder()
|
||||
$episodePostsRepliesCount = new PostModel()
|
||||
->builder()
|
||||
->select('fediverse_posts.episode_id as episode_id, COUNT(*) as `comments_count`')
|
||||
->join('fediverse_posts as fp', 'fediverse_posts.id = fp.in_reply_to_id')
|
||||
->where('fediverse_posts.in_reply_to_id', null)
|
||||
@ -390,7 +392,8 @@ class EpisodeModel extends UuidModel
|
||||
$countsPerEpisodeId = $query->getResultArray();
|
||||
|
||||
if ($countsPerEpisodeId !== []) {
|
||||
return (new self())->updateBatch($countsPerEpisodeId, 'id');
|
||||
return new self()
|
||||
->updateBatch($countsPerEpisodeId, 'id');
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -429,7 +432,8 @@ class EpisodeModel extends UuidModel
|
||||
}
|
||||
|
||||
/** @var ?Episode $episode */
|
||||
$episode = (new self())->find($episodeId);
|
||||
$episode = new self()
|
||||
->find($episodeId);
|
||||
|
||||
if (! $episode instanceof Episode) {
|
||||
return $data;
|
||||
@ -523,7 +527,8 @@ class EpisodeModel extends UuidModel
|
||||
}
|
||||
|
||||
/** @var ?Episode $episode */
|
||||
$episode = (new self())->find($episodeId);
|
||||
$episode = new self()
|
||||
->find($episodeId);
|
||||
|
||||
if (! $episode instanceof Episode) {
|
||||
return $data;
|
||||
|
@ -56,7 +56,8 @@ class LikeModel extends UuidModel
|
||||
'comment_id' => $comment->id,
|
||||
]);
|
||||
|
||||
(new EpisodeCommentModel())->builder()
|
||||
new EpisodeCommentModel()
|
||||
->builder()
|
||||
->where('id', service('uuid')->fromString($comment->id)->getBytes())
|
||||
->increment('likes_count');
|
||||
|
||||
@ -91,7 +92,8 @@ class LikeModel extends UuidModel
|
||||
{
|
||||
$this->db->transStart();
|
||||
|
||||
(new EpisodeCommentModel())->builder()
|
||||
new EpisodeCommentModel()
|
||||
->builder()
|
||||
->where('id', service('uuid') ->fromString($comment->id) ->getBytes())
|
||||
->decrement('likes_count');
|
||||
|
||||
|
@ -297,9 +297,10 @@ class PersonModel extends Model
|
||||
|
||||
cache()
|
||||
->delete("podcast#{$podcastId}_persons");
|
||||
(new PodcastModel())->clearCache([
|
||||
'id' => $podcastId,
|
||||
]);
|
||||
new PodcastModel()
|
||||
->clearCache([
|
||||
'id' => $podcastId,
|
||||
]);
|
||||
|
||||
$data = [];
|
||||
foreach ($personIds as $personId) {
|
||||
@ -339,9 +340,10 @@ class PersonModel extends Model
|
||||
cache()->deleteMatching("podcast#{$podcastId}_person#{$personId}*");
|
||||
cache()
|
||||
->delete("podcast#{$podcastId}_persons");
|
||||
(new PodcastModel())->clearCache([
|
||||
'id' => $podcastId,
|
||||
]);
|
||||
new PodcastModel()
|
||||
->clearCache([
|
||||
'id' => $podcastId,
|
||||
]);
|
||||
|
||||
return $this->db->table('podcasts_persons')
|
||||
->delete([
|
||||
@ -363,9 +365,10 @@ class PersonModel extends Model
|
||||
if ($personIds !== []) {
|
||||
cache()
|
||||
->delete("podcast#{$podcastId}_episode#{$episodeId}_persons");
|
||||
(new EpisodeModel())->clearCache([
|
||||
'id' => $episodeId,
|
||||
]);
|
||||
new EpisodeModel()
|
||||
->clearCache([
|
||||
'id' => $episodeId,
|
||||
]);
|
||||
|
||||
$data = [];
|
||||
foreach ($personIds as $personId) {
|
||||
@ -404,9 +407,10 @@ class PersonModel extends Model
|
||||
cache()->deleteMatching("podcast#{$podcastId}_episode#{$episodeId}_person#{$personId}*");
|
||||
cache()
|
||||
->delete("podcast#{$podcastId}_episode#{$episodeId}_persons");
|
||||
(new EpisodeModel())->clearCache([
|
||||
'id' => $episodeId,
|
||||
]);
|
||||
new EpisodeModel()
|
||||
->clearCache([
|
||||
'id' => $episodeId,
|
||||
]);
|
||||
|
||||
return $this->db->table('episodes_persons')
|
||||
->delete([
|
||||
|
@ -309,7 +309,8 @@ class PodcastModel extends Model
|
||||
];
|
||||
}
|
||||
|
||||
$secondsToNextUnpublishedEpisode = (new EpisodeModel())->getSecondsToNextUnpublishedEpisode($podcastId);
|
||||
$secondsToNextUnpublishedEpisode = new EpisodeModel()
|
||||
->getSecondsToNextUnpublishedEpisode($podcastId);
|
||||
|
||||
cache()
|
||||
->save($cacheName, $defaultQuery, $secondsToNextUnpublishedEpisode ?: DECADE);
|
||||
@ -325,7 +326,8 @@ class PodcastModel extends Model
|
||||
*/
|
||||
public function clearCache(array $data): array
|
||||
{
|
||||
$podcast = (new self())->find((int) (is_array($data['id']) ? $data['id'][0] : $data['id']));
|
||||
$podcast = new self()
|
||||
->find((int) (is_array($data['id']) ? $data['id'][0] : $data['id']));
|
||||
|
||||
// delete cache for users' podcasts
|
||||
cache()
|
||||
@ -389,21 +391,22 @@ class PodcastModel extends Model
|
||||
$domain =
|
||||
$url->getHost() . ($url->getPort() ? ':' . $url->getPort() : '');
|
||||
|
||||
$actorId = (new ActorModel())->insert(
|
||||
[
|
||||
'uri' => url_to('podcast-activity', $username),
|
||||
'username' => $username,
|
||||
'domain' => $domain,
|
||||
'private_key' => $privatekey,
|
||||
'public_key' => $publickey,
|
||||
'display_name' => $data['data']['title'],
|
||||
'summary' => $data['data']['description_html'],
|
||||
'inbox_url' => url_to('inbox', $username),
|
||||
'outbox_url' => url_to('outbox', $username),
|
||||
'followers_url' => url_to('followers', $username),
|
||||
],
|
||||
true,
|
||||
);
|
||||
$actorId = new ActorModel()
|
||||
->insert(
|
||||
[
|
||||
'uri' => url_to('podcast-activity', $username),
|
||||
'username' => $username,
|
||||
'domain' => $domain,
|
||||
'private_key' => $privatekey,
|
||||
'public_key' => $publickey,
|
||||
'display_name' => $data['data']['title'],
|
||||
'summary' => $data['data']['description_html'],
|
||||
'inbox_url' => url_to('inbox', $username),
|
||||
'outbox_url' => url_to('outbox', $username),
|
||||
'followers_url' => url_to('followers', $username),
|
||||
],
|
||||
true,
|
||||
);
|
||||
|
||||
$data['data']['actor_id'] = $actorId;
|
||||
|
||||
@ -417,10 +420,12 @@ class PodcastModel extends Model
|
||||
*/
|
||||
protected function setActorAvatar(array $data): array
|
||||
{
|
||||
$podcast = (new self())->find((int) (is_array($data['id']) ? $data['id'][0] : $data['id']));
|
||||
$podcast = new self()
|
||||
->find((int) (is_array($data['id']) ? $data['id'][0] : $data['id']));
|
||||
|
||||
if ($podcast instanceof Podcast) {
|
||||
$podcastActor = (new ActorModel())->find($podcast->actor_id);
|
||||
$podcastActor = new ActorModel()
|
||||
->find($podcast->actor_id);
|
||||
|
||||
if (! $podcastActor instanceof Actor) {
|
||||
return $data;
|
||||
@ -429,7 +434,8 @@ class PodcastModel extends Model
|
||||
$podcastActor->avatar_image_url = $podcast->cover->federation_url;
|
||||
$podcastActor->avatar_image_mimetype = $podcast->cover->federation_mimetype;
|
||||
|
||||
(new ActorModel())->update($podcast->actor_id, $podcastActor);
|
||||
new ActorModel()
|
||||
->update($podcast->actor_id, $podcastActor);
|
||||
}
|
||||
|
||||
return $data;
|
||||
@ -442,7 +448,8 @@ class PodcastModel extends Model
|
||||
*/
|
||||
protected function updatePodcastActor(array $data): array
|
||||
{
|
||||
$podcast = (new self())->find((int) (is_array($data['id']) ? $data['id'][0] : $data['id']));
|
||||
$podcast = new self()
|
||||
->find((int) (is_array($data['id']) ? $data['id'][0] : $data['id']));
|
||||
|
||||
if ($podcast instanceof Podcast) {
|
||||
$actorModel = new ActorModel();
|
||||
|
@ -32,21 +32,21 @@ class Checkbox extends FormComponent
|
||||
in_array($this->getValue(), ['yes', 'true', 'on', '1'], true),
|
||||
);
|
||||
|
||||
$hint = $this->hint === '' ? '' : (new Hint([
|
||||
$hint = $this->hint === '' ? '' : new Hint([
|
||||
'class' => 'ml-1',
|
||||
'slot' => $this->hint,
|
||||
]))->render();
|
||||
])->render();
|
||||
|
||||
$this->mergeClass('inline-flex items-start gap-x-2');
|
||||
|
||||
$helperText = '';
|
||||
if ($this->helper !== '') {
|
||||
$helperId = $this->name . 'Help';
|
||||
$helperText = (new Helper([
|
||||
$helperText = new Helper([
|
||||
'id' => $helperId,
|
||||
'slot' => $this->helper,
|
||||
'class' => '-mt-1',
|
||||
]))->render();
|
||||
])->render();
|
||||
$this->attributes['aria-describedby'] = $helperId;
|
||||
}
|
||||
|
||||
|
@ -44,10 +44,10 @@ class Field extends Component
|
||||
$helperText = '';
|
||||
if ($this->helper !== '') {
|
||||
$helperId = $this->name . 'Help';
|
||||
$helperText = (new Helper([
|
||||
$helperText = new Helper([
|
||||
'id' => $helperId,
|
||||
'slot' => $this->helper,
|
||||
]))->render();
|
||||
])->render();
|
||||
$this->attributes['aria-describedby'] = $helperId;
|
||||
}
|
||||
|
||||
|
@ -31,10 +31,10 @@ class Label extends Component
|
||||
lang('Common.optional') .
|
||||
')</small>' : '';
|
||||
|
||||
$hint = $this->hint === '' ? '' : (new Hint([
|
||||
$hint = $this->hint === '' ? '' : new Hint([
|
||||
'class' => 'ml-1',
|
||||
'slot' => $this->hint,
|
||||
]))->render();
|
||||
])->render();
|
||||
|
||||
$this->attributes['for'] = $this->for;
|
||||
|
||||
|
@ -41,23 +41,23 @@ class RadioGroup extends FormComponent
|
||||
'isRequired' => var_export($this->isRequired, true),
|
||||
];
|
||||
|
||||
$options .= (new RadioButton($radioButtonData))->render();
|
||||
$options .= new RadioButton($radioButtonData)->render();
|
||||
}
|
||||
|
||||
$helperText = '';
|
||||
if ($this->helper !== '') {
|
||||
$helperId = $this->name . 'Help';
|
||||
$helperText = (new Helper([
|
||||
$helperText = new Helper([
|
||||
'id' => $helperId,
|
||||
'slot' => $this->helper,
|
||||
]))->render();
|
||||
])->render();
|
||||
$this->attributes['aria-describedby'] = $helperId;
|
||||
}
|
||||
|
||||
$hint = $this->hint === '' ? '' : (new Hint([
|
||||
$hint = $this->hint === '' ? '' : new Hint([
|
||||
'class' => 'ml-1',
|
||||
'slot' => $this->hint,
|
||||
]))->render();
|
||||
])->render();
|
||||
|
||||
return <<<HTML
|
||||
<fieldset {$this->getStringifiedAttributes()}>
|
||||
|
@ -36,19 +36,19 @@ class Toggler extends FormComponent
|
||||
in_array($this->getValue(), ['yes', 'true', 'on', '1'], true),
|
||||
);
|
||||
|
||||
$hint = $this->hint === '' ? '' : (new Hint([
|
||||
$hint = $this->hint === '' ? '' : new Hint([
|
||||
'class' => 'ml-1',
|
||||
'slot' => $this->hint,
|
||||
]))->render();
|
||||
])->render();
|
||||
|
||||
$helperText = '';
|
||||
if ($this->helper !== '') {
|
||||
$helperId = $this->name . 'Help';
|
||||
$helperText = (new Helper([
|
||||
$helperText = new Helper([
|
||||
'id' => $helperId,
|
||||
'slot' => $this->helper,
|
||||
'class' => '-mt-1',
|
||||
]))->render();
|
||||
])->render();
|
||||
$this->attributes['aria-describedby'] = $helperId;
|
||||
}
|
||||
|
||||
|
@ -3,7 +3,7 @@
|
||||
--main-text-color: #555;
|
||||
--dark-text-color: #222;
|
||||
--light-text-color: #c7c7c7;
|
||||
--brand-primary-color: #e06e3f;
|
||||
--brand-primary-color: #dc4814;
|
||||
--light-bg-color: #ededee;
|
||||
--dark-bg-color: #404040;
|
||||
}
|
||||
@ -84,7 +84,7 @@ p.lead {
|
||||
text-align: center;
|
||||
padding: calc(4px + 0.2083vw);
|
||||
width: 100%;
|
||||
margin-top: -2.14rem;
|
||||
top: 0;
|
||||
position: fixed;
|
||||
}
|
||||
|
||||
|
@ -27,7 +27,7 @@ $errorId = uniqid('error', true);
|
||||
<!-- Header -->
|
||||
<div class="header">
|
||||
<div class="environment">
|
||||
Displayed at <?= esc(date('H:i:sa')) ?> —
|
||||
Displayed at <?= esc(date('H:i:s')) ?> —
|
||||
PHP: <?= esc(PHP_VERSION) ?> —
|
||||
CodeIgniter: <?= esc(CodeIgniter::CI_VERSION) ?> --
|
||||
Environment: <?= ENVIRONMENT ?>
|
||||
|
@ -9,38 +9,38 @@
|
||||
"php": "^8.4",
|
||||
"adaures/ipcat-php": "^v1.0.0",
|
||||
"adaures/podcast-persons-taxonomy": "^v1.0.1",
|
||||
"aws/aws-sdk-php": "^3.342.5",
|
||||
"aws/aws-sdk-php": "^3.356.3",
|
||||
"chrisjean/php-ico": "^1.0.4",
|
||||
"cocur/slugify": "^v4.6.0",
|
||||
"codeigniter4/framework": "v4.6.0",
|
||||
"codeigniter4/framework": "4.6.3",
|
||||
"codeigniter4/settings": "v2.2.0",
|
||||
"codeigniter4/shield": "v1.1.0",
|
||||
"codeigniter4/shield": "1.2.0",
|
||||
"codeigniter4/tasks": "dev-develop",
|
||||
"geoip2/geoip2": "v3.1.0",
|
||||
"geoip2/geoip2": "3.2.0",
|
||||
"james-heinrich/getid3": "^2.0.0-beta6",
|
||||
"league/commonmark": "^2.6.1",
|
||||
"league/commonmark": "^2.7.1",
|
||||
"league/html-to-markdown": "5.1.1",
|
||||
"melbahja/seo": "^v2.1.1",
|
||||
"michalsn/codeigniter4-uuid": "v1.1.0",
|
||||
"michalsn/codeigniter4-uuid": "1.3.0",
|
||||
"mpratt/embera": "^2.0.42",
|
||||
"opawg/user-agents-v2-php": "dev-main",
|
||||
"phpseclib/phpseclib": "~2.0.48",
|
||||
"vlucas/phpdotenv": "v5.6.1",
|
||||
"vlucas/phpdotenv": "5.6.2",
|
||||
"whichbrowser/parser": "^v2.1.8",
|
||||
"yassinedoghri/codeigniter-vite": "^v1.1.0",
|
||||
"yassinedoghri/php-icons": "^v1.2.0",
|
||||
"yassinedoghri/php-icons": "1.3.0",
|
||||
"yassinedoghri/podcast-feed": "dev-main"
|
||||
},
|
||||
"require-dev": {
|
||||
"captainhook/captainhook": "^5.25.0",
|
||||
"codeigniter/phpstan-codeigniter": "v1.5.3",
|
||||
"captainhook/captainhook": "^5.25.11",
|
||||
"codeigniter/phpstan-codeigniter": "1.5.4",
|
||||
"mikey179/vfsstream": "^v1.6.12",
|
||||
"phpstan/extension-installer": "^1.4.3",
|
||||
"phpstan/phpstan": "^2.1.8",
|
||||
"phpunit/phpunit": "^11.5.12",
|
||||
"rector/rector": "^2.0.10",
|
||||
"symplify/coding-standard": "^12.2.3",
|
||||
"symplify/easy-coding-standard": "^12.5.8"
|
||||
"phpstan/phpstan": "^2.1.22",
|
||||
"phpunit/phpunit": "^12.3.6",
|
||||
"rector/rector": "^2.1.4",
|
||||
"symplify/coding-standard": "^12.4.3",
|
||||
"symplify/easy-coding-standard": "^12.5.24"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
|
2756
composer.lock
generated
2756
composer.lock
generated
File diff suppressed because it is too large
Load Diff
@ -82,7 +82,6 @@ want to generate Video Clips. The following extensions must be installed:
|
||||
|
||||
**Note** - If you do not add this cron task, the following Castopod features
|
||||
will not work:
|
||||
|
||||
- Importing a podcast from an existing RSS feed
|
||||
- Broadcasting social activities to your followers in the fediverse
|
||||
- Broadcasting episodes to open hubs using
|
||||
|
@ -12,26 +12,22 @@ improvements ⚡.
|
||||
|
||||
0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
|
||||
database.
|
||||
|
||||
- cf.
|
||||
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
|
||||
|
||||
1. Go to the
|
||||
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and
|
||||
see if your instance is up to date with the latest Castopod version
|
||||
|
||||
- cf.
|
||||
[Where can I find my Castopod version?](#where-can-i-find-my-castopod-version)
|
||||
|
||||
2. Download the latest release package named `Castopod Package`, you may choose
|
||||
between the `zip` or `tar.gz` archives
|
||||
|
||||
- ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
|
||||
- Note that you can also download the latest package from
|
||||
[castopod.org](https://castopod.org/)
|
||||
|
||||
3. On your server:
|
||||
|
||||
- Remove all files except `.env` and `public/media`
|
||||
- Copy the new files from the downloaded package into your server
|
||||
|
||||
|
@ -82,7 +82,6 @@ want to generate Video Clips. The following extensions must be installed:
|
||||
|
||||
**Note** - If you do not add this cron task, the following Castopod features
|
||||
will not work:
|
||||
|
||||
- Importing a podcast from an existing RSS feed
|
||||
- Broadcasting social activities to your followers in the fediverse
|
||||
- Broadcasting episodes to open hubs using
|
||||
|
@ -12,26 +12,22 @@ improvements ⚡.
|
||||
|
||||
0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
|
||||
database.
|
||||
|
||||
- cf.
|
||||
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
|
||||
|
||||
1. Go to the
|
||||
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and
|
||||
see if your instance is up to date with the latest Castopod version
|
||||
|
||||
- cf.
|
||||
[Where can I find my Castopod version?](#where-can-i-find-my-castopod-version)
|
||||
|
||||
2. Download the latest release package named `Castopod Package`, you may choose
|
||||
between the `zip` or `tar.gz` archives
|
||||
|
||||
- ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
|
||||
- Note that you can also download the latest package from
|
||||
[castopod.org](https://castopod.org/)
|
||||
|
||||
3. On your server:
|
||||
|
||||
- Remove all files except `.env` and `public/media`
|
||||
- Copy the new files from the downloaded package into your server
|
||||
|
||||
|
@ -82,7 +82,6 @@ want to generate Video Clips. The following extensions must be installed:
|
||||
|
||||
**Note** - If you do not add this cron task, the following Castopod features
|
||||
will not work:
|
||||
|
||||
- Importing a podcast from an existing RSS feed
|
||||
- Broadcasting social activities to your followers in the fediverse
|
||||
- Broadcasting episodes to open hubs using
|
||||
|
@ -12,26 +12,22 @@ d'errors 🐛 i millores de rendiment ⚡.
|
||||
|
||||
0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
|
||||
database.
|
||||
|
||||
- cf.
|
||||
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
|
||||
|
||||
1. Go to the
|
||||
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and
|
||||
see if your instance is up to date with the latest Castopod version
|
||||
|
||||
- cf.
|
||||
[Where can I find my Castopod version?](#where-can-i-find-my-castopod-version)
|
||||
|
||||
2. Download the latest release package named `Castopod Package`, you may choose
|
||||
between the `zip` or `tar.gz` archives
|
||||
|
||||
- ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
|
||||
- Note that you can also download the latest package from
|
||||
[castopod.org](https://castopod.org/)
|
||||
|
||||
3. On your server:
|
||||
|
||||
- Remove all files except `.env` and `public/media`
|
||||
- Copy the new files from the downloaded package into your server
|
||||
|
||||
|
@ -82,7 +82,6 @@ want to generate Video Clips. The following extensions must be installed:
|
||||
|
||||
**Note** - If you do not add this cron task, the following Castopod features
|
||||
will not work:
|
||||
|
||||
- Importing a podcast from an existing RSS feed
|
||||
- Broadcasting social activities to your followers in the fediverse
|
||||
- Broadcasting episodes to open hubs using
|
||||
|
@ -12,26 +12,22 @@ improvements ⚡.
|
||||
|
||||
0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
|
||||
database.
|
||||
|
||||
- cf.
|
||||
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
|
||||
|
||||
1. Go to the
|
||||
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and
|
||||
see if your instance is up to date with the latest Castopod version
|
||||
|
||||
- cf.
|
||||
[Where can I find my Castopod version?](#where-can-i-find-my-castopod-version)
|
||||
|
||||
2. Download the latest release package named `Castopod Package`, you may choose
|
||||
between the `zip` or `tar.gz` archives
|
||||
|
||||
- ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
|
||||
- Note that you can also download the latest package from
|
||||
[castopod.org](https://castopod.org/)
|
||||
|
||||
3. On your server:
|
||||
|
||||
- Remove all files except `.env` and `public/media`
|
||||
- Copy the new files from the downloaded package into your server
|
||||
|
||||
|
@ -86,7 +86,6 @@ nicht installiert: %s:
|
||||
|
||||
**Hinweis** - Wenn Sie diese Cron-Aufgabe nicht hinzufügen, funktionieren die
|
||||
folgenden Castopod-Funktionen nicht:
|
||||
|
||||
- Einen Podcast aus einem vorhandenen RSS-Feed importieren
|
||||
- Sende soziale Aktivitäten an deine Follower im Fediversum
|
||||
- Übertragungen von Episoden zu open hubs mit
|
||||
|
@ -12,26 +12,22 @@ improvements ⚡.
|
||||
|
||||
0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
|
||||
database.
|
||||
|
||||
- cf.
|
||||
[Da li treba da napravim rezervnu kopiju pre ažuriranja?](#should-i-make-a-backup-before-updating)
|
||||
|
||||
1. Go to the
|
||||
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and
|
||||
see if your instance is up to date with the latest Castopod version
|
||||
|
||||
- cf.
|
||||
[Gde mogu da pronađem moju verziju Castopod-a?](#where-can-i-find-my-castopod-version)
|
||||
|
||||
2. Download the latest release package named `Castopod Package`, you may choose
|
||||
between the `zip` or `tar.gz` archives
|
||||
|
||||
- ⚠️ Uverite se da ste preuzeli Castopod paket a **NE** izvorni kod
|
||||
- Note that you can also download the latest package from
|
||||
[castopod.org](https://castopod.org/)
|
||||
|
||||
3. Na vašem serveru:
|
||||
|
||||
- Remove all files except `.env` and `public/media`
|
||||
- Copy the new files from the downloaded package into your server
|
||||
|
||||
|
@ -82,7 +82,6 @@ want to generate Video Clips. The following extensions must be installed:
|
||||
|
||||
**Note** - If you do not add this cron task, the following Castopod features
|
||||
will not work:
|
||||
|
||||
- Importing a podcast from an existing RSS feed
|
||||
- Broadcasting social activities to your followers in the fediverse
|
||||
- Broadcasting episodes to open hubs using
|
||||
|
@ -12,26 +12,22 @@ improvements ⚡.
|
||||
|
||||
0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
|
||||
database.
|
||||
|
||||
- cf.
|
||||
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
|
||||
|
||||
1. Go to the
|
||||
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and
|
||||
see if your instance is up to date with the latest Castopod version
|
||||
|
||||
- cf.
|
||||
[Where can I find my Castopod version?](#where-can-i-find-my-castopod-version)
|
||||
|
||||
2. Download the latest release package named `Castopod Package`, you may choose
|
||||
between the `zip` or `tar.gz` archives
|
||||
|
||||
- ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
|
||||
- Note that you can also download the latest package from
|
||||
[castopod.org](https://castopod.org/)
|
||||
|
||||
3. On your server:
|
||||
|
||||
- Remove all files except `.env` and `public/media`
|
||||
- Copy the new files from the downloaded package into your server
|
||||
|
||||
|
@ -82,7 +82,6 @@ want to generate Video Clips. The following extensions must be installed:
|
||||
|
||||
**Note** - If you do not add this cron task, the following Castopod features
|
||||
will not work:
|
||||
|
||||
- Importing a podcast from an existing RSS feed
|
||||
- Broadcasting social activities to your followers in the fediverse
|
||||
- Broadcasting episodes to open hubs using
|
||||
|
@ -12,26 +12,22 @@ improvements ⚡.
|
||||
|
||||
0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
|
||||
database.
|
||||
|
||||
- cf.
|
||||
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
|
||||
|
||||
1. Go to the
|
||||
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and
|
||||
see if your instance is up to date with the latest Castopod version
|
||||
|
||||
- cf.
|
||||
[Where can I find my Castopod version?](#where-can-i-find-my-castopod-version)
|
||||
|
||||
2. Download the latest release package named `Castopod Package`, you may choose
|
||||
between the `zip` or `tar.gz` archives
|
||||
|
||||
- ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
|
||||
- Note that you can also download the latest package from
|
||||
[castopod.org](https://castopod.org/)
|
||||
|
||||
3. On your server:
|
||||
|
||||
- Remove all files except `.env` and `public/media`
|
||||
- Copy the new files from the downloaded package into your server
|
||||
|
||||
|
@ -40,7 +40,6 @@ project generated for you!
|
||||
2. add a manifest.json file
|
||||
|
||||
<FileTree>
|
||||
|
||||
- hello-world
|
||||
- **manifest.json**
|
||||
|
||||
@ -51,7 +50,6 @@ project generated for you!
|
||||
3. add the Plugin.php class
|
||||
|
||||
<FileTree>
|
||||
|
||||
- hello-world
|
||||
- manifest.json
|
||||
- **Plugin.php**
|
||||
|
@ -85,7 +85,6 @@ extensiones:
|
||||
|
||||
**Note** - If you do not add this cron task, the following Castopod features
|
||||
will not work:
|
||||
|
||||
- Importing a podcast from an existing RSS feed
|
||||
- Broadcasting social activities to your followers in the fediverse
|
||||
- Broadcasting episodes to open hubs using
|
||||
|
@ -12,26 +12,22 @@ de errores 🐛 y mejoras de rendimiento ⚡.
|
||||
|
||||
0. ⚠️ Antes de cualquier actualización, te recomendamos que respaldes tus
|
||||
archivos de Castopod y base de datos.
|
||||
|
||||
- cf.
|
||||
[¿Debería hacer una copia de seguridad antes de actualizar?](#should-i-make-a-backup-before-updating)
|
||||
|
||||
1. Vaya a la página de
|
||||
[lanzamientos](https://code.castopod.org/adaures/castopod/-/releases) y vea
|
||||
si su instancia está actualizada con la última versión de Castopod
|
||||
|
||||
- cf.
|
||||
[¿Dónde puedo encontrar mi versión de Castopod?](#where-can-i-find-my-castopod-version)
|
||||
|
||||
2. Descargue el último paquete de lanzamiento llamado `Paquete Castopod`, puede
|
||||
elegir entre los archivos `zip` o `tar.gz`
|
||||
|
||||
- ⚠️ Asegúrate de descargar el paquete de Castopod y **NO** el código fuente
|
||||
- Ten en cuenta que también puedes descargar el último paquete de
|
||||
[castopod.org](https://castopod.org/)
|
||||
|
||||
3. En tu servidor:
|
||||
|
||||
- Eliminar todos los archivos excepto `.env` y la carpeta `public/media`
|
||||
- Copie los nuevos archivos del paquete descargado en su servidor
|
||||
|
||||
|
@ -82,7 +82,6 @@ want to generate Video Clips. The following extensions must be installed:
|
||||
|
||||
**Note** - If you do not add this cron task, the following Castopod features
|
||||
will not work:
|
||||
|
||||
- Importing a podcast from an existing RSS feed
|
||||
- Broadcasting social activities to your followers in the fediverse
|
||||
- Broadcasting episodes to open hubs using
|
||||
|
@ -12,26 +12,22 @@ improvements ⚡.
|
||||
|
||||
0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
|
||||
database.
|
||||
|
||||
- cf.
|
||||
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
|
||||
|
||||
1. Go to the
|
||||
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and
|
||||
see if your instance is up to date with the latest Castopod version
|
||||
|
||||
- cf.
|
||||
[Where can I find my Castopod version?](#where-can-i-find-my-castopod-version)
|
||||
|
||||
2. Download the latest release package named `Castopod Package`, you may choose
|
||||
between the `zip` or `tar.gz` archives
|
||||
|
||||
- ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
|
||||
- Note that you can also download the latest package from
|
||||
[castopod.org](https://castopod.org/)
|
||||
|
||||
3. On your server:
|
||||
|
||||
- Remove all files except `.env` and `public/media`
|
||||
- Copy the new files from the downloaded package into your server
|
||||
|
||||
|
@ -82,7 +82,6 @@ want to generate Video Clips. The following extensions must be installed:
|
||||
|
||||
**Note** - If you do not add this cron task, the following Castopod features
|
||||
will not work:
|
||||
|
||||
- Importing a podcast from an existing RSS feed
|
||||
- Broadcasting social activities to your followers in the fediverse
|
||||
- Broadcasting episodes to open hubs using
|
||||
|
@ -12,26 +12,22 @@ improvements ⚡.
|
||||
|
||||
0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
|
||||
database.
|
||||
|
||||
- cf.
|
||||
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
|
||||
|
||||
1. Go to the
|
||||
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and
|
||||
see if your instance is up to date with the latest Castopod version
|
||||
|
||||
- cf.
|
||||
[Where can I find my Castopod version?](#where-can-i-find-my-castopod-version)
|
||||
|
||||
2. Download the latest release package named `Castopod Package`, you may choose
|
||||
between the `zip` or `tar.gz` archives
|
||||
|
||||
- ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
|
||||
- Note that you can also download the latest package from
|
||||
[castopod.org](https://castopod.org/)
|
||||
|
||||
3. On your server:
|
||||
|
||||
- Remove all files except `.env` and `public/media`
|
||||
- Copy the new files from the downloaded package into your server
|
||||
|
||||
|
@ -82,7 +82,6 @@ want to generate Video Clips. The following extensions must be installed:
|
||||
|
||||
**Note** - If you do not add this cron task, the following Castopod features
|
||||
will not work:
|
||||
|
||||
- Importing a podcast from an existing RSS feed
|
||||
- Broadcasting social activities to your followers in the fediverse
|
||||
- Broadcasting episodes to open hubs using
|
||||
|
@ -12,26 +12,22 @@ improvements ⚡.
|
||||
|
||||
0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
|
||||
database.
|
||||
|
||||
- cf.
|
||||
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
|
||||
|
||||
1. Go to the
|
||||
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and
|
||||
see if your instance is up to date with the latest Castopod version
|
||||
|
||||
- cf.
|
||||
[Where can I find my Castopod version?](#where-can-i-find-my-castopod-version)
|
||||
|
||||
2. Download the latest release package named `Castopod Package`, you may choose
|
||||
between the `zip` or `tar.gz` archives
|
||||
|
||||
- ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
|
||||
- Note that you can also download the latest package from
|
||||
[castopod.org](https://castopod.org/)
|
||||
|
||||
3. On your server:
|
||||
|
||||
- Remove all files except `.env` and `public/media`
|
||||
- Copy the new files from the downloaded package into your server
|
||||
|
||||
|
@ -87,7 +87,6 @@ installées :
|
||||
|
||||
**Note** - If you do not add this cron task, the following Castopod features
|
||||
will not work:
|
||||
|
||||
- Importing a podcast from an existing RSS feed
|
||||
- Broadcasting social activities to your followers in the fediverse
|
||||
- Broadcasting episodes to open hubs using
|
||||
|
@ -12,27 +12,23 @@ corrections de bugs 🐛 et des améliorations de performance ⚡.
|
||||
|
||||
0. ⚠️ Avant toute mise à jour, nous vous recommandons fortement de sauvegarder
|
||||
vos fichiers Castopod et la base de données .
|
||||
|
||||
- cf.
|
||||
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
|
||||
|
||||
1. Allez à la page
|
||||
[des versions](https://code.castopod.org/adaures/castopod/-/releases) et
|
||||
vérifiez si votre instance est à jour avec la dernière version de Castopod
|
||||
|
||||
- cf.
|
||||
[Where can I find my Castopod version?](#where-can-i-find-my-castopod-version)
|
||||
|
||||
2. Téléchargez la dernière version du paquet nommé `Castopod Package`. Vous
|
||||
pouvez choisir entre les archives au format `zip` ou `tar.gz`
|
||||
|
||||
- ⚠️ Assurez-vous de bien télécharger le paquet Castopod et **NON** le code
|
||||
source
|
||||
- Notez que vous pouvez également télécharger le dernier paquet depuis
|
||||
[castopod.org](https://castopod.org/)
|
||||
|
||||
3. Sur votre serveur :
|
||||
|
||||
- Supprimer tous les fichiers sauf `.env` et `public/media`
|
||||
- Copiez les nouveaux fichiers du paquet téléchargé sur votre serveur
|
||||
|
||||
|
@ -86,7 +86,6 @@ installées :
|
||||
|
||||
**Note** - If you do not add this cron task, the following Castopod features
|
||||
will not work:
|
||||
|
||||
- Importing a podcast from an existing RSS feed
|
||||
- Broadcasting social activities to your followers in the fediverse
|
||||
- Broadcasting episodes to open hubs using
|
||||
|
@ -12,26 +12,22 @@ corrections de bugs 🐛 et des améliorations de performance ⚡.
|
||||
|
||||
0. ⚠️ Avant toute mise à jour, nous vous recommandons fortement de sauvegarder
|
||||
vos fichiers Castopod et la base de données .
|
||||
|
||||
- cf.
|
||||
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
|
||||
|
||||
1. Go to the
|
||||
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and
|
||||
see if your instance is up to date with the latest Castopod version
|
||||
|
||||
- cf.
|
||||
[Where can I find my Castopod version?](#where-can-i-find-my-castopod-version)
|
||||
|
||||
2. Download the latest release package named `Castopod Package`, you may choose
|
||||
between the `zip` or `tar.gz` archives
|
||||
|
||||
- ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
|
||||
- Note that you can also download the latest package from
|
||||
[castopod.org](https://castopod.org/)
|
||||
|
||||
3. Sur votre serveur :
|
||||
|
||||
- Supprimer tous les fichiers sauf `.env` et `public/media`
|
||||
- Copiez les nouveaux fichiers du paquet téléchargé sur votre serveur
|
||||
|
||||
|
@ -82,7 +82,6 @@ want to generate Video Clips. The following extensions must be installed:
|
||||
|
||||
**Note** - If you do not add this cron task, the following Castopod features
|
||||
will not work:
|
||||
|
||||
- Importing a podcast from an existing RSS feed
|
||||
- Broadcasting social activities to your followers in the fediverse
|
||||
- Broadcasting episodes to open hubs using
|
||||
|
@ -12,26 +12,22 @@ improvements ⚡.
|
||||
|
||||
0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
|
||||
database.
|
||||
|
||||
- cf.
|
||||
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
|
||||
|
||||
1. Go to the
|
||||
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and
|
||||
see if your instance is up to date with the latest Castopod version
|
||||
|
||||
- cf.
|
||||
[Where can I find my Castopod version?](#where-can-i-find-my-castopod-version)
|
||||
|
||||
2. Download the latest release package named `Castopod Package`, you may choose
|
||||
between the `zip` or `tar.gz` archives
|
||||
|
||||
- ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
|
||||
- Note that you can also download the latest package from
|
||||
[castopod.org](https://castopod.org/)
|
||||
|
||||
3. On your server:
|
||||
|
||||
- Remove all files except `.env` and `public/media`
|
||||
- Copy the new files from the downloaded package into your server
|
||||
|
||||
|
@ -82,7 +82,6 @@ want to generate Video Clips. The following extensions must be installed:
|
||||
|
||||
**Note** - If you do not add this cron task, the following Castopod features
|
||||
will not work:
|
||||
|
||||
- Importing a podcast from an existing RSS feed
|
||||
- Broadcasting social activities to your followers in the fediverse
|
||||
- Broadcasting episodes to open hubs using
|
||||
|
@ -12,26 +12,22 @@ improvements ⚡.
|
||||
|
||||
0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
|
||||
database.
|
||||
|
||||
- cf.
|
||||
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
|
||||
|
||||
1. Go to the
|
||||
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and
|
||||
see if your instance is up to date with the latest Castopod version
|
||||
|
||||
- cf.
|
||||
[Where can I find my Castopod version?](#where-can-i-find-my-castopod-version)
|
||||
|
||||
2. Download the latest release package named `Castopod Package`, you may choose
|
||||
between the `zip` or `tar.gz` archives
|
||||
|
||||
- ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
|
||||
- Note that you can also download the latest package from
|
||||
[castopod.org](https://castopod.org/)
|
||||
|
||||
3. On your server:
|
||||
|
||||
- Remove all files except `.env` and `public/media`
|
||||
- Copy the new files from the downloaded package into your server
|
||||
|
||||
|
@ -82,7 +82,6 @@ want to generate Video Clips. The following extensions must be installed:
|
||||
|
||||
**Note** - If you do not add this cron task, the following Castopod features
|
||||
will not work:
|
||||
|
||||
- Importing a podcast from an existing RSS feed
|
||||
- Broadcasting social activities to your followers in the fediverse
|
||||
- Broadcasting episodes to open hubs using
|
||||
|
@ -12,26 +12,22 @@ improvements ⚡.
|
||||
|
||||
0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
|
||||
database.
|
||||
|
||||
- cf.
|
||||
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
|
||||
|
||||
1. Go to the
|
||||
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and
|
||||
see if your instance is up to date with the latest Castopod version
|
||||
|
||||
- cf.
|
||||
[Where can I find my Castopod version?](#where-can-i-find-my-castopod-version)
|
||||
|
||||
2. Download the latest release package named `Castopod Package`, you may choose
|
||||
between the `zip` or `tar.gz` archives
|
||||
|
||||
- ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
|
||||
- Note that you can also download the latest package from
|
||||
[castopod.org](https://castopod.org/)
|
||||
|
||||
3. On your server:
|
||||
|
||||
- Remove all files except `.env` and `public/media`
|
||||
- Copy the new files from the downloaded package into your server
|
||||
|
||||
|
@ -82,7 +82,6 @@ want to generate Video Clips. The following extensions must be installed:
|
||||
|
||||
**Note** - If you do not add this cron task, the following Castopod features
|
||||
will not work:
|
||||
|
||||
- Importing a podcast from an existing RSS feed
|
||||
- Broadcasting social activities to your followers in the fediverse
|
||||
- Broadcasting episodes to open hubs using
|
||||
|
@ -12,26 +12,22 @@ improvements ⚡.
|
||||
|
||||
0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
|
||||
database.
|
||||
|
||||
- cf.
|
||||
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
|
||||
|
||||
1. Go to the
|
||||
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and
|
||||
see if your instance is up to date with the latest Castopod version
|
||||
|
||||
- cf.
|
||||
[Where can I find my Castopod version?](#where-can-i-find-my-castopod-version)
|
||||
|
||||
2. Download the latest release package named `Castopod Package`, you may choose
|
||||
between the `zip` or `tar.gz` archives
|
||||
|
||||
- ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
|
||||
- Note that you can also download the latest package from
|
||||
[castopod.org](https://castopod.org/)
|
||||
|
||||
3. On your server:
|
||||
|
||||
- Remove all files except `.env` and `public/media`
|
||||
- Copy the new files from the downloaded package into your server
|
||||
|
||||
|
@ -82,7 +82,6 @@ want to generate Video Clips. The following extensions must be installed:
|
||||
|
||||
**Note** - If you do not add this cron task, the following Castopod features
|
||||
will not work:
|
||||
|
||||
- Importing a podcast from an existing RSS feed
|
||||
- Broadcasting social activities to your followers in the fediverse
|
||||
- Broadcasting episodes to open hubs using
|
||||
|
@ -12,26 +12,22 @@ improvements ⚡.
|
||||
|
||||
0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
|
||||
database.
|
||||
|
||||
- cf.
|
||||
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
|
||||
|
||||
1. Go to the
|
||||
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and
|
||||
see if your instance is up to date with the latest Castopod version
|
||||
|
||||
- cf.
|
||||
[Where can I find my Castopod version?](#where-can-i-find-my-castopod-version)
|
||||
|
||||
2. Download the latest release package named `Castopod Package`, you may choose
|
||||
between the `zip` or `tar.gz` archives
|
||||
|
||||
- ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
|
||||
- Note that you can also download the latest package from
|
||||
[castopod.org](https://castopod.org/)
|
||||
|
||||
3. On your server:
|
||||
|
||||
- Remove all files except `.env` and `public/media`
|
||||
- Copy the new files from the downloaded package into your server
|
||||
|
||||
|
@ -82,7 +82,6 @@ want to generate Video Clips. The following extensions must be installed:
|
||||
|
||||
**Note** - If you do not add this cron task, the following Castopod features
|
||||
will not work:
|
||||
|
||||
- Importing a podcast from an existing RSS feed
|
||||
- Broadcasting social activities to your followers in the fediverse
|
||||
- Broadcasting episodes to open hubs using
|
||||
|
@ -12,26 +12,22 @@ improvements ⚡.
|
||||
|
||||
0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
|
||||
database.
|
||||
|
||||
- cf.
|
||||
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
|
||||
|
||||
1. Go to the
|
||||
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and
|
||||
see if your instance is up to date with the latest Castopod version
|
||||
|
||||
- cf.
|
||||
[Where can I find my Castopod version?](#where-can-i-find-my-castopod-version)
|
||||
|
||||
2. Download the latest release package named `Castopod Package`, you may choose
|
||||
between the `zip` or `tar.gz` archives
|
||||
|
||||
- ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
|
||||
- Note that you can also download the latest package from
|
||||
[castopod.org](https://castopod.org/)
|
||||
|
||||
3. On your server:
|
||||
|
||||
- Remove all files except `.env` and `public/media`
|
||||
- Copy the new files from the downloaded package into your server
|
||||
|
||||
|
@ -82,7 +82,6 @@ want to generate Video Clips. The following extensions must be installed:
|
||||
|
||||
**Note** - If you do not add this cron task, the following Castopod features
|
||||
will not work:
|
||||
|
||||
- Importing a podcast from an existing RSS feed
|
||||
- Broadcasting social activities to your followers in the fediverse
|
||||
- Broadcasting episodes to open hubs using
|
||||
|
@ -12,26 +12,22 @@ improvements ⚡.
|
||||
|
||||
0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
|
||||
database.
|
||||
|
||||
- cf.
|
||||
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
|
||||
|
||||
1. Go to the
|
||||
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and
|
||||
see if your instance is up to date with the latest Castopod version
|
||||
|
||||
- cf.
|
||||
[Where can I find my Castopod version?](#where-can-i-find-my-castopod-version)
|
||||
|
||||
2. Download the latest release package named `Castopod Package`, you may choose
|
||||
between the `zip` or `tar.gz` archives
|
||||
|
||||
- ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
|
||||
- Note that you can also download the latest package from
|
||||
[castopod.org](https://castopod.org/)
|
||||
|
||||
3. On your server:
|
||||
|
||||
- Remove all files except `.env` and `public/media`
|
||||
- Copy the new files from the downloaded package into your server
|
||||
|
||||
|
@ -82,7 +82,6 @@ want to generate Video Clips. The following extensions must be installed:
|
||||
|
||||
**Note** - If you do not add this cron task, the following Castopod features
|
||||
will not work:
|
||||
|
||||
- Importing a podcast from an existing RSS feed
|
||||
- Broadcasting social activities to your followers in the fediverse
|
||||
- Broadcasting episodes to open hubs using
|
||||
|
@ -12,26 +12,22 @@ improvements ⚡.
|
||||
|
||||
0. ⚠️ Before any update, we highly recommend you backup your Castopod files and
|
||||
database.
|
||||
|
||||
- cf.
|
||||
[Should I make a backup before updating?](#should-i-make-a-backup-before-updating)
|
||||
|
||||
1. Go to the
|
||||
[releases page](https://code.castopod.org/adaures/castopod/-/releases) and
|
||||
see if your instance is up to date with the latest Castopod version
|
||||
|
||||
- cf.
|
||||
[Where can I find my Castopod version?](#where-can-i-find-my-castopod-version)
|
||||
|
||||
2. Download the latest release package named `Castopod Package`, you may choose
|
||||
between the `zip` or `tar.gz` archives
|
||||
|
||||
- ⚠️ Make sure you download the Castopod Package and **NOT** the Source Code
|
||||
- Note that you can also download the latest package from
|
||||
[castopod.org](https://castopod.org/)
|
||||
|
||||
3. On your server:
|
||||
|
||||
- Remove all files except `.env` and `public/media`
|
||||
- Copy the new files from the downloaded package into your server
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user