/ clis / apple-podcasts / episodes.js
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  });