# Netfly TV — IPTV/VOD Architecture Reference

**Source:** jadx decompilation of Netfly TV v3.0.3 (package `org.drive_hunter`, app `xyz.netfly.*`)
**Developer:** Anywhere Soluções em Tecnologia (Brazil) — Olé TV rebrand
**Date:** 2026-06-13

---

## Architecture Overview

- **Hybrid:** Native Android (Java) + Flutter module
- **Base:** MultiDexApplication + custom BaseActivity with manual ViewBinding
- **DI:** Service-locator singletons (no Dagger/Hilt/Koin)
- **Event bus:** GreenRobot EventBus
- **State:** ViewModel + LiveData
- **Security:** Native library `libsecurecheck.so` with SHA256 hash verification
- **Screen adaptation:** `xyz.stream.view.autosize` (custom autosize library)

## Player

- **Primary:** IJKPlayer (`tv.danmaku.ijk.media.player`) — FFmpeg-based, supports HLS/RTSP/RTMP
- **Secondary:** Media3 ExoPlayer (imported but less used)
- **Init:** `IjkPlayerRuntime.builder(context).sharedPreferences(...).okHttpClient(...).premiumUserProvider(...).build()`
- **Custom UI:** `VideoGestureFrameLayout` for brightness/volume/seek gestures
- **Pre-buffering:** `PreloadManager` for channel switching speed
- **Caching:** `CacheManager` for on-device video cache

## Backend API

**CMS-driven:** Loads `cms_config.json` from server into `context.getFilesDir()/cms_config.json`
**HTTP client:** Custom — uses `clientgosdk` (Go-based SDK) with GZip compression
**Request signing:** Every API path mapped to a `psk_app_nf_*` key — sent as request parameter

### Full API endpoint map

| API Route | Signing Key | Purpose |
|---|---|---|
| `app/check` | `psk_app_nf_check` | Activation/license check |
| `app/code` | `psk_app_nf_code` | Submit activation code |
| `app/active` | `psk_app_nf_active` | Activate device |
| `app/device/token` | `psk_app_nf_token` | Device token registration |
| `app/info` | `psk_app_nf_info` | App metadata/version |
| `app/latest` | `psk_app_nf_latest` | Latest version check |
| `user/device/login` | `psk_app_nf_login` | Device+UUID login |
| `user/login/sn` | `psk_app_nf_sn` | Social network login |
| `email/login` | `psk_app_nf_e_login` | Email+password login |
| `email/reg` | `psk_app_nf_reg` | Email registration |
| `email/send` | `psk_app_nf_e_send` | Send verification email |
| `email/reset_password` | `psk_app_nf_rstpw` | Password reset |
| `user/password/lost` | `psk_app_nf_lost` | Lost password flow |
| `user/order/status` | `psk_app_nf_u_status` | Subscription status |
| `user/lock` | `psk_app_nf_u_lock` | Account lock status |
| `user/lock/set` | `psk_app_nf_u_lock_set` | Set account lock |
| `user/watchers` | `psk_app_nf_watchers` | Who's watching |
| `user/play/history` | `psk_app_nf_p_history` | Playback history |
| `user/play/history/detail` | `psk_app_nf_p_history_detail` | History detail |
| `user/play/history/del` | `psk_app_nf_p_history_del` | Delete history entry |
| `user/favorite` | `psk_app_nf_favorite` | Add favorite |
| `user/favorite/del` | `psk_app_nf_favorite_del` | Remove favorite |
| `user/dislike` | `psk_app_nf_dislike` | Dislike content |
| `user/send/email` | `psk_app_nf_u_send_email` | Send email from app |
| `search` | `psk_app_nf_search` | Global search |
| `video/search` | `psk_app_nf_v_search` | VOD search |
| `video/list` | `psk_app_nf_v_list` | Video listing |
| `video/info` | `psk_app_nf_v_info` | Video details |
| `video/random` | `psk_app_nf_v_random` | Random video |
| `video/top` | `psk_app_nf_v_top` | Top/popular videos |
| `video/tags` | `psk_app_nf_v_tags` | Video tags/categories |
| `video/key` | `psk_app_nf_v_key` | Config key for videos |
| `video/episodes` | `psk_app_nf_v_episodes` | TV show episodes |
| `video/episodes/detail` | `psk_app_nf_ve_detail` | Episode detail |
| `video/episodes/list` | `psk_app_nf_ve_list` | Episode list |
| `video/episodes/sources` | `psk_app_nf_ve_sources` | Episode play sources |
| `live/channels/play` | `psk_app_nf_c_play` | Live channel stream URL |
| `live/channels/list` | `psk_app_nf_c_list` | All channels |
| `live/channels/epgs` | `psk_app_nf_c_epgs` | EPG schedule data |
| `live/channels/hot` | `psk_app_nf_c_hot` | Hot/popular channels |
| `live/channels/properties` | `psk_app_nf_prop` | Channel properties |
| `live/channels/adult` | `psk_app_nf_live_c_adult` | Adult channels |
| `live/categories/list` | `psk_app_nf_list` | Channel categories |
| `live/category` | `psk_app_nf_live_category` | Category detail |
| `live/channels` | `psk_app_nf_live_channels` | Live channels feed |
| `live-collection/banner` | `psk_app_nf_live_c_banner` | Live collection banners |
| `live-collection/list` | `psk_app_nf_live_c_list` | Live collections |
| `live-collection/channel/list` | `psk_app_nf_live_c_c_list` | Collection channels |
| `collection/live/list` | `psk_app_nf_c_live_list` | Live collection list |
| `collection/list` | `psk_app_nf_l_list` | Content collections |
| `collection/media/list` | `psk_app_nf_l_mlist` | Collection media list |
| `sports/football/leagues` | `psk_app_nf_fo_leagues` | Football leagues |
| `sports/football/leagues/matchs` | `psk_app_nf_fo_leagues_matchs` | League matches |
| `support/config` | `psk_app_nf_s_config` | Support config |
| `config/key` | `psk_app_nf_v_key` | Config key |
| `translation/subtitle` | `psk_app_nf_subtitle` | Subtitle translations |
| `translation/task/progress` | `psk_app_nf_progress` | Translation progress |
| `cms/subtitle` | `psk_app_nf_cms_stt` | CMS subtitle config |
| `people/search` | `psk_app_nf_p_search` | People/actor search |
| `users/url` | `psk_app_nf_u_url` | User-specific URLs |

