Skip to content

Release 2.1: multi-version playback and MLIP scan fixes#50

Merged
ModerRAS merged 1 commit into
masterfrom
release/multi-version-playback-2.1.0
Jul 22, 2026
Merged

Release 2.1: multi-version playback and MLIP scan fixes#50
ModerRAS merged 1 commit into
masterfrom
release/multi-version-playback-2.1.0

Conversation

@ModerRAS

@ModerRAS ModerRAS commented Jul 22, 2026

Copy link
Copy Markdown
Owner

Summary

  • refresh and retry transient MLIP library.db 404 responses, expose useful scan summaries, and prefer authoritative MLIP metadata
  • group physical files into logical episodes with shared progress, version selection, nearest-path auto-next, and TV/Web settings parity
  • canonicalize long Unicode and partially encoded WebDAV playback URLs
  • bump baseAppVersionName to 2.1.0

Validation

  • ./gradlew --console=plain test :app:assembleDebug
  • BUILD SUCCESSFUL (797 tasks)
  • git diff --check

Device status

  • HK1 ADB remains unauthorized, so no app data was cleared and no real-device install was attempted

Summary by CodeRabbit

  • New Features

    • Choose among available episode versions before playback, including for the next episode.
    • Configure automatic nearest-version selection or manual selection in Playback settings.
    • Episode progress now remains consistent across multiple versions and merged library entries.
    • Web controls display episode versions and support selecting a specific version.
    • Library scans show clearer summaries, file counts, timestamps, and notices.
  • Bug Fixes

    • Improved WebDAV connection error reporting and recovery.
    • Corrected handling and encoding of remote media URLs.
    • Updated the default app version to 2.1.0.

@coderabbitai

coderabbitai Bot commented Jul 22, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 021f068d-c331-4104-8a1e-0a82071c5758

📥 Commits

Reviewing files that changed from the base of the PR and between 457bdab and e34a638.

📒 Files selected for processing (49)
  • app/build.gradle.kts
  • app/src/main/kotlin/com/miruplay/tv/MainActivity.kt
  • app/src/main/kotlin/com/miruplay/tv/navigation/NavRoutes.kt
  • core/model/src/main/kotlin/com/miruplay/tv/model/Episode.kt
  • core/model/src/main/kotlin/com/miruplay/tv/model/EpisodeVersionSelectionPolicy.kt
  • core/model/src/main/kotlin/com/miruplay/tv/model/MediaPathConventions.kt
  • core/model/src/main/kotlin/com/miruplay/tv/model/PlaybackSource.kt
  • core/model/src/main/kotlin/com/miruplay/tv/model/ScanResult.kt
  • core/model/src/test/kotlin/com/miruplay/tv/model/EpisodeVersionsTest.kt
  • data/src/main/kotlin/com/miruplay/tv/data/preferences/PlaybackPreferencesManager.kt
  • data/src/test/kotlin/com/miruplay/tv/data/preferences/PlaybackPreferencesManagerTest.kt
  • media-source/src/main/kotlin/com/miruplay/tv/mediasource/WebDavMediaSource.kt
  • media-source/src/test/kotlin/com/miruplay/tv/mediasource/WebDavMediaSourceTest.kt
  • repository-api/src/main/kotlin/com/miruplay/tv/repository/EpisodePlaybackSourceResolver.kt
  • repository-api/src/main/kotlin/com/miruplay/tv/repository/LibraryAnimeResolver.kt
  • repository-api/src/main/kotlin/com/miruplay/tv/repository/LibraryEpisodeResolver.kt
  • repository-api/src/main/kotlin/com/miruplay/tv/repository/MediaIndexPosterGrouping.kt
  • repository-api/src/main/kotlin/com/miruplay/tv/repository/NextPlaybackSourceResolver.kt
  • repository-api/src/main/kotlin/com/miruplay/tv/repository/PlayableUriResolver.kt
  • repository-api/src/main/kotlin/com/miruplay/tv/repository/PlaybackPreferencesRepository.kt
  • repository-api/src/test/kotlin/com/miruplay/tv/repository/LibraryAnimeResolverTest.kt
  • repository-api/src/test/kotlin/com/miruplay/tv/repository/LibraryEpisodeResolverTest.kt
  • repository-api/src/test/kotlin/com/miruplay/tv/repository/NextPlaybackSourceResolverTest.kt
  • repository-api/src/test/kotlin/com/miruplay/tv/repository/PlayableUriResolverTest.kt
  • scanner/src/main/kotlin/com/miruplay/tv/scanner/MlipLibraryIndexImporter.kt
  • scanner/src/main/kotlin/com/miruplay/tv/scanner/ScanCoordinator.kt
  • scanner/src/test/kotlin/com/miruplay/tv/scanner/MlipLibraryIndexImporterTest.kt
  • scanner/src/test/kotlin/com/miruplay/tv/scanner/ScanCoordinatorTest.kt
  • ui-tv/src/main/kotlin/com/miruplay/tv/ui/components/EpisodeVersionDialog.kt
  • ui-tv/src/main/kotlin/com/miruplay/tv/ui/detail/AnimeDetailScreen.kt
  • ui-tv/src/main/kotlin/com/miruplay/tv/ui/detail/AnimeDetailViewModel.kt
  • ui-tv/src/main/kotlin/com/miruplay/tv/ui/library/LibraryScreen.kt
  • ui-tv/src/main/kotlin/com/miruplay/tv/ui/library/LibraryViewModel.kt
  • ui-tv/src/main/kotlin/com/miruplay/tv/ui/player/PlayerScreen.kt
  • ui-tv/src/main/kotlin/com/miruplay/tv/ui/player/PlayerViewModel.kt
  • ui-tv/src/main/kotlin/com/miruplay/tv/ui/settings/AddSourceScreen.kt
  • ui-tv/src/main/kotlin/com/miruplay/tv/ui/settings/SettingsViewModel.kt
  • ui-tv/src/test/kotlin/com/miruplay/tv/ui/library/LibraryScanNoticeTest.kt
  • ui-tv/src/test/kotlin/com/miruplay/tv/ui/settings/SettingsViewModelTokenTest.kt
  • web-control-core/src/main/kotlin/com/miruplay/tv/webcontrol/WebControlLibraryLoader.kt
  • web-control-core/src/main/kotlin/com/miruplay/tv/webcontrol/WebControlModels.kt
  • web-control-core/src/main/kotlin/com/miruplay/tv/webcontrol/WebControlPlayback.kt
  • web-control-core/src/main/kotlin/com/miruplay/tv/webcontrol/WebControlSourceRequests.kt
  • web-control-core/src/test/kotlin/com/miruplay/tv/webcontrol/WebControlLibraryLoaderTest.kt
  • web-control-core/src/test/kotlin/com/miruplay/tv/webcontrol/WebControlSettingsRouteTest.kt
  • web-control-core/src/test/kotlin/com/miruplay/tv/webcontrol/WebControlSourceRequestsTest.kt
  • web-control/frontend/src/App.vue
  • web-control/frontend/src/styles.css
  • web-control/src/main/kotlin/com/miruplay/tv/webcontrol/WebControlService.kt

