Merge aniyomi - #464
Open
Dark25 wants to merge 21 commits into
Open
Conversation
Co-authored-by: Jan Šmedek <smedek.j@seznam.cz> Co-authored-by: VtrU8i <victor.u8i@gmail.com> Co-authored-by: kenkoro <frogharvard@gmail.com> Co-authored-by: Frosted <frosted@users.noreply.hosted.weblate.org> Co-authored-by: Mousica <golonchy.aitta@gmail.com> Co-authored-by: Максим Горпиніч <gorpinicmaksim0@gmail.com> Co-authored-by: Chopper <156493704+choppeh@users.noreply.github.com> Co-authored-by: Joël Miramon <joel@miramon.de>
Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com> Co-authored-by: AwkwardPeak7 <48650614+AwkwardPeak7@users.noreply.github.com>
Co-authored-by: Joël Miramon <joel@miramon.de>
…across database schema adapters, catalog sources, player activity, and viewmodels while retaining Animetail custom features.
… AnimeSource interface
…ViewModel, AnimeViewModel, and ExternalIntents
There was a problem hiding this comment.
Pull request overview
This PR ports/merges several Aniyomi-related source and player integrations into this codebase, including a new combined source update API, JSON “memo” metadata persistence, and an extension-provided HTTP server pathway for streaming/downloading.
Changes:
- Introduces combined suspend APIs for updating anime details + episodes/seasons (
getAnimeEpisodeUpdate,getAnimeSeasonUpdate) and updates app flows to use them. - Adds JSON
memofields forSAnime/SEpisodeand persists them through domain/data/db/backup layers. - Adds an extension HTTP server integration (placeholder URL rewriting, foreground service, player/external intents/download support), and deprecates legacy helper source classes/methods.
Reviewed changes
Copilot reviewed 86 out of 86 changed files in this pull request and generated 7 comments.
Show a summary per file
| File | Description |
|---|---|
| source-local/src/main/kotlin/tachiyomi/source/local/entries/anime/LocalAnimeSource.kt | Adapts local source to new AnimeSource + combined update APIs. |
| source-api/src/main/kotlin/eu/kanade/tachiyomi/animesource/online/ParsedAnimeHttpSource.kt | Deprecates parsed helper base class for sources. |
| source-api/src/main/kotlin/eu/kanade/tachiyomi/animesource/online/AnimeHttpSource.kt | Adds getHomeUrl, adjusts/deprecates helper APIs, and updates Rx wrappers. |
| source-api/src/main/kotlin/eu/kanade/tachiyomi/animesource/model/Video.kt | Adds localhost-placeholder detection and rewriting helpers for HTTP server. |
| source-api/src/main/kotlin/eu/kanade/tachiyomi/animesource/model/SEpisodeImpl.kt | Adds memo storage to episode model implementation. |
| source-api/src/main/kotlin/eu/kanade/tachiyomi/animesource/model/SEpisode.kt | Adds memo to episode interface + copy logic. |
| source-api/src/main/kotlin/eu/kanade/tachiyomi/animesource/model/SAnimeSeasonUpdate.kt | New wrapper type for combined anime+seasons updates. |
| source-api/src/main/kotlin/eu/kanade/tachiyomi/animesource/model/SAnimeImpl.kt | Adds memo storage to anime model implementation. |
| source-api/src/main/kotlin/eu/kanade/tachiyomi/animesource/model/SAnimeEpisodeUpdate.kt | New wrapper type for combined anime+episodes updates. |
| source-api/src/main/kotlin/eu/kanade/tachiyomi/animesource/model/SAnime.kt | Adds memo to anime interface + copy logic. |
| source-api/src/main/kotlin/eu/kanade/tachiyomi/animesource/model/HttpServer.kt | Adds placeholder URL constant. |
| source-api/src/main/kotlin/eu/kanade/tachiyomi/animesource/model/AnimesPage.kt | Changes AnimesPage from data class to class with deprecated compatibility helpers. |
| source-api/src/main/kotlin/eu/kanade/tachiyomi/animesource/AnimeSource.kt | Introduces new source API surface (filters, paging, combined update APIs). |
| source-api/src/main/kotlin/eu/kanade/tachiyomi/animesource/AnimeCatalogueSource.kt | Updates overrides to match new AnimeSource defaults. |
| i18n-aniyomi/src/commonMain/moko-resources/base/strings.xml | Adds HTTP server strings for notification/UI. |
| domain/src/main/java/tachiyomi/domain/source/anime/service/AnimeSourceManager.kt | Renames/expands source flows (sources, getAll). |
| domain/src/main/java/tachiyomi/domain/source/anime/model/StubAnimeSource.kt | Updates stub source to implement new required APIs. |
| domain/src/main/java/tachiyomi/domain/items/episode/model/EpisodeUpdate.kt | Adds memo to episode update DTO. |
| domain/src/main/java/tachiyomi/domain/items/episode/model/Episode.kt | Adds memo to episode domain model. |
| domain/src/main/java/tachiyomi/domain/items/episode/interactor/ShouldUpdateDbEpisode.kt | Includes memo in episode-diffing logic. |
| domain/src/main/java/tachiyomi/domain/entries/anime/model/AnimeUpdate.kt | Adds memo to anime update DTO. |
| domain/src/main/java/tachiyomi/domain/entries/anime/model/Anime.kt | Adds memo to anime domain model. |
| data/src/main/sqldelightanime/migrations/136.sqm | Adds memo columns to animes/episodes tables. |
| data/src/main/sqldelightanime/dataanime/episodes.sq | Persists episode memo (schema + insert/update). |
| data/src/main/sqldelightanime/dataanime/animes.sq | Persists anime memo (schema + insert/update). |
| data/src/main/java/tachiyomi/data/source/anime/AnimeSourceRepositoryImpl.kt | Switches repository usage to new source manager flow and stubs. |
| data/src/main/java/tachiyomi/data/source/anime/AnimeSourcePagingSource.kt | Generalizes paging sources to AnimeSource. |
| data/src/main/java/tachiyomi/data/items/episode/EpisodeRepositoryImpl.kt | Stores/loads episode memo and uses memo adapter. |
| data/src/main/java/tachiyomi/data/entries/anime/AnimeRepositoryImpl.kt | Stores/loads anime memo and uses memo adapter. |
| data/src/main/java/tachiyomi/data/entries/anime/AnimeMapper.kt | Maps memo through DB → domain transformations. |
| core/common/src/main/kotlin/mihon/core/common/extensions/JsonObject.kt | Adds empty {} bytes constant for protobuf backups. |
| core/common/src/main/java/eu/kanade/tachiyomi/network/OkHttpExtensions.kt | Deprecates Rx helpers and refactors coroutine await implementation. |
| core/common/src/main/java/eu/kanade/tachiyomi/network/NetworkHelper.kt | Removes unused nonCloudflareClient. |
| core/common/src/main/java/eu/kanade/tachiyomi/network/HttpException.kt | Restores HttpException as a standalone type. |
| CHANGELOG.md | Notes added HTTP server/torrent/preview features under Unreleased. |
| app/src/main/res/drawable/ic_dns_24dp.xml | Adds icon for HTTP server notification. |
| app/src/main/java/mihon/domain/source/models/RemoteAnimeSeasonUpdate.kt | New domain wrapper for season update results. |
| app/src/main/java/mihon/domain/source/models/RemoteAnimeEpisodeUpdate.kt | New domain wrapper for episode update results. |
| app/src/main/java/mihon/domain/source/interactor/UpdateAnimeFromRemote.kt | New interactor to fetch/update anime + episodes/seasons via combined source API. |
| app/src/main/java/eu/kanade/tachiyomi/util/AnimeExtensions.kt | Minor formatting cleanup. |
| app/src/main/java/eu/kanade/tachiyomi/ui/updates/anime/AnimeUpdatesTab.kt | Passes sourceId into player start. |
| app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerViewModel.kt | Adds ability to update current Video state. |
| app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerActivity.kt | Starts HTTP server when needed and rewrites placeholder video URLs for playback. |
| app/src/main/java/eu/kanade/tachiyomi/ui/player/network/NetworkStreamSource.kt | Expands minimal source implementation to satisfy new AnimeSource. |
| app/src/main/java/eu/kanade/tachiyomi/ui/player/ExternalIntents.kt | Starts HTTP server + rewrites placeholder URLs for external playback. |
| app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt | Adds helper to start HTTP server service and routes sourceId through player start. |
| app/src/main/java/eu/kanade/tachiyomi/ui/entries/anime/AnimeViewModel.kt | Switches refresh logic to UpdateAnimeFromRemote combined update flow. |
| app/src/main/java/eu/kanade/tachiyomi/ui/deeplink/anime/DeepLinkAnimeScreenModel.kt | Uses getAll() and combined update interactor to resolve episodes. |
| app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/source/globalsearch/GlobalAnimeSearchViewModel.kt | Generalizes enabled sources to AnimeSource. |
| app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/source/globalsearch/AnimeSearchViewModel.kt | Refactors search state map types and uses getAll() sources. |
| app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/source/browse/BrowseAnimeSourceViewModel.kt | Minor changes aligning browse VM with updated types. |
| app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/source/browse/BrowseAnimeSourceScreen.kt | Uses getHomeUrl() and supportsLatest directly from AnimeSource. |
| app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/migration/search/MigrateAnimeSearchViewModel.kt | Updates migration search enabled sources type. |
| app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/migration/search/MigrateAnimeDialog.kt | Uses combined remote updater rather than direct episode list + sync. |
| app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/migration/search/AnimeSourceSearchScreen.kt | Uses getHomeUrl() in WebView entry point. |
| app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/migration/anime/season/MigrateSeasonSelectScreenModel.kt | Uses combined remote updater to fetch seasons. |
| app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/migration/anime/season/MigrateSeasonSelectScreen.kt | Uses getHomeUrl() in WebView entry point. |
| app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/extension/details/AnimeExtensionDetailsScreenModel.kt | Clears cookies for both baseUrl and getHomeUrl() values. |
| app/src/main/java/eu/kanade/tachiyomi/ui/browse/anime/extension/AnimeExtensionsScreenModel.kt | Searches sources by getHomeUrl(). |
| app/src/main/java/eu/kanade/tachiyomi/source/anime/AndroidAnimeSourceManager.kt | Changes flow to expose all AnimeSource instances and adds getAll(). |
| app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionLoader.kt | Removes catalogue-only assumptions for language detection. |
| app/src/main/java/eu/kanade/tachiyomi/extension/anime/api/AnimeExtensionApi.kt | Adds parsing/mapping for legacy Aniyomi extension index JSON. |
| app/src/main/java/eu/kanade/tachiyomi/di/AppModule.kt | Wires memo adapters into SQLDelight DB adapters. |
| app/src/main/java/eu/kanade/tachiyomi/data/player/service/HttpServerService.kt | New foreground service to run extension-provided HTTP server. |
| app/src/main/java/eu/kanade/tachiyomi/data/notification/Notifications.kt | Adds notification channel/id for HTTP server. |
| app/src/main/java/eu/kanade/tachiyomi/data/library/anime/AnimeMetadataUpdateJob.kt | Updates metadata refresh to use combined remote updater. |
| app/src/main/java/eu/kanade/tachiyomi/data/library/anime/AnimeLibraryUpdateJob.kt | Updates library refresh to use combined remote updater and new results. |
| app/src/main/java/eu/kanade/tachiyomi/data/download/anime/AnimeDownloader.kt | Adds HTTP server support for placeholder URLs during download/external download. |
| app/src/main/java/eu/kanade/tachiyomi/data/download/anime/AnimeDownloadCache.kt | Updates cache source listing to include getAll(). |
| app/src/main/java/eu/kanade/tachiyomi/data/database/models/anime/EpisodeImpl.kt | Adds memo to legacy DB model. |
| app/src/main/java/eu/kanade/tachiyomi/data/database/models/anime/Episode.kt | Maps memo into domain episode. |
| app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/AnimeRestorer.kt | Restores memo fields for anime/episodes. |
| app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupEpisode.kt | Stores/restores episode memo in protobuf backups. |
| app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupAnime.kt | Stores/restores anime memo in protobuf backups. |
| app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/PreferenceBackupCreator.kt | Uses getAll() sources for preference backups. |
| app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/AnimeBackupCreator.kt | Writes anime memo into backups. |
| app/src/main/java/eu/kanade/presentation/webview/WebViewScreenContent.kt | Removes unused WebView/network spoofing dependencies. |
| app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsTrackingScreen.kt | Uses getAll() sources for enhanced tracker availability detection. |
| app/src/main/java/eu/kanade/presentation/entries/anime/EpisodeOptionsDialogScreen.kt | Starts HTTP server for link-copy and passes sourceId into player start. |
| app/src/main/java/eu/kanade/presentation/browse/anime/MigrateAnimeSearchScreen.kt | Generalizes click handler type to AnimeSource. |
| app/src/main/java/eu/kanade/presentation/browse/anime/GlobalAnimeSearchScreen.kt | Generalizes UI map types to AnimeSource. |
| app/src/main/java/eu/kanade/domain/items/episode/model/Episode.kt | Maps memo to/from SEpisode and DB episode. |
| app/src/main/java/eu/kanade/domain/entries/anime/model/Anime.kt | Maps memo to/from SAnime and domain anime. |
| app/src/main/java/eu/kanade/domain/entries/anime/interactor/UpdateAnime.kt | Persists memo when updating from remote anime. |
| app/src/main/java/eu/kanade/domain/DomainModule.kt | Registers UpdateAnimeFromRemote factory. |
| app/src/main/AndroidManifest.xml | Registers new HttpServerService. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Comment on lines
+1127
to
+1141
| val (success, port) = MainActivity.startHttpServerService( | ||
| context = applicationContext, | ||
| sourceId = sourceId, | ||
| ) | ||
|
|
||
| val newVideo = video.copyHttpServer(port) | ||
| videoUrl = newVideo.videoUrl | ||
| viewModel.updateVideo(newVideo) | ||
|
|
||
| if (!success) { | ||
| launchUI { | ||
| toast(AYMR.strings.http_server_start_failure) | ||
| } | ||
| return@launchIO | ||
| } |
Comment on lines
458
to
+460
| isExternal = true | ||
| val (success, port) = MainActivity.startHttpServerService(context, download.source.id) | ||
| if (!success) throw Exception("Failed to start server") |
Comment on lines
539
to
547
| val clipEntry = ClipData.newPlainText( | ||
| currentVideo.videoUrl, | ||
| currentVideo.videoUrl, | ||
| ).toClipEntry() | ||
| clipboard.setClipEntry(clipEntry) | ||
| if (currentVideo.usesHttpServer()) { | ||
| MainActivity.startHttpServerService(context, anime.source) | ||
| } | ||
| context.toast(copiedString) |
Comment on lines
835
to
+843
| if (extPlayer) { | ||
| val sourceId = sourceId ?: (Injekt.get<GetAnime>().await(animeId)?.source ?: -1L) | ||
| val (success, port) = startHttpServerService(context, sourceId) | ||
| if (!success) { | ||
| withUIContext { Injekt.get<Application>().toast(AYMR.strings.http_server_start_failure) } | ||
| return | ||
| } | ||
|
|
||
| val video = video?.copyHttpServer(port) |
Comment on lines
+39
to
+42
| if (isRunning.value) { | ||
| _isRunning.update { _ -> false } | ||
| httpServer?.stop() | ||
| } |
Comment on lines
+108
to
+110
| private const val NAME = "HttpServerSerivce" | ||
| private val ACTION_STOP = "${BuildConfig.APPLICATION_ID}.$NAME.ACTION_STOP" | ||
| const val EXTRA_SOURCE_ID = "$NAME.EXTRA.SOURCE.ID" |
Comment on lines
187
to
191
| override fun fetchSearchAnime(page: Int, query: String, filters: AnimeFilterList): Observable<AnimesPage> { | ||
| return Observable.defer { | ||
| try { | ||
| client.newCall(searchAnimeRequest(page, query, filters)).asObservableSuccess() | ||
| } catch (e: NoClassDefFoundError) { | ||
| // RxJava doesn't handle Errors, which tends to happen during global searches | ||
| // if an old extension using non-existent classes is still around | ||
| throw RuntimeException(e) | ||
| } | ||
| } | ||
| return client.newCall(searchAnimeRequest(page, query, filters)) | ||
| .asObservableSuccess() | ||
| .map { response -> | ||
| searchAnimeParse(response) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.