mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-27 11:18:14 +01:00 
			
		
		
		
	Merge pull request #1554 from mfcar/blockRssFeed
Add rss feed configuration
This commit is contained in:
		
						commit
						9c6b07df99
					
				| @ -14,6 +14,21 @@ | ||||
| 
 | ||||
|           <span class="material-icons absolute right-2 bottom-2 p-0.5 text-base transition-transform duration-100 text-gray-300 hover:text-white transform hover:scale-125 cursor-pointer" @click="copyToClipboard(currentFeed.feedUrl)">content_copy</span> | ||||
|         </div> | ||||
| 
 | ||||
|         <div v-if="currentFeed.meta" class="mt-5"> | ||||
|           <div class="flex py-0.5"> | ||||
|             <div class="w-48"><span class="text-white text-opacity-60 uppercase text-sm">{{ $strings.LabelRssFeedPreventIndexing }}</span></div> | ||||
|             <div> {{ currentFeed.meta.preventIndexing ? 'Yes' : 'No' }} </div> | ||||
|           </div> | ||||
|           <div v-if="currentFeed.meta.ownerName" class="flex py-0.5"> | ||||
|             <div class="w-48"><span class="text-white text-opacity-60 uppercase text-sm">{{ $strings.LabelRssFeedCustomOwnerName }}</span></div> | ||||
|             <div> {{ currentFeed.meta.ownerName }} </div> | ||||
|           </div> | ||||
|           <div v-if="currentFeed.meta.ownerEmail" class="flex py-0.5"> | ||||
|             <div class="w-48"><span class="text-white text-opacity-60 uppercase text-sm">{{ $strings.LabelRssFeedCustomOwnerEmail }}</span></div> | ||||
|             <div> {{ currentFeed.meta.ownerEmail }} </div> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|       <div v-else class="w-full"> | ||||
|         <p class="text-lg font-semibold mb-4">{{ $strings.HeaderOpenRSSFeed }}</p> | ||||
| @ -22,6 +37,7 @@ | ||||
|           <ui-text-input-with-label v-model="newFeedSlug" :label="$strings.LabelRSSFeedSlug" /> | ||||
|           <p class="text-xs text-gray-400 py-0.5 px-1">{{ $getString('MessageFeedURLWillBe', [demoFeedUrl]) }}</p> | ||||
|         </div> | ||||
|         <widgets-rss-feed-metadata-builder v-model="metadataDetails" /> | ||||
| 
 | ||||
|         <p v-if="isHttp" class="w-full pt-2 text-warning text-xs">{{ $strings.NoteRSSFeedPodcastAppsHttps }}</p> | ||||
|         <p v-if="hasEpisodesWithoutPubDate" class="w-full pt-2 text-warning text-xs">{{ $strings.NoteRSSFeedPodcastAppsPubDate }}</p> | ||||
| @ -41,7 +57,12 @@ export default { | ||||
|     return { | ||||
|       processing: false, | ||||
|       newFeedSlug: null, | ||||
|       currentFeed: null | ||||
|       currentFeed: null, | ||||
|       metadataDetails: { | ||||
|         preventIndexing: true, | ||||
|         ownerName: '', | ||||
|         ownerEmail: '' | ||||
|       }, | ||||
|     } | ||||
|   }, | ||||
|   watch: { | ||||
| @ -107,7 +128,8 @@ export default { | ||||
| 
 | ||||
|       const payload = { | ||||
|         serverAddress: window.origin, | ||||
|         slug: this.newFeedSlug | ||||
|         slug: this.newFeedSlug, | ||||
|         metadataDetails: this.metadataDetails | ||||
|       } | ||||
|       if (this.$isDev) payload.serverAddress = `http://localhost:3333${this.$config.routerBasePath}` | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										92
									
								
								client/components/widgets/RssFeedMetadataBuilder.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								client/components/widgets/RssFeedMetadataBuilder.vue
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,92 @@ | ||||
| <template> | ||||
|   <div class="w-full py-2"> | ||||
|     <div class="flex -mb-px"> | ||||
|       <div class="w-1/2 h-6 rounded-tl-md relative border border-black-200 flex items-center justify-center cursor-pointer" :class="!showAdvancedView ? 'text-white bg-bg hover:bg-opacity-60 border-b-bg' : 'text-gray-400 hover:text-gray-300 bg-primary bg-opacity-70 hover:bg-opacity-60'" @click="showAdvancedView = false"> | ||||
|         <p class="text-sm">{{ $strings.HeaderRSSFeedGeneral }}</p> | ||||
|       </div> | ||||
|       <div class="w-1/2 h-6 rounded-tr-md relative border border-black-200 flex items-center justify-center -ml-px cursor-pointer" :class="showAdvancedView ? 'text-white bg-bg hover:bg-opacity-60 border-b-bg' : 'text-gray-400 hover:text-gray-300 bg-primary bg-opacity-70 hover:bg-opacity-60'" @click="showAdvancedView = true"> | ||||
|         <p class="text-sm">{{ $strings.HeaderAdvanced }}</p> | ||||
|       </div> | ||||
|     </div> | ||||
|     <div class="px-2 py-4 md:p-4 border border-black-200 rounded-b-md mr-px" style="min-height: 200px"> | ||||
|       <template v-if="!showAdvancedView"> | ||||
|         <div class="flex-grow pt-2 mb-2"> | ||||
|           <ui-checkbox v-model="preventIndexing" :label="$strings.LabelPreventIndexing" checkbox-bg="primary" border-color="gray-600" label-class="pl-2" /> | ||||
|         </div> | ||||
|       </template> | ||||
|       <template v-else> | ||||
|         <div class="flex-grow pt-2 mb-2"> | ||||
|           <ui-checkbox v-model="preventIndexing" :label="$strings.LabelPreventIndexing" checkbox-bg="primary" border-color="gray-600" label-class="pl-2" /> | ||||
|         </div> | ||||
|         <div class="w-full relative mb-1"> | ||||
|           <ui-text-input-with-label v-model="ownerName" :label="$strings.LabelRssFeedCustomOwnerName" /> | ||||
|         </div> | ||||
|         <div class="w-full relative mb-1"> | ||||
|           <ui-text-input-with-label v-model="ownerEmail" :label="$strings.LabelRssFeedCustomOwnerEmail" /> | ||||
|         </div> | ||||
|       </template> | ||||
|     </div> | ||||
|   </div> | ||||
| </template> | ||||
| 
 | ||||
| <script> | ||||
| export default { | ||||
|   props: { | ||||
|     value: { | ||||
|       type: Object, | ||||
|       default: () => { | ||||
|         return { | ||||
|           preventIndexing: true, | ||||
|           ownerName: '', | ||||
|           ownerEmail: '' | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   data() { | ||||
|     return { | ||||
|       showAdvancedView: false | ||||
|     } | ||||
|   }, | ||||
|   watch: {}, | ||||
|   computed: { | ||||
|     preventIndexing: { | ||||
|       get() { | ||||
|         return this.value.preventIndexing | ||||
|       }, | ||||
|       set(value) { | ||||
|         this.$emit('input', { | ||||
|           ...this.value, | ||||
|           preventIndexing: value | ||||
|         }) | ||||
|       } | ||||
|     }, | ||||
|     ownerName: { | ||||
|       get() { | ||||
|         return this.value.ownerName | ||||
|       }, | ||||
|       set(value) { | ||||
|         this.$emit('input', { | ||||
|           ...this.value, | ||||
|           ownerName: value | ||||
|         }) | ||||
|       } | ||||
|     }, | ||||
|     ownerEmail: { | ||||
|       get() { | ||||
|         return this.value.ownerEmail | ||||
|       }, | ||||
|       set(value) { | ||||
|         this.$emit('input', { | ||||
|           ...this.value, | ||||
|           ownerEmail: value | ||||
|         }) | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   methods: { | ||||
|   }, | ||||
|   mounted() { | ||||
|   } | ||||
| } | ||||
| </script> | ||||
| @ -127,6 +127,7 @@ | ||||
|   "HeaderRemoveEpisode": "Episode löschen", | ||||
|   "HeaderRemoveEpisodes": "Lösche {0} Episoden", | ||||
|   "HeaderRSSFeedIsOpen": "RSS-Feed ist geöffnet", | ||||
|   "HeaderRSSFeedGeneral": "RSS Details", | ||||
|   "HeaderSavedMediaProgress": "Gespeicherte Hörfortschritte", | ||||
|   "HeaderSchedule": "Zeitplan", | ||||
|   "HeaderScheduleLibraryScans": "Automatische Bibliotheksscans", | ||||
| @ -304,6 +305,7 @@ | ||||
|   "LabelPodcasts": "Podcasts", | ||||
|   "LabelPodcastType": "Podcast Type", | ||||
|   "LabelPrefixesToIgnore": "Zu ignorierende(s) Vorwort(e) (Groß- und Kleinschreibung wird nicht berücksichtigt)", | ||||
|   "LabelPreventIndexing": "Prevent your feed from being indexed by iTunes and Google podcast directories", | ||||
|   "LabelProgress": "Fortschritt", | ||||
|   "LabelProvider": "Anbieter", | ||||
|   "LabelPubDate": "Veröffentlichungsdatum", | ||||
| @ -318,6 +320,9 @@ | ||||
|   "LabelRSSFeedOpen": "RSS Feed Offen", | ||||
|   "LabelRSSFeedSlug": "RSS Feed Schlagwort", | ||||
|   "LabelRSSFeedURL": "RSS Feed URL", | ||||
|   "LabelRssFeedCustomOwnerName": "Custom owner Name", | ||||
|   "LabelRssFeedCustomOwnerEmail": "Custom owner Email", | ||||
|   "LabelRssFeedPreventIndexing": "Prevent Indexing", | ||||
|   "LabelSearchTerm": "Begriff suchen", | ||||
|   "LabelSearchTitle": "Titel", | ||||
|   "LabelSearchTitleOrASIN": "Titel oder ASIN", | ||||
|  | ||||
| @ -127,6 +127,7 @@ | ||||
|   "HeaderRemoveEpisode": "Remove Episode", | ||||
|   "HeaderRemoveEpisodes": "Remove {0} Episodes", | ||||
|   "HeaderRSSFeedIsOpen": "RSS Feed is Open", | ||||
|   "HeaderRSSFeedGeneral": "RSS Details", | ||||
|   "HeaderSavedMediaProgress": "Saved Media Progress", | ||||
|   "HeaderSchedule": "Schedule", | ||||
|   "HeaderScheduleLibraryScans": "Schedule Automatic Library Scans", | ||||
| @ -304,6 +305,7 @@ | ||||
|   "LabelPodcasts": "Podcasts", | ||||
|   "LabelPodcastType": "Podcast Type", | ||||
|   "LabelPrefixesToIgnore": "Prefixes to Ignore (case insensitive)", | ||||
|   "LabelPreventIndexing": "Prevent your feed from being indexed by iTunes and Google podcast directories", | ||||
|   "LabelProgress": "Progress", | ||||
|   "LabelProvider": "Provider", | ||||
|   "LabelPubDate": "Pub Date", | ||||
| @ -318,6 +320,9 @@ | ||||
|   "LabelRSSFeedOpen": "RSS Feed Open", | ||||
|   "LabelRSSFeedSlug": "RSS Feed Slug", | ||||
|   "LabelRSSFeedURL": "RSS Feed URL", | ||||
|   "LabelRssFeedCustomOwnerName": "Custom owner Name", | ||||
|   "LabelRssFeedCustomOwnerEmail": "Custom owner Email", | ||||
|   "LabelRssFeedPreventIndexing": "Prevent Indexing", | ||||
|   "LabelSearchTerm": "Search Term", | ||||
|   "LabelSearchTitle": "Search Title", | ||||
|   "LabelSearchTitleOrASIN": "Search Title or ASIN", | ||||
|  | ||||
| @ -127,6 +127,7 @@ | ||||
|   "HeaderRemoveEpisode": "Remove Episode", | ||||
|   "HeaderRemoveEpisodes": "Remove {0} Episodes", | ||||
|   "HeaderRSSFeedIsOpen": "RSS Feed is Open", | ||||
|   "HeaderRSSFeedGeneral": "RSS Details", | ||||
|   "HeaderSavedMediaProgress": "Saved Media Progress", | ||||
|   "HeaderSchedule": "Schedule", | ||||
|   "HeaderScheduleLibraryScans": "Schedule Automatic Library Scans", | ||||
| @ -304,6 +305,7 @@ | ||||
|   "LabelPodcasts": "Podcasts", | ||||
|   "LabelPodcastType": "Podcast Type", | ||||
|   "LabelPrefixesToIgnore": "Prefixes to Ignore (case insensitive)", | ||||
|   "LabelPreventIndexing": "Prevent your feed from being indexed by iTunes and Google podcast directories", | ||||
|   "LabelProgress": "Progress", | ||||
|   "LabelProvider": "Provider", | ||||
|   "LabelPubDate": "Pub Date", | ||||
| @ -318,6 +320,9 @@ | ||||
|   "LabelRSSFeedOpen": "RSS Feed Open", | ||||
|   "LabelRSSFeedSlug": "RSS Feed Slug", | ||||
|   "LabelRSSFeedURL": "RSS Feed URL", | ||||
|   "LabelRssFeedCustomOwnerName": "Custom owner Name", | ||||
|   "LabelRssFeedCustomOwnerEmail": "Custom owner Email", | ||||
|   "LabelRssFeedPreventIndexing": "Prevent Indexing", | ||||
|   "LabelSearchTerm": "Search Term", | ||||
|   "LabelSearchTitle": "Search Title", | ||||
|   "LabelSearchTitleOrASIN": "Search Title or ASIN", | ||||
|  | ||||
| @ -127,6 +127,7 @@ | ||||
|   "HeaderRemoveEpisode": "Supprimer l'épisode", | ||||
|   "HeaderRemoveEpisodes": "Suppression de {0} épisodes", | ||||
|   "HeaderRSSFeedIsOpen": "Le Flux RSS est actif", | ||||
|   "HeaderRSSFeedGeneral": "RSS Details", | ||||
|   "HeaderSavedMediaProgress": "Progression de la sauvegarde des médias", | ||||
|   "HeaderSchedule": "Programmation", | ||||
|   "HeaderScheduleLibraryScans": "Analyse automatique de la bibliothèque", | ||||
| @ -304,6 +305,7 @@ | ||||
|   "LabelPodcasts": "Podcasts", | ||||
|   "LabelPodcastType": "Podcast Type", | ||||
|   "LabelPrefixesToIgnore": "Préfixes à Ignorer (Insensible à la Casse)", | ||||
|   "LabelPreventIndexing": "Prevent your feed from being indexed by iTunes and Google podcast directories", | ||||
|   "LabelProgress": "Progression", | ||||
|   "LabelProvider": "Fournisseur", | ||||
|   "LabelPubDate": "Date de publication", | ||||
| @ -318,6 +320,9 @@ | ||||
|   "LabelRSSFeedOpen": "Flux RSS ouvert", | ||||
|   "LabelRSSFeedSlug": "Identificateur d'adresse du Flux RSS ", | ||||
|   "LabelRSSFeedURL": "Adresse du flux RSS", | ||||
|   "LabelRssFeedCustomOwnerName": "Custom owner Name", | ||||
|   "LabelRssFeedCustomOwnerEmail": "Custom owner Email", | ||||
|   "LabelRssFeedPreventIndexing": "Prevent Indexing", | ||||
|   "LabelSearchTerm": "Terme de recherche", | ||||
|   "LabelSearchTitle": "Titre de recherche", | ||||
|   "LabelSearchTitleOrASIN": "Recherche du titre ou ASIN", | ||||
|  | ||||
| @ -127,6 +127,7 @@ | ||||
|   "HeaderRemoveEpisode": "Ukloni epizodu", | ||||
|   "HeaderRemoveEpisodes": "Ukloni {0} epizoda/-e", | ||||
|   "HeaderRSSFeedIsOpen": "RSS Feed je otvoren", | ||||
|   "HeaderRSSFeedGeneral": "RSS Details", | ||||
|   "HeaderSavedMediaProgress": "Spremljen Media Progress", | ||||
|   "HeaderSchedule": "Schedule", | ||||
|   "HeaderScheduleLibraryScans": "Zakaži automatsko skeniranje biblioteke", | ||||
| @ -304,6 +305,7 @@ | ||||
|   "LabelPodcasts": "Podcasts", | ||||
|   "LabelPodcastType": "Podcast Type", | ||||
|   "LabelPrefixesToIgnore": "Prefiksi za ignorirati (mala i velika slova nisu bitna)", | ||||
|   "LabelPreventIndexing": "Prevent your feed from being indexed by iTunes and Google podcast directories", | ||||
|   "LabelProgress": "Napredak", | ||||
|   "LabelProvider": "Dobavljač", | ||||
|   "LabelPubDate": "Datam izdavanja", | ||||
| @ -318,6 +320,9 @@ | ||||
|   "LabelRSSFeedOpen": "RSS Feed Open", | ||||
|   "LabelRSSFeedSlug": "RSS Feed Slug", | ||||
|   "LabelRSSFeedURL": "RSS Feed URL", | ||||
|   "LabelRssFeedCustomOwnerName": "Custom owner Name", | ||||
|   "LabelRssFeedCustomOwnerEmail": "Custom owner Email", | ||||
|   "LabelRssFeedPreventIndexing": "Prevent Indexing", | ||||
|   "LabelSearchTerm": "Traži pojam", | ||||
|   "LabelSearchTitle": "Traži naslov", | ||||
|   "LabelSearchTitleOrASIN": "Traži naslov ili ASIN", | ||||
|  | ||||
| @ -127,6 +127,7 @@ | ||||
|   "HeaderRemoveEpisode": "Rimuovi Episodi", | ||||
|   "HeaderRemoveEpisodes": "Rimuovi {0} Episodi", | ||||
|   "HeaderRSSFeedIsOpen": "RSS Feed è aperto", | ||||
|   "HeaderRSSFeedGeneral": "RSS Details", | ||||
|   "HeaderSavedMediaProgress": "Progressi salvati", | ||||
|   "HeaderSchedule": "Schedula", | ||||
|   "HeaderScheduleLibraryScans": "Schedula la scansione della libreria", | ||||
| @ -304,6 +305,7 @@ | ||||
|   "LabelPodcasts": "Podcasts", | ||||
|   "LabelPodcastType": "Podcast Type", | ||||
|   "LabelPrefixesToIgnore": "Suffissi da ignorare (specificando maiuscole e minuscole)", | ||||
|   "LabelPreventIndexing": "Prevent your feed from being indexed by iTunes and Google podcast directories", | ||||
|   "LabelProgress": "Cominciati", | ||||
|   "LabelProvider": "Provider", | ||||
|   "LabelPubDate": "Data Pubblicazione", | ||||
| @ -318,6 +320,9 @@ | ||||
|   "LabelRSSFeedOpen": "RSS Feed Aperto", | ||||
|   "LabelRSSFeedSlug": "RSS Feed Slug", | ||||
|   "LabelRSSFeedURL": "RSS Feed URL", | ||||
|   "LabelRssFeedCustomOwnerName": "Custom owner Name", | ||||
|   "LabelRssFeedCustomOwnerEmail": "Custom owner Email", | ||||
|   "LabelRssFeedPreventIndexing": "Prevent Indexing", | ||||
|   "LabelSearchTerm": "Ricerca", | ||||
|   "LabelSearchTitle": "Cerca Titolo", | ||||
|   "LabelSearchTitleOrASIN": "Cerca titolo o ASIN", | ||||
|  | ||||
| @ -127,6 +127,7 @@ | ||||
|   "HeaderRemoveEpisode": "Usuń odcinek", | ||||
|   "HeaderRemoveEpisodes": "Usuń {0} odcinków", | ||||
|   "HeaderRSSFeedIsOpen": "Kanał RSS jest otwarty", | ||||
|   "HeaderRSSFeedGeneral": "RSS Details", | ||||
|   "HeaderSavedMediaProgress": "Zapisany postęp", | ||||
|   "HeaderSchedule": "Harmonogram", | ||||
|   "HeaderScheduleLibraryScans": "Zaplanuj automatyczne skanowanie biblioteki", | ||||
| @ -304,6 +305,7 @@ | ||||
|   "LabelPodcasts": "Podcasty", | ||||
|   "LabelPodcastType": "Podcast Type", | ||||
|   "LabelPrefixesToIgnore": "Ignorowane prefiksy (wielkość liter nie ma znaczenia)", | ||||
|   "LabelPreventIndexing": "Prevent your feed from being indexed by iTunes and Google podcast directories", | ||||
|   "LabelProgress": "Postęp", | ||||
|   "LabelProvider": "Dostawca", | ||||
|   "LabelPubDate": "Data publikacji", | ||||
| @ -318,6 +320,9 @@ | ||||
|   "LabelRSSFeedOpen": "RSS Feed otwarty", | ||||
|   "LabelRSSFeedSlug": "RSS Feed Slug", | ||||
|   "LabelRSSFeedURL": "URL kanały RSS", | ||||
|   "LabelRssFeedCustomOwnerName": "Custom owner Name", | ||||
|   "LabelRssFeedCustomOwnerEmail": "Custom owner Email", | ||||
|   "LabelRssFeedPreventIndexing": "Prevent Indexing", | ||||
|   "LabelSearchTerm": "Wyszukiwanie frazy", | ||||
|   "LabelSearchTitle": "Wyszukaj tytuł", | ||||
|   "LabelSearchTitleOrASIN": "Szukaj tytuł lub ASIN", | ||||
|  | ||||
| @ -127,6 +127,7 @@ | ||||
|   "HeaderRemoveEpisode": "Удалить Эпизод", | ||||
|   "HeaderRemoveEpisodes": "Удалить {0} Эпизодов", | ||||
|   "HeaderRSSFeedIsOpen": "RSS-канал Открыт", | ||||
|   "HeaderRSSFeedGeneral": "RSS Details", | ||||
|   "HeaderSavedMediaProgress": "Прогресс Медиа Сохранен", | ||||
|   "HeaderSchedule": "Планировщик", | ||||
|   "HeaderScheduleLibraryScans": "Планировщик Автоматического Сканирования Библиотеки", | ||||
| @ -304,6 +305,7 @@ | ||||
|   "LabelPodcasts": "Подкасты", | ||||
|   "LabelPodcastType": "Podcast Type", | ||||
|   "LabelPrefixesToIgnore": "Игнорируемые Префиксы (без учета регистра)", | ||||
|   "LabelPreventIndexing": "Prevent your feed from being indexed by iTunes and Google podcast directories", | ||||
|   "LabelProgress": "Прогресс", | ||||
|   "LabelProvider": "Провайдер", | ||||
|   "LabelPubDate": "Дата Публикации", | ||||
| @ -318,6 +320,9 @@ | ||||
|   "LabelRSSFeedOpen": "Открыть RSS-канал", | ||||
|   "LabelRSSFeedSlug": "Встроить RSS-канал", | ||||
|   "LabelRSSFeedURL": "URL RSS-канала", | ||||
|   "LabelRssFeedCustomOwnerName": "Custom owner Name", | ||||
|   "LabelRssFeedCustomOwnerEmail": "Custom owner Email", | ||||
|   "LabelRssFeedPreventIndexing": "Prevent Indexing", | ||||
|   "LabelSearchTerm": "Поисковый Запрос", | ||||
|   "LabelSearchTitle": "Поиск по Названию", | ||||
|   "LabelSearchTitleOrASIN": "Поиск по Названию или ASIN", | ||||
|  | ||||
| @ -127,6 +127,7 @@ | ||||
|   "HeaderRemoveEpisode": "移除剧集", | ||||
|   "HeaderRemoveEpisodes": "移除 {0} 剧集", | ||||
|   "HeaderRSSFeedIsOpen": "RSS 源已打开", | ||||
|   "HeaderRSSFeedGeneral": "RSS Details", | ||||
|   "HeaderSavedMediaProgress": "保存媒体进度", | ||||
|   "HeaderSchedule": "计划任务", | ||||
|   "HeaderScheduleLibraryScans": "自动扫描媒体库", | ||||
| @ -304,6 +305,7 @@ | ||||
|   "LabelPodcasts": "播客", | ||||
|   "LabelPodcastType": "Podcast Type", | ||||
|   "LabelPrefixesToIgnore": "忽略的前缀 (不区分大小写)", | ||||
|   "LabelPreventIndexing": "Prevent your feed from being indexed by iTunes and Google podcast directories", | ||||
|   "LabelProgress": "进度", | ||||
|   "LabelProvider": "供应商", | ||||
|   "LabelPubDate": "出版日期", | ||||
| @ -318,6 +320,9 @@ | ||||
|   "LabelRSSFeedOpen": "打开 RSS 源", | ||||
|   "LabelRSSFeedSlug": "RSS 源段", | ||||
|   "LabelRSSFeedURL": "RSS 源 URL", | ||||
|   "LabelRssFeedCustomOwnerName": "Custom owner Name", | ||||
|   "LabelRssFeedCustomOwnerEmail": "Custom owner Email", | ||||
|   "LabelRssFeedPreventIndexing": "Prevent Indexing", | ||||
|   "LabelSearchTerm": "搜索项", | ||||
|   "LabelSearchTitle": "搜索标题", | ||||
|   "LabelSearchTitleOrASIN": "搜索标题或 ASIN", | ||||
|  | ||||
| @ -134,4 +134,4 @@ class RSSFeedController { | ||||
|     next() | ||||
|   } | ||||
| } | ||||
| module.exports = new RSSFeedController() | ||||
| module.exports = new RSSFeedController() | ||||
|  | ||||
| @ -188,9 +188,12 @@ class RssFeedManager { | ||||
|   async openFeedForItem(user, libraryItem, options) { | ||||
|     const serverAddress = options.serverAddress | ||||
|     const slug = options.slug | ||||
|     const preventIndexing = options.metadataDetails?.preventIndexing ?? true | ||||
|     const ownerName = options.metadataDetails?.ownerName | ||||
|     const ownerEmail = options.metadataDetails?.ownerEmail | ||||
| 
 | ||||
|     const feed = new Feed() | ||||
|     feed.setFromItem(user.id, slug, libraryItem, serverAddress) | ||||
|     feed.setFromItem(user.id, slug, libraryItem, serverAddress, preventIndexing, ownerName, ownerEmail) | ||||
|     this.feeds[feed.id] = feed | ||||
| 
 | ||||
|     Logger.debug(`[RssFeedManager] Opened RSS feed "${feed.feedUrl}"`) | ||||
| @ -202,9 +205,12 @@ class RssFeedManager { | ||||
|   async openFeedForCollection(user, collectionExpanded, options) { | ||||
|     const serverAddress = options.serverAddress | ||||
|     const slug = options.slug | ||||
|     const preventIndexing = options.metadataDetails?.preventIndexing ?? true | ||||
|     const ownerName = options.metadataDetails?.ownerName | ||||
|     const ownerEmail = options.metadataDetails?.ownerEmail | ||||
| 
 | ||||
|     const feed = new Feed() | ||||
|     feed.setFromCollection(user.id, slug, collectionExpanded, serverAddress) | ||||
|     feed.setFromCollection(user.id, slug, collectionExpanded, serverAddress, preventIndexing, ownerName, ownerEmail) | ||||
|     this.feeds[feed.id] = feed | ||||
| 
 | ||||
|     Logger.debug(`[RssFeedManager] Opened RSS feed "${feed.feedUrl}"`) | ||||
| @ -216,9 +222,12 @@ class RssFeedManager { | ||||
|   async openFeedForSeries(user, seriesExpanded, options) { | ||||
|     const serverAddress = options.serverAddress | ||||
|     const slug = options.slug | ||||
|     const preventIndexing = options.metadataDetails?.preventIndexing ?? true | ||||
|     const ownerName = options.metadataDetails?.ownerName | ||||
|     const ownerEmail = options.metadataDetails?.ownerEmail | ||||
| 
 | ||||
|     const feed = new Feed() | ||||
|     feed.setFromSeries(user.id, slug, seriesExpanded, serverAddress) | ||||
|     feed.setFromSeries(user.id, slug, seriesExpanded, serverAddress, preventIndexing, ownerName, ownerEmail) | ||||
|     this.feeds[feed.id] = feed | ||||
| 
 | ||||
|     Logger.debug(`[RssFeedManager] Opened RSS feed "${feed.feedUrl}"`) | ||||
| @ -246,4 +255,4 @@ class RssFeedManager { | ||||
|     return this.handleCloseFeed(feed) | ||||
|   } | ||||
| } | ||||
| module.exports = RssFeedManager | ||||
| module.exports = RssFeedManager | ||||
|  | ||||
| @ -70,7 +70,8 @@ class Feed { | ||||
|       id: this.id, | ||||
|       entityType: this.entityType, | ||||
|       entityId: this.entityId, | ||||
|       feedUrl: this.feedUrl | ||||
|       feedUrl: this.feedUrl, | ||||
|       meta: this.meta.toJSONMinified(), | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
| @ -80,7 +81,7 @@ class Feed { | ||||
|     return episode.fullPath | ||||
|   } | ||||
| 
 | ||||
|   setFromItem(userId, slug, libraryItem, serverAddress) { | ||||
|   setFromItem(userId, slug, libraryItem, serverAddress, preventIndexing = true, ownerName = null, ownerEmail = null) { | ||||
|     const media = libraryItem.media | ||||
|     const mediaMetadata = media.metadata | ||||
|     const isPodcast = libraryItem.mediaType === 'podcast' | ||||
| @ -108,6 +109,9 @@ class Feed { | ||||
|     this.meta.explicit = !!mediaMetadata.explicit | ||||
|     this.meta.type = mediaMetadata.type | ||||
|     this.meta.language = mediaMetadata.language | ||||
|     this.meta.preventIndexing = preventIndexing | ||||
|     this.meta.ownerName = ownerName | ||||
|     this.meta.ownerEmail = ownerEmail | ||||
| 
 | ||||
|     this.episodes = [] | ||||
|     if (isPodcast) { // PODCAST EPISODES
 | ||||
|  | ||||
| @ -9,6 +9,9 @@ class FeedMeta { | ||||
|     this.explicit = null | ||||
|     this.type = null | ||||
|     this.language = null | ||||
|     this.preventIndexing = null | ||||
|     this.ownerName = null | ||||
|     this.ownerEmail = null | ||||
| 
 | ||||
|     if (meta) { | ||||
|       this.construct(meta) | ||||
| @ -25,6 +28,9 @@ class FeedMeta { | ||||
|     this.explicit = meta.explicit | ||||
|     this.type = meta.type | ||||
|     this.language = meta.language | ||||
|     this.preventIndexing = meta.preventIndexing | ||||
|     this.ownerName = meta.ownerName | ||||
|     this.ownerEmail = meta.ownerEmail | ||||
|   } | ||||
| 
 | ||||
|   toJSON() { | ||||
| @ -37,7 +43,20 @@ class FeedMeta { | ||||
|       link: this.link, | ||||
|       explicit: this.explicit, | ||||
|       type: this.type, | ||||
|       language: this.language | ||||
|       language: this.language, | ||||
|       preventIndexing: this.preventIndexing, | ||||
|       ownerName: this.ownerName, | ||||
|       ownerEmail: this.ownerEmail | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   toJSONMinified() { | ||||
|     return { | ||||
|       title: this.title, | ||||
|       description: this.description, | ||||
|       preventIndexing: this.preventIndexing, | ||||
|       ownerName: this.ownerName, | ||||
|       ownerEmail: this.ownerEmail | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
| @ -52,7 +71,8 @@ class FeedMeta { | ||||
|       custom_namespaces: { | ||||
|         'itunes': 'http://www.itunes.com/dtds/podcast-1.0.dtd', | ||||
|         'psc': 'http://podlove.org/simple-chapters', | ||||
|         'podcast': 'https://podcastindex.org/namespace/1.0' | ||||
|         'podcast': 'https://podcastindex.org/namespace/1.0', | ||||
|         'googleplay': 'http://www.google.com/schemas/play-podcasts/1.0' | ||||
|       }, | ||||
|       custom_elements: [ | ||||
|         { 'language': this.language || 'en' }, | ||||
| @ -69,13 +89,13 @@ class FeedMeta { | ||||
|         }, | ||||
|         { | ||||
|           'itunes:owner': [ | ||||
|             { 'itunes:name': this.author || '' }, | ||||
|             { 'itunes:email': '' } | ||||
|             { 'itunes:name': this.ownerName || this.author || '' }, | ||||
|             { 'itunes:email': this.ownerEmail || '' } | ||||
|           ] | ||||
|         }, | ||||
|         { | ||||
|           "itunes:explicit": !!this.explicit | ||||
|         } | ||||
|         { 'itunes:explicit': !!this.explicit }, | ||||
|         { 'itunes:block': !!this.preventIndexing }, | ||||
|         { 'googleplay:block': !!this.preventIndexing } | ||||
|       ] | ||||
|     } | ||||
|   } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user