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