feat(themes): set different default banner per theme
40
app/Config/Fediverse.php
Normal file
@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* @copyright 2022 Podlibre
|
||||
* @license https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
|
||||
* @link https://castopod.org/
|
||||
*/
|
||||
|
||||
namespace Config;
|
||||
|
||||
use Modules\Fediverse\Config\Fediverse as FediverseBaseConfig;
|
||||
|
||||
class Fediverse extends FediverseBaseConfig
|
||||
{
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
$defaultBanner = config('Images')
|
||||
->podcastBannerDefaultPaths[service('settings')->get('App.theme')] ?? config(
|
||||
'Images'
|
||||
)->podcastBannerDefaultPaths['default'];
|
||||
|
||||
['dirname' => $dirname, 'extension' => $extension, 'filename' => $filename] = pathinfo(
|
||||
$defaultBanner['path']
|
||||
);
|
||||
$defaultBannerPath = $filename;
|
||||
if ($dirname !== '.') {
|
||||
$defaultBannerPathList = [$dirname, $filename];
|
||||
$defaultBannerPath = implode('/', $defaultBannerPathList);
|
||||
}
|
||||
|
||||
helper('media');
|
||||
|
||||
$this->defaultCoverImagePath = media_path($defaultBannerPath . '_federation.' . $extension);
|
||||
$this->defaultCoverImageMimetype = $defaultBanner['mimetype'];
|
||||
}
|
||||
}
|
@ -126,11 +126,43 @@ class Images extends BaseConfig
|
||||
],
|
||||
];
|
||||
|
||||
public string $avatarDefaultPath = 'castopod-avatar-default.jpg';
|
||||
public string $avatarDefaultPath = 'castopod-avatar.jpg';
|
||||
|
||||
public string $avatarDefaultMimeType = 'image/jpg';
|
||||
|
||||
public string $podcastBannerDefaultPath = 'castopod-banner-default.jpg';
|
||||
/**
|
||||
* @var array<string, array<string, string>>
|
||||
*/
|
||||
public array $podcastBannerDefaultPaths = [
|
||||
'default' => [
|
||||
'path' => 'castopod-banner-pine.jpg',
|
||||
'mimetype' => 'image/jpeg',
|
||||
],
|
||||
'pine' => [
|
||||
'path' => 'castopod-banner-pine.jpg',
|
||||
'mimetype' => 'image/jpeg',
|
||||
],
|
||||
'crimson' => [
|
||||
'path' => 'castopod-banner-crimson.jpg',
|
||||
'mimetype' => 'image/jpeg',
|
||||
],
|
||||
'amber' => [
|
||||
'path' => 'castopod-banner-amber.jpg',
|
||||
'mimetype' => 'image/jpeg',
|
||||
],
|
||||
'lake' => [
|
||||
'path' => 'castopod-banner-lake.jpg',
|
||||
'mimetype' => 'image/jpeg',
|
||||
],
|
||||
'jacaranda' => [
|
||||
'path' => 'castopod-banner-jacaranda.jpg',
|
||||
'mimetype' => 'image/jpeg',
|
||||
],
|
||||
'onyx' => [
|
||||
'path' => 'castopod-banner-onyx.jpg',
|
||||
'mimetype' => 'image/jpeg',
|
||||
],
|
||||
];
|
||||
|
||||
public string $podcastBannerDefaultMimeType = 'image/jpeg';
|
||||
|
||||
@ -144,6 +176,10 @@ class Images extends BaseConfig
|
||||
* @var array<string, array<string, int|string>>
|
||||
*/
|
||||
public array $personAvatarSizes = [
|
||||
'federation' => [
|
||||
'width' => 400,
|
||||
'height' => 400,
|
||||
],
|
||||
'tiny' => [
|
||||
'width' => 40,
|
||||
'height' => 40,
|
||||
|
@ -42,8 +42,7 @@ class WebmanifestController extends Controller
|
||||
'background' => '#F9F3F0',
|
||||
],
|
||||
'onyx' => [
|
||||
'theme' =>
|
||||
'#040406',
|
||||
'theme' => '#040406',
|
||||
'background' => '#F3F3F7',
|
||||
],
|
||||
];
|
||||
|
@ -271,11 +271,13 @@ class Podcast extends Entity
|
||||
public function getBanner(): Image
|
||||
{
|
||||
if ($this->banner_id === null) {
|
||||
$defaultBanner = config('Images')
|
||||
->podcastBannerDefaultPaths[service('settings')->get('App.theme')] ?? config(
|
||||
'Images'
|
||||
)->podcastBannerDefaultPaths['default'];
|
||||
return new Image([
|
||||
'file_path' => config('Images')
|
||||
->podcastBannerDefaultPath,
|
||||
'file_mimetype' => config('Images')
|
||||
->podcastBannerDefaultMimeType,
|
||||
'file_path' => $defaultBanner['path'],
|
||||
'file_mimetype' => $defaultBanner['mimetype'],
|
||||
'file_size' => 0,
|
||||
'file_metadata' => [
|
||||
'sizes' => config('Images')
|
||||
|
@ -12,6 +12,7 @@ namespace Modules\Admin\Controllers;
|
||||
|
||||
use App\Entities\Location;
|
||||
use App\Entities\Podcast;
|
||||
use App\Models\ActorModel;
|
||||
use App\Models\CategoryModel;
|
||||
use App\Models\EpisodeModel;
|
||||
use App\Models\LanguageModel;
|
||||
@ -369,6 +370,10 @@ class PodcastController extends BaseController
|
||||
return redirect()->back();
|
||||
}
|
||||
|
||||
$db = db_connect();
|
||||
|
||||
$db->transStart();
|
||||
|
||||
$mediaModel = new MediaModel();
|
||||
if (! $mediaModel->deleteMedia($this->podcast->banner)) {
|
||||
return redirect()
|
||||
@ -377,6 +382,18 @@ class PodcastController extends BaseController
|
||||
->with('errors', $mediaModel->errors());
|
||||
}
|
||||
|
||||
// remove banner url from actor
|
||||
$actor = (new ActorModel())->getActorById($this->podcast->actor_id);
|
||||
|
||||
if ($actor !== null) {
|
||||
$actor->cover_image_url = null;
|
||||
$actor->cover_image_mimetype = null;
|
||||
|
||||
(new ActorModel())->update($actor->id, $actor);
|
||||
}
|
||||
|
||||
$db->transComplete();
|
||||
|
||||
return redirect()->back();
|
||||
}
|
||||
|
||||
|
@ -30,11 +30,11 @@ class Fediverse extends BaseConfig
|
||||
* Default avatar and cover images
|
||||
* --------------------------------------------------------------------
|
||||
*/
|
||||
public string $defaultAvatarImagePath = 'media/castopod-avatar-default_thumbnail.jpg';
|
||||
public string $defaultAvatarImagePath = 'media/castopod-avatar_fediveration.jpg';
|
||||
|
||||
public string $defaultAvatarImageMimetype = 'image/jpeg';
|
||||
|
||||
public string $defaultCoverImagePath = 'media/castopod-cover-default.jpg';
|
||||
public string $defaultCoverImagePath = 'media/castopod-banner-pine_fediveration.jpg';
|
||||
|
||||
public string $defaultCoverImageMimetype = 'image/jpeg';
|
||||
|
||||
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
Before Width: | Height: | Size: 9.9 KiB After Width: | Height: | Size: 9.9 KiB |
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 4.8 KiB |
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
BIN
public/media/castopod-banner-amber.jpg
Normal file
After Width: | Height: | Size: 29 KiB |
BIN
public/media/castopod-banner-amber_federation.jpg
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
public/media/castopod-banner-amber_medium.webp
Normal file
After Width: | Height: | Size: 6.6 KiB |
BIN
public/media/castopod-banner-amber_small.webp
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
public/media/castopod-banner-crimson.jpg
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
public/media/castopod-banner-crimson_federation.jpg
Normal file
After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 6.8 KiB After Width: | Height: | Size: 6.6 KiB |
BIN
public/media/castopod-banner-crimson_small.webp
Normal file
After Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 1.7 KiB |
BIN
public/media/castopod-banner-jacaranda.jpg
Normal file
After Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 14 KiB |
BIN
public/media/castopod-banner-jacaranda_medium.webp
Normal file
After Width: | Height: | Size: 6.6 KiB |
BIN
public/media/castopod-banner-jacaranda_small.webp
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
public/media/castopod-banner-lake.jpg
Normal file
After Width: | Height: | Size: 27 KiB |
BIN
public/media/castopod-banner-lake_federation.jpg
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
public/media/castopod-banner-lake_medium.webp
Normal file
After Width: | Height: | Size: 6.5 KiB |
BIN
public/media/castopod-banner-lake_small.webp
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
public/media/castopod-banner-onyx.jpg
Normal file
After Width: | Height: | Size: 25 KiB |
BIN
public/media/castopod-banner-onyx_federation.jpg
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
public/media/castopod-banner-onyx_medium.webp
Normal file
After Width: | Height: | Size: 6.6 KiB |
BIN
public/media/castopod-banner-onyx_small.webp
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
public/media/castopod-banner-pine.jpg
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
public/media/castopod-banner-pine_federation.jpg
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
public/media/castopod-banner-pine_medium.webp
Normal file
After Width: | Height: | Size: 6.4 KiB |
BIN
public/media/castopod-banner-pine_small.webp
Normal file
After Width: | Height: | Size: 1.6 KiB |
@ -1,6 +1,6 @@
|
||||
<article class="relative flex flex-col flex-1 flex-shrink-0 w-full transition group overflow-hidden bg-elevated border-3 snap-center hover:shadow-lg focus-within:shadow-lg focus-within:ring-accent border-subtle rounded-xl min-w-[12rem] max-w-[17rem]">
|
||||
<a href="<?= route_to('episode-view', $episode->podcast->id, $episode->id) ?>" class="flex flex-col justify-end w-full h-full text-white group">
|
||||
<div class="absolute bottom-0 left-0 z-10 w-full h-full backdrop-gradient"></div>
|
||||
<div class="absolute bottom-0 left-0 z-10 w-full h-full backdrop-gradient mix-blend-multiply"></div>
|
||||
<div class="w-full h-full overflow-hidden">
|
||||
<img src="<?= $episode->cover->medium_url ?>" alt="<?= $episode->title ?>" class="object-cover w-full h-full transition duration-200 ease-in-out transform group-focus:scale-105 group-hover:scale-105 aspect-square" />
|
||||
</div>
|
||||
|
@ -1,6 +1,6 @@
|
||||
<article class="relative h-full overflow-hidden transition shadow bg-elevated border-3 border-subtle rounded-xl group hover:shadow-xl focus-within:shadow-xl focus-within:ring-accent">
|
||||
<a href="<?= route_to('person-view', $person->id) ?>" class="flex flex-col justify-end w-full h-full text-white group">
|
||||
<div class="absolute bottom-0 left-0 z-10 w-full h-full backdrop-gradient"></div>
|
||||
<div class="absolute bottom-0 left-0 z-10 w-full h-full backdrop-gradient mix-blend-multiply"></div>
|
||||
<div class="w-full h-full overflow-hidden">
|
||||
<img alt="<?= $person->full_name ?>" src="<?= $person->avatar->medium_url ?>" class="object-cover w-full h-full transition duration-200 ease-in-out transform aspect-square group-focus:scale-105 group-hover:scale-105" />
|
||||
</div>
|
||||
|
@ -1,6 +1,6 @@
|
||||
<article class="relative h-full overflow-hidden transition shadow bg-elevated border-3 border-subtle group rounded-xl hover:shadow-xl focus-within:shadow-xl focus-within:ring-accent">
|
||||
<a href="<?= route_to('podcast-view', $podcast->id) ?>" class="flex flex-col justify-end w-full h-full text-white group">
|
||||
<div class="absolute bottom-0 left-0 z-10 w-full h-full backdrop-gradient"></div>
|
||||
<div class="absolute bottom-0 left-0 z-10 w-full h-full backdrop-gradient mix-blend-multiply"></div>
|
||||
<div class="w-full h-full overflow-hidden">
|
||||
<img
|
||||
alt="<?= $podcast->title ?>"
|
||||
|
@ -59,7 +59,7 @@
|
||||
<?php foreach ($podcasts as $podcast): ?>
|
||||
<a href="<?= $podcast->link ?>" class="relative w-full h-full overflow-hidden transition shadow focus:ring-accent rounded-xl border-subtle hover:shadow-xl focus:shadow-xl group border-3">
|
||||
<article class="text-white">
|
||||
<div class="absolute bottom-0 left-0 z-10 w-full h-full backdrop-gradient"></div>
|
||||
<div class="absolute bottom-0 left-0 z-10 w-full h-full backdrop-gradient mix-blend-multiply"></div>
|
||||
<div class="w-full h-full overflow-hidden">
|
||||
<img alt="<?= $podcast->title ?>" src="<?= $podcast->cover->medium_url ?>" class="object-cover w-full h-full transition duration-200 ease-in-out transform aspect-square group-focus:scale-105 group-hover:scale-105" />
|
||||
</div>
|
||||
|
@ -44,7 +44,7 @@
|
||||
<?php endif; ?>
|
||||
|
||||
<header class="relative z-50 flex flex-col-reverse justify-between w-full col-start-2 bg-top bg-no-repeat bg-cover sm:flex-row sm:items-end bg-header aspect-[3/1]" style="background-image: url('<?= $podcast->banner->medium_url ?>');">
|
||||
<div class="absolute bottom-0 left-0 w-full h-full backdrop-gradient"></div>
|
||||
<div class="absolute bottom-0 left-0 w-full h-full backdrop-gradient mix-blend-multiply"></div>
|
||||
<div class="z-10 flex items-center pl-4 -mb-6 md:pl-8 md:-mb-8 gap-x-4">
|
||||
<img src="<?= $podcast->cover->thumbnail_url ?>" alt="<?= $podcast->title ?>" loading="lazy" class="h-24 rounded-full sm:h-28 md:h-36 ring-3 ring-background-elevated aspect-square" />
|
||||
<div class="relative flex flex-col text-white -top-2 sm:top-0 md:top-2">
|
||||
|