Merge Aniyomi and Mihon #419
Merged
Merged
Conversation
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.
There was a problem hiding this comment.
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: JsonObjectmetadata to manga/chapter models and persist it through database, backup, and sync layers. - Replace the old
eu.kanade.tachiyomi.torrentServer.*implementation withaniyomi.core.common.torrent.*, new TorrServer settings UI, and updated player/downloader torrent handling. - Add player trickplay thumbnail preview support and introduce a
HttpServerhook 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() | ||
| } | ||
| } |
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
androidx.benchmark plugin adds non minified versions of the release variants. we can just reuse that.
* Enable ABI splits in `build.gradle.kts` for `armeabi-v7a`, `arm64-v8a`, `x86`, and `x86_64`. * Add release APK and baseline profile data files.
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.