{
  "versionName": "0.7.0",
  "versionCode": 2108,
  "baseVersionCode": 108,
  "apkUrl": "https://updater.javp.app/javp-0.7.0+108.apk",
  "changelog": "## 0.7.0+108 (2026-09-25)\n\n### Bug fixes\n\n- Web companion opens IPTV as HLS (`.m3u8`) instead of a raw MPEG-TS (`.ts`) download, so Chrome/Firefox can play live channels.\n\n- Web companion demand-loads an IPTV live or VOD group when you open it, instead of painting an empty list and waiting on SQLite / a full dump.\n\n- Web companion no longer throws LiveChannelDb is unavailable on web when syncing Xtream live groups. Channels persist in the catalog / localStorage instead.\n\n### Fixes\n\n- Pausing playback pauses the next-episode countdown, so the next episode does not start on its own while the video is paused.\n\n- Google Drive on the web no longer fails to connect or sync with \u201cinit has already been called\u201d.\n\n- Pull-to-refresh on a series reloads episode versions from the catalog, including links that were already resolved.\n\n- Offline download now recognizes catalog HLS proxies (base64-wrapped `.m3u8` URLs) and packages the full episode instead of saving a tiny playlist file\n\n- Dragging the playhead on a movie or episode follows your finger, and playback jumps to that time when you let go.\n\n- Removing or re-syncing a remote catalog clears stale local series shells and\n  expired stream links so Play and episode lists match the live catalog again\n\n- Finishing an episode with no scene after the credits marks it watched and offers the next episode, instead of leaving a percent on that episode.\n- The next-episode countdown is shorter and uses a smaller card so the picture stays visible behind it. With no credits marker, that card appears only in the last few seconds, in time to show it will autoplay.\n\n- Holding for temporary 2\u00d7 no longer cancels into volume or brightness when the finger moves slightly\n\n- Phone player side-strip volume now follows the device volume (0\u2013100%), not software gain relative to the current level\n- Phone brightness side-strip uses a smoother perceptual curve instead of jumping between dim and full bright\n\n- After re-adding a custom catalog (new id, maybe a new name), v2 series that\n  still showed episode lists can resolve play URLs again instead of staying on\n  stubs from the old source id.\n\n- Refreshing a remote-catalog series page renews expired tokenized play links (magnets still kept)\n\n- Soft keyboard no longer covers Add / Edit source fields on the catalogs list.\n\n- Taps and settings toggles respond during a catalog sync. Progress animations\n  used to starve Flutter's idle queue, so clicks arrived but nothing reacted.\n- Discord Rich Presence no longer polls on the UI thread while you browse.\n- Catalog reads no longer wait behind a long SQLite maintenance pass. Sort-title\n  reindex runs on its own connection, and contended waits time out instead of\n  parking the app for up to half a minute.\n- Large catalog jobs no longer sleep a full frame between chunks, so a sync is\n  not several times slower than the work itself.\n- The Sources list stays scrollable while status updates; only the row that\n  changed rebuilds.\n- Windows no longer sweeps empty XInput slots dozens of times a second when no\n  controller is attached.\n\n- Watching a magnet no longer leaves a growing torrent cache on disk after you\n  stop \u2014 stream data under the temp folder is deleted when playback ends (and\n  orphans are cleared the next time the torrent engine starts).\n\n- Series episode lists no longer collapse to the one you just played after you leave and come back \u2014 opening a show keeps the full season, and playing an episode no longer dumps extra stream versions onto Home / Catalog.\n\n- Opening a downloaded series after a restart plays the files already on the\n  device instead of fetching episode versions from the catalog.\n\n- macOS: app no longer crashes at launch looking for `librqbit_engine` under the build machine's home directory; the torrent engine dylib now loads from the app bundle via `@rpath`.\n\n- Auto-download ahead and next/previous episode keep the same version kind you picked (for example VOSTFR) instead of falling back to the default edition\n\n- Web player uses the same gesture controls as the desktop/phone app, and clicks work again (HTML video no longer steals pointer events).\n- Live / HLS streams play in Chromium browsers via hls.js.\n\n### Improvements\n\n- The web companion lives at http://javp.tf (no HSTS) so HTTP streams can play in the browser.\n- `http://javp.tf/add?\u2026` is a first-class add-source link (same query as `https://javp.app/add`), not a media open.\n\n- On http://javp.tf, IPTV passwords and other secrets persist in localStorage. flutter_secure_storage_web cannot run outside a secure context (HTTPS / localhost).\n\n- On https://javp.tf, the web companion recommends http://javp.tf (mixed content / CORS). javp.app stays the native add-source link.\n\n- Play/pause control uses a slightly darker disc with no drop shadow\n\n### Features\n\n- Playing local disk files (Open with / Library picker) starts immediately\n  like a regular media player \u2014 without adding them to Library \u2014 and Next /\n  Previous steps through other media in the same folder.",
  "force": false,
  "channel": "stable",
  "publishedAt": "2026-09-25T09:27:17+00:00",
  "releases": [
    {
      "versionName": "0.7.0",
      "title": "0.7.0+108 (2026-09-25)",
      "notes": "### Bug fixes\n\n- Web companion opens IPTV as HLS (`.m3u8`) instead of a raw MPEG-TS (`.ts`) download, so Chrome/Firefox can play live channels.\n\n- Web companion demand-loads an IPTV live or VOD group when you open it, instead of painting an empty list and waiting on SQLite / a full dump.\n\n- Web companion no longer throws LiveChannelDb is unavailable on web when syncing Xtream live groups. Channels persist in the catalog / localStorage instead.\n\n### Fixes\n\n- Pausing playback pauses the next-episode countdown, so the next episode does not start on its own while the video is paused.\n\n- Google Drive on the web no longer fails to connect or sync with \u201cinit has already been called\u201d.\n\n- Pull-to-refresh on a series reloads episode versions from the catalog, including links that were already resolved.\n\n- Offline download now recognizes catalog HLS proxies (base64-wrapped `.m3u8` URLs) and packages the full episode instead of saving a tiny playlist file\n\n- Dragging the playhead on a movie or episode follows your finger, and playback jumps to that time when you let go.\n\n- Removing or re-syncing a remote catalog clears stale local series shells and\n  expired stream links so Play and episode lists match the live catalog again\n\n- Finishing an episode with no scene after the credits marks it watched and offers the next episode, instead of leaving a percent on that episode.\n- The next-episode countdown is shorter and uses a smaller card so the picture stays visible behind it. With no credits marker, that card appears only in the last few seconds, in time to show it will autoplay.\n\n- Holding for temporary 2\u00d7 no longer cancels into volume or brightness when the finger moves slightly\n\n- Phone player side-strip volume now follows the device volume (0\u2013100%), not software gain relative to the current level\n- Phone brightness side-strip uses a smoother perceptual curve instead of jumping between dim and full bright\n\n- After re-adding a custom catalog (new id, maybe a new name), v2 series that\n  still showed episode lists can resolve play URLs again instead of staying on\n  stubs from the old source id.\n\n- Refreshing a remote-catalog series page renews expired tokenized play links (magnets still kept)\n\n- Soft keyboard no longer covers Add / Edit source fields on the catalogs list.\n\n- Taps and settings toggles respond during a catalog sync. Progress animations\n  used to starve Flutter's idle queue, so clicks arrived but nothing reacted.\n- Discord Rich Presence no longer polls on the UI thread while you browse.\n- Catalog reads no longer wait behind a long SQLite maintenance pass. Sort-title\n  reindex runs on its own connection, and contended waits time out instead of\n  parking the app for up to half a minute.\n- Large catalog jobs no longer sleep a full frame between chunks, so a sync is\n  not several times slower than the work itself.\n- The Sources list stays scrollable while status updates; only the row that\n  changed rebuilds.\n- Windows no longer sweeps empty XInput slots dozens of times a second when no\n  controller is attached.\n\n- Watching a magnet no longer leaves a growing torrent cache on disk after you\n  stop \u2014 stream data under the temp folder is deleted when playback ends (and\n  orphans are cleared the next time the torrent engine starts).\n\n- Series episode lists no longer collapse to the one you just played after you leave and come back \u2014 opening a show keeps the full season, and playing an episode no longer dumps extra stream versions onto Home / Catalog.\n\n- Opening a downloaded series after a restart plays the files already on the\n  device instead of fetching episode versions from the catalog.\n\n- macOS: app no longer crashes at launch looking for `librqbit_engine` under the build machine's home directory; the torrent engine dylib now loads from the app bundle via `@rpath`.\n\n- Auto-download ahead and next/previous episode keep the same version kind you picked (for example VOSTFR) instead of falling back to the default edition\n\n- Web player uses the same gesture controls as the desktop/phone app, and clicks work again (HTML video no longer steals pointer events).\n- Live / HLS streams play in Chromium browsers via hls.js.\n\n### Improvements\n\n- The web companion lives at http://javp.tf (no HSTS) so HTTP streams can play in the browser.\n- `http://javp.tf/add?\u2026` is a first-class add-source link (same query as `https://javp.app/add`), not a media open.\n\n- On http://javp.tf, IPTV passwords and other secrets persist in localStorage. flutter_secure_storage_web cannot run outside a secure context (HTTPS / localhost).\n\n- On https://javp.tf, the web companion recommends http://javp.tf (mixed content / CORS). javp.app stays the native add-source link.\n\n- Play/pause control uses a slightly darker disc with no drop shadow\n\n### Features\n\n- Playing local disk files (Open with / Library picker) starts immediately\n  like a regular media player \u2014 without adding them to Library \u2014 and Next /\n  Previous steps through other media in the same folder.",
      "versionCode": 108
    },
    {
      "versionName": "0.6.0",
      "title": "0.6.0",
      "notes": "First public open-source release of JAVP under the **GNU GPL-3.0-or-later**.\n\nBring-your-own media player for Android, Windows, Linux, and macOS: local\nfiles, Jellyfin / Emby / Plex, M3U / Xtream, JSON catalogs, optional trackers\n(SIMKL, Trakt, \u2026), and torrents you supply yourself. No bundled content or\ncredentials."
    }
  ],
  "gitCommit": "89b7f074fe88bb28bc8501eeef4526c4a7d23a10",
  "apkSha256": "cf9f87e94b2fd36d9a1107ba51b1d8d1e840230ca45c0a6804d59c752e2b5490",
  "apks": {
    "arm64-v8a": {
      "url": "https://updater.javp.app/javp-arm64-v8a-0.7.0+108.apk",
      "sha256": "8d4ed6fb692c46a043a5a8e557deae11eda04a59cc109d038dcc57033984114d",
      "versionCode": "2108"
    },
    "armeabi-v7a": {
      "url": "https://updater.javp.app/javp-armeabi-v7a-0.7.0+108.apk",
      "sha256": "47997f5f137960175ec31948dee67aabdca2582f46edb2e55f5b5ebd7f799a8d",
      "versionCode": "1108"
    },
    "universal": {
      "url": "https://updater.javp.app/javp-0.7.0+108.apk",
      "sha256": "cf9f87e94b2fd36d9a1107ba51b1d8d1e840230ca45c0a6804d59c752e2b5490",
      "versionCode": "108"
    }
  },
  "packages": {
    "linux-x64": {
      "url": "https://updater.javp.app/javp-0.7.0+108-linux-x64.zip",
      "sha256": "04902ff2e2a68dc240a390f16f2b09e9eef915270e9f1a24b3163403e90de325",
      "kind": "zip"
    }
  }
}