📝 Walkthrough

Walkthrough

The change adds episode-version grouping, logical progress tracking, nearest-version playback, manual version selection, scan metadata notices, remote URL handling, and corresponding TV and web-control integrations.

Changes

Version-aware playback

Layer / File(s) Summary
Episode version data model
core/model/..., core/model/src/test/...
Episodes now expose logical progress IDs and physical versions, with grouping, version replacement, nearest-path selection, and policy values.
Logical episode resolution
repository-api/src/main/kotlin/com/miruplay/tv/repository/*, repository-api/src/test/...
Repositories aggregate progress across versions, resolve logical episodes, group playback queues, and select the next version-aware episode.
Playback navigation and version selection
app/src/main/kotlin/..., ui-tv/src/main/kotlin/..., data/src/main/kotlin/...
Player routes carry progressId; TV playback can show a version dialog; and the selection policy is persisted through settings.
MLIP scan metadata and notices
scanner/src/main/kotlin/..., ui-tv/src/main/kotlin/...
MLIP imports report new media counts and database metadata, while scan summaries are preserved and displayed in the library UI.
Remote path and WebDAV handling
core/model/src/main/kotlin/..., repository-api/src/main/kotlin/..., media-source/src/main/kotlin/...
Remote URL path segments are canonicalized individually, and WebDAV transport failures map to network errors.
Web-control version and scan APIs
web-control-core/..., web-control/..., web-control/frontend/...
Web-control models, endpoints, frontend playback settings, episode-version actions, and scan summary messages support the new fields and flows.

Estimated code review effort: 5 (Critical) | ~120 minutes

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant AnimeDetailScreen
  participant PlayerViewModel
  participant NextPlaybackSourceResolver
  participant EpisodeVersionDialog

  User->>AnimeDetailScreen: play episode
  AnimeDetailScreen->>EpisodeVersionDialog: show available versions
  EpisodeVersionDialog->>PlayerViewModel: select version
  PlayerViewModel->>NextPlaybackSourceResolver: build playback source
  NextPlaybackSourceResolver-->>PlayerViewModel: versioned PlaybackSource
  PlayerViewModel-->>User: start playback
Loading
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch release/multi-version-playback-2.1.0

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@ModerRAS
ModerRAS merged commit 2783a78 into master Jul 22, 2026
3 of 4 checks passed
@ModerRAS
ModerRAS deleted the release/multi-version-playback-2.1.0 branch July 22, 2026 11:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant