Skip to content

Merge Aniyomi and Mihon #419

Merged
Dark25 merged 41 commits into
masterfrom
aniyomi-up
Jul 10, 2026
Merged

Merge Aniyomi and Mihon #419
Dark25 merged 41 commits into
masterfrom
aniyomi-up

Conversation

@Dark25

@Dark25 Dark25 commented Jul 7, 2026

Copy link
Copy Markdown
Collaborator

No description provided.

AntsyLich and others added 14 commits July 7, 2026 15:30
Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com>
Currently, every title will be added as READING, even if no chapter
has been read.

For consistency with every other tracker, I added the hasReadChapters
check as seen in other tracker implementations.
- Fixed syntax and type errors in MangaRestorer and SearchableSettings.
- Migrated Hikka tracker to use the new split MangaTrack domain models.
- Replaced deprecated LocalBroadcastManager with Kotlin SharedFlow in extension installers.
- Corrected SQLDelight package imports in AppModule and dependency issues in PlayerActivity.
- Converted BackupManga to a data class to support copy operations in SyncService.
- Modified TorrentServerService to set the port from preferences before checking the server status (echo).
- Improved the wait() method with more robust logic and an increased timeout (20s).
- Added checks in PlayerActivity to wait for the server and handle startup failures with a toast, preventing the app from attempting to load invalid URLs.
Copilot AI review requested due to automatic review settings July 7, 2026 17:33

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 appears to merge/align Aniyomi + Mihon changes into Animetail by extending the public source API and app domain models (adding memo JSON metadata), refactoring TorrServer integration into aniyomi.core.common.torrent, and adding new player capabilities (thumbnail previews + optional local HTTP server) plus tracker improvements (display username + Hikka).

Changes:

  • Add memo: JsonObject metadata to manga/chapter models and persist it through database, backup, and sync layers.
  • Replace the old eu.kanade.tachiyomi.torrentServer.* implementation with aniyomi.core.common.torrent.*, new TorrServer settings UI, and updated player/downloader torrent handling.
  • Add player trickplay thumbnail preview support and introduce a HttpServer hook for extensions.

Reviewed changes

