Skip to content

Merge aniyomi - #464

Open
Dark25 wants to merge 21 commits into
masterfrom
merge-aniyomi
Open

Merge aniyomi#464
Dark25 wants to merge 21 commits into
masterfrom
merge-aniyomi

Conversation

@Dark25

@Dark25 Dark25 commented Aug 6, 2026

Copy link
Copy Markdown
Collaborator

No description provided.

Secozzi and others added 21 commits October 31, 2025 10:02
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.
…ViewModel, AnimeViewModel, and ExternalIntents
Copilot AI lite review requested due to automatic review settings August 6, 2026 21:56

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 memo fields for SAnime/SEpisode and 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)
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.

7 participants