episodes.js
1 import { cli, Strategy } from '@jackwener/opencli/registry'; 2 import { CliError } from '@jackwener/opencli/errors'; 3 import { itunesFetch, formatDuration, formatDate } from './utils.js'; 4 cli({ 5 site: 'apple-podcasts', 6 name: 'episodes', 7 description: 'List recent episodes of an Apple Podcast (use ID from search)', 8 strategy: Strategy.PUBLIC, 9 browser: false, 10 args: [ 11 { name: 'id', positional: true, required: true, help: 'Podcast ID (collectionId from search output)' }, 12 { name: 'limit', type: 'int', default: 15, help: 'Max episodes to show' }, 13 ], 14 columns: ['title', 'duration', 'date'], 15 func: async (_page, args) => { 16 const limit = Math.max(1, Math.min(Number(args.limit), 200)); 17 // results[0] is the podcast itself; the rest are episodes 18 const data = await itunesFetch(`/lookup?id=${args.id}&entity=podcastEpisode&limit=${limit + 1}`); 19 const episodes = (data.results ?? []).filter((r) => r.kind === 'podcast-episode'); 20 if (!episodes.length) 21 throw new CliError('NOT_FOUND', 'No episodes found', 'Check the podcast ID from: opencli apple-podcasts search <keyword>'); 22 return episodes.slice(0, limit).map((ep) => ({ 23 title: ep.trackName, 24 duration: formatDuration(ep.trackTimeMillis), 25 date: formatDate(ep.releaseDate), 26 })); 27 }, 28 });