Commit graph

90 commits

Author SHA1 Message Date
tapframe
84cc669bd5 feat: sidebar for desktop 2026-06-09 23:10:01 +05:30
tapframe
9a79a5a7e3 feat: support app versioning 2026-06-09 21:42:34 +05:30
tapframe
daac198e1b feat(badges): change pos - top,bottom 2026-06-07 03:09:29 +05:30
tapframe
9b3298fe2c feat: trakt as a source for morelikethis 2026-06-06 23:56:23 +05:30
tapframe
ab5415f477 feat: clear cw cache 2026-06-06 23:31:32 +05:30
tapframe
d7e1da6b47 feat(settings): add advanced settings section 2026-06-06 23:23:40 +05:30
tapframe
2446465494 feat: remember last used profile 2026-06-06 23:17:53 +05:30
tapframe
406ef99cfc feat(MPV): Spatial Audio for ios 2026-06-06 21:48:35 +05:30
tapframe
150081f832 feat(android): metahero trailer playback 2026-06-04 01:01:15 +05:30
tapframe
16dcac85f0 feat: toggle for size badge, localise some hardcoded strings 2026-06-01 16:13:23 +05:30
tapframe
df15c4d2f2 feat: support streambadges globally 2026-05-31 15:41:40 +05:30
tapframe
d757f1baed Merge branch 'pr/1211' into cmp-rewrite
# Conflicts:
#	composeApp/src/commonMain/kotlin/com/nuvio/app/App.kt
2026-05-31 14:49:00 +05:30
tapframe
55eb5ea2eb Merge branch 'cmp-rewrite' into skoruppa/cmp-rewrite 2026-05-31 14:06:35 +05:30
tapframe
5a47d1fe56 Add P2P playback integration 2026-05-30 02:09:23 +05:30
tapframe
7477600514 Make blank debrid templates use original text 2026-05-30 00:59:47 +05:30
skoruppa
464cfb3059 Port improved external players support 2026-05-29 11:38:11 +02:00
tapframe
8aed980b32 feat(cloud): preserving orginal order as a sort option 2026-05-29 14:37:51 +05:30
tapframe
388dcbdf0f Merge branch 'feat/i18n-fr-consolidated' into cmp-rewrite 2026-05-29 03:08:30 +05:30
tapframe
e89d7c5406 feat: adding tv style cw card 2026-05-29 02:25:35 +05:30
tapframe
2fc6a925a1 feat: adding subtitle delay, styles management. 2026-05-27 00:25:23 +05:30
Stéphane
a258b8c12e i18n(fr): extract platform stubs + audit FR quality (pass 4)
Extract hardcoded strings (23 sites in 9 platform-specific files):
- AppUpdaterPlatform stubs (iOS, Desktop, Android Playstore)
- PluginRepository stubs (iOS App Store, Android Playstore) + main fullCommonMain
- AddonRepository.normalizeManifestUrl require message
- CollectionEditorRepository dynamic titles (TMDB Collection/List/Production/
  Network/Person/Director + Trakt List fallback)
- ExternalPlayerPlatform.android.kt (Android system player label)

New keys added (2):
- collections_editor_trakt_list_title_format (Trakt List %1$s)
- external_player_android_system (Android system player)

Reused existing keys (8): updates_not_available, plugins_error_unavailable_build,
plugins_error_enter_valid_url, plugins_error_provider_not_found,
plugins_error_enter_repo_url, addons_error_enter_url, and 6 tmdb_*_title_format.

Audit FR quality (1719 strings) — 26 corrections + 68 apostrophe normalizations:
- Fix 3 residual vouvoiement (Controlez/Enrichissez/Programmez → tu)
- Fix 2 imperative conjugations (Parcoure→Parcours, Inclut→Inclus)
- Fix 2 placeholder type bugs (%1$d→%1$s where String input)
- Fix 1 trailing space, 1 double negation calque
- Harmonize "Plus comme ceci"→"À voir aussi", flux→stream, Jun/Jul→Juin/Juil.,
  rate limit "debit"→"requetes", "Crédits de personne TMDB"→"Crédits TMDB de la personne"
- Improve 7 anglicisms (en focus→focus sur, indice→indication UI, etc.)
- Normalize 68 lines: ' → ’ typographic (192 typo / 0 droite)