### Auth Flow

```
SplashActivity → app/check (activation check)
               ↓
LoginActivity → user/device/login (device UUID + login_uuid)
              → email/login (email + password)
              → email/reg (register) → app/code (enter activation code)
              → app/active (activate)
              ↓
RoleActivity → dashboard/home
```

## Monetization

- **AdMob:** App ID `ca-app-pub-8852922660664051~9258636436`
- **Pangle (ByteDance):** v8.1.0.3 — reward, interstitial, full-screen, banner
- **Subscriptions:** `SubscriptionActivity` + `user/order/status` endpoint
- **Activation codes:** `app/code` → `app/active` two-step flow
- **Pay config:** CMS has `pay_website_config` → `netfly.link_url`

## Download System

- **Foreground service:** `DownloadService` with channel `download_channel`
- **Thread pool:** 1 core, 1 max, LinkedBlockingDeque
- **DB:** `DbHolder` (SQLite) tracks `FileInfo` (status codes: 44=waiting, 43=paused, 45=queued, 46=downloading)

## Screen Map (34 activities)

| Activity | Type | Purpose |
|---|---|---|
| `SplashActivity` | Launcher | Activation check, init, navigate |
| `LoginActivity` | Full | Email/password/OTP/login/register |
| `RoleActivity` | Full | Role/package selection |
| `HomeActivity` | Full | Main home (landscape TV) |
| `DashboardActivity` | Full | Dashboard |
| `MainTvActivity` | Full | TV main screen |
| `MobileMainActivity` | Full (Flutter) | Mobile UI |
| `VodLibraryActivity` | Full | Movie/show catalog |
| `VodInfoActivity` | Full | Movie/show detail |
| `VodPlayerActivity` | Full | VOD playback |
| `PlaybackActivity` | Full | Playback controls |
| `LiveActivity` | Full | Live TV guide |
| `LivePlayActivity` | Full | Live playback |
| `SelectChannelActivity` | Dialog | Channel picker |
| `ChannelListActivity` | Full | Channel grid |
| `CategorySettingActivity` | Full | Category filter |
| `IptvLiveActivity` | Full | IPTV stream |
| `IptvSelectChannelActivity` | Dialog | IPTV channel picker |
| `SearchTvActivity` | Full | TV search |
| `SearchTabletActivity` | Full | Tablet search |
| `PersonActivity` | Full | Cast/crew |
| `MatchActivity` | Full | Sports match |
| `LeagueSortActivity` | Full | Sports leagues |
| `DownloadItemActivity` | Full | Download manager |
| `SubscriptionActivity` | Full | Payments |
| `AdultLibraryActivity` | Full | Adult content |
| `ParentalLockActivity` | Dialog | PIN lock |
| `VideoDetailActivity` | Full | Mobile detail (Flutter-compat) |
| `EpisodesActivity` | Dialog | Episode selector |
| `SelectTagActivity` | Dialog | Tag filter |
| `AudioAndSubtitleActivity` | Full | Track picker |
| `AirplayGuideActivity` | Full | AirPlay guide |
| `CastAndCrewDetailActivity` | Full | Cast detail |
| `FeedbackPopActivity` | Dialog | Feedback |

## Key SDKs (from decompiled manifest)

```
Google Ads (AdMob) — ca-app-pub-8852922660664051~9258636436
Pangle (ByteDance) — v8.1.0.3
Firebase Analytics
Firebase Cloud Messaging
Google Analytics
Google Ad Manager
ZXing (QR/barcode)
Flutter (InAppWebView, embedded views)
WorkManager
Room
AndroidX Security (EncryptedSharedPreferences)
```
