From 3f4a6bd0b9f870f16107a41b102b6bf734868198 Mon Sep 17 00:00:00 2001 From: Yassine Doghri <yassine@doghri.fr> Date: Thu, 29 Oct 2020 17:25:15 +0000 Subject: [PATCH] feat: add episode_numbering() component helper to display episode and season numbers --- app/Controllers/Admin/Episode.php | 12 +++- app/Controllers/Admin/Podcast.php | 4 +- app/Helpers/components_helper.php | 66 ++++++++++++++++++++- app/Helpers/id3_helper.php | 2 +- app/Helpers/rss_helper.php | 3 +- app/Language/en/Episode.php | 1 + app/Language/fr/Episode.php | 1 + app/Views/admin/episode/create.php | 1 - app/Views/admin/episode/edit.php | 1 - app/Views/admin/episode/list.php | 44 ++++---------- app/Views/admin/podcast/latest_episodes.php | 37 ++---------- app/Views/episode.php | 23 ++----- app/Views/podcast.php | 7 ++- 13 files changed, 108 insertions(+), 94 deletions(-) diff --git a/app/Controllers/Admin/Episode.php b/app/Controllers/Admin/Episode.php index 6dc61de177..0e1d348f61 100644 --- a/app/Controllers/Admin/Episode.php +++ b/app/Controllers/Admin/Episode.php @@ -118,8 +118,12 @@ class Episode extends BaseController $this->request->getPost('parental_advisory') !== 'undefined' ? $this->request->getPost('parental_advisory') : null, - 'number' => $this->request->getPost('episode_number'), - 'season_number' => $this->request->getPost('season_number'), + 'number' => $this->request->getPost('episode_number') + ? $this->request->getPost('episode_number') + : null, + 'season_number' => $this->request->getPost('season_number') + ? $this->request->getPost('season_number') + : null, 'type' => $this->request->getPost('type'), 'is_blocked' => $this->request->getPost('block') == 'yes', 'created_by' => user(), @@ -204,7 +208,9 @@ class Episode extends BaseController $this->request->getPost('parental_advisory') !== 'undefined' ? $this->request->getPost('parental_advisory') : null; - $this->episode->number = $this->request->getPost('episode_number'); + $this->episode->number = $this->request->getPost('episode_number') + ? $this->request->getPost('episode_number') + : null; $this->episode->season_number = $this->request->getPost('season_number') ? $this->request->getPost('season_number') : null; diff --git a/app/Controllers/Admin/Podcast.php b/app/Controllers/Admin/Podcast.php index c46ed1e8a5..a6e9e2023b 100644 --- a/app/Controllers/Admin/Podcast.php +++ b/app/Controllers/Admin/Podcast.php @@ -384,7 +384,9 @@ class Podcast extends BaseController 'number' => $this->request->getPost('force_renumber') === 'yes' ? $itemNumber - : $nsItunes->episode, + : (!empty($nsItunes->episode) + ? $nsItunes->episode + : null), 'season_number' => empty( $this->request->getPost('season_number') ) diff --git a/app/Helpers/components_helper.php b/app/Helpers/components_helper.php index 0e31cb651a..ae528dc4a5 100644 --- a/app/Helpers/components_helper.php +++ b/app/Helpers/components_helper.php @@ -259,9 +259,9 @@ if (!function_exists('data_table')) { if (!function_exists('publication_pill')) { /** - * Data table component + * Publication pill component * - * Creates a stylized table. + * Shows the stylized publication datetime in regards to current datetime. * * @param \CodeIgniter\I18n\Time $publicationDate publication datetime of the episode * @param boolean $isPublished whether or not the episode has been published @@ -303,4 +303,66 @@ if (!function_exists('publication_pill')) { '</span>'; } } + +// ------------------------------------------------------------------------ + +if (!function_exists('episode_numbering')) { + /** + * Returns relevant translated episode numbering. + * + * @param int|null $episodeNumber + * @param int|null $seasonNumber + * @param string $class styling classes + * @param string $is_abbr component will show abbreviated numbering if true + * + * @return string + */ + function episode_numbering( + $episodeNumber = null, + $seasonNumber = null, + $class = '', + $isAbbr = false + ): string { + if (!$episodeNumber && !$seasonNumber) { + return ''; + } + + $transKey = ''; + $args = []; + if ($episodeNumber && $seasonNumber) { + $transKey = 'Episode.season_episode'; + $args = [ + 'seasonNumber' => $seasonNumber, + 'episodeNumber' => $episodeNumber, + ]; + } elseif ($episodeNumber && !$seasonNumber) { + $transKey = 'Episode.number'; + $args = [ + 'episodeNumber' => $episodeNumber, + ]; + } elseif (!$episodeNumber && $seasonNumber) { + $transKey = 'Episode.season'; + $args = [ + 'seasonNumber' => $seasonNumber, + ]; + } + + if ($isAbbr) { + return '<abbr class="' . + $class . + '" title="' . + lang($transKey, $args) . + '">' . + lang($transKey . '_abbr', $args) . + '</abbr>'; + } + + return '<span class="' . + $class . + '">' . + lang($transKey, $args) . + '</span>'; + } +} + // ------------------------------------------------------------------------ diff --git a/app/Helpers/id3_helper.php b/app/Helpers/id3_helper.php index 2e7b185969..5046c72c46 100644 --- a/app/Helpers/id3_helper.php +++ b/app/Helpers/id3_helper.php @@ -70,7 +70,7 @@ function write_enclosure_tags($episode) $episode->published_at ? $episode->published_at->format('Y') : '', ], 'genre' => ['Podcast'], - 'comment' => [$episode->description_html], + 'comment' => [$episode->description], 'track_number' => [strval($episode->number)], 'copyright_message' => [$episode->podcast->copyright], 'publisher' => [ diff --git a/app/Helpers/rss_helper.php b/app/Helpers/rss_helper.php index 93dbbdcefc..f09da92b97 100644 --- a/app/Helpers/rss_helper.php +++ b/app/Helpers/rss_helper.php @@ -142,7 +142,8 @@ function get_rss_feed($podcast, $serviceName = '') $itunes_namespace ); - $item->addChild('episode', $episode->number, $itunes_namespace); + $episode->number && + $item->addChild('episode', $episode->number, $itunes_namespace); $episode->season_number && $item->addChild( 'season', diff --git a/app/Language/en/Episode.php b/app/Language/en/Episode.php index 61f0132db0..652bad3ac9 100644 --- a/app/Language/en/Episode.php +++ b/app/Language/en/Episode.php @@ -12,6 +12,7 @@ return [ 'next_episode' => 'Next episode', 'next_season' => 'Next season', 'season' => 'Season {seasonNumber}', + 'season_abbr' => 'S{seasonNumber}', 'number' => 'Episode {episodeNumber}', 'number_abbr' => 'Ep. {episodeNumber}', 'season_episode' => 'Season {seasonNumber} episode {episodeNumber}', diff --git a/app/Language/fr/Episode.php b/app/Language/fr/Episode.php index 2b5716cd76..a98e63b974 100644 --- a/app/Language/fr/Episode.php +++ b/app/Language/fr/Episode.php @@ -12,6 +12,7 @@ return [ 'next_episode' => 'Épisode suivant', 'next_season' => 'Saison suivante', 'season' => 'Saison {seasonNumber}', + 'season_abbr' => 'S{seasonNumber}', 'number' => 'Épisode {episodeNumber}', 'number_abbr' => 'Ep. {episodeNumber}', 'season_episode' => 'Saison {seasonNumber} épisode {episodeNumber}', diff --git a/app/Views/admin/episode/create.php b/app/Views/admin/episode/create.php index a948b1fa08..6d1e50c96e 100644 --- a/app/Views/admin/episode/create.php +++ b/app/Views/admin/episode/create.php @@ -104,7 +104,6 @@ 'name' => 'episode_number', 'class' => 'form-input w-full', 'value' => old('episode_number'), - 'required' => 'required', 'type' => 'number', ]) ?> </div> diff --git a/app/Views/admin/episode/edit.php b/app/Views/admin/episode/edit.php index b2f9382faa..2b5db05fdf 100644 --- a/app/Views/admin/episode/edit.php +++ b/app/Views/admin/episode/edit.php @@ -108,7 +108,6 @@ 'name' => 'episode_number', 'class' => 'form-input w-full', 'value' => old('episode_number', $episode->number), - 'required' => 'required', 'type' => 'number', ]) ?> </div> diff --git a/app/Views/admin/episode/list.php b/app/Views/admin/episode/list.php index 9f0330086b..dff7ceffb1 100644 --- a/app/Views/admin/episode/list.php +++ b/app/Views/admin/episode/list.php @@ -11,12 +11,10 @@ <?= $this->endSection() ?> <?= $this->section('headerRight') ?> -<?= button( - lang('Episode.create'), - route_to('episode-create', $podcast->id), - - ['variant' => 'primary', 'iconLeft' => 'add'] -) ?> +<?= button(lang('Episode.create'), route_to('episode-create', $podcast->id), [ + 'variant' => 'primary', + 'iconLeft' => 'add', +]) ?> <?= $this->endSection() ?> @@ -43,34 +41,12 @@ ) ?>"> <h2 class="inline-flex justify-between w-full font-bold leading-none group"> <span class="mr-1 group-hover:underline"><?= $episode->title ?></span> - <?php if ( - $episode->season_number && - $episode->number - ): ?> - <abbr class="text-xs font-bold text-gray-600" title="<?= lang( - 'Episode.season_episode', - [ - 'seasonNumber' => - $episode->season_number, - 'episodeNumber' => $episode->number, - ] - ) ?>"><?= lang('Episode.season_episode_abbr', [ - 'seasonNumber' => $episode->season_number, - 'episodeNumber' => $episode->number, -]) ?></abbr> - <?php elseif ( - !$episode->season_number && - $episode->number - ): ?> - <abbr class="text-xs font-bold text-gray-600" title="<?= lang( - 'Episode.number', - [ - 'episodeNumber' => $episode->number, - ] - ) ?>"><?= lang('Episode.number_abbr', [ - 'episodeNumber' => $episode->number, -]) ?></abbr> - <?php endif; ?> + <?= episode_numbering( + $episode->number, + $episode->season_number, + 'text-xs font-bold text-gray-600', + true + ) ?> </h2> </a> <div class="relative" data-toggle="dropdown"> diff --git a/app/Views/admin/podcast/latest_episodes.php b/app/Views/admin/podcast/latest_episodes.php index b4dadbfa8c..9613909276 100644 --- a/app/Views/admin/podcast/latest_episodes.php +++ b/app/Views/admin/podcast/latest_episodes.php @@ -27,37 +27,12 @@ ><?= $episode->title ?> </a> <div class="text-xs"> - <?php if ( - $episode->season_number && - $episode->number - ): ?> - <abbr class="font-bold text-gray-600" title="<?= lang( - 'Episode.season_episode', - [ - 'seasonNumber' => - $episode->season_number, - 'episodeNumber' => $episode->number, - ] - ) ?>"><?= lang( - 'Episode.season_episode_abbr', - [ - 'seasonNumber' => $episode->season_number, - 'episodeNumber' => $episode->number, - ] -) ?></abbr> - <?php elseif ( - !$episode->season_number && - $episode->number - ): ?> - <abbr class="font-bold text-gray-600" title="<?= lang( - 'Episode.number', - [ - 'episodeNumber' => $episode->number, - ] - ) ?>"><?= lang('Episode.number_abbr', [ - 'episodeNumber' => $episode->number, -]) ?></abbr> - <?php endif; ?> + <?= episode_numbering( + $episode->number, + $episode->season_number, + 'font-bold text-gray-600', + true + ) ?> <span class="mx-1">•</span> <time pubdate diff --git a/app/Views/episode.php b/app/Views/episode.php index 2bebb296d9..93d3166c94 100644 --- a/app/Views/episode.php +++ b/app/Views/episode.php @@ -63,24 +63,11 @@ alt="<?= $episode->title ?>" class="object-cover w-full max-w-xs mb-2 rounded-lg md:mb-0 md:mr-4" /> <div class="flex flex-col w-full max-w-sm"> <h1 class="text-lg font-semibold md:text-2xl"><?= $episode->title ?></h1> - <?php if ($episode->number): ?> - <p class="text-gray-600"> - <?php if ($episode->season_number): ?> - <a class="mr-1 underline hover:no-underline" href="<?= route_to( - 'podcast', - $podcast->name - ) . - '?season=' . - $episode->season_number ?>"> - <?= lang('Episode.season', [ - 'seasonNumber' => $episode->season_number, - ]) ?></a> - <?php endif; ?> - <?= lang('Episode.number', [ - 'episodeNumber' => $episode->number, - ]) ?> - </p> - <?php endif; ?> + <?= episode_numbering( + $episode->number, + $episode->season_number, + 'text-gray-600' + ) ?> <div class="text-sm"> <time pubdate diff --git a/app/Views/podcast.php b/app/Views/podcast.php index 2d02c189bf..98258d0dd9 100644 --- a/app/Views/podcast.php +++ b/app/Views/podcast.php @@ -117,7 +117,12 @@ <a class="text-sm hover:underline" href="<?= $episode->link ?>"> <h2 class="inline-flex justify-between w-full font-bold leading-none group"> <span class="mr-1 group-hover:underline"><?= $episode->title ?></span> - <span class="font-bold text-gray-600">#<?= $episode->number ?></span> + <?= episode_numbering( + $episode->number, + $episode->season_number, + 'text-xs font-bold text-gray-600', + true + ) ?> </h2> </a> <div class="mb-2 text-xs"> -- GitLab