Parity EN ↔ FR: 1719 strings, 2 plurals.
Builds: composeApp:compileFullDebugKotlinAndroid + compilePlaystoreDebugKotlinAndroid
both SUCCESSFUL. xmllint OK on both XML files.

Merged origin/cmp-rewrite to integrate PR #1173 (release alert badge + dropped-show
filtering for CW section), resolving conflicts in strings.xml EN+FR.
2026-05-25 21:12:33 +02:00
Stéphane
fa9528d3a7 Merge remote-tracking branch 'origin/cmp-rewrite' into feat/extract-hardcoded-strings-pass4
# Conflicts:
#	composeApp/src/commonMain/composeResources/values-fr/strings.xml
#	composeApp/src/commonMain/composeResources/values/strings.xml
2026-05-25 19:47:53 +02:00
Guilherme Lima Pereira
28fe7fc567 feat: release alert badge and dropped-show filtering for CW section
- Add New Episode / New Season badge to the Continue Watching next-up
  cards, matching the NuvioTV implementation. Badge fires when a new
  episode has aired after the user's last watched timestamp and within
  the 60-day recency window.

- Filter shows that are marked as 'dropped' on Trakt from the Continue
  Watching in-progress list, next-up seed candidates, and the
  enrichment disk cache, matching NuvioTV behaviour.

- Add AirDateUtils.kt with calculateReleaseAlertState() and
  parseReleaseDateToEpochMs() helpers used for both badge logic and
  correct next-up sort ordering when a release alert is active.

- Persist isReleaseAlert / isNewSeasonRelease in CachedNextUpItem so
  badge state survives cold starts without waiting for a full re-fetch.

- Extend translations for the badge strings (airs today / tomorrow /
  in N days / on date) across de, el, es, fr, id, it, nb, pl, pt, tr,
  cs and the default English strings.

- Add unit tests for parseReleaseDateToEpochMs, calculateReleaseAlertState
  inputs/outputs, formatReleaseDateWithoutYear, isoCalendarDateOrNull,
  daysUntilExplicitRelease, and isoEpochDay.
