diff --git a/app/Controllers/Admin/Episode.php b/app/Controllers/Admin/Episode.php
index 6dc61de177b18870f31b6ea986dea16f8292d83a..0e1d348f61ee19eeac0ffd31e59df2ea408a0b5a 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 c46ed1e8a56c158cd44f372667991636c08a1fb7..a6e9e2023b7eca6a23dabbcb29ab43cd6705f91e 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 0e31cb651a4388ac27031ed6fbca9520677c0893..ae528dc4a5f92676f052505f5a31061d2f880d28 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 2e7b18596908ebeeef4c1939639cd2782ff32bad..5046c72c46c14cdae4799e883fd2e9e0aa612eb5 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 93dbbdcefce6df5edb54d61e1dfad3915a85ac79..f09da92b97b3c910fedefb0c3ebe0d2c4e5c2738 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 61f0132db020d2b2686abf32943bd36d6f1a9cb3..652bad3ac932aa0cd4d627f4926fcc325a5d23aa 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 2b5716cd766daa4acc8abd3c1784b5fde89fc13a..a98e63b974bbf45058fd1d21db64119c2af939e8 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 a948b1fa088b89b75fe5396e17d1ec9a4de7cdd6..6d1e50c96edd403134d0c4823a23c12ab0a53876 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 b2f9382faa078cfe25cf99d87248ff2ecdbe7ce0..2b5db05fdf3caf0c8b486eaf9270e6c28e857859 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 9f0330086b33b4c0efa8fcd4ba26f46f81c0d686..dff7ceffb1e889f612f4786975f64b8631ab3e59 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 b4dadbfa8cd849fb7be792a262748fa48f0b47de..9613909276c048de0646eee1303434df757e54ce 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 2bebb296d99fd19f619019f38dd365a0635e2ddf..93d3166c9497649d94b3c89777d7068064634234 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 2d02c189bf13ae7a517d219451b5e3fd3810429a..98258d0dd90237d95932540d3c4e8bcdabcb3ee2 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">