refactor: simplify episode metadata writer

Remove verbose JSDoc, shorten variable names, match existing code style.
Rename saveEpisodeMetadataFiles -> writeEpisodeMetadata.
This commit is contained in:
Arunesh Dwivedi 2026-06-04 17:05:34 +00:00
parent 49c06f16f5
commit 9477d9a808

View file

@ -477,9 +477,8 @@ class PodcastScanner {
libraryScan.addLog(LogLevel.DEBUG, `Success saving abmetadata to "${metadataFilePath}"`) libraryScan.addLog(LogLevel.DEBUG, `Success saving abmetadata to "${metadataFilePath}"`)
// Write per-episode metadata files alongside each episode's audio file
if (storeMetadataWithItem && libraryItem.media.podcastEpisodes?.length) { if (storeMetadataWithItem && libraryItem.media.podcastEpisodes?.length) {
await this.saveEpisodeMetadataFiles(libraryItem, libraryItem.media.podcastEpisodes, libraryScan) await this.writeEpisodeMetadata(libraryItem, libraryItem.media.podcastEpisodes, libraryScan)
} }
return metadataLibraryFile return metadataLibraryFile
@ -490,48 +489,35 @@ class PodcastScanner {
}) })
} }
/** async writeEpisodeMetadata(libraryItem, episodes, libraryScan) {
* Write per-episode metadata files alongside each episode's audio file. for (const ep of episodes) {
* For an episode at /path/to/episode.mp3, writes /path/to/episode.json if (!ep.audioFile?.metadata?.path) continue
* containing title, description, pubDate, chapters, etc.
*
* @param {import('../models/LibraryItem')} libraryItem
* @param {import('../models/PodcastEpisode')[]} podcastEpisodes
* @param {import('./LibraryScan')} libraryScan
* @returns {Promise<void>}
*/
async saveEpisodeMetadataFiles(libraryItem, podcastEpisodes, libraryScan) {
for (const episode of podcastEpisodes) {
if (!episode.audioFile?.metadata?.path) continue
const audioFilePath = episode.audioFile.metadata.path const metaPath = ep.audioFile.metadata.path.replace(/\.[^.]+$/, '.json')
const episodeMetadataPath = audioFilePath.replace(/\.[^.]+$/, '.json') const data = {
title: ep.title,
const episodeJson = { subtitle: ep.subtitle,
title: episode.title, season: ep.season,
subtitle: episode.subtitle, episode: ep.episode,
season: episode.season, episodeType: ep.episodeType,
episode: episode.episode, pubDate: ep.pubDate,
episodeType: episode.episodeType, publishedAt: ep.publishedAt,
pubDate: episode.pubDate, description: ep.description,
publishedAt: episode.publishedAt, chapters: ep.chapters || []
description: episode.description,
chapters: episode.chapters || []
} }
try { try {
await fsExtra.writeFile(episodeMetadataPath, JSON.stringify(episodeJson, null, 2)) await fsExtra.writeFile(metaPath, JSON.stringify(data, null, 2))
libraryScan.addLog(LogLevel.DEBUG, `Saved episode metadata to "${episodeMetadataPath}"`) libraryScan.addLog(LogLevel.DEBUG, `Saved episode meta: ${metaPath}`)
// Add to libraryFiles if not already tracked const exists = libraryItem.libraryFiles.find((f) => f.metadata.path === filePathToPOSIX(metaPath))
const metadataLibraryFile = libraryItem.libraryFiles.find((lf) => lf.metadata.path === filePathToPOSIX(episodeMetadataPath)) if (!exists) {
if (!metadataLibraryFile) { const lf = new LibraryFile()
const newLibraryFile = new LibraryFile() await lf.setDataFromPath(metaPath, Path.basename(metaPath))
await newLibraryFile.setDataFromPath(episodeMetadataPath, Path.basename(episodeMetadataPath)) libraryItem.libraryFiles.push(lf.toJSON())
libraryItem.libraryFiles.push(newLibraryFile.toJSON())
} }
} catch (error) { } catch (err) {
libraryScan.addLog(LogLevel.ERROR, `Failed to save episode metadata at "${episodeMetadataPath}"`, error) libraryScan.addLog(LogLevel.ERROR, `Failed writing ${metaPath}: ${err.message}`)
} }
} }
} }