Copilot reviewed 123 out of 124 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
source-api/src/commonMain/kotlin/eu/kanade/tachiyomi/torrentutils/TorrentUtils.kt Switches to injected TorrServer API + new exception mapping.
source-api/src/commonMain/kotlin/eu/kanade/tachiyomi/source/model/SMangaImpl.kt Adds memo default + reorders fields.
source-api/src/commonMain/kotlin/eu/kanade/tachiyomi/source/model/SManga.kt Adds memo to public source API and copyFrom.
source-api/src/commonMain/kotlin/eu/kanade/tachiyomi/source/model/SChapterImpl.kt Adds memo default + reorders fields.
source-api/src/commonMain/kotlin/eu/kanade/tachiyomi/source/model/SChapter.kt Adds memo to public source API.
source-api/src/commonMain/kotlin/eu/kanade/tachiyomi/source/model/MangasPage.kt Converts from data class to class with compatibility methods.
source-api/src/commonMain/kotlin/eu/kanade/tachiyomi/animesource/online/AnimeHttpSource.kt Adds local server hook + thumbnail APIs + tile fetching.
source-api/src/commonMain/kotlin/eu/kanade/tachiyomi/animesource/model/ThumbnailInfo.kt New thumbnail/tile metadata model.
source-api/src/commonMain/kotlin/eu/kanade/tachiyomi/animesource/model/HttpServer.kt New lightweight local HTTP server wrapper for extensions.
source-api/build.gradle.kts Adds nanohttpd dependency to source-api.
README.md Adds Hikka to tracker list.
presentation-core/src/main/java/tachiyomi/presentation/core/icons/Magnet.kt Adds Magnet icon for torrent settings entry.
i18n-aniyomi/src/commonMain/moko-resources/base/strings.xml Adds TorrServer settings + status strings.
gradle/libs.versions.toml Switches unifile dependency group/version.
gradle/aniyomi.versions.toml Adds nanohttpd + torrserver versions/libs.
domain/src/main/java/tachiyomi/domain/items/chapter/model/ChapterUpdate.kt Adds memo to update DTO.
domain/src/main/java/tachiyomi/domain/items/chapter/model/Chapter.kt Adds memo to domain model + default.
domain/src/main/java/tachiyomi/domain/entries/manga/model/MangaUpdate.kt Adds memo to update DTO.
domain/src/main/java/tachiyomi/domain/entries/manga/model/Manga.kt Adds memo, migrates to kotlinx serialization + Java serialization bridge.
data/src/main/sqldelight/migrations/41.sqm Adds memo columns to mangas/chapters.
data/src/main/sqldelight/data/mangas.sq Adds persisted memo field + updates insert/update queries.
data/src/main/sqldelight/data/chapters.sq Adds persisted memo field + updates insert/update queries.
data/src/main/java/tachiyomi/data/items/chapter/ChapterRepositoryImpl.kt Wires memo through inserts/updates and adapters.
data/src/main/java/tachiyomi/data/items/chapter/ChapterMapper.kt Adds memo mapping to domain model.
data/src/main/java/tachiyomi/data/entries/manga/MangaRepositoryImpl.kt Wires memo through insert/update flows.
data/src/main/java/tachiyomi/data/entries/manga/MangaMapper.kt Adds memo mapping to domain model.
data/src/main/java/tachiyomi/data/DatabaseAdapter.kt Adds MemoColumnAdapter for DB storage.
core/common/src/main/kotlin/mihon/core/common/extensions/JsonObject.kt Adds JsonObject.Companion.EMPTY helper.
core/common/src/main/java/eu/kanade/tachiyomi/torrentServer/TorrentServerUtils.kt Removes old torrent server utils.
core/common/src/main/java/eu/kanade/tachiyomi/torrentServer/TorrentServerApi.kt Removes old torrent server API.
core/common/src/main/java/eu/kanade/tachiyomi/torrentServer/model/*.kt Removes old torrent server models.
core/common/src/main/java/aniyomi/core/common/torrent/TorrentServerUtils.kt New torrent server utils implementation.
core/common/src/main/java/aniyomi/core/common/torrent/TorrentServerApi.kt New suspend-based torrent API wrapper.
core/common/src/main/java/aniyomi/core/common/torrent/TorrentPreferences.kt New torrent preferences and proxy mode.
core/common/src/main/java/aniyomi/core/common/torrent/model/TorrentRequest.kt New request model with correct JSON naming.
core/common/src/main/java/aniyomi/core/common/torrent/model/Torrent.kt New torrent response model with SerialName mappings.
core/common/src/main/java/aniyomi/core/common/torrent/DisabledTorrServerException.kt New exception for disabled TorrServer state.
core/common/build.gradle.kts Switches torrserver dependency to aniyomilibs.torrserver.
app/src/main/res/drawable/brand_hikka.xml Adds Hikka tracker brand icon.
app/src/main/java/eu/kanade/test/DummyTracker.kt Implements new tracker display-name methods.
app/src/main/java/eu/kanade/tachiyomi/util/LocalHttpServerService.kt Fixes service stop to use DI Application.
app/src/main/java/eu/kanade/tachiyomi/ui/setting/track/TrackLoginActivity.kt Adds Hikka OAuth callback handling.
app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerViewModel.kt Adds seek thumbnail preview state + http server stop hook.
app/src/main/java/eu/kanade/tachiyomi/ui/player/PlayerActivity.kt Updates torrent playback flow and resets state.
app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/PlayerControls.kt Integrates thumbnail preview + seeking state.
app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/GestureHandler.kt Updates gesture seeking to use new seek state.
app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/components/ThumbnailPreview.kt New UI for trickplay thumbnail preview.
app/src/main/java/eu/kanade/tachiyomi/ui/player/controls/components/SeekBar.kt Adds dual-position behavior for seeking vs playback.
app/src/main/java/eu/kanade/tachiyomi/ui/player/cast/CastMediaBuilder.kt Updates torrent link handling for cast to new APIs.
app/src/main/java/eu/kanade/tachiyomi/ui/entries/anime/AnimeScreenModel.kt Starts TorrServer conditionally via new preferences/util.
app/src/main/java/eu/kanade/tachiyomi/ui/entries/anime/AnimeScreen.kt Makes torrent start conditional on enable flag.
app/src/main/java/eu/kanade/tachiyomi/source/anime/AnimeSourceExtensions.kt Minor comment placement adjustment.
app/src/main/java/eu/kanade/tachiyomi/extension/manga/MangaExtensionManager.kt Adds installer cancel shared-flow events.
app/src/main/java/eu/kanade/tachiyomi/extension/manga/installer/InstallerManga.kt Replaces LocalBroadcast cancel with shared-flow cancel.
app/src/main/java/eu/kanade/tachiyomi/extension/anime/installer/InstallerAnime.kt Replaces LocalBroadcast cancel with shared-flow cancel.
app/src/main/java/eu/kanade/tachiyomi/extension/anime/AnimeExtensionManager.kt Adds installer cancel shared-flow events.
app/src/main/java/eu/kanade/tachiyomi/di/PreferenceModule.kt Registers TorrentPreferences in DI.
app/src/main/java/eu/kanade/tachiyomi/di/AppModule.kt Registers torrent API/utils and DB memo adapters.
app/src/main/java/eu/kanade/tachiyomi/data/track/TrackerManager.kt Adds Hikka tracker.
app/src/main/java/eu/kanade/tachiyomi/data/track/Tracker.kt Adds display username API.
app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/ShikimoriApi.kt Expands current user response to include nickname.
app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/Shikimori.kt Saves display username + uses id for credential username.
app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/dto/SMUser.kt Adds nickname field.
app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList.kt Saves display username on login.
app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdatesApi.kt Adds current user endpoint.
app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdates.kt Saves display username on login.
app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/dto/MUCurrentUser.kt New DTO.
app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuApi.kt Expands current user response to include name.
app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/Kitsu.kt Saves display username and uses id for creds.
app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/dto/KitsuUser.kt Adds attributes.name.
app/src/main/java/eu/kanade/tachiyomi/data/track/hikka/* Adds new Hikka tracker implementation.
app/src/main/java/eu/kanade/tachiyomi/data/track/BaseTracker.kt Implements display username persistence.
app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/dto/BGMUser.kt Adds nickname field.
app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiApi.kt Returns full current user DTO.
app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/Bangumi.kt Saves display username and uses username for creds.
app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/dto/ALUser.kt Adds viewer name.
app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt Returns viewer data object instead of pair.
app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/Anilist.kt Saves display username + uses id for creds.
app/src/main/java/eu/kanade/tachiyomi/data/torrent/service/TorrentServerService.kt New torrserver service implementation + notification.
app/src/main/java/eu/kanade/tachiyomi/data/sync/SyncManager.kt Adjusts manga restorer method name.
app/src/main/java/eu/kanade/tachiyomi/data/notification/Notifications.kt Localizes torrent channel name.
app/src/main/java/eu/kanade/tachiyomi/data/download/anime/AnimeDownloader.kt Updates torrent download path and server stopping.
app/src/main/java/eu/kanade/tachiyomi/data/database/models/manga/ChapterImpl.kt Adds memo field to legacy DB model.
app/src/main/java/eu/kanade/tachiyomi/data/database/models/manga/Chapter.kt Wires memo into domain conversion.
app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/MangaRestorer.kt Wires memo into restore and DB updates.
app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupManga.kt Adds memo + initialized to backup model.
app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupChapter.kt Adds memo to backup chapter model + mapper.
app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/MangaBackupCreator.kt Writes memo + initialized into backups.
app/src/main/java/eu/kanade/presentation/util/ExceptionFormatter.kt Adds formatting for DisabledTorrServerException.
app/src/main/java/eu/kanade/presentation/more/settings/widget/TrackingPreferenceWidget.kt Displays tracker display username when logged in.
app/src/main/java/eu/kanade/presentation/more/settings/widget/EditTextPreferenceWidget.kt Adds keyboardOptions support.
app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsTrackingScreen.kt Adds Hikka tracker entry and adjusts TMDB flow.
app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsSearchScreen.kt Adds torrent settings screen to search.
app/src/main/java/eu/kanade/presentation/more/settings/screen/player/PlayerSettingsTorrentScreen.kt New TorrServer settings screen + notice/proxy options.
app/src/main/java/eu/kanade/presentation/more/settings/screen/player/PlayerSettingsSubtitleScreen.kt Converts to Screen() type.
app/src/main/java/eu/kanade/presentation/more/settings/screen/player/PlayerSettingsPlayerScreen.kt Removes old torrent group and converts to Screen().
app/src/main/java/eu/kanade/presentation/more/settings/screen/player/PlayerSettingsMainScreen.kt Adds TorrServer settings entry.
app/src/main/java/eu/kanade/presentation/more/settings/screen/player/PlayerSettingsGesturesScreen.kt Converts to Screen() type.
app/src/main/java/eu/kanade/presentation/more/settings/screen/player/PlayerSettingsDecoderScreen.kt Converts to Screen() type.
app/src/main/java/eu/kanade/presentation/more/settings/screen/player/PlayerSettingsAudioScreen.kt Converts to Screen() type.
app/src/main/java/eu/kanade/presentation/more/settings/screen/player/PlayerSettingsAdvancedScreen.kt Converts to Screen() type.
app/src/main/java/eu/kanade/presentation/more/settings/PreferenceItem.kt Wires new widget args + keyboardOptions.
app/src/main/java/eu/kanade/presentation/more/settings/Preference.kt Adds keyboardOptions to preference model.
app/src/main/java/eu/kanade/domain/track/service/TrackPreferences.kt Adds display username storage.
app/src/main/java/eu/kanade/domain/items/chapter/interactor/SyncChaptersWithSource.kt Preserves memo when syncing chapters.
app/src/main/AndroidManifest.xml Adds Hikka auth host + updates TorrServer service path.
app/proguard-rules.pro Keeps Serializable writeReplace/readResolve methods.
app/build.gradle.kts Adds torrserver lib + native lib filters.
.gitignore Ignores Android Studio native build dirs.
Comments suppressed due to low confidence (3)

core/common/src/main/java/aniyomi/core/common/torrent/TorrentPreferences.kt:51

  • ProxyMode.None currently has the same wire value as Tracker ("tracker"), so selecting "None" will still start TorrServer in tracker-proxy mode. This makes the setting ineffective.
    app/src/main/java/eu/kanade/tachiyomi/data/torrent/service/TorrentServerService.kt:103
  • The in-code comment contains profanity ("fuck android 14"), which is unprofessional and can violate project/community standards. Please rephrase it to a neutral explanation of the Android 14 behavior/workaround.
    core/common/src/main/java/aniyomi/core/common/torrent/TorrentPreferences.kt:14
  • The TorrServer trackers preference key is misspelled ("pref_torrserver_tackers"), which will store/read the setting under an unintended key and can make it hard to migrate or troubleshoot. Use a correctly spelled key.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +29 to 33
} catch (_: SocketTimeoutException) {
throw DeadTorrentException()
} catch (_: Exception) {
throw DisabledTorrServerException()
}
Comment on lines 84 to 89
favoriteModifiedAt = this@BackupManga.favoriteModifiedAt,
version = this@BackupManga.version,
notes = this@BackupManga.notes,
initialized = this@BackupManga.initialized,
memo = MemoColumnAdapter.decode(this@BackupManga.memo),
)
Comment on lines 40 to 46
dateUpload = this@BackupChapter.dateUpload,
sourceOrder = this@BackupChapter.sourceOrder,
lastModifiedAt = this@BackupChapter.lastModifiedAt,
version = this@BackupChapter.version,
dateUploadOverride = this@BackupChapter.dateUploadOverride,
memo = MemoColumnAdapter.decode(this@BackupChapter.memo),
)
Comment on lines +1109 to 1115
if (torrentPreferences.torrServerEnable().get() &&
(
video.videoUrl.startsWith(torrentServerApi.hostUrl) ||
video.videoUrl.startsWith("magnet") ||
video.videoUrl.endsWith("torrent")
)
) {
Comment on lines +1168 to +1171
if (videoUrl.startsWith("content://")) {
val videoInputStream = applicationContext.contentResolver.openInputStream(videoUrl.toUri())
val torrent = torrentServerApi.uploadTorrent(videoInputStream!!, title, false)
val torrentUrl = torrentServerUtils.getTorrentPlayLink(torrent, 0)
Comment on lines +73 to +81
object MemoColumnAdapter : ColumnAdapter<JsonObject, ByteArray> {
override fun decode(databaseValue: ByteArray): JsonObject {
return Json.decodeFromString<JsonObject>(databaseValue.decodeToString())
}

override fun encode(value: JsonObject): ByteArray {
return value.toString().encodeToByteArray()
}
}
xMohnad and others added 13 commits July 7, 2026 19:53
Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com>
User list mutation aren't available via GraphQL, so that will still be
done with the v2 API.

Shikimori API docs say to prefer the GraphQL API when possible:
https://shikimori.io/api/doc

Allows adding some additional data in the search results, namely:
- Authors & Artists
- Description

As a nice bonus, this reduces the number of requests to Shikimori
because the findLibManga method no longer needs to do 2 calls to fetch
both list and title data.
Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com>
Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com>
* Add support for MangaBaka

Note: missing a client ID which should be added by the project owner.

* Fix typo causing token refresh to fail

The field is called `refresh_token` not `refreshToken`, so all
token refreshes would fail with a 401.

* Use user-preferred score type

Currently, this only set once on login. When selecting a different
score type on MangaBaka, users (currently) will have to log out and
log in again in order for Mihon to refetch the score setting.

This appears to be what Mihon's AniList implementation does as well,
so I followed that.

* Fix score preference

Didn't get caught during the rebase.

* Fix finish_date

* Fix dates appearing offset

Timezone shenanigans meant Mihon was sending an ISO 8601 string for
the UTC timezone which lead to issues in non-UTC timezones.

For example:
1. User in UTC+1 selects 2026-03-22
2. Date picker returns 2026-03-22T00:00:00+01:00
3. MangaBakaApi converts that to an instant, converting it to UTC:
  2026-03-21T23:00:00Z
4. MangaBaka receives that and sets all time components to 0
5. Mihon (when opening the track sheet next) receives:
  2026-03-21T00:00:00Z
6. Mihon renders that as 2026-03-21

I figured out that MangaBaka accepts date-only strings as well, so we
just send those now.

* Remove fetching of total_chapters from MangaBaka

Currently, this information is not what Mihon needs for automatic
marking as COMPLETED since MangaBaka considers this an ongoing tally
of volume-published chapters rather than the final chapter number of a
title.

If anyone other than me used this code: Probably will have to unlink
& relink MB entries to get rid of the total_chapters data, not sure.

MangaBaka is currently considering a request from me to potentially
change this, but currently it's not what we need.

* Fix start date being reset on each read chapter

Admittedly a silly oversight. The other date-supporting trackers (AL,
MAL, Kitsu) use this check as opposed to `>= 0.0`.

* Add id: prefix search for MangaBaka

* Use new /v1/my/profile endpoint

Kindly added by the developers after my request <3.

* Change tracker ID to 11

* Remove unused import

* Identify Mihon in UA on all requests

* Use new `published.start_date` field for search

* Change Mihon's User Agent string for MangaBaka

- use MR.strings.app_name to avoid manual work for forks
- include app ID & commit sha for further distinction

* Add Changelog entry

* Add Mihon client ID

* Add OAuth state query param

This is?/will be? required by MangaBaka's auth provider and caused
linking issues for anyone who tried to link with MB in the past two
weeks or so.

* Update MangaBaka API URL

Changed as per MB announcement from 2026-05-27

* Use `titles` instead of old `title`

* Make title selection a method on MangaBakaItem

* Include ID in fallback title for easier reporting

Makes it a lot more intuitive for users.
Also reworded the message to more clearly direct users to the
Mangabaka Discord server instead of sounding like an instruction to
contact some "mangabaka" user in the Mihon Discord.

* `titles` is nullable

At least I noticed this before it was merged...

* Fix MangaBaka brand name

Co-authored-by: BrutuZ <7104931+BrutuZ@users.noreply.github.com>

* Remove Hikka comment

* Put MangaBaka at the top of the tracker list

AntsyLich decreed it to be like this.

Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com>

* Add display name support from #3533

* Fix changelog

* Rename MB icon to brand_mangabaka.webp

---------

Co-authored-by: BrutuZ <7104931+BrutuZ@users.noreply.github.com>
Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com>
…tabs

Fixes an issue where search queries typed in the extension tab search bar
were routed to the incorrect screen model, swapping manga and anime searches.

The previous routing logic was based on index parity (odd/even tab index).
Due to changes in the tab layout order (such as the feed tab), the anime
extension tab ended up on an odd index (3) and the manga extension tab on an
even index (4), breaking the parity assumption and swapping the queries.

Replaced the modulo check with explicit checks against the resolved tab
indices ('animeExtensionsTabIndex' and 'mangaExtensionsTabIndex').
…ote-removed titles (#3548)

* Fix Hikka search failing due to unclosed response

This closes #3547.

I have also included a precautionary refactor of the `getRead` method
in HikkaApi.kt, which by the looks of it _could_ leak an unclosed
response as well.

The try/catch with awaitSuccess pattern has been used in this same way
in the Bangumi and MangaBaka implementations as well. The benefit here
is that `awaitSuccess()` closes the response on error before throwing
an `HttpException`.

* Show toast on remote-removed list entries
@Dark25 Dark25 merged commit 16302d1 into master Jul 10, 2026
2 checks passed
@Dark25 Dark25 deleted the aniyomi-up branch July 10, 2026 20: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.

10 participants