AerioTV
AerioTV is a native IPTV streaming application for iOS, iPadOS, tvOS, and macOS (using the iPad app). It connects to Dispatcharr via API Key, Xtream Codes, and M3U playlist servers to deliver live TV, movies, and series with a full electronic program guide (EPG) when supplied by the user.
- This will usually lag behind the TestFlight version.
- This version may have bugs but will always be the latest.
- This version will occasionally be ahead of the Apple Testflight version.
The AerioTV Family
| App | Devices | Repository | | --- | --- | --- | | AerioTV for Apple (this repo) | iPhone, iPad, Apple TV, and Mac (iPad app) | jonzey231/AerioTV | | AerioTV for Android | Phones, tablets, Google TV, and Android TV | jonzey231/AerioTV-Android | | AerioTV for Roku | Roku players and Roku TVs (community port) | EndofLineTech/AerioTV-Roku |
The Apple and Android apps share one design and feature set. They also work together: cast from an iPhone to AerioTV on Android TV, or AirPlay to an Apple TV.
Screenshots
iPhone
iPad
Apple TV
Features
A native Apple-platform IPTV client. Stream live TV with full EPG, browse on-demand movies and series, schedule recordings to a Dispatcharr server or to your device, and watch up to 9 channels at once with Multiview, across iPhone, iPad, Apple TV, and macOS (running the iPad app), with iCloud sync stitching it all together.
Click each section for the full list:
Live TV & Guide: MPV-powered playback, list + grid views, EPG, reminders.
- MPV-powered, GPU-accelerated playback
- List view + full EPG guide (grid on iPad/tvOS, list on iPhone)
- Program titles, descriptions, and time slots
- Channel info banner identifies the channel + program when a stream starts
- Sort channels by number, name, or favorites
- Tap to play, long-press for favorites
- Long-press an upcoming program to set a reminder or schedule a recording
- EPG reminders fire 5 minutes before the program starts; sync via iCloud
- EPG window configurable from 6 hours up to the full available window
- Channels without guide data still selectable from the grid
Multiview (v1.6.0): up to 9 streams at once.
- Watch up to 9 live channels at once in a dynamically-sized grid
- Enter from any playing channel: tap the grid button (iPad) or
- Layouts adapt to tile count: 1, 2, 3 asymmetric, 2×2, 5
- Only the most recently added stream plays audio; tap any tile
- Long-press menu on every tile: Make Audio / Full-Screen in
- Move Mode for rearranging tiles (long-press → "Move Tile")
- Picture-in-Picture from multiview on iPad, only the audio
- Performance warning at the 5th tile (2-hour throttle); hard
.critical device temp
DVR Recording (v1.5.0): server-side on Dispatcharr, local on every server type.
- Schedule live or upcoming programs from the Live TV guide
- Dispatcharr server-side recording, continues even when
- Local recording on this device, records to
Documents/Recordings (or a user-chosen folder on iOS).
Available for Dispatcharr, Xtream Codes, and M3U
- Per-recording pre-roll (start early) and post-roll (end late)
- Remove Commercials (Comskip), server-side processing on
- DVR tab appears automatically when there's at least one
- Auto-discovery of recordings scheduled outside the app
- Download completed server recordings to local storage
- Local storage quota with live usage bar (1–200 GB,
- iOS Files app access ("On My iPhone → AerioTV")
- Keep-device-awake toggle so a local recording isn't
Movies & TV Shows (Dispatcharr & Xtream Codes): VOD library, Continue Watching, TMDB-rich metadata.
- Browse and filter on-demand content by category
- TMDB-rich metadata on Dispatcharr (backdrop, plot, cast,
- Provider-supplied metadata on Xtream Codes (poster, title,
- Continue Watching, resume movies and episodes; progress
- Long-press to remove items from Continue Watching
- Per-playlist VOD toggle in Settings → Edit Playlist
- Series and movie detail caches make second-opens instant
Player: chrome, Stream Info, Sleep Timer, AirPlay, PiP, swipe channel-flip.
- Tap to summon chrome; auto-fade after 5s of inactivity
- Single overflow menu (iOS) / Options panel (tvOS) for all
- Audio track + subtitle track selection
- Playback speed (0.5×, 0.75×, 1×, 1.25×, 1.5×, 2×) for VOD,
- Sleep Timer (30 / 60 / 90 / 120 min), with a countdown in the
- Audio Only mode
- AirPlay
- Picture-in-Picture on iOS, swipe home during playback and
- Stream Info overlay, codec, resolution, FPS, pixel
- Channel-flip gestures, Up/Down on the Siri Remote
Casting Google Cast from iPhone, with native hand-off to AerioTV on Android TV.
- Cast live channels from the iPhone to Google Cast receivers on
- Android TV / Google TV with AerioTV installed: the cast
- Other Cast receivers (Chromecast, Chromecast Ultra,
- Audio is never transcoded: AAC passes through, and AC-3 or
- No Dispatcharr output profile or other server-side
- When casting to the web receiver the phone is the media source,
- The cast card at the bottom of the app controls playback; the X
iCloud Sync: granular categories, scoped delete, set-up-once.
- Server configurations, preferences, VOD watch progress, EPG
- Uses iCloud Key-Value Storage
- Granular per-category sync controls in Settings (v1.6.17+);
- Per-category "Delete from iCloud" actions for scrubbing stale
- Set up once on one device and your other devices pick up the
Apple TV: Siri Remote, Top Shelf, floating player, LAN detection.
- Full Siri Remote support with d-pad navigation
- Options panel for audio, subtitles, speed, sleep timer, and
- Up/down on the Siri Remote changes channels during
- Press Menu to minimize live TV to a floating corner player;
- Channels and logos sized for living-room viewing
- LAN detection probes local server URLs automatically; no
- Top Shelf, your 6 most-watched channels (with the
iPhone & iPad polish: gestures, layouts, mini-player, multiview safe-area carve-outs.
- Mini-player (iPhone bottom bar / iPad top-right corner) keeps
- Pinch-to-zoom-out shrinks the iPad player to the corner mini
- Swipe down to dismiss / minimize the player on iPhone
- iPhone multiview respects the notch and Dynamic Island,
- iPad / Mac Catalyst use the iPad app as-is; macOS gets the
Supported Server Types
AerioTV connects to three different playlist types. Each unlocks a different set of features. If you're choosing between them, the short version is:
Click each type for the full breakdown:
Dispatcharr Direct Connect (Recommended): Dispatcharr Admin Username & Password or API with API key authentication. Most full-featured option.
Dispatcharr is a self-hosted IPTV middleware that gives users control over their IPTV services. See the linked GitHub.
Benefits Dispatcharr is uniquely good at
- Server-side DVR, schedule recordings that continue running
- Comskip (commercial-skip), toggle when scheduling a server-side
- Server-side recording playback, stream completed server
- Server-side stream failover via channel UUID, when a primary
.m3u8 then .ts, but
the server can't swap to a different provider on its own.)
- TMDB-enriched VOD metadata, backdrops, plots, cast, director,
- Bulk EPG fetch, one network call returns -1h to +24h for
/api/epg/grid/. Xtream Codes uses per-stream
EPG calls; M3U pulls XMLTV from a separate URL.
- Per-server custom User-Agent override, set in Settings →
- External XMLTV URL override (advanced), point the EPG at
- Auto-discovery of recordings scheduled outside the app,
Xtream Codes: IPTV Source URL + username & password authentication. No self-hosting required.
The Xtream Codes API is what most IPTV providers natively expose. You log in with the username / password your provider gave you and AerioTV pulls live TV, movies, and series.
Benefits
- No self-hosting. Most IPTV providers expose an Xtream Codes
- Live TV + VOD library. Movies and series come from the same
- Per-playlist VOD toggle. Settings → Edit Playlist exposes
- Local DVR with pre-roll / post-roll. Recordings on this
- EPG via TVG ID matching, most provider EPGs key to
tvg_id field automatically.
- Client-side stream URL fallback, Aerio tries
.m3u8first,
.ts, so a transient HLS hiccup doesn't kill playback
outright.
- Familiar auth model, single username and password.
- VOD metadata is provider-supplied, not TMDB-enriched. You
- No server-side DVR. Recordings are local-only, must keep
- EPG depth varies by provider, some give you a few days,
M3U Playlist: Direct URL + optional XMLTV EPG. Universal compatibility, simplest setup.
A plain M3U playlist is just a list of stream URLs in a text file. Works with literally any IPTV provider that gives you a playlist URL, including providers that don't support the Xtream Codes API.
Benefits
- Universal compatibility. If a provider hands you any URL
.m3u / .m3u8, AerioTV can play it.
- Fastest setup. Paste the URL → done. No credentials, no
- No self-hosting.
- Local DVR with pre-roll / post-roll. Recordings on this
- Optional separate XMLTV URL for EPG. Bring your own EPG
- Compressed
.xml.gzEPG, coming in a future release.
- No VOD library. M3U is live TV only, no movies or series.
- No server-side DVR. Recordings are local-only, AerioTV
- EPG depends on a separate XMLTV source. You set the URL
- No stream failover at all. When a stream URL stops working,
.m3u8/.ts
client fallback like XC has, and no server-side swap like
Dispatcharr has.
- Large M3U files can be slow to parse on first launch, a
Networking
AerioTV talks to your server directly from the device. If the server sits behind a reverse proxy with single sign-on (SSO), the app's requests have no browser session, so the paths it uses need to pass through to the server's own authentication instead. Each bypassed path is still guarded by the server: the Dispatcharr API by an API key or token, the Xtream Codes paths by the account's username and password, and the stream proxy by the stream UUID in the URL.
Pangolin access rules for Dispatcharr (click to expand)
Add these rules to the Dispatcharr resource in this order. The three
"Pass to Auth" rules keep the API documentation behind SSO; the rest let
AerioTV reach the server. Rules 6 through 11 are only needed when a
Dispatcharr user connects through an Xtream Codes playlist instead of
Direct Connect. Direct Connect never touches /output/, so there is no
rule for it; see the note below the table.
| # | Action | Match | Path | Needed for |
|---|--------|-------|------|------------|
| 1 | Pass to Auth | Path | /api/swagger/* | keeps the API docs behind SSO |
| 2 | Pass to Auth | Path | /api/redoc/* | keeps the API docs behind SSO |
| 3 | Pass to Auth | Path | /api/schema/* | keeps the API docs behind SSO |
| 4 | Bypass Auth | Path | /api/* | channels, EPG, VOD, recordings, logos, native Catch-Up sessions, Mark as Radio Channel (admin only PATCH of /api/channels/channels/) |
| 5 | Bypass Auth | Path | /proxy/* | live streams, VOD streams, Catch-Up playback, stream switching |
| 6 | Bypass Auth | Path | /player_api.php | Xtream Codes only |
| 7 | Bypass Auth | Path | /xmltv.php | Xtream Codes only |
| 8 | Bypass Auth | Path | /get.php | Xtream Codes only |
| 9 | Bypass Auth | Path | /live/* | Xtream Codes only |
| 10 | Bypass Auth | Path | /movie/* | Xtream Codes only |
| 11 | Bypass Auth | Path | /series/* | Xtream Codes only |
| 12 | Bypass Auth | Path | /timeshift/* | Xtream Codes Catch-Up; also the Direct Connect Catch-Up fallback on Dispatcharr builds without native catch-up sessions |
Anyone who knows a stream UUID can play that stream through rule 5, which is how Dispatcharr's proxy works with or without a reverse proxy. A geo or IP rule on the resource narrows that further if you want it.
/output/* (the M3U playlist and XMLTV export) is deliberately not in the
list. Direct Connect reads channels and the guide through /api/*, so
bypassing SSO there would only publish an unauthenticated playlist. Add a
/output/* bypass only if you point an M3U playlist at Dispatcharr, and
then limit it with Dispatcharr's own network access settings.
Every Dispatcharr API path AerioTV uses (for a narrower set of rules than
/api/*)
If you would rather not bypass SSO for all of /api/*, these are the paths
the app requests, taken from the code of both platforms. is a
numeric id or session token; reverse proxies usually need a wildcard there.
| # | Area | Path | Used for |
|---|------|------|----------|
| 1 | Login and account | /api/accounts/token/ | username and password login, returns the JWT pair |
| 2 | Login and account | /api/accounts/token/refresh/ | renews the access token so you stay signed in |
| 3 | Login and account | /api/accounts/users/me/ | your user record, including the API key and the Catch-Up (XC) password |
| 4 | Login and account | /api/accounts/users/ | admin check; a 2xx here proves the account is an admin (unlocks Switch Stream and server-side features) |
| 5 | Server | /api/core/version/ | server version, also the connectivity and auth test at setup |
| 6 | Server | /api/core/settings/ | server-wide switches such as whether Catch-Up is enabled |
| 7 | Channels and guide | /api/channels/channels/ | the channel list for the playlist |
| 8 | Channels and guide | /api/channels/channels/ | one channel's details and stream order (Switch Stream reorder); PATCH is_radio for Mark as Radio Channel (admin only) |
| 9 | Channels and guide | /api/channels/channels/ | a channel's member streams for Switch Stream |
| 10 | Channels and guide | /api/channels/groups/ | channel groups for the group pills and sidebar |
| 11 | Channels and guide | /api/channels/profiles/ | channel profiles for the Edit Playlist picker |
| 12 | Channels and guide | /api/channels/profiles/ | the channels inside the chosen profile |
| 13 | Channels and guide | /api/channels/logos/ | channel logo images |
| 14 | Channels and guide | /api/channels/summary/ | lightweight counts used to verify the connection |
| 15 | Channels and guide | /api/epg/grid/ | the bulk EPG window (about -1 h to +24 h) that fills the guide |
| 16 | Channels and guide | /api/epg/programs/ | program search and per-channel program lists beyond the grid window |
| 17 | Channels and guide | /api/epg/programs/ | one program's full detail (categories, rating) for tinted cards and the info sheet |
| 18 | Channels and guide | /api/epg/current-programs/ | what is airing now on a set of channels (Live TV cards, Top Shelf) |
| 19 | Channels and guide | /api/epg/epgdata/ | the EPG channel rows that map tvg ids to EPG sources |
| 20 | Channels and guide | /api/epg/sources/ | the server's EPG sources, layered onto the guide |
| 21 | Channels and guide | /api/m3u/accounts/ | source account names shown next to streams and in the VOD version picker |
| 22 | DVR | /api/channels/recordings/ | list and schedule recordings |
| 23 | DVR | /api/channels/recordings/ | one recording's details, edit and delete |
| 24 | DVR | /api/channels/recordings/ | plays a completed recording |
| 25 | DVR | /api/channels/recordings/ | stops a recording in progress |
| 26 | DVR | /api/channels/recordings/ | runs commercial removal on a recording |
| 27 | DVR | /api/channels/series-rules/ | series recording rules |
| 28 | DVR | /api/channels/series-rules/evaluate/ | schedules the episodes a new series rule matches |
| 29 | VOD | /api/vod/categories/ | movie and series categories |
| 30 | VOD | /api/vod/movies/ | movie library pages, search and Recently Added |
| 31 | VOD | /api/vod/movies/ | the copies of a movie across source accounts (version picker) |
| 32 | VOD | /api/vod/movies/ | TMDB-enriched detail for a movie |
| 33 | VOD | /api/vod/series/ | series library pages, search and Recently Added |
| 34 | VOD | /api/vod/series/ | one series by id, for Continue Watching and Watchlist rows |
| 35 | VOD | /api/vod/series/ | the copies of a series across source accounts |
| 36 | VOD | /api/vod/series/ | TMDB-enriched detail for a series |
| 37 | VOD | /api/vod/episodes/ | the episodes of a series |
| 38 | Playback sessions | /api/proxy/hls/sessions/ | opens a Force HLS session for a channel |
| 39 | Playback sessions | /api/proxy/hls/sessions/ | closes that session when playback stops |
| 40 | Playback sessions | /api/catchup/sessions/ | opens a native Catch-Up session for a past program |
| 41 | Playback sessions | /api/catchup/sessions/ | closes the Catch-Up session |
| 42 | Playback sessions | /api/catchup/sessions/ | reports the playback position so the session can be resumed |
Collapsed to prefixes (10 rules cover all 42 paths):
/api/accounts/, /api/core/, /api/channels/, /api/epg/, /api/m3u/*,
/api/vod/, /api/proxy/, /api/catchup/, plus /proxy/ and
/timeshift/*.
New Dispatcharr features will add paths over time, which is the trade against
the single /api/* rule.
When does AerioTV refresh?
AerioTV always opens from the cache on your device first and refreshes in the background. The spinner only appears when there is nothing cached yet or when you refresh by hand.
| Data | On launch | While open | While closed | |---|---|---|---| | Channels and guide | Painted from the cache, then refreshed quietly after the guide appears | Refreshed again when you return and the data is more than 30 minutes old | Background Refresh interval in Settings, General (1 to 48 hours, or a time of day; the About Refreshing note there summarizes this table) | | Movies and TV Shows | Library restored from the cache | Re-scanned in the background on the Refresh Library schedule in Settings, Movies and TV Shows (every launch, daily, or weekly), or when the server reports a change | Same background job | | DVR recordings | Restored from the cache | Updated every 30 seconds while the app is in the foreground | Not polled | | Favorites, progress, reminders, settings (sync) | Pulled on launch and on profile switch | Pulled again after 5 minutes away and every 15 minutes; your changes are sent a few seconds after you make them | Not synced |
Switching profiles on a Dispatcharr playlist keeps the server's guide and library on screen; only your channel visibility and personal data change. Pull down (phone) or press Refresh (TV) to force an update at any time.
OTA / HDHomeRun Channels (MPEG-2)
Over-the-air broadcast channels (ATSC tuners such as HDHomeRun) carry MPEG-2 video. Apple devices have no MPEG-2 decoder, so these channels cannot play natively and AerioTV will show a "Channel Not Supported" message naming MPEG-2 as the reason.
For Dispatcharr users the fix is a one-time server-side transcode:
create an ffmpeg Stream Profile
and assign it to your OTA channels. Command: ffmpeg. Parameters
(paste exactly this, and do NOT include the word ffmpeg at the start
of the parameters field):
-fflags +discardcorrupt+genpts -user_agent {userAgent} -i {streamUrl} -map 0:v:0 -map 0:a? -vf yadif -c:v libx264 -preset veryfast -tune zerolatency -crf 21 -maxrate 12M -bufsize 24M -g 60 -keyint_min 60 -sc_threshold 0 -c:a ac3 -mpegts_flags +pat_pmt_at_frames+resend_headers+initial_discontinuity -f mpegts pipe:1
This deinterlaces the broadcast and re-encodes it to H.264 with AC-3
audio, which every Apple device plays natively. Expect roughly one CPU
core per concurrently watched OTA channel; if your server has a
hardware encoder, substitute -c:v h264_qsv or -c:v h264_nvenc for
-c:v libx264 -crf 21. Remember to assign the profile to the OTA
channels themselves: editing a profile does not move any channel onto
it.
If your HDHomeRun is a transcode-capable model (EXTEND class), enabling its built-in H.264 transcoder is an alternative that needs no server CPU at all.
Requirements for Development
- Xcode 15 or later
- iOS 18.0+, iPadOS 18.0+, tvOS 18.0+, macOS 15.0+ (using the iPad app)
- Swift Package Manager for dependency management
Getting Started
Clone the repository and install dependencies:
git clone https://github.com/jonzey231/AerioTV.git
cd AerioTV
pod install
Open the workspace (not the project file) in Xcode:
open Aerio.xcworkspace
Select either the Aerio_iOS or Aerio_tvOS scheme and build to a simulator or device.
Dependencies
- Swift Package Manager for dependency management
- The
Pods/directory (if present from legacy builds) is excluded from version control
Project Structure
App/ Application entry point, player, splash screen, Now Playing integration
Design/ Colors, typography, shared UI components
Features/
Home/ Main tab view, VOD store, Now Playing manager
LiveTV/ Channel list, EPG guide, channel store
Movies/ Movie browsing and detail views
Series/ TV series browsing and detail views
Settings/ App settings, network settings, appearance
Onboarding/ Welcome flow, server setup, iCloud sync
Models/ SwiftData models for servers, channels, EPG programs
Networking/ Dispatcharr API, Xtream Codes API, M3U/XMLTV parsing
Shared/ Keychain helper, sync manager, reminder manager
SupportingFiles/ Info.plist, entitlements, asset catalogs
TopShelfExtension/ Apple TV Top Shelf content provider
Configuration
- On first launch the app presents an onboarding flow where you add your server
- Server configurations can be imported from another device through iCloud sync
- EPG data is downloaded once and cached locally
- Default EPG window is 36 hours ahead (configurable in Settings > Network)
- Fresh install shows a loading screen until the initial EPG download completes
Sideloading
- Pre-built .ipa files for iOS and tvOS are available on the Releases page
- Download the .ipa for your platform
- Install using your preferred sideloading method (AltStore, Sideloadly, etc.)
Building for Release
- Import this repository into Xcode
- Select the appropriate scheme (
Aerio_iOSorAerio_tvOS) - Set the destination to your preferred device
- Build and/or run, or generate a .ipa via Product > Archive
License
Copyright (C) 2026 Logan Jones and contributors
AerioTV for iOS, iPadOS, and tvOS is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. See LICENSE.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
An additional permission under GPL section 7 covers linking with the proprietary Google Cast SDK. See LICENSE-EXCEPTIONS.md.
Releases published before the relicensing commit were under the MIT License. That grant is not revoked: any copy obtained under MIT keeps its MIT rights to that snapshot in perpetuity. Everything from the relicensing commit forward is GPL-3.0-or-later.
Third-party components
AerioTV links MPVKit (mpv v0.41.0 and FFmpeg 8.x, LGPL-3.0-or-later as
bundled), which also bundles libass (ISC), FreeType (FTL), HarfBuzz (MIT),
FriBidi (LGPL-2.1-or-later), libunibreak (zlib), OpenSSL (Apache-2.0), GnuTLS,
GMP, Nettle and Hogweed (LGPL), libplacebo (LGPL-2.1-or-later), shaderc and
MoltenVK (Apache-2.0), Little CMS (MIT), libdovi (MIT), dav1d (BSD-2-Clause),
libuavs3d (BSD-3-Clause), libbluray (LGPL-2.1-or-later) and libuchardet
(MPL-1.1 / GPL-2.0 / LGPL-2.1); the proprietary Google Cast SDK; SwiftDraw
(zlib); and Protocol Buffers (BSD-3-Clause). Protobuf here is Google's
Objective-C Protocol Buffers 3.29.6, BSD-3-Clause, pulled in transitively by
the Cast SDK, not apple/swift-protobuf. See
THIRD_PARTY_LICENSES.md for the full list, exact
build configuration, and where to obtain corresponding source. The same
information is in the app under Settings > About > Open Source Licenses.
MPVKit is linked as a dynamic XCFramework and can be replaced with a modified build, as section 4 of the LGPL requires. To receive the corresponding MPVKit, mpv, or FFmpeg source directly, open an issue at github.com/jonzey231/AerioTV/issues.
The Google Cast SDK for iOS is proprietary and is used under the Google APIs Terms of Service and the Google Cast SDK Additional Developer Terms of Service. Linking it with this GPL-licensed program is permitted by an additional permission under GPL section 7; see LICENSE-EXCEPTIONS.md.
This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (https://www.openssl.org/). OpenSSL 3.3.5 is used under the Apache License, Version 2.0. MoltenVK (The Brenwill Workshop Ltd. and the Khronos Group) and shaderc (The Khronos Group) are used under the Apache License, Version 2.0. Full text: https://www.apache.org/licenses/LICENSE-2.0
Patents
AerioTV includes independent implementations of audio and video codecs through FFmpeg that may be covered by patents in some countries. AerioTV is free software under GPL-3.0-or-later and grants no patent license; users are responsible for compliance with any patent or licensing requirements where they live.
AerioTV also encodes video on the device for casting, in H.264/AVC (High profile) and HEVC/H.265 (Main profile). This encoding, like hardware and platform decoding of these formats, uses only the codecs provided by the operating system: VideoToolbox on Apple devices and MediaCodec on Android devices. AerioTV does not bundle any third-party video encoder. These operating system codecs are licensed by Apple, and by Google or the device manufacturer, respectively for use on those devices; AerioTV grants no additional patent license for H.264/AVC or HEVC/H.265 encoding or decoding.
Dolby, Dolby Digital, Dolby Digital Plus, Dolby TrueHD, DTS, DTS-HD and other codec and format names are trademarks of their respective owners. AerioTV is not affiliated with, endorsed by, or certified by any of them, and codec names are used only to describe the formats the app can play.
TMDB attribution
This product uses the TMDB API but is not endorsed or certified by TMDB.
Artwork and metadata come from TMDB under the TMDB API Terms of Use. The TMDB logo is used per TMDB's logo and attribution guidance.
Support
To report bugs or request features, open an issue at github.com/jonzey231/AerioTV/issues.