Розробка мобільного додатку для подкастів
Подкаст-додаток — це спеціфічна ніша всередині аудіо-стримінгу. Контент з відкритих RSS-фідів, воспроизведення довгих епізодів (30–90 хвилин), потребує variable speed playback, глав (chapters), transcript-синхронізації та надійного offline-режиму. Готові SDK для подкастингу практично немає — все збирається з компонентів.
RSS та парсинг фідів
Подкасти публікуються через RSS 2.0 з iTunes/Podcast namespace. Кожен епізод — елемент <item> з <enclosure> (посилання на MP3/AAC), <itunes:duration>, <itunes:image>, <itunes:episode>, <content:encoded> для show notes.
Парсинг на клієнті — XMLParser (iOS, SAX-based) чи XmlPullParser (Android). Для регулярного оновлення фідів фонова задача переважна: BGAppRefreshTask (iOS) з інтервалом не менше 15 хвилин, PeriodicWorkRequest у WorkManager (Android). Apple Podcast Index та Listen Notes — агрегатори фідів з REST API, якщо потрібна база тисяч подкастів без самостійного парсингу.
// iOS — завантаження та парсинг RSS фіду
class PodcastFeedParser: NSObject, XMLParserDelegate {
private var currentElement = ""
private var currentEpisode: EpisodeBuilder?
func parser(_ parser: XMLParser, didStartElement elementName: String,
namespaceURI: String?, qualifiedName: String?,
attributes: [String: String] = [:]) {
currentElement = elementName
if elementName == "item" { currentEpisode = EpisodeBuilder() }
if elementName == "enclosure" {
currentEpisode?.audioURL = attributes["url"]
currentEpisode?.fileSize = Int(attributes["length"] ?? "0")
}
}
}
Воспроизведення зі змінною швидкістю
Speed playback (0.5x — 3.0x) без pitch shift — обов'язкова функція для подкастів. На iOS: AVPlayer.rate змінює швидкість. AVAudioSession з AVAudioTimePitchAlgorithm.timeDomain на AVPlayerItem — забирає pitch shift при прискоренні. Варіант .spectral — краща якість, але CPU затратніше.
На Android: ExoPlayer Media3 з PlaybackParameters(speed = 1.5f, pitch = 1.0f). Pitch = 1.0 означає фіксований pitch незалежно від швидкості.
Важливо: при швидкості > 2x у деяких говорящих голос стає неразборчивим через алгоритм pitch correction. Це обмеження алгоритму, не баг реалізації.
Главы (Podcast Chapters)
Главы — навігація всередині довгого епізоду. Два формати: MP3 ID3 chapter frames (CHAP тег) та Podlove Simple Chapters (у RSS XML). Apple Podcasts підтримує обидва.
Для читання ID3 chapters на iOS: AVMetadataItem через AVAsset.loadMetadata(for: .id3Metadata), пошук AVMetadataID3MetadataKeyChapterTOC та AVMetadataID3MetadataKeyChapter. На Android — ID3 parsing через ExoPlayer Metadata output чи сторонні бібліотеки (jaudiotagger).
UI для глав: timeline з маркерами, список глав з можливістю переходу по тапу на AVPlayer.seek(to: CMTime) / player.seekTo(positionMs).
Транскрипт та синхронізація тексту
Podcast Namespace <podcast:transcript> — тип application/srt чи application/json (WebVTT-подібний формат). При воспроизведенні — підсвічувати поточну рядок транскрипта по AVPlayer.currentTime.
Якщо транскрипта немає — генерація через Whisper (OpenAI API чи локальний inference через whisper.cpp). На iPhone з Neural Engine — whisper.cpp з CoreML-моделлю small працює в 2–3x realtime. Для серверної генерації за вимогою — економічно доцільніше хмарний API.
Offline та управління завантаженнями
Завантаження епізоду: URLSessionDownloadTask з URLSessionConfiguration.background. Прогрес через URLSessionDownloadDelegate.urlSession(_:downloadTask:didWriteData:). Файл зберігається у documentDirectory з іменем на основі episode ID.
Управління сховищем — важлива частина UX: показувати розмір завантажених епізодів, пропонувати видалити прослухані, налаштовувати авто-завантаження нових епізодів.
Lock Screen та CarPlay
Lock Screen: MPNowPlayingInfoCenter з MPNowPlayingInfoPropertyPlaybackRate, MPNowPlayingInfoPropertyDefaultPlaybackRate, MPNowPlayingInfoPropertyChapterCount, MPNowPlayingInfoPropertyCurrentChapterIndex. Главы відображаються в iOS Control Center.
CarPlay: CPTemplateApplicationScene + CPListTemplate для каталогу подкастів. CPNowPlayingTemplate — екран воспроизведення. Потребує entitlement (com.apple.developer.carplay-audio).
Рекомендації та відкриття подкастів
Podchaser API, Podcast Index API — агрегатори з метаданими та рейтингами. Для рекомендацій по історії прослухування — topic modeling через LDA чи sentence embeddings (описи подкастів → косинусна подібність). На старті достатньо простої логіки: «слухав X → інші, хто слухав X, слухали Y».
1 неділя — 3 місяці залежно від обсягу: від простого агрегатора з плеєром до повнофункціональної платформи з власним хостингом та аналітикою. Вартість розраховується індивідуально.







