diff --git a/app/Controllers/Admin/Podcast.php b/app/Controllers/Admin/Podcast.php
index 1d10f9f2..05503ca2 100644
--- a/app/Controllers/Admin/Podcast.php
+++ b/app/Controllers/Admin/Podcast.php
@@ -156,6 +156,7 @@ class Podcast extends BaseController
'copyright' => $this->request->getPost('copyright'),
'block' => $this->request->getPost('block') === 'yes',
'complete' => $this->request->getPost('complete') === 'yes',
+ 'lock' => $this->request->getPost('lock') === 'yes',
'created_by' => user(),
'updated_by' => user(),
]);
@@ -244,10 +245,19 @@ class Podcast extends BaseController
' ⎋',
]);
}
-
$nsItunes = $feed->channel[0]->children(
'http://www.itunes.com/dtds/podcast-1.0.dtd'
);
+ $nsPodcast = $feed->channel[0]->children(
+ 'https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md'
+ );
+
+ if ((string) $nsPodcast->locked === 'yes') {
+ return redirect()
+ ->back()
+ ->withInput()
+ ->with('errors', [lang('PodcastImport.lock_import')]);
+ }
$podcast = new \App\Entities\Podcast([
'name' => $this->request->getPost('name'),
@@ -453,6 +463,7 @@ class Podcast extends BaseController
$this->podcast->block = $this->request->getPost('block') === 'yes';
$this->podcast->complete =
$this->request->getPost('complete') === 'yes';
+ $this->podcast->lock = $this->request->getPost('lock') === 'yes';
$this->updated_by = user();
$db = \Config\Database::connect();
diff --git a/app/Database/Migrations/2020-05-30-101500_add_podcasts.php b/app/Database/Migrations/2020-05-30-101500_add_podcasts.php
index 018315cf..96633865 100644
--- a/app/Database/Migrations/2020-05-30-101500_add_podcasts.php
+++ b/app/Database/Migrations/2020-05-30-101500_add_podcasts.php
@@ -79,6 +79,10 @@ class AddPodcasts extends Migration
'constraint' => 1024,
'null' => true,
],
+ 'episode_description_footer' => [
+ 'type' => 'TEXT',
+ 'null' => true,
+ ],
'block' => [
'type' => 'TINYINT',
'constraint' => 1,
@@ -89,19 +93,12 @@ class AddPodcasts extends Migration
'constraint' => 1,
'default' => 0,
],
- 'episode_description_footer' => [
- 'type' => 'TEXT',
- 'null' => true,
- ],
- 'created_by' => [
- 'type' => 'INT',
- 'constraint' => 11,
- 'unsigned' => true,
- ],
- 'updated_by' => [
- 'type' => 'INT',
- 'constraint' => 11,
- 'unsigned' => true,
+ 'lock' => [
+ 'type' => 'TINYINT',
+ 'constraint' => 1,
+ 'comment' =>
+ 'This tells other podcast platforms whether they are allowed to import this feed.',
+ 'default' => 1,
],
'imported_feed_url' => [
'type' => 'VARCHAR',
@@ -117,6 +114,16 @@ class AddPodcasts extends Migration
'The RSS new feed URL if this podcast is moving out, NULL otherwise.',
'null' => true,
],
+ 'created_by' => [
+ 'type' => 'INT',
+ 'constraint' => 11,
+ 'unsigned' => true,
+ ],
+ 'updated_by' => [
+ 'type' => 'INT',
+ 'constraint' => 11,
+ 'unsigned' => true,
+ ],
'created_at' => [
'type' => 'TIMESTAMP',
],
diff --git a/app/Entities/Podcast.php b/app/Entities/Podcast.php
index f60e44dc..e64cd5bc 100644
--- a/app/Entities/Podcast.php
+++ b/app/Entities/Podcast.php
@@ -76,13 +76,14 @@ class Podcast extends Entity
'owner_email' => '?string',
'type' => 'string',
'copyright' => '?string',
+ 'episode_description_footer' => '?string',
'block' => 'boolean',
'complete' => 'boolean',
- 'episode_description_footer' => '?string',
- 'created_by' => 'integer',
- 'updated_by' => 'integer',
+ 'lock' => 'boolean',
'imported_feed_url' => '?string',
'new_feed_url' => '?string',
+ 'created_by' => 'integer',
+ 'updated_by' => 'integer',
];
/**
diff --git a/app/Helpers/rss_helper.php b/app/Helpers/rss_helper.php
index 9f17a2f7..78413378 100644
--- a/app/Helpers/rss_helper.php
+++ b/app/Helpers/rss_helper.php
@@ -21,8 +21,11 @@ function get_rss_feed($podcast)
$itunes_namespace = 'http://www.itunes.com/dtds/podcast-1.0.dtd';
+ $podcast_namespace =
+ 'https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md';
+
$rss = new SimpleRSSElement(
- ""
+ ""
);
$channel = $rss->addChild('channel');
@@ -60,7 +63,9 @@ function get_rss_feed($podcast)
$itunes_image = $channel->addChild('image', null, $itunes_namespace);
$itunes_image->addAttribute('href', $podcast->image->original_url);
$channel->addChild('language', $podcast->language);
-
+ $channel
+ ->addChild('locked', $podcast->lock ? 'yes' : 'no', $podcast_namespace)
+ ->addAttribute('owner', $podcast->owner_email);
// set main category first, then other categories as apple
add_category_tag($channel, $podcast->category);
foreach ($podcast->other_categories as $other_category) {
diff --git a/app/Language/en/Podcast.php b/app/Language/en/Podcast.php
index fc54298c..d979ae78 100644
--- a/app/Language/en/Podcast.php
+++ b/app/Language/en/Podcast.php
@@ -65,6 +65,9 @@ return [
'status_section_subtitle' => 'Dead or alive?',
'block' => 'Podcast should be hidden from all platforms',
'complete' => 'Podcast will not be having new episodes',
+ 'lock' => 'Podcast is locked for export',
+ 'lock_hint' =>
+ 'The purpose is to tell other podcast platforms whether they are allowed to import this feed. A value of yes means that any attempt to import this feed into a new platform should be rejected.',
'submit_create' => 'Create podcast',
'submit_edit' => 'Save podcast',
],
diff --git a/app/Language/en/PodcastImport.php b/app/Language/en/PodcastImport.php
index d914557a..5660a280 100644
--- a/app/Language/en/PodcastImport.php
+++ b/app/Language/en/PodcastImport.php
@@ -40,5 +40,7 @@ return [
'Use this if your podcast does not have a season number but wish to set one during import. Leave blank otherwise.',
'max_episodes' => 'Maximum number of episodes to import',
'max_episodes_hint' => 'Leave blank to import all episodes',
+ 'lock_import' =>
+ 'This feed is protected. You cannot import it. If you are the owner, unprotect it on the origin platform.',
'submit' => 'Import podcast',
];
diff --git a/app/Language/fr/Podcast.php b/app/Language/fr/Podcast.php
index 0452bbc6..8fe3ad14 100644
--- a/app/Language/fr/Podcast.php
+++ b/app/Language/fr/Podcast.php
@@ -66,6 +66,9 @@ return [
'status_section_subtitle' => 'Vivant ou mort ?',
'block' => 'Le podcast doit être masqué sur toutes les plateformes',
'complete' => 'Le podcast n’aura plus de nouveaux épisodes.',
+ 'lock' => 'Le podcast est fermé à l’export',
+ 'lock_hint' =>
+ 'Le but est d’indiquer aux autres plates-formes de podcast si elles sont autorisées à importer ce flux. La valeur « oui » signifie que toute tentative d’importation de ce flux dans une nouvelle plateforme doit être rejetée.',
'submit_create' => 'Créer le podcast',
'submit_edit' => 'Enregistrer le podcast',
],
diff --git a/app/Language/fr/PodcastImport.php b/app/Language/fr/PodcastImport.php
index c7d03e0c..539d0609 100644
--- a/app/Language/fr/PodcastImport.php
+++ b/app/Language/fr/PodcastImport.php
@@ -41,5 +41,7 @@ return [
'Utilisez ceci si le podcast à importer ne contient pas de numéros de saison mais que vous souhaitez en définir un. Laissez vide sinon.',
'max_episodes' => 'Nombre maximum d’épisodes à importer',
'max_episodes_hint' => 'Laissez vide pour importer tous les épisodes',
+ 'lock_import' =>
+ 'Ce flux est protégé. Vous ne pouvez pas l’importer. Si en vous êtes le propriétaire, déprotégez-le sur la plate-forme d’origine.',
'submit' => 'Importer le podcast',
];
diff --git a/app/Models/PodcastModel.php b/app/Models/PodcastModel.php
index 1fd98403..84b26e6b 100644
--- a/app/Models/PodcastModel.php
+++ b/app/Models/PodcastModel.php
@@ -32,6 +32,7 @@ class PodcastModel extends Model
'copyright',
'block',
'complete',
+ 'lock',
'created_by',
'updated_by',
'imported_feed_url',
diff --git a/app/Views/admin/podcast/create.php b/app/Views/admin/podcast/create.php
index 006dd61a..1ee84141 100644
--- a/app/Views/admin/podcast/create.php
+++ b/app/Views/admin/podcast/create.php
@@ -262,6 +262,13 @@
old('complete', false)
) ?>
+= form_switch(
+ lang('Podcast.form.lock'),
+ ['id' => 'lock', 'name' => 'lock'],
+ 'yes',
+ old('lock', $podcast->lock)
+) ?>
+
= form_section_close() ?>
diff --git a/app/Views/admin/podcast/edit.php b/app/Views/admin/podcast/edit.php
index 2a3933b7..b2c02869 100644
--- a/app/Views/admin/podcast/edit.php
+++ b/app/Views/admin/podcast/edit.php
@@ -269,7 +269,16 @@
lang('Podcast.form.complete'),
['id' => 'complete', 'name' => 'complete'],
'yes',
- old('complete', $podcast->complete)
+ old('complete', $podcast->complete),
+ 'mb-2'
+) ?>
+
+= form_switch(
+ lang('Podcast.form.lock') .
+ hint_tooltip(lang('Podcast.form.lock_hint'), 'ml-1'),
+ ['id' => 'lock', 'name' => 'lock'],
+ 'yes',
+ old('lock', $podcast->lock)
) ?>
= form_section_close() ?>