2026-05-24 19:59:41 -03:00
Stéphane
5aa87684c9 i18n(fr): resolve cherry-pick conflicts after merging PR #943 + #1025 + #1029
After cherry-picking pass3 changes on top of the 3 merged i18n PRs:
- Combined imports & merged code from both versions where compatible
- For CollectionEditorRepository.kt: kept pass3 version entirely (cleaner
  scope.launch + getString flow vs runBlocking in #1025)
- For SubmitIntroDialog.kt: kept #943 convention (_label/_button suffixes)
- For TmdbCollectionSourceResolver.kt: merged all imports (#1025 + pass3)
- For PlayerControls.kt: kept #943 submit_intro_action key
- For PlaybackSettingsPage.kt: kept #943 pre-loaded invalidKeyMessage
- For CollectionEditorScreen.kt: kept new tmdb_country_placeholder key
- Added missing import in SubtitleRepository.kt

Strings.xml result: 1709 EN ↔ 1709 FR, 0 missing, 0 orphan, 0 vouvoiement.
2026-05-24 10:00:34 +02:00
Stéphane
33412cc700 i18n(fr): extract hardcoded strings, harmonize tutoiement, audit cohérence
- Extract 13 hardcoded user-facing strings from cloud, collection, player,
  debrid, IntroDB to res/values/strings.xml (FR translations included)
- Refactor titleForMedia() to accept localized suffixes as parameters,
  wrap addTmdbSourceFromInput/addTraktSourceFromResult in scope.launch
- Pre-load error message for runCatching error() to keep i18n-aware
- Harmonize entire values-fr/strings.xml to tutoiement (100 occurrences
  converted from vouvoiement: Cliquez→Clique, Vous→Tu, Votre→Ton, etc.)
- Fix terminology inconsistencies: Résumé→Aperçu, Réseaux→Chaînes (TMDB),
  Suivant→À suivre (up next), Téléchargement échoué→Échec du téléchargement,
  Découverte TMDB→TMDB Discover, etc.
- Add 134 EN strings, +444 FR (134 new + 310 backfill/rewrites)
- Parity preserved: 1532 ↔ 1532 strings, 0 placeholder divergence
2026-05-24 09:48:01 +02:00
Stéphane
fd71323cb5 merge: PR #1029 feat(i18n) extract last deep-cut hardcoded strings
Resolved conflicts in values/strings.xml and values-fr/strings.xml
by concatenating both blocks (no duplicate keys).
2026-05-24 09:41:51 +02:00
Stéphane
6ef8c42065 merge: PR #1025 feat(i18n) extract remaining hardcoded strings
Resolved conflicts in values/strings.xml and values-fr/strings.xml
by concatenating both blocks (no duplicate keys).
2026-05-24 09:41:28 +02:00
Stéphane
9495300ea2 merge: PR #943 i18n(fr) full French localization overhaul 2026-05-24 09:39:50 +02:00
tapframe
ae6841d87e ref: adding attributes 2026-05-22 20:29:51 +05:30
tapframe
023c26070a feat: add support for addon enable/disable flag 2026-05-22 17:48:48 +05:30
tapframe
a1a9b10807 Merge branch 'cwtest' into stripdebrid 2026-05-22 16:42:04 +05:30
tapframe
ab228a741f Revert "removal: debrid integration"
This reverts commit e25a2d7f3e.
2026-05-22 15:43:50 +05:30
tapframe
6720cbf7f6 feat(cloud): passing watchprogress 2026-05-22 15:32:11 +05:30
tapframe
df481a5d29 Improve watched marking parity 2026-05-22 02:57:48 +05:30
tapframe
6d929a71cf ref: adjust cloud library ui and sorting 2026-05-21 15:11:42 +05:30
tapframe
0cecf20fd3 String changes 2026-05-21 14:51:30 +05:30
tapframe
cb60d0196b feat(cloud): adding premimize 2026-05-21 14:37:44 +05:30
tapframe
a7f768cdcd ref(torbox): short_name extraction 2026-05-21 14:01:03 +05:30
tapframe
664cc69ec3 ref: adjust phrasing 2026-05-21 13:09:01 +05:30
tapframe
e3cfcc820c feat: Add cloud library support 2026-05-21 12:56:53 +05:30
tapframe
48265df85e feat(torbox): link device 2026-05-21 12:07:29 +05:30
tapframe
5d5e1c83a3 feat(debrid): neutralize architecture 2026-05-21 11:39:54 +05:30
tapframe
e25a2d7f3e removal: debrid integration 2026-05-20 21:44:27 +05:30
skoruppa
ba08ba8194 Port Reuse Binge Group from the TV version 2026-05-20 13:05:14 +02:00
tapframe
1ccaed7b20 feat: debrid hybrid approach 2026-05-20 13:16:22 +05:30
Stéphane
d1ee3cf784 feat(i18n): extract last deep-cut hardcoded strings to resources
Migrates 13 additional user-facing English literals found across 7 files
in a follow-up audit. Adds 13 new keys (EN + FR) and replaces the inline
literals with `getString(...)` / `runBlocking { getString(...) }`
depending on context.

- RuntimeFormat: episode / runtime hours+minutes template (`%dh %dm`,
  `%dh`, `%dm` → resource-backed; FR uses `%d h %d min`).
- SearchRepository: `require {}` empty-result message now hits
  `search_error_no_results_for_catalog` instead of the inline literal.
- PluginRepository: `already installed`, install-failed, refresh-failed
  fallback messages.
- PluginManifestParser: three `require {}` validation messages (name,
  version, providers).
- AddonManifestParser: `Manifest missing "<name>"` exception now uses
  `addons_manifest_missing_field`.
- PlayerEngine.ios: `MPV not available — Please rebuild the app` →
  `player_error_mpv_unavailable`.
- YoutubeChunkedDataSourceFactory: the developer-facing `No DataSpec`
  exception is replaced by a user-friendly `Unable to play this stream.`
  message that's safe to render through `onPlayerError.localizedMessage`.

FR translations follow existing conventions (tutoiement, curly apostrophes,
NBSP inside `« »`, internal branch names kept out of user-facing copy).
2026-05-20 06:41:24 +02:00
Stéphane
546226c79f feat(i18n): extract remaining hardcoded strings flagged by audit
Migrates the long tail of user-facing English literals identified by the
audit report — 65 new keys across 14 source files plus the matching FR
translations (tutoiement, NBSP, curly apostrophes).

Categories:
- TMDB filter placeholders in CollectionEditorScreen (10 keys, "28,12",
  "2020-01-01", "100", "en, ko, ja, hi", etc.)
- Collection editor titles & errors in CollectionEditorRepository
  (TMDB/Trakt fallback titles, validation errors, "Could not load …")
- Folder type labels in FolderDetailRepository ("Trakt Series List",
  "Trakt Movie List")
- TMDB resolver errors (api key required, not found, missing IDs, discover
  no data) in TmdbCollectionSourceResolver
- Trakt public list resolver errors and search-result fallbacks in
  TraktPublicListSourceResolver (rate limit, not public, items/likes
  counts, credentials missing, error_with_code formatter)
- Comments load failure in TraktCommentsRepository
- Trakt status messages (Connected/Disconnected) in TraktAuthRepository
- AppUpdater exceptions (no release, github api error, missing tag,
  no APK asset) — also strips the "cmp-rewrite" branch name from the
  user-facing copy
- HTTP error fallbacks shared by both AddonPlatform.{android,ios}.kt
  ("Request failed with HTTP %d", "Empty response body")
- AndroidAppUpdaterPlatform download/install errors
- iOS DownloadsPlatformDownloader file/HTTP errors
- SubtitleRepository addon-subtitle display format
- DownloadsLiveStatusPlatform.android Pause action (reuses
  compose_action_pause) and the byte-unit table (now includes
  unit_bytes_tb)

Non-Composable suspend bodies use the existing `getString(...)` pattern;
synchronous bodies (constructors, lambda inits) use the established
`runBlocking { getString(...) }` pattern already in the codebase.

Keys that overlap with #943 (the FR overhaul PR) use the exact same
names so the eventual merge is a no-op on those.
2026-05-20 06:41:00 +02:00
Stéphane
f03bb3eb7a i18n(fr): extract remaining hardcoded strings to stringResource
- NetworkStatusRepository: titleForEmptyState/messageForEmptyState now @Composable, using existing keys (network_cannot_reach_servers, network_no_internet_connection, details_servers_unreachable, details_check_connection) + 2 new (network_connection_issue, network_please_check_connection)
- LibraryRepository: LOCAL_LIBRARY_LIST_TITLE moved to library_local_tab_title resource; toLibraryDisplayTitle() "Other" fallback uses library_other
- EpisodeReleaseNotificationsRepository: permission-disabled message uses settings_notifications_permission_disabled
- StreamsRepository.fallbackRepositoryLabel: uses streams_plugin_repository_fallback
- PluginRuntime: title fallback "Unknown" uses generic_unknown

4 new keys added (EN + FR with tutoiement, NBSP, apostrophes courbes).
Parity preserved: 1353 keys EN ↔ FR.
2026-05-20 06:36:59 +02:00
Stéphane
105f4f52cb i18n(fr): refonte complète des traductions françaises
- Ajout des 38 clés FR manquantes (Trakt, TMDB Person/Director, IntroDB)
- Extraction des chaînes hardcodées vers stringResource :
  PluginsSettingsScreen (37), SubmitIntroDialog (10), PlaybackSettingsPage (1)
- Tutoiement systématique (~80 verbes -ez → -e/-s/-is, vos→tes, votre→ton/ta avec
  détection de genre, Vous pouvez/devez/...→Tu peux/dois/...)
- Typographie : apostrophes courbes ’, espaces insécables avant : ; ? !,
  guillemets français « » avec NBSP intérieurs
- Corrections d'accord (addon masculin partout, clé féminin, addons principaux)
- Cohérence terminologique (streams partout, chaînes pour network,
  liste de suivi pour watchlist, j'aime pour likes, enregistrée pour sauvegardée)
- Reformulations naturelles (Plus comme ceci → À voir aussi ×4, etc.)

Parité finale : 1243 clés EN ↔ FR.
2026-05-20 06:36:59 +02:00
tapframe
9ca3f56655 chore: adding prefetch warning note 2026-05-19 21:21:55 +05:30