diff --git a/app/src/main/java/eu/kanade/domain/manga/interactor/UpdateManga.kt b/app/src/main/java/eu/kanade/domain/manga/interactor/UpdateManga.kt index d5cfc248dd..89b70a6ce8 100644 --- a/app/src/main/java/eu/kanade/domain/manga/interactor/UpdateManga.kt +++ b/app/src/main/java/eu/kanade/domain/manga/interactor/UpdateManga.kt @@ -70,6 +70,7 @@ class UpdateManga( genre = remoteManga.getGenres(), thumbnailUrl = thumbnailUrl, status = remoteManga.status.toLong(), + webUrls = remoteManga.getWebUrls(), updateStrategy = remoteManga.update_strategy, initialized = true, ), diff --git a/app/src/main/java/eu/kanade/domain/manga/model/Manga.kt b/app/src/main/java/eu/kanade/domain/manga/model/Manga.kt index ebd2ad3e92..55c3ef656d 100644 --- a/app/src/main/java/eu/kanade/domain/manga/model/Manga.kt +++ b/app/src/main/java/eu/kanade/domain/manga/model/Manga.kt @@ -46,6 +46,7 @@ fun Manga.toSManga(): SManga = SManga.create().also { it.description = description it.genre = genre.orEmpty().joinToString() it.status = status.toInt() + it.webUrls = webUrls.orEmpty().joinToString(", ") it.thumbnail_url = thumbnailUrl it.initialized = initialized } @@ -59,6 +60,11 @@ fun Manga.copyFrom(other: SManga): Manga { } else { genre } + val webUrls = if (other.webUrls != null) { + other.getWebUrls() + } else { + webUrls + } val thumbnailUrl = other.thumbnail_url ?: thumbnailUrl return this.copy( author = author, @@ -67,6 +73,7 @@ fun Manga.copyFrom(other: SManga): Manga { genre = genres, thumbnailUrl = thumbnailUrl, status = other.status.toLong(), + webUrls = webUrls, updateStrategy = other.update_strategy, initialized = other.initialized && initialized, ) @@ -81,6 +88,7 @@ fun SManga.toDomainManga(sourceId: Long): Manga { description = description, genre = getGenres(), status = status.toLong(), + webUrls = getWebUrls(), thumbnailUrl = thumbnail_url, updateStrategy = update_strategy, initialized = initialized, @@ -111,7 +119,16 @@ fun getComicInfo( ComicInfo.Number(it.toString()) } }, - web = ComicInfo.Web(urls.joinToString(" ")), + web = if (!manga.webUrls.isNullOrEmpty()) { + ComicInfo.Web( + manga.webUrls!! + .plus(urls) + .distinct() + .joinToString(" ") + ) + } else { + ComicInfo.Web(urls.joinToString(" ")) + }, summary = manga.description?.let { ComicInfo.Summary(it) }, writer = manga.author?.let { ComicInfo.Writer(it) }, penciller = manga.artist?.let { ComicInfo.Penciller(it) }, diff --git a/app/src/main/java/eu/kanade/presentation/track/TrackInfoDialogHome.kt b/app/src/main/java/eu/kanade/presentation/track/TrackInfoDialogHome.kt index 9935321803..09210ff8e8 100644 --- a/app/src/main/java/eu/kanade/presentation/track/TrackInfoDialogHome.kt +++ b/app/src/main/java/eu/kanade/presentation/track/TrackInfoDialogHome.kt @@ -8,6 +8,7 @@ import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.IntrinsicSize +import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxHeight @@ -17,6 +18,8 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.systemBars import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.layout.wrapContentSize +import androidx.compose.foundation.lazy.LazyRow +import androidx.compose.foundation.lazy.items import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll @@ -26,12 +29,16 @@ import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.IconButton +import androidx.compose.material3.LocalMinimumInteractiveComponentEnforcement import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.SuggestionChip +import androidx.compose.material3.SuggestionChipDefaults import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.material3.VerticalDivider import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -51,10 +58,12 @@ import eu.kanade.presentation.components.DropdownMenu import eu.kanade.presentation.theme.TachiyomiPreviewTheme import eu.kanade.presentation.track.components.TrackLogoIcon import eu.kanade.tachiyomi.data.track.Tracker +import eu.kanade.tachiyomi.data.track.TrackerChipElement import eu.kanade.tachiyomi.ui.manga.track.TrackItem import eu.kanade.tachiyomi.util.lang.toLocalDate import eu.kanade.tachiyomi.util.system.copyToClipboard import tachiyomi.i18n.MR +import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource import java.time.format.DateTimeFormatter @@ -64,6 +73,7 @@ private const val UnsetStatusTextAlpha = 0.5F fun TrackInfoDialogHome( trackItems: List, dateFormat: DateTimeFormatter, + webUrlProvider: () -> List?, onStatusClick: (TrackItem) -> Unit, onChapterClick: (TrackItem) -> Unit, onScoreClick: (TrackItem) -> Unit, @@ -72,6 +82,9 @@ fun TrackInfoDialogHome( onNewSearch: (TrackItem) -> Unit, onOpenInBrowser: (TrackItem) -> Unit, onRemoved: (TrackItem) -> Unit, + onNewIdSearch: (TrackerChipElement) -> Unit, + onNewChipSearch: (TrackerChipElement) -> Unit, + onOpenChipElementInBrowser: (TrackerChipElement) -> Unit, ) { Column( modifier = Modifier @@ -82,6 +95,13 @@ fun TrackInfoDialogHome( .windowInsetsPadding(WindowInsets.systemBars), verticalArrangement = Arrangement.spacedBy(24.dp), ) { + TrackerRow( + trackItems = trackItems, + webUrlProvider = webUrlProvider, + onNewIdSearch = onNewIdSearch, + onNewChipSearch = onNewChipSearch, + onOpenChipElementInBrowser = onOpenChipElementInBrowser, + ) trackItems.forEach { item -> if (item.track != null) { val supportsScoring = item.tracker.getScoreList().isNotEmpty() @@ -127,6 +147,84 @@ fun TrackInfoDialogHome( } } +@Composable +private fun TrackerRow( + trackItems: List, + webUrlProvider: () -> List?, + onNewIdSearch: (TrackerChipElement) -> Unit, + onNewChipSearch: (TrackerChipElement) -> Unit, + onOpenChipElementInBrowser: (TrackerChipElement) -> Unit, +) { + val trackerChipElements = webUrlProvider() + ?.asSequence() + ?.map { TrackerChipElement(it, trackItems) } + ?.filter { it.trackItem?.track?.remoteId != it.remoteId || it.trackItem?.track == null } + ?.filter { it.serviceId != null } + ?.sortedBy { it.serviceId } + ?.sortedWith(compareBy(nullsLast()) { it.trackItem?.tracker?.id }) + ?.toList() + + if (!trackerChipElements.isNullOrEmpty()) { + Box( + modifier = Modifier + .padding(top = 8.dp) + .padding(end = 12.dp) + .animateContentSize(), + ) { + val context = LocalContext.current + var showMenu by remember { mutableStateOf(false) } + var selectedChipElement: TrackerChipElement? by remember { mutableStateOf(null) } + DropdownMenu( + expanded = showMenu, + onDismissRequest = { showMenu = false }, + ) { + if (selectedChipElement?.trackItem?.tracker != null) { + DropdownMenuItem( + text = { Text(text = stringResource(MR.strings.action_open_in_mihon)) }, + onClick = { + if (selectedChipElement!!.remoteId != null) { + onNewIdSearch(selectedChipElement!!) + } else if (selectedChipElement!!.searchQuery != null) { + onNewChipSearch(selectedChipElement!!) + } + showMenu = false + }, + ) + } + DropdownMenuItem( + text = { Text(text = stringResource(MR.strings.action_copy_to_clipboard)) }, + onClick = { + context.copyToClipboard(selectedChipElement?.url!!, selectedChipElement?.url!!) + showMenu = false + }, + ) + DropdownMenuItem( + text = { Text(text = stringResource(MR.strings.action_open_in_browser)) }, + onClick = { + onOpenChipElementInBrowser(selectedChipElement!!) + showMenu = false + }, + ) + } + LazyRow( + contentPadding = PaddingValues(horizontal = MaterialTheme.padding.extraSmall), + horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), + ) { + items(items = trackerChipElements) { chipElement -> + TrackerChip( + trackerChipElement = chipElement, + modifier = Modifier, + onClick = { + selectedChipElement = chipElement + showMenu = true + }, + ) + } + } + } + } +} + @Composable private fun TrackInfoItem( title: String, @@ -318,6 +416,38 @@ private fun TrackInfoItemMenu( } } +@Composable +fun TrackerChip( + trackerChipElement: TrackerChipElement, + modifier: Modifier = Modifier, + onClick: () -> Unit, +) { + CompositionLocalProvider(LocalMinimumInteractiveComponentEnforcement provides false) { + SuggestionChip( + modifier = modifier, + onClick = onClick, + colors = SuggestionChipDefaults.suggestionChipColors().copy(), + icon = { + trackerChipElement.icon?.let { icon -> + Icon( + imageVector = icon, + contentDescription = null, + ) + } + }, + label = { + trackerChipElement.trackerName?.let { name -> + Text( + text = name, + style = MaterialTheme.typography.bodySmall, + maxLines = 1, + ) + } + }, + ) + } +} + @PreviewLightDark @Composable private fun TrackInfoDialogHomePreviews( diff --git a/app/src/main/java/eu/kanade/presentation/track/TrackInfoDialogHomePreviewProvider.kt b/app/src/main/java/eu/kanade/presentation/track/TrackInfoDialogHomePreviewProvider.kt index aa58403eac..f9a5dc431f 100644 --- a/app/src/main/java/eu/kanade/presentation/track/TrackInfoDialogHomePreviewProvider.kt +++ b/app/src/main/java/eu/kanade/presentation/track/TrackInfoDialogHomePreviewProvider.kt @@ -48,6 +48,7 @@ internal class TrackInfoDialogHomePreviewProvider : trackItemWithTrack, ), dateFormat = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM), + webUrlProvider = { listOf(aTrack.remoteUrl) }, onStatusClick = {}, onChapterClick = {}, onScoreClick = {}, @@ -56,6 +57,9 @@ internal class TrackInfoDialogHomePreviewProvider : onNewSearch = {}, onOpenInBrowser = {}, onRemoved = {}, + onNewIdSearch = {}, + onNewChipSearch = {}, + onOpenChipElementInBrowser = {}, ) } @@ -63,6 +67,7 @@ internal class TrackInfoDialogHomePreviewProvider : TrackInfoDialogHome( trackItems = listOf(), dateFormat = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM), + webUrlProvider = { listOf(aTrack.remoteUrl) }, onStatusClick = {}, onChapterClick = {}, onScoreClick = {}, @@ -71,6 +76,9 @@ internal class TrackInfoDialogHomePreviewProvider : onNewSearch = {}, onOpenInBrowser = {}, onRemoved = {}, + onNewIdSearch = {}, + onNewChipSearch = {}, + onOpenChipElementInBrowser = {}, ) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/MangaBackupCreator.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/MangaBackupCreator.kt index fd10293a97..defba4f3e6 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/MangaBackupCreator.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/create/creators/MangaBackupCreator.kt @@ -88,6 +88,7 @@ private fun Manga.toBackupManga() = description = this.description, genre = this.genre.orEmpty(), status = this.status.toInt(), + webUrls = this.webUrls.orEmpty(), thumbnailUrl = this.thumbnailUrl, favorite = this.favorite, source = this.source, diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupManga.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupManga.kt index 410ecc67ad..ff8de5e534 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupManga.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupManga.kt @@ -43,6 +43,8 @@ data class BackupManga( @ProtoNumber(107) var favoriteModifiedAt: Long? = null, @ProtoNumber(108) var excludedScanlators: List = emptyList(), @ProtoNumber(109) var version: Long = 0, + @ProtoNumber(110) var webUrls: List? = emptyList(), + ) { fun getMangaImpl(): Manga { return Manga.create().copy( @@ -53,6 +55,7 @@ data class BackupManga( description = this@BackupManga.description, genre = this@BackupManga.genre, status = this@BackupManga.status.toLong(), + webUrls = this@BackupManga.webUrls, thumbnailUrl = this@BackupManga.thumbnailUrl, favorite = this@BackupManga.favorite, source = this@BackupManga.source, diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/MangaRestorer.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/MangaRestorer.kt index b0c86e2ab1..dc1006a0fc 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/MangaRestorer.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/restore/restorers/MangaRestorer.kt @@ -97,6 +97,7 @@ class MangaRestorer( artist = newer.artist, description = newer.description, genre = newer.genre, + webUrls = newer.webUrls, thumbnailUrl = newer.thumbnailUrl, status = newer.status, initialized = this.initialized || newer.initialized, @@ -115,6 +116,7 @@ class MangaRestorer( genre = manga.genre?.joinToString(separator = ", "), title = manga.title, status = manga.status, + webUrls = manga.webUrls?.joinToString(separator = ", "), thumbnailUrl = manga.thumbnailUrl, favorite = manga.favorite, lastUpdate = manga.lastUpdate, @@ -249,6 +251,7 @@ class MangaRestorer( genre = manga.genre, title = manga.title, status = manga.status, + webUrls = manga.webUrls, thumbnailUrl = manga.thumbnailUrl, favorite = manga.favorite, lastUpdate = manga.lastUpdate, diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/Tracker.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/Tracker.kt index 06644e9329..4e6c090d52 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/Tracker.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/Tracker.kt @@ -56,6 +56,8 @@ interface Tracker { suspend fun login(username: String, password: String) + suspend fun searchId(id: Long): List + @CallSuper fun logout() diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/TrackerChipElement.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/TrackerChipElement.kt new file mode 100644 index 0000000000..04f0e921b9 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/TrackerChipElement.kt @@ -0,0 +1,88 @@ +package eu.kanade.tachiyomi.data.track + +import androidx.compose.ui.graphics.vector.ImageVector +import eu.kanade.tachiyomi.data.track.anilist.Anilist +import eu.kanade.tachiyomi.data.track.anilist.AnilistApi +import eu.kanade.tachiyomi.data.track.bangumi.Bangumi +import eu.kanade.tachiyomi.data.track.kitsu.Kitsu +import eu.kanade.tachiyomi.data.track.kitsu.KitsuApi +import eu.kanade.tachiyomi.data.track.mangaupdates.MangaUpdates +import eu.kanade.tachiyomi.data.track.myanimelist.MyAnimeList +import eu.kanade.tachiyomi.data.track.shikimori.Shikimori +import eu.kanade.tachiyomi.data.track.shikimori.ShikimoriApi +import eu.kanade.tachiyomi.ui.manga.track.TrackItem +import tachiyomi.presentation.core.icons.Anilist +import tachiyomi.presentation.core.icons.Bangumi +import tachiyomi.presentation.core.icons.CustomIcons +import tachiyomi.presentation.core.icons.Kitsu +import tachiyomi.presentation.core.icons.MangaUpdates +import tachiyomi.presentation.core.icons.MyAnimeListStretched +import tachiyomi.presentation.core.icons.Shikimori +import java.net.URL + +class TrackerChipElement( + val url: String, + trackItems: List, +) { + val hostName: String = URL(url).host ?: "Could not detect hostname" + + val trackerName: String? = when (hostName) { + URL(AnilistApi.baseUrl).host -> Anilist.NAME + URL(KitsuApi.baseUrl).host -> Kitsu.NAME + URL(MY_ANIME_LIST_BASE_URL).host -> MyAnimeList.NAME + URL(ShikimoriApi.baseUrl).host -> Shikimori.NAME + in BANGUMI_BASE_URLs.map { URL(it).host } -> Bangumi.NAME + URL(MANGA_UPDATES_BASE_URL).host -> MangaUpdates.NAME + else -> null + } + + val trackItem: TrackItem? = trackItems.find { trackerName == it.tracker.name } + + val icon: ImageVector? = when (trackerName) { + Anilist.NAME -> CustomIcons.Anilist + Kitsu.NAME -> CustomIcons.Kitsu + MyAnimeList.NAME -> CustomIcons.MyAnimeListStretched + Shikimori.NAME -> CustomIcons.Shikimori + Bangumi.NAME -> CustomIcons.Bangumi + MangaUpdates.NAME -> CustomIcons.MangaUpdates + else -> null + } + + val serviceId = when (trackerName) { + Anilist.NAME -> TrackerManager.ANILIST + Kitsu.NAME -> TrackerManager.KITSU + MyAnimeList.NAME -> TrackerManager.MY_ANIME_LIST + Shikimori.NAME -> TrackerManager.SHIKIMORI + Bangumi.NAME -> TrackerManager.BANGUMI + MangaUpdates.NAME -> TrackerManager.MANGA_UPDATES + else -> null + } + + val remoteId = when (trackerName) { + Anilist.NAME -> ANILIST_ID_REGEX.find(URL(url).path)?.groups?.get(1)?.value?.toLong() + MyAnimeList.NAME -> MY_ANIME_LIST_ID_REGEX.find(URL(url).path)?.groups?.get(1)?.value?.toLong() + Shikimori.NAME -> SHIKIMORI_ID_REGEX.find(URL(url).path)?.groups?.get(1)?.value?.toLong() + Bangumi.NAME -> BANGUMI_ID_REGEX.find(URL(url).path)?.groups?.get(1)?.value?.toLong() + else -> null + } + + val searchQuery = when (trackerName) { + Kitsu.NAME -> KITSU_QUERY_REGEX.find(URL(url).path)?.groups?.get(1)?.value + MangaUpdates.NAME -> MANGA_UPDATES_QUERY_REGEX.find(URL(url).path)?.groups?.get(1)?.value + else -> null + } + + companion object { + private const val MY_ANIME_LIST_BASE_URL = "https://myanimelist.net" + private const val MANGA_UPDATES_BASE_URL = "https://www.mangaupdates.com" + private val BANGUMI_BASE_URLs = listOf("https://bangumi.tv", "https://bgm.tv") + + private val ANILIST_ID_REGEX = Regex("""^/manga/(\d+)""") + private val MY_ANIME_LIST_ID_REGEX = Regex("""^/manga/(\d+)""") + private val SHIKIMORI_ID_REGEX = Regex("""^/mangas/(\d+)""") + private val BANGUMI_ID_REGEX = Regex("""^/subject/(\d+)""") + + private val KITSU_QUERY_REGEX = Regex("""^/manga/(.+)""") + private val MANGA_UPDATES_QUERY_REGEX = Regex("""^/series/\w+/(.+)""") + } +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/TrackerManager.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/TrackerManager.kt index 598a0c06c6..2daae14d61 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/TrackerManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/TrackerManager.kt @@ -13,8 +13,12 @@ import eu.kanade.tachiyomi.data.track.suwayomi.Suwayomi class TrackerManager { companion object { + const val MY_ANIME_LIST = 1L const val ANILIST = 2L const val KITSU = 3L + const val SHIKIMORI = 4L + const val BANGUMI = 5L + const val MANGA_UPDATES = 7L const val KAVITA = 8L } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/Anilist.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/Anilist.kt index abf0d702a1..33974cd27a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/Anilist.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/Anilist.kt @@ -17,9 +17,10 @@ import tachiyomi.i18n.MR import uy.kohesive.injekt.injectLazy import tachiyomi.domain.track.model.Track as DomainTrack -class Anilist(id: Long) : BaseTracker(id, "AniList"), DeletableTracker { +class Anilist(id: Long) : BaseTracker(id, NAME), DeletableTracker { companion object { + const val NAME = "AniList" const val READING = 1L const val COMPLETED = 2L const val ON_HOLD = 3L @@ -32,6 +33,8 @@ class Anilist(id: Long) : BaseTracker(id, "AniList"), DeletableTracker { const val POINT_10_DECIMAL = "POINT_10_DECIMAL" const val POINT_5 = "POINT_5" const val POINT_3 = "POINT_3" + + private const val SEARCH_ID_PREFIX = "id:" } private val json: Json by injectLazy() @@ -198,9 +201,18 @@ class Anilist(id: Long) : BaseTracker(id, "AniList"), DeletableTracker { } override suspend fun search(query: String): List { + if (query.startsWith(SEARCH_ID_PREFIX)) { + query.substringAfter(SEARCH_ID_PREFIX).toLongOrNull()?.let { id -> + return (api.findMangaById(id)) + } + } return api.search(query) } + override suspend fun searchId(id: Long): List { + return api.findMangaById(id) + } + override suspend fun refresh(track: Track): Track { val remoteTrack = api.getLibManga(track, getUsername().toInt()) track.copyPersonalFrom(remoteTrack) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt index c808d0f31c..77a9710386 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt @@ -189,6 +189,60 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { } } + suspend fun findMangaById(mangaId: Long): List { + return withIOContext { + val query = """ + |query (${'$'}manga_id: Int!) { + |Page (perPage: 1) { + |media(id: ${'$'}manga_id, type: MANGA) { + |id + |title { + |userPreferred + |} + |coverImage { + |large + |} + |format + |status + |chapters + |description + |startDate { + |year + |month + |day + |} + |averageScore + |} + |} + |} + | + """.trimMargin() + val payload = buildJsonObject { + put("query", query) + putJsonObject("variables") { + put("manga_id", mangaId) + } + } + with(json) { + authClient.newCall( + POST( + apiUrl, + body = payload.toString().toRequestBody(jsonMime), + ), + ) + .awaitSuccess() + .parseAs() + .let { response -> + val data = response["data"]!!.jsonObject + val page = data["Page"]!!.jsonObject + val media = page["media"]!!.jsonArray + val entries = media.map { jsonToALManga(it.jsonObject) } + entries.map { it.toTrack() } + } + } + } + } + suspend fun findLibManga(track: Track, userid: Int): Track? { return withIOContext { val query = """ @@ -366,7 +420,7 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { companion object { private const val clientId = "16329" private const val apiUrl = "https://graphql.anilist.co/" - private const val baseUrl = "https://anilist.co/api/v2/" + const val baseUrl = "https://anilist.co/api/v2/" private const val baseMangaUrl = "https://anilist.co/manga/" fun mangaUrl(mediaId: Long): String { diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/Bangumi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/Bangumi.kt index b8e7d2acc0..f0d3569a55 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/Bangumi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/Bangumi.kt @@ -14,7 +14,7 @@ import tachiyomi.i18n.MR import uy.kohesive.injekt.injectLazy import tachiyomi.domain.track.model.Track as DomainTrack -class Bangumi(id: Long) : BaseTracker(id, "Bangumi") { +class Bangumi(id: Long) : BaseTracker(id, NAME) { private val json: Json by injectLazy() @@ -118,6 +118,10 @@ class Bangumi(id: Long) : BaseTracker(id, "Bangumi") { } } + override suspend fun searchId(id: Long): List { + return listOf(api.getMangaSearchById(id)) + } + fun saveToken(oauth: OAuth?) { trackPreferences.trackToken(this).set(json.encodeToString(oauth)) } @@ -137,6 +141,7 @@ class Bangumi(id: Long) : BaseTracker(id, "Bangumi") { } companion object { + const val NAME = "Bangumi" const val READING = 3L const val COMPLETED = 2L const val ON_HOLD = 4L diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiApi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiApi.kt index 65d2dc8058..b4b91f7243 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiApi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/BangumiApi.kt @@ -132,6 +132,17 @@ class BangumiApi( } } + suspend fun getMangaSearchById(id: Long): TrackSearch { + return withIOContext { + with(json) { + authClient.newCall(GET("$apiUrl/subject/$id")) + .awaitSuccess() + .parseAs() + .let { jsonToSearch(it) } + } + } + } + suspend fun statusLibManga(track: Track): Track? { return withIOContext { val urlUserRead = "$apiUrl/collection/${track.remote_id}" diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/kavita/Kavita.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/kavita/Kavita.kt index a9aed629b0..96740bd729 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/kavita/Kavita.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/kavita/Kavita.kt @@ -78,6 +78,10 @@ class Kavita(id: Long) : BaseTracker(id, "Kavita"), EnhancedTracker { TODO("Not yet implemented: search") } + override suspend fun searchId(id: Long): List { + TODO("Not yet implemented") + } + override suspend fun refresh(track: Track): Track { val remoteTrack = api.getTrackSearch(track.tracking_url) track.copyPersonalFrom(remoteTrack) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/Kitsu.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/Kitsu.kt index 4b0db8bce9..42baaa97af 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/Kitsu.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/Kitsu.kt @@ -16,9 +16,10 @@ import uy.kohesive.injekt.injectLazy import java.text.DecimalFormat import tachiyomi.domain.track.model.Track as DomainTrack -class Kitsu(id: Long) : BaseTracker(id, "Kitsu"), DeletableTracker { +class Kitsu(id: Long) : BaseTracker(id, NAME), DeletableTracker { companion object { + const val NAME = "Kitsu" const val READING = 1L const val COMPLETED = 2L const val ON_HOLD = 3L @@ -119,6 +120,10 @@ class Kitsu(id: Long) : BaseTracker(id, "Kitsu"), DeletableTracker { return api.search(query) } + override suspend fun searchId(id: Long): List { + TODO("Not yet implemented") + } + override suspend fun refresh(track: Track): Track { val remoteTrack = api.getLibManga(track) track.copyPersonalFrom(remoteTrack) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuApi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuApi.kt index 3c9251eafc..5699414579 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuApi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/kitsu/KitsuApi.kt @@ -270,7 +270,7 @@ class KitsuApi(private val client: OkHttpClient, interceptor: KitsuInterceptor) private const val clientSecret = "54d7307928f63414defd96399fc31ba847961ceaecef3a5fd93144e960c0e151" - private const val baseUrl = "https://kitsu.io/api/edge/" + const val baseUrl = "https://kitsu.io/api/edge/" private const val loginUrl = "https://kitsu.io/api/oauth/token" private const val baseMangaUrl = "https://kitsu.io/manga/" private const val algoliaKeyUrl = "https://kitsu.io/api/edge/algolia-keys/media/" diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/komga/Komga.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/komga/Komga.kt index eee8941a3c..c82192d10d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/komga/Komga.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/komga/Komga.kt @@ -76,6 +76,10 @@ class Komga(id: Long) : BaseTracker(id, "Komga"), EnhancedTracker { TODO("Not yet implemented: search") } + override suspend fun searchId(id: Long): List { + TODO("Not yet implemented") + } + override suspend fun refresh(track: Track): Track { val remoteTrack = api.getTrackSearch(track.tracking_url) track.copyPersonalFrom(remoteTrack) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdates.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdates.kt index 6219e728b6..94f55f9987 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdates.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdates.kt @@ -16,9 +16,10 @@ import kotlinx.collections.immutable.toImmutableList import tachiyomi.i18n.MR import tachiyomi.domain.track.model.Track as DomainTrack -class MangaUpdates(id: Long) : BaseTracker(id, "MangaUpdates"), DeletableTracker { +class MangaUpdates(id: Long) : BaseTracker(id, NAME), DeletableTracker { companion object { + const val NAME = "MangaUpdates" const val READING_LIST = 0L const val WISH_LIST = 1L const val COMPLETE_LIST = 2L @@ -101,6 +102,10 @@ class MangaUpdates(id: Long) : BaseTracker(id, "MangaUpdates"), DeletableTracker } } + override suspend fun searchId(id: Long): List { + TODO("Not yet implemented") + } + override suspend fun refresh(track: Track): Track { val (series, rating) = api.getSeriesListItem(track) return track.copyFrom(series, rating) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdatesApi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdatesApi.kt index 5da3b72224..4c5ad05ad0 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdatesApi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/mangaupdates/MangaUpdatesApi.kt @@ -38,7 +38,6 @@ class MangaUpdatesApi( ) { private val json: Json by injectLazy() - private val baseUrl = "https://api.mangaupdates.com" private val contentType = "application/vnd.api+json".toMediaType() private val authClient by lazy { @@ -208,4 +207,7 @@ class MangaUpdatesApi( } } } + companion object { + private const val baseUrl = "https://api.mangaupdates.com" + } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList.kt index 33daee1a95..23869a468a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/myanimelist/MyAnimeList.kt @@ -15,9 +15,10 @@ import tachiyomi.i18n.MR import uy.kohesive.injekt.injectLazy import tachiyomi.domain.track.model.Track as DomainTrack -class MyAnimeList(id: Long) : BaseTracker(id, "MyAnimeList"), DeletableTracker { +class MyAnimeList(id: Long) : BaseTracker(id, NAME), DeletableTracker { companion object { + const val NAME = "MyAnimeList" const val READING = 1L const val COMPLETED = 2L const val ON_HOLD = 3L @@ -132,6 +133,10 @@ class MyAnimeList(id: Long) : BaseTracker(id, "MyAnimeList"), DeletableTracker { return api.search(query) } + override suspend fun searchId(id: Long): List { + return listOf(api.getMangaDetails(id.toInt())) + } + override suspend fun refresh(track: Track): Track { return api.findListItem(track) ?: add(track) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/Shikimori.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/Shikimori.kt index 118d005c15..14016233ee 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/Shikimori.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/Shikimori.kt @@ -15,9 +15,10 @@ import tachiyomi.i18n.MR import uy.kohesive.injekt.injectLazy import tachiyomi.domain.track.model.Track as DomainTrack -class Shikimori(id: Long) : BaseTracker(id, "Shikimori"), DeletableTracker { +class Shikimori(id: Long) : BaseTracker(id, NAME), DeletableTracker { companion object { + const val NAME = "Shikimori" const val READING = 1L const val COMPLETED = 2L const val ON_HOLD = 3L @@ -88,6 +89,10 @@ class Shikimori(id: Long) : BaseTracker(id, "Shikimori"), DeletableTracker { return api.search(query) } + override suspend fun searchId(id: Long): List { + return listOf(api.getMangaFromId(id)) + } + override suspend fun refresh(track: Track): Track { api.findLibManga(track, getUsername())?.let { remoteTrack -> track.library_id = remoteTrack.library_id diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/ShikimoriApi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/ShikimoriApi.kt index 6eb93a6362..b274647a5b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/ShikimoriApi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/shikimori/ShikimoriApi.kt @@ -126,6 +126,22 @@ class ShikimoriApi( } } + suspend fun getMangaFromId(id: Long): TrackSearch { + return withIOContext { + val mangaUrl = "$apiUrl/mangas".toUri().buildUpon() + .appendPath(id.toString()) + .build() + with(json) { + authClient.newCall(GET(mangaUrl.toString())) + .awaitSuccess() + .parseAs() + .let { response -> + jsonToSearch(response) + } + } + } + } + suspend fun findLibManga(track: Track, userId: String): Track? { return withIOContext { val urlMangas = "$apiUrl/mangas".toUri().buildUpon() @@ -195,7 +211,7 @@ class ShikimoriApi( private const val clientId = "PB9dq8DzI405s7wdtwTdirYqHiyVMh--djnP7lBUqSA" private const val clientSecret = "NajpZcOBKB9sJtgNcejf8OB9jBN1OYYoo-k4h2WWZus" - private const val baseUrl = "https://shikimori.one" + const val baseUrl = "https://shikimori.one" private const val apiUrl = "$baseUrl/api" private const val oauthUrl = "$baseUrl/oauth/token" private const val loginUrl = "$baseUrl/oauth/authorize" diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/suwayomi/Suwayomi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/suwayomi/Suwayomi.kt index 6b2ca63f90..418f845343 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/suwayomi/Suwayomi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/suwayomi/Suwayomi.kt @@ -69,6 +69,10 @@ class Suwayomi(id: Long) : BaseTracker(id, "Suwayomi"), EnhancedTracker { TODO("Not yet implemented") } + override suspend fun searchId(id: Long): List { + TODO("Not yet implemented") + } + override suspend fun refresh(track: Track): Track { val remoteTrack = api.getTrackSearch(track.tracking_url) track.copyPersonalFrom(remoteTrack) diff --git a/app/src/main/java/eu/kanade/tachiyomi/di/AppModule.kt b/app/src/main/java/eu/kanade/tachiyomi/di/AppModule.kt index 9997a07118..83518e14f6 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/di/AppModule.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/di/AppModule.kt @@ -84,6 +84,7 @@ class AppModule(val app: Application) : InjektModule { ), mangasAdapter = Mangas.Adapter( genreAdapter = StringListColumnAdapter, + web_urlsAdapter = StringListColumnAdapter, update_strategyAdapter = UpdateStrategyColumnAdapter, ), ) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreen.kt index c2466ffd4f..0216d4317c 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreen.kt @@ -138,7 +138,7 @@ class MangaScreen( ) }.takeIf { isHttpSource }, onTrackingClicked = { - if (screenModel.loggedInTrackers.isEmpty()) { + if (screenModel.loggedInTrackers.isEmpty() && successState.manga.webUrls.isNullOrEmpty()) { navigator.push(SettingsScreen(SettingsScreen.Destination.Tracking)) } else { screenModel.showTrackDialog() @@ -234,6 +234,7 @@ class MangaScreen( mangaId = successState.manga.id, mangaTitle = successState.manga.title, sourceId = successState.source.id, + webUrls = successState.manga.webUrls, ), enableSwipeDismiss = { it.lastItem is TrackInfoDialogHomeScreen }, onDismissRequest = onDismissRequest, diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackInfoDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackInfoDialog.kt index 1ba697f245..f077d22635 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackInfoDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/TrackInfoDialog.kt @@ -51,6 +51,7 @@ import eu.kanade.presentation.util.Screen import eu.kanade.tachiyomi.data.track.DeletableTracker import eu.kanade.tachiyomi.data.track.EnhancedTracker import eu.kanade.tachiyomi.data.track.Tracker +import eu.kanade.tachiyomi.data.track.TrackerChipElement import eu.kanade.tachiyomi.data.track.TrackerManager import eu.kanade.tachiyomi.data.track.model.TrackSearch import eu.kanade.tachiyomi.util.lang.convertEpochMillisZone @@ -90,6 +91,7 @@ data class TrackInfoDialogHomeScreen( private val mangaId: Long, private val mangaTitle: String, private val sourceId: Long, + private val webUrls: List?, ) : Screen() { @Composable @@ -104,6 +106,7 @@ data class TrackInfoDialogHomeScreen( TrackInfoDialogHome( trackItems = state.trackItems, dateFormat = dateFormat, + webUrlProvider = { webUrls }, onStatusClick = { navigator.push( TrackStatusSelectorScreen( @@ -170,6 +173,32 @@ data class TrackInfoDialogHomeScreen( ), ) }, + onNewIdSearch = { + if (it.serviceId != null) { + navigator.push( + TrackerSearchScreen( + mangaId = mangaId, + initialQuery = "", + currentUrl = null, + serviceId = it.serviceId, + mangaIdOnTracker = it.remoteId, + ), + ) + } + }, + onNewChipSearch = { + if (it.serviceId != null) { + navigator.push( + TrackerSearchScreen( + mangaId = mangaId, + initialQuery = it.searchQuery!!, + currentUrl = null, + serviceId = it.serviceId, + ), + ) + } + }, + onOpenChipElementInBrowser = { openChipElementInBrowser(context, it) }, ) } @@ -183,6 +212,10 @@ data class TrackInfoDialogHomeScreen( } } + private fun openChipElementInBrowser(context: Context, chipElement: TrackerChipElement) { + context.openInBrowser(chipElement.url) + } + private class Model( private val mangaId: Long, private val sourceId: Long, @@ -641,6 +674,7 @@ data class TrackerSearchScreen( private val initialQuery: String, private val currentUrl: String?, private val serviceId: Long, + private val mangaIdOnTracker: Long? = null, ) : Screen() { @Composable @@ -652,6 +686,7 @@ data class TrackerSearchScreen( currentUrl = currentUrl, initialQuery = initialQuery, tracker = Injekt.get().get(serviceId)!!, + mangaIdOnTracker = mangaIdOnTracker, ) } @@ -678,12 +713,14 @@ data class TrackerSearchScreen( private val currentUrl: String? = null, initialQuery: String, private val tracker: Tracker, + mangaIdOnTracker: Long? = null, ) : StateScreenModel(State()) { - init { // Run search on first launch if (initialQuery.isNotBlank()) { trackingSearch(initialQuery) + } else if (mangaIdOnTracker != null) { + idSearch(mangaIdOnTracker) } } @@ -709,6 +746,28 @@ data class TrackerSearchScreen( } } + fun idSearch(id: Long) { + screenModelScope.launch { + // To show loading state + mutableState.update { it.copy(queryResult = null, selected = null) } + + val result = withIOContext { + try { + val results = tracker.searchId(id) + Result.success(results) + } catch (e: Throwable) { + Result.failure(e) + } + } + mutableState.update { oldState -> + oldState.copy( + queryResult = result, + selected = result.getOrNull()?.find { it.tracking_url == currentUrl }, + ) + } + } + } + fun registerTracking(item: TrackSearch) { screenModelScope.launchNonCancellable { tracker.register(item, mangaId) } } diff --git a/app/src/main/java/eu/kanade/test/DummyTracker.kt b/app/src/main/java/eu/kanade/test/DummyTracker.kt index 56092b440a..860aacaca7 100644 --- a/app/src/main/java/eu/kanade/test/DummyTracker.kt +++ b/app/src/main/java/eu/kanade/test/DummyTracker.kt @@ -73,6 +73,10 @@ data class DummyTracker( override suspend fun search(query: String): List = valSearchResults + override suspend fun searchId(id: Long): List { + TODO("Not yet implemented") + } + override suspend fun refresh( track: eu.kanade.tachiyomi.data.database.models.Track, ): eu.kanade.tachiyomi.data.database.models.Track = track diff --git a/config/detekt/baseline.xml b/config/detekt/baseline.xml index 1845cae53c..a2128bd73f 100644 --- a/config/detekt/baseline.xml +++ b/config/detekt/baseline.xml @@ -301,8 +301,8 @@ LongParameterList:MangaInfoHeader.kt$( favorite: Boolean, trackingCount: Int, nextUpdate: Instant?, isUserIntervalMode: Boolean, onAddToLibraryClicked: () -> Unit, onWebViewClicked: (() -> Unit)?, onWebViewLongClicked: (() -> Unit)?, onTrackingClicked: () -> Unit, onEditIntervalClicked: (() -> Unit)?, onEditCategory: (() -> Unit)?, modifier: Modifier = Modifier, ) LongParameterList:MangaInfoHeader.kt$( isTabletUi: Boolean, appBarPadding: Dp, title: String, author: String?, artist: String?, sourceName: String, isStubSource: Boolean, coverDataProvider: () -> Manga, status: Long, onCoverClick: () -> Unit, doSearch: (query: String, global: Boolean) -> Unit, modifier: Modifier = Modifier, ) LongParameterList:MangaInfoHeader.kt$( title: String, doSearch: (query: String, global: Boolean) -> Unit, author: String?, artist: String?, status: Long, sourceName: String, isStubSource: Boolean, textAlign: TextAlign? = LocalTextStyle.current.textAlign, ) - LongParameterList:MangaMapper.kt$MangaMapper$( id: Long, source: Long, url: String, artist: String?, author: String?, description: String?, genre: List<String>?, title: String, status: Long, thumbnailUrl: String?, favorite: Boolean, lastUpdate: Long?, nextUpdate: Long?, initialized: Boolean, viewerFlags: Long, chapterFlags: Long, coverLastModified: Long, dateAdded: Long, updateStrategy: UpdateStrategy, calculateInterval: Long, lastModifiedAt: Long, favoriteModifiedAt: Long?, ) - LongParameterList:MangaMapper.kt$MangaMapper$( id: Long, source: Long, url: String, artist: String?, author: String?, description: String?, genre: List<String>?, title: String, status: Long, thumbnailUrl: String?, favorite: Boolean, lastUpdate: Long?, nextUpdate: Long?, initialized: Boolean, viewerFlags: Long, chapterFlags: Long, coverLastModified: Long, dateAdded: Long, updateStrategy: UpdateStrategy, calculateInterval: Long, lastModifiedAt: Long, favoriteModifiedAt: Long?, totalCount: Long, readCount: Double, latestUpload: Long, chapterFetchedAt: Long, lastRead: Long, bookmarkCount: Double, category: Long, ) + LongParameterList:MangaMapper.kt$MangaMapper$( id: Long, source: Long, url: String, artist: String?, author: String?, description: String?, genre: List<String>?, title: String, status: Long, thumbnailUrl: String?, favorite: Boolean, lastUpdate: Long?, nextUpdate: Long?, initialized: Boolean, viewerFlags: Long, chapterFlags: Long, coverLastModified: Long, dateAdded: Long, updateStrategy: UpdateStrategy, calculateInterval: Long, lastModifiedAt: Long, favoriteModifiedAt: Long?, webUrls: List<String>?, ) + LongParameterList:MangaMapper.kt$MangaMapper$( id: Long, source: Long, url: String, artist: String?, author: String?, description: String?, genre: List<String>?, title: String, status: Long, thumbnailUrl: String?, favorite: Boolean, lastUpdate: Long?, nextUpdate: Long?, initialized: Boolean, viewerFlags: Long, chapterFlags: Long, coverLastModified: Long, dateAdded: Long, updateStrategy: UpdateStrategy, calculateInterval: Long, lastModifiedAt: Long, favoriteModifiedAt: Long?, webUrls: List<String>?, totalCount: Long, readCount: Double, latestUpload: Long, chapterFetchedAt: Long, lastRead: Long, bookmarkCount: Double, category: Long, ) LongParameterList:MangaRestorer.kt$MangaRestorer$( manga: Manga, chapters: List<BackupChapter>, categories: List<Long>, backupCategories: List<BackupCategory>, history: List<BackupHistory>, tracks: List<BackupTracking>, excludedScanlators: List<String>, ) LongParameterList:MangaScreen.kt$( manga: Manga, chapters: List<ChapterList>, isAnyChapterSelected: Boolean, chapterSwipeStartAction: LibraryPreferences.ChapterSwipeAction, chapterSwipeEndAction: LibraryPreferences.ChapterSwipeAction, onChapterClicked: (Chapter) -> Unit, onDownloadChapter: ((List<ChapterList.Item>, ChapterDownloadAction) -> Unit)?, onChapterSelected: (ChapterList.Item, Boolean, Boolean, Boolean) -> Unit, onChapterSwipe: (ChapterList.Item, LibraryPreferences.ChapterSwipeAction) -> Unit, ) LongParameterList:MangaScreen.kt$( selected: List<ChapterList.Item>, onMultiBookmarkClicked: (List<Chapter>, bookmarked: Boolean) -> Unit, onMultiMarkAsReadClicked: (List<Chapter>, markAsRead: Boolean) -> Unit, onMarkPreviousAsReadClicked: (Chapter) -> Unit, onDownloadChapter: ((List<ChapterList.Item>, ChapterDownloadAction) -> Unit)?, onMultiDeleteClicked: (List<Chapter>) -> Unit, fillFraction: Float, modifier: Modifier = Modifier, ) @@ -398,6 +398,7 @@ MagicNumber:BackupManga.kt$BackupManga$106 MagicNumber:BackupManga.kt$BackupManga$107 MagicNumber:BackupManga.kt$BackupManga$108 + MagicNumber:BackupManga.kt$BackupManga$109 MagicNumber:BackupManga.kt$BackupManga$13 MagicNumber:BackupManga.kt$BackupManga$14 MagicNumber:BackupManga.kt$BackupManga$16 @@ -1143,6 +1144,7 @@ TooManyFunctions:MangaUpdates.kt$MangaUpdates : BaseTrackerDeletableTracker TooManyFunctions:MyAnimeList.kt$MyAnimeList : BaseTrackerDeletableTracker TooManyFunctions:MyAnimeListApi.kt$MyAnimeListApi + TooManyFunctions:ShikimoriApi.kt$ShikimoriApi TooManyFunctions:NotificationReceiver.kt$NotificationReceiver : BroadcastReceiver TooManyFunctions:NotificationReceiver.kt$NotificationReceiver$Companion TooManyFunctions:PagerPageHolder.kt$PagerPageHolder : ReaderPageImageViewPositionableView diff --git a/core-metadata/src/main/java/tachiyomi/core/metadata/comicinfo/ComicInfo.kt b/core-metadata/src/main/java/tachiyomi/core/metadata/comicinfo/ComicInfo.kt index 5d4d922771..03bbbafecc 100644 --- a/core-metadata/src/main/java/tachiyomi/core/metadata/comicinfo/ComicInfo.kt +++ b/core-metadata/src/main/java/tachiyomi/core/metadata/comicinfo/ComicInfo.kt @@ -1,5 +1,6 @@ package tachiyomi.core.metadata.comicinfo +import android.webkit.URLUtil import eu.kanade.tachiyomi.source.model.SManga import kotlinx.serialization.Serializable import nl.adaptivity.xmlutil.serialization.XmlElement @@ -17,9 +18,11 @@ fun SManga.getComicInfo() = ComicInfo( publishingStatus = ComicInfo.PublishingStatusTachiyomi( ComicInfoPublishingStatus.toComicInfoValue(status.toLong()), ), + web = webUrls?.let { urls -> + ComicInfo.Web(urls.split(", ").joinToString(" ") { it.trim() }) + }, title = null, number = null, - web = null, translator = null, inker = null, colorist = null, @@ -59,6 +62,14 @@ fun SManga.copyFromComicInfo(comicInfo: ComicInfo) { ?.let { artist = it } status = ComicInfoPublishingStatus.toSMangaValue(comicInfo.publishingStatus?.value) + + comicInfo.web?.value + ?.split(" ") + ?.map { it.trim() } + ?.distinct() + ?.filter { URLUtil.isNetworkUrl(it) } + ?.takeIf { it.isNotEmpty() } + ?.let { webUrls = it.joinToString(", ") } } // https://anansi-project.github.io/docs/comicinfo/schemas/v2.0 diff --git a/data/src/main/java/tachiyomi/data/manga/MangaMapper.kt b/data/src/main/java/tachiyomi/data/manga/MangaMapper.kt index 8f0a68d43e..33dca86673 100644 --- a/data/src/main/java/tachiyomi/data/manga/MangaMapper.kt +++ b/data/src/main/java/tachiyomi/data/manga/MangaMapper.kt @@ -32,6 +32,7 @@ object MangaMapper { version: Long, @Suppress("UNUSED_PARAMETER") isSyncing: Long, + webUrls: List?, ): Manga = Manga( id = id, source = source, @@ -50,6 +51,7 @@ object MangaMapper { description = description, genre = genre, status = status, + webUrls = webUrls, thumbnailUrl = thumbnailUrl, updateStrategy = updateStrategy, initialized = initialized, @@ -84,6 +86,7 @@ object MangaMapper { favoriteModifiedAt: Long?, version: Long, isSyncing: Long, + webUrls: List?, totalCount: Long, readCount: Double, latestUpload: Long, @@ -117,6 +120,7 @@ object MangaMapper { favoriteModifiedAt, version, isSyncing, + webUrls, ), category = category, totalChapters = totalCount, diff --git a/data/src/main/java/tachiyomi/data/manga/MangaRepositoryImpl.kt b/data/src/main/java/tachiyomi/data/manga/MangaRepositoryImpl.kt index 06b7bde583..a91a57f1ad 100644 --- a/data/src/main/java/tachiyomi/data/manga/MangaRepositoryImpl.kt +++ b/data/src/main/java/tachiyomi/data/manga/MangaRepositoryImpl.kt @@ -105,6 +105,7 @@ class MangaRepositoryImpl( genre = manga.genre, title = manga.title, status = manga.status, + webUrls = manga.webUrls, thumbnailUrl = manga.thumbnailUrl, favorite = manga.favorite, lastUpdate = manga.lastUpdate, @@ -154,6 +155,7 @@ class MangaRepositoryImpl( genre = value.genre?.let(StringListColumnAdapter::encode), title = value.title, status = value.status, + webUrls = value.webUrls?.let(StringListColumnAdapter::encode), thumbnailUrl = value.thumbnailUrl, favorite = value.favorite, lastUpdate = value.lastUpdate, diff --git a/data/src/main/sqldelight/tachiyomi/data/mangas.sq b/data/src/main/sqldelight/tachiyomi/data/mangas.sq index 3e21e5bc00..e0f55869f8 100644 --- a/data/src/main/sqldelight/tachiyomi/data/mangas.sq +++ b/data/src/main/sqldelight/tachiyomi/data/mangas.sq @@ -27,7 +27,8 @@ CREATE TABLE mangas( last_modified_at INTEGER NOT NULL DEFAULT 0, favorite_modified_at INTEGER, version INTEGER NOT NULL DEFAULT 0, - is_syncing INTEGER NOT NULL DEFAULT 0 + is_syncing INTEGER NOT NULL DEFAULT 0, + web_urls TEXT AS List ); CREATE INDEX library_favorite_index ON mangas(favorite) WHERE favorite = 1; @@ -141,8 +142,8 @@ WHERE favorite = 0 AND source IN :sourceIds; insert: -INSERT INTO mangas(source, url, artist, author, description, genre, title, status, thumbnail_url, favorite, last_update, next_update, initialized, viewer, chapter_flags, cover_last_modified, date_added, update_strategy, calculate_interval, last_modified_at, version) -VALUES (:source, :url, :artist, :author, :description, :genre, :title, :status, :thumbnailUrl, :favorite, :lastUpdate, :nextUpdate, :initialized, :viewerFlags, :chapterFlags, :coverLastModified, :dateAdded, :updateStrategy, :calculateInterval, 0, :version); +INSERT INTO mangas(source, url, artist, author, description, genre, title, status, thumbnail_url, favorite, last_update, next_update, initialized, viewer, chapter_flags, cover_last_modified, date_added, update_strategy, calculate_interval, last_modified_at, version, web_urls) +VALUES (:source, :url, :artist, :author, :description, :genre, :title, :status, :thumbnailUrl, :favorite, :lastUpdate, :nextUpdate, :initialized, :viewerFlags, :chapterFlags, :coverLastModified, :dateAdded, :updateStrategy, :calculateInterval, 0, :version, :webUrls); update: UPDATE mangas SET @@ -166,7 +167,8 @@ UPDATE mangas SET update_strategy = coalesce(:updateStrategy, update_strategy), calculate_interval = coalesce(:calculateInterval, calculate_interval), version = coalesce(:version, version), - is_syncing = coalesce(:isSyncing, is_syncing) + is_syncing = coalesce(:isSyncing, is_syncing), + web_urls = coalesce(:webUrls, web_urls) WHERE _id = :mangaId; selectLastInsertedRowId: diff --git a/data/src/main/sqldelight/tachiyomi/migrations/4.sqm b/data/src/main/sqldelight/tachiyomi/migrations/4.sqm new file mode 100644 index 0000000000..397c8b8578 --- /dev/null +++ b/data/src/main/sqldelight/tachiyomi/migrations/4.sqm @@ -0,0 +1 @@ +ALTER TABLE mangas ADD COLUMN web_urls TEXT; \ No newline at end of file diff --git a/domain/src/main/java/tachiyomi/domain/manga/model/Manga.kt b/domain/src/main/java/tachiyomi/domain/manga/model/Manga.kt index 1cfc01f803..1e36ae282b 100644 --- a/domain/src/main/java/tachiyomi/domain/manga/model/Manga.kt +++ b/domain/src/main/java/tachiyomi/domain/manga/model/Manga.kt @@ -24,6 +24,7 @@ data class Manga( val description: String?, val genre: List?, val status: Long, + val webUrls: List?, val thumbnailUrl: String?, val updateStrategy: UpdateStrategy, val initialized: Boolean, @@ -124,6 +125,7 @@ data class Manga( lastModifiedAt = 0L, favoriteModifiedAt = null, version = 0L, + webUrls = null, ) } } diff --git a/domain/src/main/java/tachiyomi/domain/manga/model/MangaUpdate.kt b/domain/src/main/java/tachiyomi/domain/manga/model/MangaUpdate.kt index 7f1cc2f87d..dc67382b53 100644 --- a/domain/src/main/java/tachiyomi/domain/manga/model/MangaUpdate.kt +++ b/domain/src/main/java/tachiyomi/domain/manga/model/MangaUpdate.kt @@ -20,6 +20,7 @@ data class MangaUpdate( val description: String? = null, val genre: List? = null, val status: Long? = null, + val webUrls: List? = null, val thumbnailUrl: String? = null, val updateStrategy: UpdateStrategy? = null, val initialized: Boolean? = null, @@ -45,6 +46,7 @@ fun Manga.toMangaUpdate(): MangaUpdate { description = description, genre = genre, status = status, + webUrls = webUrls, thumbnailUrl = thumbnailUrl, updateStrategy = updateStrategy, initialized = initialized, diff --git a/i18n/src/commonMain/resources/MR/base/strings.xml b/i18n/src/commonMain/resources/MR/base/strings.xml index bd30e2900f..0842660142 100644 --- a/i18n/src/commonMain/resources/MR/base/strings.xml +++ b/i18n/src/commonMain/resources/MR/base/strings.xml @@ -108,6 +108,7 @@ Start Resume Open in browser + Open in Mihon Show entry Copy to clipboard diff --git a/presentation-core/src/main/java/tachiyomi/presentation/core/icons/Anilist.kt b/presentation-core/src/main/java/tachiyomi/presentation/core/icons/Anilist.kt new file mode 100644 index 0000000000..2943c9dcd4 --- /dev/null +++ b/presentation-core/src/main/java/tachiyomi/presentation/core/icons/Anilist.kt @@ -0,0 +1,55 @@ +package tachiyomi.presentation.core.icons + +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.PathFillType.Companion.NonZero +import androidx.compose.ui.graphics.SolidColor +import androidx.compose.ui.graphics.StrokeCap.Companion.Butt +import androidx.compose.ui.graphics.StrokeJoin.Companion.Miter +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.graphics.vector.ImageVector.Builder +import androidx.compose.ui.graphics.vector.path +import androidx.compose.ui.unit.dp + +val CustomIcons.Anilist: ImageVector + get() { + if (_anilist != null) { + return _anilist!! + } + _anilist = Builder( + name = "Anilist", defaultWidth = 24.0.dp, defaultHeight = 24.0.dp, + viewportWidth = 24.0f, viewportHeight = 24.0f + ).apply { + path( + fill = SolidColor(Color(0xFF000000)), stroke = null, strokeLineWidth = 0.0f, + strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = 4.0f, + pathFillType = NonZero + ) { + moveTo(6.361f, 2.943f) + lineTo(0.0f, 21.056f) + horizontalLineToRelative(4.942f) + lineToRelative(1.077f, -3.133f) + lineTo(11.4f, 17.923f) + lineToRelative(1.052f, 3.133f) + lineTo(22.9f, 21.056f) + curveToRelative(0.71f, 0.0f, 1.1f, -0.392f, 1.1f, -1.101f) + lineTo(24.0f, 17.53f) + curveToRelative(0.0f, -0.71f, -0.39f, -1.101f, -1.1f, -1.101f) + horizontalLineToRelative(-6.483f) + lineTo(16.417f, 4.045f) + curveToRelative(0.0f, -0.71f, -0.392f, -1.102f, -1.101f, -1.102f) + horizontalLineToRelative(-2.422f) + curveToRelative(-0.71f, 0.0f, -1.101f, 0.392f, -1.101f, 1.102f) + verticalLineToRelative(1.064f) + lineToRelative(-0.758f, -2.166f) + close() + moveTo(8.685f, 8.891f) + lineTo(10.373f, 13.909f) + lineTo(7.144f, 13.909f) + close() + } + } + .build() + return _anilist!! + } + +private var _anilist: ImageVector? = null diff --git a/presentation-core/src/main/java/tachiyomi/presentation/core/icons/Bangumi.kt b/presentation-core/src/main/java/tachiyomi/presentation/core/icons/Bangumi.kt new file mode 100644 index 0000000000..0fc5510e29 --- /dev/null +++ b/presentation-core/src/main/java/tachiyomi/presentation/core/icons/Bangumi.kt @@ -0,0 +1,60 @@ +package tachiyomi.presentation.core.icons + +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.PathFillType.Companion.EvenOdd +import androidx.compose.ui.graphics.SolidColor +import androidx.compose.ui.graphics.StrokeCap.Companion.Butt +import androidx.compose.ui.graphics.StrokeJoin.Companion.Miter +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.graphics.vector.ImageVector.Builder +import androidx.compose.ui.graphics.vector.path +import androidx.compose.ui.unit.dp + +val CustomIcons.Bangumi: ImageVector + get() { + if (_bangumi != null) { + return _bangumi!! + } + _bangumi = Builder( + name = "Bangumi", defaultWidth = 24.0.dp, defaultHeight = 24.0.dp, + viewportWidth = 400.0f, viewportHeight = 400.0f, + ).apply { + path( + fill = SolidColor(Color(0xFF000000)), stroke = SolidColor(Color(0x00000000)), + strokeLineWidth = 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, + strokeLineMiter = 4.0f, pathFillType = EvenOdd + ) { + moveToRelative(171.562f, 42.451f) + curveToRelative(-14.318f, 4.363f, -15.599f, 6.561f, -93.776f, 160.83f) + curveToRelative(-58.257f, 114.961f, -59.368f, 118.79f, -38.726f, 133.488f) + curveToRelative(5.287f, 3.765f, 9.584f, 4.86f, 33.993f, 8.661f) + curveToRelative(20.337f, 3.168f, 146.161f, 1.97f, 173.954f, -1.656f) + curveToRelative(49.553f, -6.465f, 53.029f, -9.922f, 94.489f, -94.002f) + curveToRelative(39.009f, -79.106f, 39.545f, -80.71f, 31.995f, -95.681f) + curveToRelative(-10.852f, -21.52f, -23.614f, -24.701f, -105.702f, -26.349f) + curveToRelative(-87.154f, -1.751f, -81.589f, 1.915f, -61.103f, -40.251f) + curveToRelative(11.499f, -23.669f, 17.38f, -40.221f, 14.998f, -42.214f) + curveToRelative(-5.58f, -4.67f, -38.063f, -6.501f, -50.122f, -2.826f) + moveTo(289.281f, 175.86f) + curveToRelative(12.396f, 5.387f, 12.509f, 5.035f, -24.76f, 76.851f) + curveToRelative(-28.307f, 54.547f, -25.56f, 53.017f, -93.15f, 51.905f) + curveToRelative(-77.348f, -1.273f, -76.368f, 3.919f, -19.294f, -102.212f) + curveToRelative(15.498f, -28.819f, 20.53f, -30.564f, 86.765f, -30.092f) + curveToRelative(37.501f, 0.268f, 43.933f, 0.72f, 50.439f, 3.548f) + moveTo(-23.0f, -9.0f) + horizontalLineToRelative(20.0f) + verticalLineToRelative(20.0f) + horizontalLineToRelative(-20.0f) + close() + moveTo(407.0f, -9.0f) + horizontalLineToRelative(20.0f) + verticalLineToRelative(20.0f) + horizontalLineToRelative(-20.0f) + close() + } + } + .build() + return _bangumi!! + } + +private var _bangumi: ImageVector? = null diff --git a/presentation-core/src/main/java/tachiyomi/presentation/core/icons/Kitsu.kt b/presentation-core/src/main/java/tachiyomi/presentation/core/icons/Kitsu.kt new file mode 100644 index 0000000000..25cff576bd --- /dev/null +++ b/presentation-core/src/main/java/tachiyomi/presentation/core/icons/Kitsu.kt @@ -0,0 +1,114 @@ +package tachiyomi.presentation.core.icons + +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.PathFillType.Companion.NonZero +import androidx.compose.ui.graphics.SolidColor +import androidx.compose.ui.graphics.StrokeCap.Companion.Butt +import androidx.compose.ui.graphics.StrokeJoin.Companion.Miter +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.graphics.vector.ImageVector.Builder +import androidx.compose.ui.graphics.vector.path +import androidx.compose.ui.unit.dp + +val CustomIcons.Kitsu: ImageVector + get() { + if (_kitsu != null) { + return _kitsu!! + } + _kitsu = Builder( + name = "Kitsu", defaultWidth = 24.dp, defaultHeight = 24.dp, + viewportWidth = 24.0f, viewportHeight = 24.0f, + ).apply { + path( + fill = SolidColor(Color(0xFF000000)), stroke = null, strokeLineWidth = 0.0f, + strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = 4.0f, + pathFillType = NonZero + ) { + moveTo(1.429f, 5.441f) + arcToRelative(12.478f, 12.478f, 0.0f, false, false, 1.916f, 2.056f) + curveToRelative(0.011f, 0.011f, 0.022f, 0.011f, 0.022f, 0.022f) + curveToRelative(0.452f, 0.387f, 1.313f, 0.947f, 1.937f, 1.173f) + curveToRelative(0.0f, 0.0f, 3.886f, 1.496f, 4.091f, 1.582f) + arcToRelative(1.4f, 1.4f, 0.0f, false, false, 0.237f, 0.075f) + arcToRelative(0.694f, 0.694f, 0.0f, false, false, 0.808f, -0.549f) + curveToRelative(0.011f, -0.065f, 0.022f, -0.172f, 0.022f, -0.248f) + lineTo(10.462f, 5.161f) + curveToRelative(0.011f, -0.667f, -0.205f, -1.679f, -0.398f, -2.239f) + curveToRelative(0.0f, -0.011f, -0.011f, -0.022f, -0.011f, -0.032f) + arcTo(11.979f, 11.979f, 0.0f, false, false, 8.824f, 0.36f) + lineTo(8.781f, 0.285f) + arcToRelative(0.697f, 0.697f, 0.0f, false, false, -0.958f, -0.162f) + curveToRelative(-0.054f, 0.032f, -0.086f, 0.075f, -0.129f, 0.119f) + lineTo(7.608f, 0.36f) + arcToRelative(4.743f, 4.743f, 0.0f, false, false, -0.786f, 3.412f) + arcToRelative(8.212f, 8.212f, 0.0f, false, false, -0.775f, 0.463f) + curveToRelative(-0.043f, 0.032f, -0.42f, 0.291f, -0.71f, 0.56f) + arcTo(4.803f, 4.803f, 0.0f, false, false, 1.87f, 4.3f) + curveToRelative(-0.043f, 0.011f, -0.097f, 0.021f, -0.14f, 0.032f) + curveToRelative(-0.054f, 0.022f, -0.107f, 0.043f, -0.151f, 0.076f) + arcToRelative(0.702f, 0.702f, 0.0f, false, false, -0.193f, 0.958f) + lineToRelative(0.043f, 0.075f) + close() + moveTo(8.222f, 1.07f) + curveToRelative(0.366f, 0.614f, 0.678f, 1.249f, 0.925f, 1.917f) + curveToRelative(-0.495f, 0.086f, -0.98f, 0.215f, -1.453f, 0.388f) + arcToRelative(3.918f, 3.918f, 0.0f, false, true, 0.528f, -2.305f) + close() + moveTo(4.658f, 5.463f) + arcToRelative(7.467f, 7.467f, 0.0f, false, false, -0.893f, 1.216f) + arcToRelative(11.68f, 11.68f, 0.0f, false, true, -1.453f, -1.55f) + arcToRelative(3.825f, 3.825f, 0.0f, false, true, 2.346f, 0.334f) + close() + moveTo(17.706f, 5.161f) + arcToRelative(7.673f, 7.673f, 0.0f, false, false, -2.347f, -0.474f) + arcToRelative(7.583f, 7.583f, 0.0f, false, false, -3.811f, 0.818f) + lineToRelative(-0.215f, 0.108f) + verticalLineToRelative(3.918f) + curveToRelative(0.0f, 0.054f, 0.0f, 0.258f, -0.032f, 0.431f) + arcToRelative(1.535f, 1.535f, 0.0f, false, true, -0.646f, 0.98f) + arcToRelative(1.545f, 1.545f, 0.0f, false, true, -1.152f, 0.247f) + arcToRelative(2.618f, 2.618f, 0.0f, false, true, -0.409f, -0.118f) + arcToRelative(747.6f, 747.6f, 0.0f, false, true, -3.402f, -1.313f) + arcToRelative(8.9f, 8.9f, 0.0f, false, false, -0.323f, -0.129f) + arcToRelative(30.597f, 30.597f, 0.0f, false, false, -3.822f, 3.832f) + lineToRelative(-0.075f, 0.086f) + arcToRelative(0.698f, 0.698f, 0.0f, false, false, 0.538f, 1.098f) + arcToRelative(0.676f, 0.676f, 0.0f, false, false, 0.42f, -0.118f) + curveToRelative(0.011f, -0.011f, 0.022f, -0.022f, 0.043f, -0.032f) + curveToRelative(1.313f, -0.947f, 2.756f, -1.712f, 4.284f, -2.325f) + arcToRelative(0.7f, 0.7f, 0.0f, false, true, 0.818f, 0.13f) + arcToRelative(0.704f, 0.704f, 0.0f, false, true, 0.054f, 0.915f) + lineToRelative(-0.237f, 0.388f) + arcToRelative(20.277f, 20.277f, 0.0f, false, false, -1.97f, 4.306f) + lineToRelative(-0.032f, 0.129f) + arcToRelative(0.646f, 0.646f, 0.0f, false, false, 0.108f, 0.538f) + arcToRelative(0.713f, 0.713f, 0.0f, false, false, 0.549f, 0.301f) + arcToRelative(0.657f, 0.657f, 0.0f, false, false, 0.42f, -0.118f) + curveToRelative(0.054f, -0.043f, 0.108f, -0.086f, 0.151f, -0.14f) + lineToRelative(0.043f, -0.065f) + arcToRelative(18.95f, 18.95f, 0.0f, false, true, 1.765f, -2.153f) + arcToRelative(20.156f, 20.156f, 0.0f, false, true, 10.797f, -6.018f) + curveToRelative(0.032f, -0.011f, 0.065f, -0.011f, 0.097f, -0.011f) + curveToRelative(0.237f, 0.011f, 0.42f, 0.215f, 0.409f, 0.452f) + arcToRelative(0.424f, 0.424f, 0.0f, false, true, -0.344f, 0.398f) + curveToRelative(-3.908f, 0.829f, -10.948f, 5.469f, -8.483f, 12.208f) + curveToRelative(0.043f, 0.108f, 0.075f, 0.172f, 0.129f, 0.269f) + arcToRelative(0.71f, 0.71f, 0.0f, false, false, 0.538f, 0.301f) + arcToRelative(0.742f, 0.742f, 0.0f, false, false, 0.657f, -0.398f) + curveToRelative(0.398f, -0.754f, 1.152f, -1.593f, 3.326f, -2.497f) + curveToRelative(6.061f, -2.508f, 7.062f, -6.093f, 7.17f, -8.364f) + verticalLineToRelative(-0.129f) + arcToRelative(7.716f, 7.716f, 0.0f, false, false, -5.016f, -7.451f) + close() + moveTo(11.623f, 22.923f) + curveToRelative(-0.56f, -1.669f, -0.506f, -3.283f, 0.151f, -4.823f) + curveToRelative(1.26f, 2.035f, 3.456f, 2.207f, 3.456f, 2.207f) + curveToRelative(-2.25f, 0.937f, -3.133f, 1.863f, -3.607f, 2.616f) + close() + } + } + .build() + return _kitsu!! + } + +private var _kitsu: ImageVector? = null diff --git a/presentation-core/src/main/java/tachiyomi/presentation/core/icons/MangaUpdates.kt b/presentation-core/src/main/java/tachiyomi/presentation/core/icons/MangaUpdates.kt new file mode 100644 index 0000000000..c02a94a3c1 --- /dev/null +++ b/presentation-core/src/main/java/tachiyomi/presentation/core/icons/MangaUpdates.kt @@ -0,0 +1,191 @@ +package tachiyomi.presentation.core.icons + +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.PathFillType.Companion.EvenOdd +import androidx.compose.ui.graphics.SolidColor +import androidx.compose.ui.graphics.StrokeCap.Companion.Butt +import androidx.compose.ui.graphics.StrokeJoin.Companion.Miter +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.graphics.vector.ImageVector.Builder +import androidx.compose.ui.graphics.vector.path +import androidx.compose.ui.unit.dp + +val CustomIcons.MangaUpdates: ImageVector + get() { + if (_mangaUpdates != null) { + return _mangaUpdates!! + } + _mangaUpdates = Builder( + name = "Manga Updates", defaultWidth = 24.dp, defaultHeight = 24.0.dp, + viewportWidth = 381.0f, viewportHeight = 373.94443f, + ).apply { + path( + fill = SolidColor(Color(0xFF000000)), stroke = SolidColor(Color(0x00000000)), + strokeLineWidth = 0.0f, strokeLineCap = Butt, strokeLineJoin = Miter, + strokeLineMiter = 4.0f, pathFillType = EvenOdd + ) { + moveToRelative(277.859f, 18.375f) + curveToRelative(-0.265f, 0.43f, -1.169f, 0.781f, -2.007f, 0.781f) + curveToRelative(-8.873f, 0.0f, -20.251f, 13.114f, -28.809f, 33.203f) + curveToRelative(-0.782f, 1.834f, -3.634f, 11.632f, -4.208f, 14.454f) + curveToRelative(-0.898f, 4.413f, -3.079f, 12.994f, -3.674f, 14.453f) + curveToRelative(-0.35f, 0.859f, -0.81f, 2.441f, -1.022f, 3.515f) + curveToRelative(-0.212f, 1.074f, -1.118f, 4.678f, -2.012f, 8.008f) + curveToRelative(-4.201f, 15.635f, -4.92f, 18.346f, -5.543f, 20.899f) + curveToRelative(-0.367f, 1.503f, -1.075f, 4.14f, -1.573f, 5.859f) + curveToRelative(-0.499f, 1.719f, -1.088f, 4.271f, -1.311f, 5.671f) + curveToRelative(-0.222f, 1.401f, -0.717f, 2.74f, -1.099f, 2.976f) + curveToRelative(-0.382f, 0.236f, -0.695f, 1.443f, -0.695f, 2.681f) + curveToRelative(0.0f, 1.238f, -0.351f, 2.469f, -0.781f, 2.734f) + curveToRelative(-0.43f, 0.266f, -0.781f, 1.18f, -0.781f, 2.032f) + curveToRelative(0.0f, 0.851f, -0.719f, 3.907f, -1.598f, 6.789f) + curveToRelative(-1.812f, 5.944f, -2.667f, 9.024f, -5.47f, 19.695f) + curveToRelative(-0.507f, 1.934f, -1.202f, 4.219f, -1.543f, 5.078f) + curveToRelative(-0.34f, 0.86f, -1.055f, 3.32f, -1.588f, 5.469f) + curveToRelative(-0.533f, 2.148f, -1.269f, 4.24f, -1.635f, 4.648f) + curveToRelative(-0.367f, 0.409f, -0.666f, 1.38f, -0.666f, 2.159f) + curveToRelative(0.0f, 0.78f, -0.318f, 2.028f, -0.705f, 2.774f) + curveToRelative(-0.388f, 0.746f, -1.132f, 2.938f, -1.653f, 4.872f) + curveToRelative(-1.053f, 3.903f, -2.166f, 7.398f, -3.111f, 9.766f) + curveToRelative(-0.343f, 0.859f, -1.046f, 2.793f, -1.562f, 4.297f) + curveToRelative(-0.991f, 2.885f, -1.159f, 3.335f, -3.802f, 10.171f) + curveToRelative(-0.917f, 2.371f, -1.667f, 4.573f, -1.667f, 4.891f) + curveToRelative(0.0f, 0.319f, -0.663f, 2.07f, -1.473f, 3.891f) + curveToRelative(-0.81f, 1.822f, -2.291f, 5.422f, -3.291f, 8.0f) + curveToRelative(-4.157f, 10.711f, -4.783f, 11.224f, -6.321f, 5.181f) + curveToRelative(-0.397f, -1.561f, -1.08f, -4.068f, -1.518f, -5.572f) + curveToRelative(-0.438f, -1.504f, -1.102f, -4.141f, -1.476f, -5.859f) + curveToRelative(-0.374f, -1.719f, -1.07f, -4.707f, -1.546f, -6.641f) + curveToRelative(-0.477f, -1.934f, -1.18f, -4.922f, -1.563f, -6.641f) + curveToRelative(-0.382f, -1.718f, -1.068f, -4.707f, -1.524f, -6.64f) + curveToRelative(-1.708f, -7.246f, -3.402f, -15.866f, -4.684f, -23.828f) + curveToRelative(-0.415f, -2.578f, -1.144f, -6.973f, -1.621f, -9.766f) + curveToRelative(-0.477f, -2.793f, -1.172f, -7.363f, -1.544f, -10.156f) + curveToRelative(-0.373f, -2.793f, -1.076f, -8.067f, -1.563f, -11.719f) + curveToRelative(-3.441f, -25.836f, -5.037f, -66.225f, -3.528f, -89.33f) + curveToRelative(1.001f, -15.327f, -3.799f, -23.717f, -17.01f, -29.735f) + curveToRelative(-7.191f, -3.276f, -25.321f, -5.034f, -29.279f, -2.839f) + curveToRelative(-0.746f, 0.414f, -2.762f, 1.423f, -4.481f, 2.242f) + curveToRelative(-6.504f, 3.1f, -7.995f, 4.103f, -12.201f, 8.21f) + curveToRelative(-7.255f, 7.083f, -12.793f, 16.694f, -15.378f, 26.686f) + curveToRelative(-1.884f, 7.287f, -2.43f, 9.622f, -3.289f, 14.063f) + curveToRelative(-0.498f, 2.578f, -1.07f, 5.391f, -1.27f, 6.25f) + curveToRelative(-0.201f, 0.859f, -0.726f, 3.848f, -1.168f, 6.641f) + curveToRelative(-0.442f, 2.792f, -1.099f, 6.835f, -1.46f, 8.984f) + curveToRelative(-0.361f, 2.148f, -1.035f, 6.191f, -1.497f, 8.984f) + curveToRelative(-0.79f, 4.779f, -1.409f, 7.903f, -3.131f, 15.821f) + curveToRelative(-0.686f, 3.153f, -1.484f, 6.134f, -3.293f, 12.304f) + curveToRelative(-0.44f, 1.504f, -0.988f, 3.706f, -1.218f, 4.893f) + curveToRelative(-0.229f, 1.187f, -0.727f, 2.35f, -1.107f, 2.585f) + curveToRelative(-0.38f, 0.235f, -0.691f, 1.215f, -0.691f, 2.178f) + curveToRelative(0.0f, 0.963f, -0.291f, 2.084f, -0.646f, 2.493f) + curveToRelative(-0.355f, 0.408f, -1.098f, 2.324f, -1.651f, 4.258f) + curveToRelative(-0.554f, 1.933f, -1.28f, 4.218f, -1.613f, 5.078f) + curveToRelative(-0.334f, 0.859f, -1.152f, 3.32f, -1.819f, 5.468f) + curveToRelative(-1.417f, 4.574f, -6.577f, 19.609f, -7.506f, 21.875f) + curveToRelative(-0.352f, 0.86f, -1.78f, 5.254f, -3.171f, 9.766f) + curveToRelative(-1.392f, 4.512f, -2.817f, 8.906f, -3.167f, 9.766f) + curveToRelative(-0.35f, 0.859f, -1.004f, 2.793f, -1.452f, 4.297f) + curveToRelative(-0.449f, 1.503f, -1.48f, 4.843f, -2.291f, 7.421f) + curveToRelative(-0.811f, 2.579f, -1.935f, 6.27f, -2.497f, 8.204f) + curveToRelative(-0.562f, 1.933f, -1.312f, 3.849f, -1.667f, 4.257f) + curveToRelative(-0.355f, 0.409f, -0.645f, 1.71f, -0.645f, 2.893f) + curveToRelative(0.0f, 1.183f, -0.315f, 2.959f, -0.7f, 3.946f) + curveToRelative(-0.385f, 0.987f, -1.088f, 3.288f, -1.563f, 5.114f) + curveToRelative(-1.991f, 7.667f, -2.638f, 10.065f, -3.213f, 11.915f) + curveToRelative(-0.334f, 1.074f, -1.022f, 4.062f, -1.53f, 6.64f) + curveToRelative(-0.508f, 2.578f, -1.221f, 5.918f, -1.586f, 7.422f) + curveToRelative(-4.571f, 18.867f, -4.575f, 47.925f, -0.009f, 59.766f) + curveToRelative(9.6f, 24.888f, 40.718f, 31.115f, 54.659f, 10.937f) + curveToRelative(2.442f, -3.534f, 5.504f, -11.626f, 5.504f, -14.544f) + curveToRelative(0.0f, -1.067f, 0.314f, -2.274f, 0.697f, -2.682f) + curveToRelative(0.899f, -0.959f, 1.538f, -7.556f, 2.415f, -24.961f) + curveToRelative(1.066f, -21.154f, 2.992f, -34.13f, 7.826f, -52.735f) + curveToRelative(0.391f, -1.504f, 0.945f, -3.706f, 1.23f, -4.894f) + curveToRelative(0.285f, -1.188f, 0.828f, -2.351f, 1.207f, -2.585f) + curveToRelative(0.378f, -0.234f, 0.688f, -1.113f, 0.688f, -1.952f) + curveToRelative(0.0f, -0.84f, 0.32f, -2.138f, 0.711f, -2.884f) + curveToRelative(1.079f, -2.06f, 3.976f, -9.676f, 3.976f, -10.454f) + curveToRelative(0.0f, -0.377f, 0.745f, -2.351f, 1.655f, -4.388f) + curveToRelative(1.566f, -3.505f, 3.349f, -7.658f, 5.07f, -11.811f) + curveToRelative(0.83f, -2.001f, 1.103f, -1.386f, 3.602f, 8.109f) + curveToRelative(0.821f, 3.122f, 1.876f, 6.864f, 2.973f, 10.547f) + curveToRelative(0.32f, 1.074f, 1.014f, 3.535f, 1.542f, 5.469f) + curveToRelative(0.529f, 1.933f, 1.233f, 4.218f, 1.564f, 5.078f) + curveToRelative(0.332f, 0.859f, 1.043f, 3.144f, 1.58f, 5.078f) + curveToRelative(1.809f, 6.518f, 2.541f, 8.977f, 3.137f, 10.547f) + curveToRelative(1.024f, 2.691f, 2.103f, 6.132f, 2.941f, 9.375f) + curveToRelative(1.561f, 6.043f, 2.686f, 10.175f, 3.296f, 12.109f) + curveToRelative(0.339f, 1.074f, 1.023f, 3.711f, 1.521f, 5.859f) + curveToRelative(1.312f, 5.663f, 2.374f, 9.822f, 3.203f, 12.556f) + curveToRelative(0.401f, 1.319f, 0.729f, 3.149f, 0.729f, 4.065f) + curveToRelative(0.0f, 0.916f, 0.315f, 2.473f, 0.7f, 3.46f) + curveToRelative(0.385f, 0.987f, 1.115f, 4.255f, 1.621f, 7.263f) + curveToRelative(0.507f, 3.008f, 1.206f, 6.348f, 1.553f, 7.422f) + curveToRelative(0.348f, 1.074f, 1.066f, 3.535f, 1.595f, 5.469f) + curveToRelative(4.333f, 15.813f, 16.073f, 32.694f, 22.805f, 32.793f) + curveToRelative(0.727f, 0.011f, 1.538f, 0.371f, 1.804f, 0.801f) + curveToRelative(0.632f, 1.023f, 18.616f, 1.023f, 22.015f, 0.0f) + curveToRelative(1.427f, -0.43f, 3.913f, -1.181f, 5.524f, -1.668f) + curveToRelative(7.96f, -2.408f, 16.014f, -8.263f, 18.375f, -13.358f) + curveToRelative(3.84f, -8.287f, 5.258f, -11.707f, 5.258f, -12.686f) + curveToRelative(0.0f, -0.606f, 0.351f, -1.32f, 0.781f, -1.585f) + curveToRelative(0.43f, -0.266f, 0.781f, -1.166f, 0.781f, -2.0f) + curveToRelative(0.0f, -0.834f, 0.352f, -1.516f, 0.782f, -1.516f) + curveToRelative(0.429f, 0.0f, 0.781f, -0.59f, 0.781f, -1.312f) + curveToRelative(0.0f, -0.721f, 0.333f, -2.391f, 0.739f, -3.711f) + curveToRelative(0.643f, -2.085f, 2.449f, -9.125f, 4.724f, -18.414f) + curveToRelative(0.369f, -1.504f, 1.1f, -4.844f, 1.626f, -7.422f) + curveToRelative(0.526f, -2.578f, 1.471f, -6.621f, 2.099f, -8.985f) + curveToRelative(0.629f, -2.363f, 1.32f, -5.268f, 1.536f, -6.455f) + curveToRelative(0.217f, -1.187f, 0.704f, -2.35f, 1.085f, -2.585f) + curveToRelative(0.38f, -0.235f, 0.691f, -1.44f, 0.691f, -2.678f) + curveToRelative(0.0f, -1.239f, 0.351f, -2.469f, 0.781f, -2.735f) + curveToRelative(0.43f, -0.265f, 0.781f, -1.458f, 0.781f, -2.65f) + curveToRelative(0.0f, -1.192f, 0.241f, -2.409f, 0.536f, -2.703f) + curveToRelative(0.778f, -0.779f, 2.564f, -6.135f, 2.577f, -7.733f) + curveToRelative(0.007f, -0.752f, 0.364f, -1.367f, 0.794f, -1.367f) + curveToRelative(0.429f, 0.0f, 0.78f, -0.615f, 0.778f, -1.367f) + curveToRelative(-0.002f, -1.078f, 4.865f, -14.091f, 10.155f, -27.149f) + curveToRelative(0.348f, -0.859f, 1.398f, -3.671f, 2.334f, -6.25f) + curveToRelative(0.936f, -2.578f, 2.025f, -5.298f, 2.42f, -6.044f) + curveToRelative(0.395f, -0.746f, 0.719f, -1.893f, 0.719f, -2.549f) + curveToRelative(0.0f, -0.657f, 0.321f, -1.804f, 0.714f, -2.55f) + curveToRelative(0.598f, -1.136f, 3.544f, -10.424f, 6.378f, -20.107f) + curveToRelative(0.377f, -1.289f, 1.397f, -4.476f, 2.266f, -7.083f) + curveToRelative(0.868f, -2.607f, 1.579f, -5.331f, 1.579f, -6.055f) + curveToRelative(0.0f, -2.522f, 1.402f, -1.292f, 1.841f, 1.615f) + curveToRelative(0.243f, 1.611f, 0.779f, 4.863f, 1.191f, 7.227f) + curveToRelative(2.794f, 16.016f, 3.671f, 25.795f, 4.797f, 53.515f) + curveToRelative(1.991f, 49.001f, 2.344f, 54.414f, 4.617f, 70.703f) + curveToRelative(3.078f, 22.06f, 9.152f, 34.215f, 19.581f, 39.185f) + curveToRelative(7.133f, 3.4f, 22.653f, 2.187f, 28.707f, -2.243f) + curveToRelative(19.432f, -14.221f, 22.04f, -46.372f, 9.553f, -117.801f) + curveToRelative(-0.928f, -5.305f, -2.158f, -11.739f, -3.099f, -16.211f) + curveToRelative(-0.43f, -2.041f, -1.095f, -5.205f, -1.478f, -7.031f) + curveToRelative(-0.383f, -1.826f, -1.467f, -6.836f, -2.41f, -11.133f) + curveToRelative(-2.246f, -10.242f, -3.806f, -18.367f, -5.549f, -28.906f) + curveToRelative(-0.426f, -2.578f, -1.109f, -6.621f, -1.518f, -8.985f) + curveToRelative(-4.499f, -26.011f, -6.585f, -64.411f, -5.088f, -93.612f) + curveToRelative(0.44f, -8.575f, 0.365f, -12.222f, -0.265f, -12.852f) + curveToRelative(-0.484f, -0.484f, -0.88f, -1.356f, -0.88f, -1.938f) + curveToRelative(0.0f, -4.124f, -8.955f, -13.084f, -16.411f, -16.419f) + curveToRelative(-3.292f, -1.472f, -4.933f, -1.938f, -14.208f, -4.037f) + curveToRelative(-4.641f, -1.05f, -16.788f, -1.083f, -17.428f, -0.048f) + moveTo(-28.0f, -16.0f) + horizontalLineToRelative(20.0f) + verticalLineToRelative(20.0f) + horizontalLineToRelative(-20.0f) + close() + moveTo(402.0f, -16.0f) + horizontalLineToRelative(20.0f) + verticalLineToRelative(20.0f) + horizontalLineToRelative(-20.0f) + close() + } + } + .build() + return _mangaUpdates!! + } + +private var _mangaUpdates: ImageVector? = null diff --git a/presentation-core/src/main/java/tachiyomi/presentation/core/icons/MyAnimeList.kt b/presentation-core/src/main/java/tachiyomi/presentation/core/icons/MyAnimeList.kt new file mode 100644 index 0000000000..237dda5a75 --- /dev/null +++ b/presentation-core/src/main/java/tachiyomi/presentation/core/icons/MyAnimeList.kt @@ -0,0 +1,79 @@ +package tachiyomi.presentation.core.icons + +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.PathFillType.Companion.NonZero +import androidx.compose.ui.graphics.SolidColor +import androidx.compose.ui.graphics.StrokeCap.Companion.Butt +import androidx.compose.ui.graphics.StrokeJoin.Companion.Miter +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.graphics.vector.ImageVector.Builder +import androidx.compose.ui.graphics.vector.path +import androidx.compose.ui.unit.dp + +val CustomIcons.MyAnimeList: ImageVector + get() { + if (_myAnimeList != null) { + return _myAnimeList!! + } + _myAnimeList = Builder( + name = "MyAnimeList", defaultWidth = 24.0.dp, defaultHeight = 24.0.dp, + viewportWidth = 24.0f, viewportHeight = 24.0f, + ).apply { + path( + fill = SolidColor(Color(0xFF000000)), stroke = null, strokeLineWidth = 0.0f, + strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = 4.0f, + pathFillType = NonZero + ) { + moveTo(8.273f, 7.247f) + verticalLineToRelative(8.423f) + lineToRelative(-2.103f, -0.003f) + verticalLineToRelative(-5.216f) + lineToRelative(-2.03f, 2.404f) + lineToRelative(-1.989f, -2.458f) + lineToRelative(-0.02f, 5.285f) + lineTo(0.001f, 15.682f) + lineTo(0.0f, 7.247f) + horizontalLineToRelative(2.203f) + lineToRelative(1.865f, 2.545f) + lineToRelative(2.015f, -2.546f) + lineToRelative(2.19f, 0.001f) + close() + moveTo(16.901f, 9.316f) + lineToRelative(0.025f, 6.335f) + horizontalLineToRelative(-2.365f) + lineToRelative(-0.008f, -2.871f) + horizontalLineToRelative(-2.8f) + curveToRelative(0.07f, 0.499f, 0.21f, 1.266f, 0.417f, 1.779f) + curveToRelative(0.155f, 0.381f, 0.298f, 0.751f, 0.583f, 1.128f) + lineToRelative(-1.705f, 1.125f) + curveToRelative(-0.349f, -0.636f, -0.622f, -1.337f, -0.878f, -2.082f) + arcToRelative(9.296f, 9.296f, 0.0f, false, true, -0.507f, -2.179f) + curveToRelative(-0.085f, -0.75f, -0.097f, -1.471f, 0.107f, -2.212f) + arcToRelative(3.908f, 3.908f, 0.0f, false, true, 1.161f, -1.866f) + curveToRelative(0.313f, -0.293f, 0.749f, -0.5f, 1.1f, -0.687f) + curveToRelative(0.351f, -0.187f, 0.743f, -0.264f, 1.107f, -0.359f) + arcToRelative(7.405f, 7.405f, 0.0f, false, true, 1.191f, -0.183f) + curveToRelative(0.398f, -0.034f, 1.107f, -0.066f, 2.39f, -0.028f) + lineToRelative(0.545f, 1.749f) + lineTo(14.51f, 8.965f) + curveToRelative(-0.593f, 0.008f, -0.878f, 0.001f, -1.341f, 0.209f) + arcToRelative(2.236f, 2.236f, 0.0f, false, false, -1.278f, 1.92f) + lineToRelative(2.663f, 0.033f) + lineToRelative(0.038f, -1.81f) + horizontalLineToRelative(2.309f) + close() + moveTo(20.893f, 7.217f) + verticalLineToRelative(6.627f) + lineToRelative(3.107f, 0.032f) + lineToRelative(-0.43f, 1.775f) + horizontalLineToRelative(-4.807f) + lineTo(18.763f, 7.187f) + lineToRelative(2.13f, 0.03f) + close() + } + } + .build() + return _myAnimeList!! + } + +private var _myAnimeList: ImageVector? = null diff --git a/presentation-core/src/main/java/tachiyomi/presentation/core/icons/MyanimelistStretched.kt b/presentation-core/src/main/java/tachiyomi/presentation/core/icons/MyanimelistStretched.kt new file mode 100644 index 0000000000..63617e93da --- /dev/null +++ b/presentation-core/src/main/java/tachiyomi/presentation/core/icons/MyanimelistStretched.kt @@ -0,0 +1,77 @@ +package tachiyomi.presentation.core.icons + +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.PathFillType.Companion.NonZero +import androidx.compose.ui.graphics.SolidColor +import androidx.compose.ui.graphics.StrokeCap.Companion.Butt +import androidx.compose.ui.graphics.StrokeJoin.Companion.Miter +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.graphics.vector.ImageVector.Builder +import androidx.compose.ui.graphics.vector.path +import androidx.compose.ui.unit.dp + +public val CustomIcons.MyAnimeListStretched: ImageVector + get() { + if (_myAnimeListStretched != null) { + return _myAnimeListStretched!! + } + _myAnimeListStretched = Builder( + name = "MyAnimeList Stretched", defaultWidth = 24.0.dp, defaultHeight = 18.716352.dp, + viewportWidth = 24.0f, viewportHeight = 18.716352f, + ).apply { + path( + fill = SolidColor(Color(0xFF000000)), stroke = null, strokeLineWidth = 1.39446f, + strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = 4.0f, + pathFillType = NonZero + ) { + moveTo(8.273f, 0.1167f) + lineTo(8.273f, 16.4957f) + lineTo(6.17f, 16.4898f) + lineTo(6.17f, 6.347f) + lineTo(4.14f, 11.0217f) + lineTo(2.151f, 6.242f) + lineTo(2.131f, 16.519f) + lineTo(0.001f, 16.519f) + lineTo(0.0f, 0.1167f) + lineTo(2.203f, 0.1167f) + lineTo(4.068f, 5.0656f) + lineTo(6.083f, 0.1147f) + close() + moveTo(16.901f, 4.14f) + lineTo(16.926f, 16.4587f) + horizontalLineToRelative(-2.365f) + lineToRelative(-0.008f, -5.5828f) + horizontalLineToRelative(-2.8f) + curveToRelative(0.07f, 0.9703f, 0.21f, 2.4618f, 0.417f, 3.4594f) + curveToRelative(0.155f, 0.7409f, 0.298f, 1.4604f, 0.583f, 2.1935f) + lineToRelative(-1.705f, 2.1876f) + curveTo(10.699f, 17.4796f, 10.426f, 16.1165f, 10.17f, 14.6678f) + arcTo(9.296f, 18.0766f, 0.0f, false, true, 9.663f, 10.4306f) + curveTo(9.578f, 8.9722f, 9.566f, 7.5702f, 9.77f, 6.1292f) + arcTo(3.908f, 7.5993f, 0.0f, false, true, 10.931f, 2.5007f) + curveToRelative(0.313f, -0.5698f, 0.749f, -0.9723f, 1.1f, -1.3359f) + curveToRelative(0.351f, -0.3636f, 0.743f, -0.5134f, 1.107f, -0.6981f) + arcToRelative(7.405f, 14.3994f, 0.0f, false, true, 1.191f, -0.3559f) + curveToRelative(0.398f, -0.0661f, 1.107f, -0.1283f, 2.39f, -0.0544f) + lineTo(17.264f, 3.4574f) + lineTo(14.51f, 3.4574f) + curveToRelative(-0.593f, 0.0156f, -0.878f, 0.002f, -1.341f, 0.4064f) + arcToRelative(2.236f, 4.348f, 0.0f, false, false, -1.278f, 3.7335f) + lineToRelative(2.663f, 0.0642f) + lineToRelative(0.038f, -3.5196f) + horizontalLineToRelative(2.309f) + close() + moveTo(20.893f, 0.0583f) + lineTo(20.893f, 12.9449f) + lineTo(24.0f, 13.0071f) + lineTo(23.57f, 16.4587f) + lineTo(18.763f, 16.4587f) + lineTo(18.763f, -0.0f) + close() + } + } + .build() + return _myAnimeListStretched!! + } + +private var _myAnimeListStretched: ImageVector? = null diff --git a/presentation-core/src/main/java/tachiyomi/presentation/core/icons/Shikimori.kt b/presentation-core/src/main/java/tachiyomi/presentation/core/icons/Shikimori.kt new file mode 100644 index 0000000000..2a5221b6b6 --- /dev/null +++ b/presentation-core/src/main/java/tachiyomi/presentation/core/icons/Shikimori.kt @@ -0,0 +1,468 @@ +package tachiyomi.presentation.core.icons + +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.PathFillType.Companion.NonZero +import androidx.compose.ui.graphics.SolidColor +import androidx.compose.ui.graphics.StrokeCap.Companion.Butt +import androidx.compose.ui.graphics.StrokeJoin.Companion.Miter +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.graphics.vector.ImageVector.Builder +import androidx.compose.ui.graphics.vector.path +import androidx.compose.ui.unit.dp + +val CustomIcons.Shikimori: ImageVector + get() { + if (_shikimori != null) { + return _shikimori!! + } + _shikimori = Builder( + name = "Shikimori", defaultWidth = 24.0.dp, defaultHeight = 24.0.dp, + viewportWidth = 24.0f, viewportHeight = 24.0f, + ).apply { + path( + fill = SolidColor(Color(0xFF000000)), stroke = null, strokeLineWidth = 0.0f, + strokeLineCap = Butt, strokeLineJoin = Miter, strokeLineMiter = 4.0f, + pathFillType = NonZero + ) { + moveTo(2.8025f, 0.0025f) + curveTo(2.7779f, 0.03f, 2.8332f, 0.1223f, 2.9834f, 0.3f) + curveToRelative(0.0981f, 0.1134f, 0.1594f, 0.2328f, 0.233f, 0.4444f) + curveToRelative(0.0551f, 0.1594f, 0.1198f, 0.3157f, 0.1443f, 0.3464f) + curveToRelative(0.0368f, 0.049f, 0.0396f, 0.037f, 0.0427f, -0.1102f) + lineTo(3.4034f, 0.8181f) + lineToRelative(0.218f, 0.3004f) + curveToRelative(0.331f, 0.4568f, 0.5365f, 0.6992f, 0.6744f, 0.7973f) + curveToRelative(0.0706f, 0.046f, 0.1136f, 0.0919f, 0.0952f, 0.098f) + curveToRelative(-0.049f, 0.0153f, -0.4785f, -0.2208f, -0.6778f, -0.374f) + curveToRelative(-0.1012f, -0.0767f, -0.196f, -0.1411f, -0.2114f, -0.1411f) + curveToRelative(-0.0153f, 0.0f, -0.0644f, -0.0461f, -0.1073f, -0.1013f) + curveToRelative(-0.0399f, -0.0552f, -0.1348f, -0.1408f, -0.2053f, -0.1898f) + curveToRelative(-0.1717f, -0.1196f, -0.3527f, -0.2913f, -0.3957f, -0.374f) + curveTo(2.763f, 0.7721f, 2.668f, 0.7323f, 2.668f, 0.7814f) + curveToRelative(0.0f, 0.049f, 0.245f, 0.377f, 0.435f, 0.5793f) + curveToRelative(0.5825f, 0.6224f, 1.1776f, 0.932f, 2.7688f, 1.4287f) + curveToRelative(0.3373f, 0.1043f, 0.6347f, 0.2085f, 0.6623f, 0.233f) + curveToRelative(0.0246f, 0.0215f, 0.0737f, 0.0398f, 0.1074f, 0.0398f) + curveToRelative(0.0306f, 0.0f, 0.0795f, 0.0152f, 0.104f, 0.0305f) + curveToRelative(0.0399f, 0.0245f, 0.0367f, 0.031f, -0.0093f, 0.031f) + curveToRelative(-0.0368f, 0.0f, -0.0521f, 0.018f, -0.046f, 0.0548f) + curveToRelative(0.0092f, 0.0552f, 0.1595f, 0.1045f, 0.4477f, 0.1444f) + curveToRelative(0.1287f, 0.0184f, 0.1593f, 0.0124f, 0.1593f, -0.0244f) + curveToRelative(0.0f, -0.049f, -0.0889f, -0.083f, -0.2207f, -0.083f) + curveToRelative(-0.049f, 0.0f, -0.0858f, -0.0151f, -0.0858f, -0.0304f) + curveToRelative(0.0f, -0.0184f, 0.031f, -0.025f, 0.0708f, -0.0188f) + curveToRelative(0.0368f, 0.0092f, 0.1652f, 0.0306f, 0.2817f, 0.052f) + curveToRelative(0.276f, 0.046f, 0.353f, 0.0768f, 0.353f, 0.135f) + curveToRelative(0.0f, 0.0644f, 0.0826f, 0.092f, 0.1377f, 0.046f) + curveToRelative(0.0307f, -0.0276f, 0.046f, -0.0274f, 0.046f, -0.0028f) + curveToRelative(0.0f, 0.0183f, 0.0151f, 0.0337f, 0.0304f, 0.0337f) + curveToRelative(0.0184f, 0.0f, 0.031f, -0.0214f, 0.031f, -0.046f) + curveToRelative(0.0f, -0.0582f, -0.0309f, -0.0586f, 0.4842f, 0.0212f) + curveToRelative(0.3066f, 0.046f, 0.42f, 0.077f, 0.374f, 0.0923f) + curveToRelative(-0.098f, 0.0368f, -0.0428f, 0.0858f, 0.0952f, 0.0858f) + curveToRelative(0.0705f, 0.0f, 0.1195f, 0.0153f, 0.1195f, 0.0337f) + curveToRelative(0.0f, 0.0276f, 0.0704f, 0.0306f, 0.2452f, 0.0183f) + curveToRelative(0.1594f, -0.0123f, 0.2516f, -0.0093f, 0.2639f, 0.0122f) + curveToRelative(0.0122f, 0.0184f, 0.0643f, 0.0275f, 0.1195f, 0.0183f) + curveToRelative(0.0521f, -0.0092f, 0.1961f, 0.0034f, 0.3126f, 0.0248f) + curveToRelative(0.3066f, 0.0583f, 1.1313f, 0.1044f, 2.977f, 0.1688f) + curveToRelative(2.983f, 0.1042f, 5.157f, 0.3277f, 5.9726f, 0.6159f) + curveToRelative(0.3617f, 0.1287f, 0.9075f, 0.4048f, 1.0087f, 0.509f) + curveToRelative(0.1594f, 0.1686f, 0.2082f, 0.3066f, 0.1898f, 0.5334f) + curveToRelative(-0.0092f, 0.1135f, -0.0092f, 0.2149f, 0.0f, 0.2241f) + curveToRelative(0.089f, 0.089f, 0.2855f, -0.0859f, 0.2855f, -0.2545f) + curveToRelative(0.0f, -0.0338f, 0.0639f, -0.1165f, 0.1467f, -0.187f) + curveToRelative(0.331f, -0.2913f, 0.3803f, -0.454f, 0.3436f, -1.1194f) + curveToRelative(-0.0246f, -0.4476f, -0.031f, -0.4782f, -0.2302f, -1.1343f) + curveToRelative(-0.2606f, -0.8585f, -0.3215f, -0.9903f, -0.6342f, -1.3214f) + curveToRelative(-0.3679f, -0.3863f, -0.7023f, -0.6072f, -1.1592f, -0.7635f) + curveToRelative(-0.1103f, -0.0368f, -0.3434f, -0.1224f, -0.5212f, -0.1899f) + curveToRelative(-0.2483f, -0.098f, -0.4262f, -0.141f, -0.788f, -0.1931f) + curveToRelative(-0.512f, -0.0736f, -1.6126f, -0.1256f, -1.956f, -0.0919f) + curveToRelative(-0.1226f, 0.0123f, -0.6132f, 0.0f, -1.1498f, -0.0337f) + curveToRelative(-0.61f, -0.0337f, -0.984f, -0.046f, -1.0729f, -0.0277f) + curveToRelative(-0.0766f, 0.0154f, -0.2085f, 0.0274f, -0.2944f, 0.0305f) + curveToRelative(-0.1257f, 0.0f, -0.1837f, 0.0187f, -0.291f, 0.0984f) + curveToRelative(-0.1257f, 0.092f, -0.2149f, 0.1194f, -0.5644f, 0.1777f) + curveToRelative(-0.5641f, 0.092f, -0.929f, 0.1653f, -1.0823f, 0.2175f) + curveToRelative(-0.1196f, 0.0429f, -0.3157f, 0.0706f, -0.6192f, 0.089f) + curveToRelative(-0.8309f, 0.0521f, -1.3029f, 0.0952f, -1.4071f, 0.129f) + curveToRelative(-0.0706f, 0.0214f, -0.3406f, 0.0274f, -0.7913f, 0.0182f) + curveToRelative(-0.5488f, -0.0123f, -0.6895f, -0.006f, -0.7171f, 0.0277f) + curveToRelative(-0.0276f, 0.0306f, -0.0155f, 0.0398f, 0.0581f, 0.0398f) + curveToRelative(0.1809f, 0.0f, 1.7968f, 0.1258f, 1.8121f, 0.141f) + curveToRelative(0.0154f, 0.0154f, -0.273f, 0.003f, -1.0977f, -0.0491f) + curveToRelative(-0.2423f, -0.0154f, -0.4567f, -0.0186f, -0.472f, -0.0094f) + curveToRelative(-0.0583f, 0.0368f, -0.4939f, 0.0307f, -0.9108f, -0.0122f) + curveToRelative(-0.515f, -0.0521f, -1.0115f, -0.138f, -1.4714f, -0.2545f) + curveToRelative(-0.2146f, -0.0521f, -0.4662f, -0.0916f, -0.644f, -0.1008f) + curveToRelative(-0.328f, -0.0153f, -0.6778f, -0.129f, -1.1714f, -0.3773f) + curveToRelative(-0.325f, -0.1625f, -0.3614f, -0.1684f, -0.3614f, -0.0366f) + verticalLineToRelative(0.1008f) + lineTo(3.244f, 0.5331f) + curveToRelative(-0.0552f, -0.0644f, -0.1224f, -0.1689f, -0.15f, -0.2302f) + curveToRelative(-0.0552f, -0.1165f, -0.2609f, -0.328f, -0.2915f, -0.3004f) + close() + moveTo(3.2609f, 3.1912f) + curveToRelative(-0.5697f, 0.0269f, -1.0938f, 0.4707f, -1.47f, 1.2628f) + curveToRelative(-0.2238f, 0.4752f, -0.2635f, 0.6593f, -0.2789f, 1.291f) + curveToRelative(-0.0122f, 0.4966f, -0.0063f, 0.598f, 0.0642f, 1.0119f) + curveToRelative(0.1503f, 0.8615f, 0.19f, 0.9625f, 0.5058f, 1.2721f) + curveToRelative(0.3342f, 0.3312f, 1.1654f, 0.785f, 1.6284f, 0.8892f) + curveToRelative(0.1594f, 0.0338f, 0.3464f, 0.0768f, 0.4139f, 0.0952f) + curveToRelative(0.2575f, 0.0644f, 0.61f, 0.0885f, 1.4868f, 0.1008f) + curveToRelative(0.8431f, 0.0153f, 0.9136f, 0.0125f, 1.027f, -0.0427f) + curveToRelative(0.0797f, -0.0398f, 0.2486f, -0.0707f, 0.4908f, -0.089f) + curveToRelative(0.2023f, -0.0184f, 0.4165f, -0.0459f, 0.4748f, -0.0643f) + curveToRelative(0.0582f, -0.0153f, 0.1841f, -0.0309f, 0.276f, -0.0309f) + curveToRelative(0.0951f, 0.0f, 0.1903f, -0.0182f, 0.2087f, -0.0366f) + curveToRelative(0.0735f, -0.0735f, 0.4228f, -0.1503f, 0.757f, -0.1687f) + curveToRelative(0.187f, -0.0092f, 0.3621f, -0.0273f, 0.3928f, -0.0427f) + curveToRelative(0.1011f, -0.0551f, 0.052f, -0.0859f, -0.1135f, -0.0675f) + curveToRelative(-0.095f, 0.0092f, -0.187f, 0.003f, -0.2207f, -0.0154f) + curveToRelative(-0.0491f, -0.0307f, -0.034f, -0.0335f, 0.0825f, -0.0366f) + curveToRelative(0.0766f, 0.0f, 0.2269f, -0.0093f, 0.3342f, -0.0216f) + curveToRelative(0.1655f, -0.0153f, 0.1842f, -0.0248f, 0.1382f, -0.0585f) + curveToRelative(-0.1134f, -0.0828f, -0.0153f, -0.1041f, 0.4936f, -0.1041f) + curveToRelative(0.4568f, 0.0f, 0.5886f, -0.0215f, 0.4537f, -0.0736f) + curveToRelative(-0.0275f, -0.0092f, -0.1413f, -0.0216f, -0.2517f, -0.0216f) + curveToRelative(-0.1134f, -0.003f, -0.1624f, -0.0119f, -0.1134f, -0.015f) + curveToRelative(0.0521f, -0.006f, 0.1628f, -0.0277f, 0.2517f, -0.043f) + curveToRelative(0.0859f, -0.0185f, 0.6255f, -0.0399f, 1.1958f, -0.046f) + curveToRelative(0.5702f, -0.0061f, 1.0542f, -0.0124f, 1.0757f, -0.0155f) + curveToRelative(0.0276f, 0.0f, 0.0338f, -0.0215f, 0.0216f, -0.0614f) + curveToRelative(-0.0123f, -0.043f, -0.0061f, -0.061f, 0.0276f, -0.061f) + curveToRelative(0.0245f, 0.0f, 0.083f, -0.049f, 0.129f, -0.1073f) + curveToRelative(0.0919f, -0.1195f, 0.1161f, -0.1137f, 0.156f, 0.0427f) + lineToRelative(0.0277f, 0.1012f) + lineToRelative(0.2207f, 0.0094f) + curveToRelative(0.1748f, 0.0061f, 0.2333f, -0.003f, 0.2916f, -0.046f) + curveToRelative(0.0398f, -0.0306f, 0.1224f, -0.0645f, 0.1837f, -0.0768f) + lineToRelative(0.1135f, -0.0216f) + lineToRelative(-0.0183f, 0.1782f) + curveToRelative(-0.0184f, 0.144f, -0.0152f, 0.1716f, 0.0215f, 0.1593f) + curveToRelative(0.0246f, -0.0092f, 0.1222f, -0.0338f, 0.2203f, -0.0553f) + lineToRelative(0.1749f, -0.0337f) + lineToRelative(-0.0675f, -0.089f) + curveToRelative(-0.043f, -0.0491f, -0.1226f, -0.098f, -0.1931f, -0.1163f) + lineToRelative(-0.1224f, -0.031f) + lineToRelative(0.1838f, -0.006f) + arcToRelative(4.812f, 4.812f, 0.0f, false, true, 0.3004f, 0.0f) + curveToRelative(0.0644f, 0.003f, 0.1135f, -0.0089f, 0.1135f, -0.0272f) + curveToRelative(0.0f, -0.0184f, -0.0182f, -0.034f, -0.0366f, -0.037f) + curveToRelative(-0.0215f, -0.0031f, -0.089f, -0.0064f, -0.1472f, -0.0095f) + curveToRelative(-0.0582f, -0.006f, -0.1564f, -0.0398f, -0.2147f, -0.0735f) + curveToRelative(-0.0582f, -0.0368f, -0.1317f, -0.067f, -0.1593f, -0.067f) + curveToRelative(-0.0307f, 0.0f, -0.0553f, -0.0157f, -0.0553f, -0.031f) + curveToRelative(0.0f, -0.0215f, 0.092f, -0.0305f, 0.2545f, -0.0244f) + curveToRelative(0.2483f, 0.0092f, 0.2514f, 0.0091f, 0.2606f, 0.0919f) + curveToRelative(0.0123f, 0.095f, 0.0122f, 0.095f, 0.0797f, 0.0675f) + arcToRelative(0.0498f, 0.0498f, 0.0f, false, false, 0.0305f, -0.0581f) + curveToRelative(-0.0184f, -0.049f, 0.037f, -0.0893f, 0.083f, -0.0586f) + curveToRelative(0.0183f, 0.0092f, 0.0918f, 0.0215f, 0.1593f, 0.0276f) + curveToRelative(0.1655f, 0.0092f, 0.9718f, 0.0737f, 1.1803f, 0.0952f) + curveToRelative(0.1103f, 0.0122f, 0.1593f, 0.0307f, 0.1593f, 0.0614f) + curveToRelative(0.0f, 0.0521f, 0.037f, 0.0549f, 0.083f, 0.0089f) + curveToRelative(0.0245f, -0.0245f, 0.1442f, -0.021f, 0.4354f, 0.0066f) + curveToRelative(0.3557f, 0.0337f, 0.4017f, 0.0425f, 0.4017f, 0.0946f) + curveToRelative(0.0f, 0.0368f, 0.0213f, 0.0556f, 0.0704f, 0.0586f) + curveToRelative(0.0368f, 0.0f, 0.1656f, 0.0121f, 0.2821f, 0.0244f) + curveToRelative(0.1196f, 0.0123f, 0.2329f, 0.0181f, 0.2513f, 0.009f) + curveToRelative(0.0214f, -0.0062f, 0.0891f, -0.0979f, 0.1504f, -0.2021f) + curveToRelative(0.1196f, -0.1993f, 0.2208f, -0.3253f, 0.2607f, -0.3253f) + curveToRelative(0.0153f, 0.0f, 0.018f, 0.0219f, 0.0089f, 0.0464f) + curveToRelative(-0.0123f, 0.0245f, -0.003f, 0.046f, 0.0154f, 0.046f) + curveToRelative(0.0215f, 0.0f, 0.0338f, 0.0244f, 0.0277f, 0.052f) + curveToRelative(-0.0061f, 0.0367f, 0.0213f, 0.0582f, 0.0919f, 0.0735f) + curveToRelative(0.1134f, 0.0246f, 0.1657f, 0.0582f, 0.089f, 0.0582f) + curveToRelative(-0.0276f, 0.0f, -0.0525f, 0.0183f, -0.0525f, 0.0398f) + curveToRelative(0.0f, 0.0215f, 0.1812f, 0.0984f, 0.4448f, 0.1842f) + curveToRelative(0.2821f, 0.095f, 0.4444f, 0.1623f, 0.4444f, 0.1899f) + curveToRelative(0.0f, 0.0306f, -0.095f, 0.0092f, -0.3586f, -0.0797f) + curveToRelative(-0.6254f, -0.2146f, -0.898f, -0.2606f, -0.898f, -0.1533f) + curveToRelative(0.0f, 0.046f, 0.0488f, 0.0676f, 0.285f, 0.1228f) + curveToRelative(0.1532f, 0.0368f, 0.3002f, 0.0642f, 0.3248f, 0.0642f) + curveToRelative(0.0214f, 0.0f, 0.0798f, 0.0338f, 0.1289f, 0.0736f) + curveToRelative(0.049f, 0.043f, 0.294f, 0.144f, 0.5638f, 0.233f) + curveToRelative(0.273f, 0.092f, 0.5153f, 0.19f, 0.5644f, 0.233f) + curveToRelative(0.049f, 0.0398f, 0.1349f, 0.0952f, 0.1931f, 0.1166f) + curveToRelative(0.1932f, 0.0828f, 0.4693f, 0.3309f, 0.6778f, 0.6099f) + curveToRelative(0.3005f, 0.4047f, 0.2973f, 0.3895f, 0.1317f, 0.3895f) + curveToRelative(-0.0766f, 0.0f, -0.2946f, -0.0214f, -0.4847f, -0.046f) + curveToRelative(-0.19f, -0.0245f, -0.429f, -0.0461f, -0.53f, -0.0492f) + curveToRelative(-0.2147f, -0.0061f, -1.9684f, 0.0278f, -2.6245f, 0.0493f) + lineToRelative(-0.4449f, 0.0154f) + lineToRelative(-0.0703f, -0.1504f) + curveToRelative(-0.0398f, -0.0828f, -0.1533f, -0.2298f, -0.2545f, -0.331f) + curveToRelative(-0.1747f, -0.1717f, -0.1837f, -0.175f, -0.2236f, -0.1167f) + curveToRelative(-0.0245f, 0.0337f, -0.1168f, 0.1626f, -0.2057f, 0.2822f) + lineToRelative(-0.1622f, 0.2236f) + lineToRelative(-0.1992f, 0.0065f) + curveToRelative(-0.1104f, 0.0f, -0.2242f, 0.0031f, -0.2517f, 0.0f) + curveToRelative(-0.0675f, -0.006f, -0.0703f, 0.0305f, -0.009f, 0.144f) + lineToRelative(0.0427f, 0.0857f) + lineToRelative(-0.3126f, 0.0216f) + curveToRelative(-0.8524f, 0.0582f, -2.661f, 0.282f, -3.268f, 0.4078f) + curveToRelative(-0.135f, 0.0276f, -0.4203f, 0.049f, -0.6778f, 0.052f) + curveToRelative(-0.46f, 0.0061f, -0.5028f, 0.0184f, -0.794f, 0.187f) + curveToRelative(-0.0522f, 0.0276f, -0.0922f, 0.0339f, -0.129f, 0.0155f) + curveToRelative(-0.0337f, -0.0215f, -0.0643f, -0.0154f, -0.0858f, 0.0122f) + curveToRelative(-0.0337f, 0.0398f, -0.144f, 0.058f, -0.9534f, 0.1439f) + curveToRelative(-0.1778f, 0.0184f, -0.475f, 0.0584f, -0.665f, 0.089f) + curveToRelative(-0.3312f, 0.0552f, -0.3499f, 0.0552f, -0.5246f, 0.0f) + curveToRelative(-0.184f, -0.0582f, -0.7572f, -0.135f, -1.2478f, -0.1687f) + lineToRelative(-0.276f, -0.0216f) + lineToRelative(-0.1622f, 0.1472f) + curveToRelative(-0.092f, 0.0797f, -0.218f, 0.2177f, -0.2855f, 0.3066f) + curveToRelative(-0.092f, 0.1257f, -0.141f, 0.166f, -0.1992f, 0.166f) + curveToRelative(-0.1257f, 0.0f, -1.2448f, 0.1743f, -2.0573f, 0.3215f) + curveToRelative(-0.8768f, 0.1594f, -1.2077f, 0.1904f, -1.4652f, 0.1382f) + curveToRelative(-0.2668f, -0.0551f, -0.2701f, -0.0583f, -0.2578f, -0.3956f) + curveToRelative(0.0122f, -0.2851f, 0.0093f, -0.2941f, -0.0643f, -0.3309f) + curveToRelative(-0.1686f, -0.0858f, -0.331f, -0.0371f, -0.5517f, 0.1622f) + curveToRelative(-0.052f, 0.046f, -0.1133f, 0.0675f, -0.1992f, 0.0675f) + curveToRelative(-0.0705f, -0.003f, -0.1993f, 0.0306f, -0.3004f, 0.0797f) + lineToRelative(-0.181f, 0.083f) + lineToRelative(0.009f, 0.1593f) + curveToRelative(0.006f, 0.0858f, -0.0032f, 0.1868f, -0.0216f, 0.2175f) + curveToRelative(-0.0245f, 0.0368f, -0.0306f, 0.1994f, -0.0183f, 0.4692f) + curveToRelative(0.0123f, 0.328f, 0.003f, 0.4476f, -0.0398f, 0.607f) + lineToRelative(-0.052f, 0.1964f) + lineToRelative(0.1471f, 0.2086f) + curveToRelative(0.2943f, 0.4139f, 0.503f, 0.7294f, 0.503f, 0.763f) + curveToRelative(0.0f, 0.0185f, 0.0916f, 0.1169f, 0.208f, 0.218f) + curveToRelative(0.506f, 0.4446f, 0.7207f, 0.5642f, 1.2174f, 0.6685f) + curveToRelative(0.5273f, 0.1134f, 0.6131f, 0.1072f, 0.9412f, -0.0675f) + curveToRelative(0.1502f, -0.0828f, 0.3251f, -0.1965f, 0.3895f, -0.2578f) + curveToRelative(0.0797f, -0.0736f, 0.3067f, -0.1931f, 0.742f, -0.3863f) + curveToRelative(0.6776f, -0.3004f, 0.7631f, -0.3342f, 0.7631f, -0.2943f) + curveToRelative(0.0f, 0.0122f, 0.043f, 0.426f, 0.0952f, 0.9135f) + curveToRelative(0.1073f, 1.024f, 0.1411f, 2.0052f, 0.0951f, 2.7595f) + curveToRelative(-0.0368f, 0.5917f, -0.0644f, 0.6743f, -0.4814f, 1.4591f) + curveToRelative(-0.6469f, 1.2172f, -1.4224f, 2.3947f, -2.008f, 3.0477f) + curveToRelative(-0.1043f, 0.1196f, -0.2636f, 0.325f, -0.3525f, 0.4599f) + curveToRelative(-0.1686f, 0.2544f, -0.4815f, 0.595f, -0.871f, 0.9445f) + curveToRelative(-0.1317f, 0.1195f, -0.2177f, 0.2206f, -0.2085f, 0.2451f) + curveToRelative(0.0092f, 0.0245f, 0.1046f, 0.0734f, 0.2119f, 0.1102f) + curveToRelative(0.1042f, 0.0398f, 0.2052f, 0.083f, 0.2236f, 0.0984f) + curveToRelative(0.049f, 0.049f, 0.1101f, 0.0303f, 0.337f, -0.0924f) + lineToRelative(0.2207f, -0.1223f) + lineToRelative(0.0891f, 0.0614f) + curveToRelative(0.1073f, 0.0705f, 0.3006f, 0.0763f, 0.4631f, 0.015f) + curveToRelative(0.0644f, -0.0245f, 0.1932f, -0.052f, 0.2883f, -0.0581f) + curveToRelative(0.19f, -0.0184f, 0.3126f, -0.0703f, 0.5118f, -0.2236f) + curveToRelative(0.0736f, -0.0552f, 0.1687f, -0.1073f, 0.2147f, -0.1195f) + curveToRelative(0.089f, -0.0184f, 0.8585f, -0.7976f, 1.2694f, -1.2881f) + curveToRelative(0.1287f, -0.1502f, 0.4506f, -0.4905f, 0.7204f, -0.7542f) + curveToRelative(0.3771f, -0.374f, 0.5457f, -0.5148f, 0.7603f, -0.6436f) + curveToRelative(0.3096f, -0.184f, 0.5548f, -0.4076f, 0.5854f, -0.5395f) + curveToRelative(0.0123f, -0.046f, 0.052f, -0.1413f, 0.0919f, -0.2118f) + curveToRelative(0.095f, -0.1625f, 0.2024f, -0.5792f, 0.1748f, -0.6835f) + curveToRelative(-0.0092f, -0.0429f, -0.0552f, -0.147f, -0.1012f, -0.233f) + curveToRelative(-0.0797f, -0.141f, -0.0855f, -0.1901f, -0.1008f, -0.5826f) + curveToRelative(-0.0276f, -0.6898f, -0.138f, -1.0515f, -0.4875f, -1.5941f) + curveToRelative(-0.2023f, -0.3127f, -0.2516f, -0.4231f, -0.3773f, -0.8278f) + curveToRelative(-0.2085f, -0.696f, -0.2697f, -1.3493f, -0.1655f, -1.8613f) + curveToRelative(0.049f, -0.2545f, 0.0735f, -0.2883f, 0.279f, -0.4078f) + curveToRelative(0.1072f, -0.0644f, 0.2484f, -0.1656f, 0.3159f, -0.227f) + lineToRelative(0.1256f, -0.1162f) + lineToRelative(0.5948f, -0.0675f) + curveToRelative(0.328f, -0.0398f, 0.6958f, -0.0889f, 0.8123f, -0.1134f) + curveToRelative(0.1196f, -0.0245f, 0.3831f, -0.0797f, 0.5855f, -0.1195f) + curveToRelative(0.2054f, -0.043f, 0.497f, -0.1164f, 0.6473f, -0.1655f) + curveToRelative(0.1502f, -0.0521f, 0.3616f, -0.1137f, 0.472f, -0.1383f) + curveToRelative(0.2146f, -0.049f, 0.9472f, -0.1192f, 0.9717f, -0.0946f) + curveToRelative(0.0092f, 0.0092f, 0.0185f, 0.4476f, 0.0155f, 0.975f) + curveToRelative(0.0f, 0.8277f, -0.0092f, 1.0515f, -0.0797f, 1.6616f) + curveToRelative(-0.1196f, 1.0455f, -0.1442f, 1.3732f, -0.1749f, 2.526f) + curveToRelative(-0.0276f, 1.1466f, -0.0365f, 1.1986f, -0.2236f, 1.3335f) + curveToRelative(-0.1349f, 0.0981f, -0.2728f, 0.0802f, -0.6806f, -0.1007f) + curveToRelative(-0.2023f, -0.089f, -0.6286f, -0.264f, -0.9505f, -0.3928f) + curveToRelative(-0.3189f, -0.1288f, -0.7727f, -0.3277f, -1.0027f, -0.4411f) + curveToRelative(-0.233f, -0.1165f, -0.4232f, -0.2028f, -0.4232f, -0.1936f) + curveToRelative(0.0f, 0.0092f, 0.1165f, 0.1595f, 0.2606f, 0.3342f) + curveToRelative(0.144f, 0.1748f, 0.2606f, 0.325f, 0.2606f, 0.3342f) + curveToRelative(0.0f, 0.0092f, -0.0274f, 0.0188f, -0.0642f, 0.0188f) + curveToRelative(-0.0552f, 0.0f, -0.0584f, 0.006f, -0.0155f, 0.0642f) + curveToRelative(0.0276f, 0.0398f, 0.0369f, 0.101f, 0.0277f, 0.1654f) + curveToRelative(-0.0123f, 0.0828f, -0.0032f, 0.1106f, 0.058f, 0.1505f) + curveToRelative(0.04f, 0.0276f, 0.1046f, 0.1041f, 0.1445f, 0.1716f) + curveToRelative(0.0368f, 0.0643f, 0.1012f, 0.147f, 0.141f, 0.1776f) + curveToRelative(0.04f, 0.0307f, 0.098f, 0.1044f, 0.1318f, 0.1627f) + curveToRelative(0.0306f, 0.0582f, 0.1348f, 0.1654f, 0.233f, 0.239f) + curveToRelative(0.098f, 0.0736f, 0.193f, 0.1687f, 0.2113f, 0.2086f) + curveToRelative(0.0184f, 0.046f, 0.1077f, 0.1133f, 0.2119f, 0.1655f) + curveToRelative(0.2422f, 0.1226f, 0.5975f, 0.4353f, 0.6557f, 0.5732f) + curveToRelative(0.0338f, 0.0859f, 0.1015f, 0.1534f, 0.2977f, 0.2822f) + curveToRelative(0.1564f, 0.1042f, 0.4321f, 0.3433f, 0.7387f, 0.6469f) + curveToRelative(0.558f, 0.5518f, 0.5887f, 0.5703f, 1.0425f, 0.5427f) + curveToRelative(0.2943f, -0.0214f, 0.4416f, -0.0768f, 0.6164f, -0.2362f) + curveToRelative(0.0705f, -0.0644f, 0.1563f, -0.1316f, 0.187f, -0.15f) + curveToRelative(0.0306f, -0.0184f, 0.1072f, -0.1072f, 0.1655f, -0.1992f) + curveToRelative(0.0582f, -0.095f, 0.147f, -0.1932f, 0.193f, -0.2208f) + curveToRelative(0.1288f, -0.0766f, 0.3587f, -0.402f, 0.3587f, -0.5062f) + curveToRelative(0.0f, -0.1533f, 0.0582f, -0.251f, 0.2606f, -0.441f) + curveToRelative(0.1778f, -0.1656f, 0.2149f, -0.2213f, 0.3253f, -0.4941f) + curveToRelative(0.1717f, -0.417f, 0.2326f, -0.6864f, 0.2878f, -1.223f) + curveToRelative(0.0674f, -0.6622f, 0.0616f, -1.4623f, -0.015f, -1.962f) + curveToRelative(-0.1257f, -0.8156f, -0.604f, -3.0876f, -0.7481f, -3.5414f) + curveToRelative(-0.1196f, -0.377f, -0.233f, -0.8676f, -0.233f, -1.0087f) + curveToRelative(0.0f, -0.0337f, 0.064f, -0.0369f, 0.3155f, -0.0215f) + curveToRelative(0.23f, 0.0153f, 0.4108f, 0.0094f, 0.6745f, -0.0305f) + curveToRelative(0.3127f, -0.046f, 0.4202f, -0.049f, 0.7514f, -0.0183f) + curveToRelative(0.2115f, 0.0184f, 0.3923f, 0.0396f, 0.3984f, 0.0488f) + curveToRelative(0.0245f, 0.0214f, 0.4968f, 1.5575f, 0.5765f, 1.8702f) + curveToRelative(0.1656f, 0.6408f, 0.1688f, 0.687f, 0.2025f, 2.2996f) + curveToRelative(0.0153f, 0.8431f, 0.0304f, 1.8426f, 0.0366f, 2.2228f) + curveToRelative(0.0061f, 0.6407f, 0.0124f, 0.7111f, 0.089f, 0.9932f) + curveToRelative(0.0981f, 0.3587f, 0.2054f, 0.5919f, 0.4261f, 0.9108f) + curveToRelative(0.089f, 0.1257f, 0.2238f, 0.3464f, 0.3005f, 0.4874f) + curveToRelative(0.1533f, 0.2852f, 0.3527f, 0.521f, 0.6103f, 0.7172f) + curveToRelative(0.3372f, 0.2606f, 0.6652f, 0.4724f, 0.8676f, 0.5644f) + curveToRelative(0.2422f, 0.1103f, 0.4382f, 0.2849f, 0.6314f, 0.5577f) + curveToRelative(0.0797f, 0.1104f, 0.1932f, 0.2609f, 0.2545f, 0.3375f) + curveToRelative(0.0613f, 0.0767f, 0.1378f, 0.1932f, 0.1716f, 0.2607f) + curveToRelative(0.0582f, 0.1226f, 0.0766f, 0.1348f, 0.4078f, 0.233f) + curveToRelative(0.1532f, 0.0459f, 0.5762f, 0.0548f, 0.8123f, 0.015f) + curveToRelative(0.1318f, -0.0216f, 0.1812f, -0.052f, 0.3928f, -0.2574f) + curveToRelative(0.285f, -0.276f, 0.42f, -0.469f, 0.42f, -0.607f) + curveToRelative(0.0f, -0.2146f, 0.0303f, -0.279f, 0.156f, -0.3281f) + curveToRelative(0.0798f, -0.0307f, 0.1196f, -0.0673f, 0.1196f, -0.1041f) + curveToRelative(0.0f, -0.1932f, -0.2023f, -0.9723f, -0.3066f, -1.1747f) + curveToRelative(-0.0674f, -0.1349f, -0.9471f, -1.324f, -1.686f, -2.2836f) + curveToRelative(-0.7849f, -1.0148f, -1.061f, -1.4567f, -1.2234f, -1.935f) + curveToRelative(-0.0521f, -0.1624f, -0.2481f, -1.2754f, -0.3708f, -2.143f) + curveToRelative(-0.0889f, -0.6224f, -0.2608f, -1.2386f, -0.5306f, -1.9223f) + curveToRelative(-0.092f, -0.233f, -0.1564f, -0.4228f, -0.141f, -0.4228f) + curveToRelative(0.0735f, 0.0f, 1.6526f, 0.4415f, 1.7445f, 0.4875f) + curveToRelative(0.0583f, 0.0307f, 0.2974f, 0.159f, 0.5274f, 0.2878f) + curveToRelative(0.23f, 0.1318f, 0.4537f, 0.2363f, 0.4935f, 0.2363f) + curveToRelative(0.046f, 0.0f, 0.239f, 0.1073f, 0.466f, 0.2606f) + lineToRelative(0.3895f, 0.2606f) + lineToRelative(0.2025f, -0.0155f) + curveToRelative(0.2912f, -0.0276f, 0.346f, -0.0398f, 0.4687f, -0.1256f) + curveToRelative(0.1748f, -0.1196f, 0.2792f, -0.138f, 0.4172f, -0.0736f) + curveToRelative(0.2667f, 0.1257f, 0.4507f, 0.1472f, 0.2883f, 0.0338f) + curveToRelative(-0.2422f, -0.1687f, -0.2667f, -0.2516f, -0.1257f, -0.4632f) + curveToRelative(0.1687f, -0.2575f, 0.1867f, -0.2757f, 0.3614f, -0.3646f) + curveToRelative(0.279f, -0.141f, 0.2976f, -0.1745f, 0.3895f, -0.6774f) + curveToRelative(0.043f, -0.2452f, 0.1011f, -0.4848f, 0.1257f, -0.5338f) + curveToRelative(0.0705f, -0.1472f, 0.0553f, -0.2419f, -0.0642f, -0.3553f) + curveToRelative(-0.0614f, -0.0583f, -0.1627f, -0.1904f, -0.2302f, -0.2916f) + curveToRelative(-0.095f, -0.1472f, -0.1223f, -0.2175f, -0.1223f, -0.3248f) + curveToRelative(0.0f, -0.1196f, -0.0124f, -0.144f, -0.1013f, -0.1992f) + arcToRelative(1.3114f, 1.3114f, 0.0f, false, false, -0.218f, -0.1074f) + curveToRelative(-0.1318f, -0.046f, -0.3369f, -0.2635f, -0.3093f, -0.3248f) + arcToRelative(2.3155f, 2.3155f, 0.0f, false, false, 0.0337f, -0.083f) + curveToRelative(0.0246f, -0.0613f, -0.2239f, -0.1962f, -0.4692f, -0.2545f) + curveToRelative(-0.2452f, -0.0582f, -0.2421f, -0.0583f, -0.1992f, -0.1073f) + curveToRelative(0.0215f, -0.0276f, 0.0212f, -0.1227f, 0.0028f, -0.3005f) + curveToRelative(-0.092f, -0.84f, -0.4321f, -1.4285f, -0.9993f, -1.7259f) + curveToRelative(-0.1226f, -0.0644f, -0.2299f, -0.1288f, -0.239f, -0.1471f) + curveToRelative(-0.0583f, -0.089f, -0.7818f, -0.365f, -1.1803f, -0.4477f) + curveToRelative(-0.1257f, -0.0245f, -0.3744f, -0.0857f, -0.5522f, -0.1378f) + curveToRelative(-0.1778f, -0.049f, -0.4504f, -0.1016f, -0.6098f, -0.12f) + curveToRelative(-0.4568f, -0.043f, -1.073f, -0.147f, -1.2754f, -0.2114f) + curveToRelative(-0.1012f, -0.0307f, -0.3403f, -0.0858f, -0.5335f, -0.1195f) + curveToRelative(-0.1931f, -0.0368f, -0.3587f, -0.0766f, -0.368f, -0.0919f) + curveToRelative(-0.0122f, -0.0184f, -0.0858f, -0.0156f, -0.187f, 0.0028f) + curveToRelative(-0.1164f, 0.0215f, -0.2912f, 0.0217f, -0.5671f, -0.0028f) + curveToRelative(-0.2177f, -0.0215f, -0.7573f, -0.034f, -1.1957f, -0.031f) + curveToRelative(-0.6745f, 0.0031f, -0.8585f, -0.0057f, -1.2019f, -0.0609f) + curveToRelative(-0.2207f, -0.0368f, -0.518f, -0.0646f, -0.659f, -0.0646f) + curveToRelative(-0.3373f, -0.0031f, -1.331f, -0.1042f, -1.1531f, -0.1196f) + curveToRelative(0.0276f, 0.0f, 0.1195f, -0.0181f, 0.2053f, -0.0365f) + curveToRelative(0.141f, -0.0307f, 0.1504f, -0.0372f, 0.1228f, -0.0985f) + curveToRelative(-0.0306f, -0.0644f, -0.0458f, -0.0673f, -0.478f, -0.0642f) + curveToRelative(-0.368f, 0.0f, -0.4539f, 0.0094f, -0.4815f, 0.0492f) + curveToRelative(-0.0306f, 0.0399f, -0.0615f, 0.0428f, -0.1964f, 0.0183f) + curveToRelative(-0.144f, -0.0306f, -0.1533f, -0.0368f, -0.1073f, -0.0736f) + curveToRelative(0.049f, -0.0368f, 0.0492f, -0.046f, 0.0094f, -0.0736f) + curveToRelative(-0.0246f, -0.0153f, -0.0676f, -0.031f, -0.0952f, -0.031f) + curveToRelative(-0.0399f, 0.0f, -1.9562f, -0.19f, -2.7533f, -0.2727f) + curveToRelative(-0.1564f, -0.0184f, -0.2941f, -0.0365f, -0.3033f, -0.0488f) + curveToRelative(-0.0092f, -0.0092f, 0.0061f, -0.0154f, 0.0337f, -0.0154f) + curveToRelative(0.0307f, 0.0f, 0.052f, -0.0124f, 0.052f, -0.0277f) + curveToRelative(0.0f, -0.046f, -0.156f, -0.058f, -0.3707f, -0.0244f) + curveToRelative(-0.1502f, 0.0215f, -0.2303f, 0.0213f, -0.2794f, -0.0032f) + curveToRelative(-0.0582f, -0.0246f, -0.0395f, -0.0273f, 0.0924f, -0.015f) + curveToRelative(0.2912f, 0.0306f, 0.1683f, -0.0401f, -0.1383f, -0.077f) + curveToRelative(-0.1656f, -0.0214f, -0.3372f, -0.043f, -0.3801f, -0.0491f) + arcToRelative(0.486f, 0.486f, 0.0f, false, true, -0.1379f, -0.046f) + curveToRelative(-0.0306f, -0.0184f, -0.3679f, -0.0763f, -0.748f, -0.1284f) + curveToRelative(-0.3802f, -0.0521f, -0.8065f, -0.1291f, -0.9506f, -0.172f) + curveToRelative(-0.4967f, -0.141f, -0.9532f, -0.371f, -1.2169f, -0.607f) + lineToRelative(-0.1382f, -0.1224f) + lineToRelative(0.0492f, -0.1167f) + curveToRelative(0.1011f, -0.2422f, 0.2299f, -0.3832f, 0.4598f, -0.4936f) + curveToRelative(0.3158f, -0.1533f, 0.46f, -0.178f, 1.0762f, -0.1964f) + curveToRelative(0.561f, -0.0122f, 0.693f, -0.0365f, 0.6286f, -0.1101f) + curveToRelative(-0.0307f, -0.043f, -0.472f, -0.1106f, -0.6928f, -0.1106f) + curveToRelative(-0.138f, 0.0f, -0.4815f, -0.0674f, -0.7973f, -0.1594f) + arcToRelative(1.2257f, 1.2257f, 0.0f, false, false, -0.4003f, -0.0488f) + close() + moveTo(12.1106f, 6.1415f) + arcToRelative(0.3051f, 0.3051f, 0.0f, false, false, -0.0675f, 0.0051f) + curveToRelative(-0.181f, 0.0307f, -0.285f, 0.0734f, -0.3769f, 0.15f) + lineToRelative(-0.0919f, 0.0736f) + lineToRelative(0.1472f, 0.0033f) + curveToRelative(0.1564f, 0.0f, 0.239f, -0.0306f, 0.3525f, -0.1317f) + curveToRelative(0.0713f, -0.0644f, 0.0838f, -0.0963f, 0.0366f, -0.1003f) + close() + moveTo(17.8868f, 7.0925f) + curveToRelative(0.0383f, -0.0023f, 0.0814f, 0.0089f, 0.1626f, 0.0319f) + curveToRelative(0.092f, 0.0276f, 0.193f, 0.0401f, 0.2236f, 0.031f) + curveToRelative(0.0307f, -0.0093f, 0.0674f, -0.0033f, 0.0797f, 0.0182f) + curveToRelative(0.0153f, 0.0276f, -0.0305f, 0.0308f, -0.1838f, 0.0155f) + curveToRelative(-0.1349f, -0.0154f, -0.2025f, -0.0126f, -0.2025f, 0.0089f) + curveToRelative(0.0f, 0.0184f, 0.0368f, 0.04f, 0.0858f, 0.0492f) + curveToRelative(0.2238f, 0.049f, 0.2607f, 0.0737f, 0.0675f, 0.0553f) + curveToRelative(-0.1103f, -0.0123f, -0.276f, -0.0213f, -0.368f, -0.0244f) + curveToRelative(-0.1594f, 0.0f, -0.1684f, 0.003f, -0.1776f, 0.0797f) + curveToRelative(-0.0092f, 0.0705f, -0.0307f, 0.0856f, -0.181f, 0.1163f) + curveToRelative(-0.2053f, 0.0398f, -0.1775f, 0.0428f, -0.3308f, -0.0277f) + curveToRelative(-0.138f, -0.0674f, -0.4418f, -0.141f, -0.819f, -0.1992f) + curveToRelative(-0.141f, -0.0215f, -0.2112f, -0.0396f, -0.1621f, -0.0427f) + curveToRelative(0.0521f, 0.0f, 0.3342f, 0.0307f, 0.6286f, 0.0736f) + curveToRelative(0.5457f, 0.0767f, 0.6988f, 0.0919f, 0.6651f, 0.0582f) + curveToRelative(-0.0092f, -0.0092f, -0.2483f, -0.0644f, -0.5334f, -0.1196f) + lineToRelative(-0.5151f, -0.1012f) + lineToRelative(0.3004f, -0.0033f) + curveToRelative(0.2637f, -0.003f, 0.3098f, 0.0064f, 0.3895f, 0.0647f) + curveToRelative(0.0675f, 0.049f, 0.1011f, 0.0583f, 0.1256f, 0.0337f) + curveToRelative(0.0215f, -0.0214f, 0.1133f, -0.028f, 0.2574f, -0.0187f) + curveToRelative(0.1931f, 0.0153f, 0.2452f, 0.0095f, 0.3525f, -0.0488f) + curveToRelative(0.0628f, -0.0322f, 0.0966f, -0.0483f, 0.135f, -0.0506f) + close() + moveTo(13.5402f, 7.6053f) + curveToRelative(0.0152f, -5.0E-4f, 0.0284f, 0.0022f, 0.036f, 0.0099f) + curveToRelative(0.0124f, 0.0092f, 2.0E-4f, 0.0306f, -0.0243f, 0.0459f) + curveToRelative(-0.0582f, 0.0368f, -0.0828f, 0.037f, -0.1073f, 0.0033f) + curveToRelative(-0.0138f, -0.0253f, 0.0499f, -0.0575f, 0.0956f, -0.059f) + close() + moveTo(18.5271f, 7.6953f) + curveToRelative(0.0057f, -0.002f, 0.0158f, 0.0105f, 0.0342f, 0.0366f) + curveToRelative(0.0214f, 0.0276f, 0.0673f, 0.052f, 0.098f, 0.052f) + curveToRelative(0.049f, 0.0f, 0.0524f, 0.006f, 0.0126f, 0.0305f) + curveToRelative(-0.0245f, 0.0153f, -0.0522f, 0.0276f, -0.0614f, 0.0276f) + curveToRelative(-0.0613f, -0.0061f, -0.0919f, -0.0428f, -0.0919f, -0.098f) + curveToRelative(0.0015f, -0.0306f, 0.0027f, -0.0468f, 0.0085f, -0.0487f) + close() + moveTo(14.5756f, 7.8758f) + curveToRelative(-0.0613f, 0.0f, -0.104f, 0.052f, -0.104f, 0.1256f) + curveToRelative(0.0f, 0.0153f, 0.0702f, 0.0276f, 0.156f, 0.0276f) + curveToRelative(0.1472f, 0.0f, 0.1536f, -0.003f, 0.1168f, -0.052f) + curveToRelative(-0.0613f, -0.0797f, -0.0983f, -0.1012f, -0.1688f, -0.1012f) + close() + moveTo(20.7657f, 9.7062f) + curveToRelative(0.0215f, -0.0092f, 0.0738f, 0.012f, 0.1167f, 0.0426f) + curveToRelative(0.0675f, 0.0521f, 0.0674f, 0.0584f, 0.0122f, 0.0553f) + curveToRelative(-0.0858f, 0.0f, -0.184f, -0.0765f, -0.1289f, -0.098f) + close() + } + } + .build() + return _shikimori!! + } + +private var _shikimori: ImageVector? = null diff --git a/source-api/src/commonMain/kotlin/eu/kanade/tachiyomi/source/model/SManga.kt b/source-api/src/commonMain/kotlin/eu/kanade/tachiyomi/source/model/SManga.kt index 490540abaf..bef30cde4d 100644 --- a/source-api/src/commonMain/kotlin/eu/kanade/tachiyomi/source/model/SManga.kt +++ b/source-api/src/commonMain/kotlin/eu/kanade/tachiyomi/source/model/SManga.kt @@ -2,6 +2,7 @@ package eu.kanade.tachiyomi.source.model import java.io.Serializable + interface SManga : Serializable { var url: String @@ -18,6 +19,8 @@ interface SManga : Serializable { var status: Int + var webUrls: String? + var thumbnail_url: String? var update_strategy: UpdateStrategy @@ -29,6 +32,11 @@ interface SManga : Serializable { return genre?.split(", ")?.map { it.trim() }?.filterNot { it.isBlank() }?.distinct() } + fun getWebUrls(): List? { + if (webUrls.isNullOrBlank()) return null + return webUrls?.split(", ")?.map { it.trim() }?.filterNot { it.isBlank() }?.distinct() + } + fun copy() = create().also { it.url = url it.title = title diff --git a/source-api/src/commonMain/kotlin/eu/kanade/tachiyomi/source/model/SMangaImpl.kt b/source-api/src/commonMain/kotlin/eu/kanade/tachiyomi/source/model/SMangaImpl.kt index 91a7711cce..3c690f4886 100644 --- a/source-api/src/commonMain/kotlin/eu/kanade/tachiyomi/source/model/SMangaImpl.kt +++ b/source-api/src/commonMain/kotlin/eu/kanade/tachiyomi/source/model/SMangaImpl.kt @@ -16,6 +16,8 @@ class SMangaImpl : SManga { override var status: Int = 0 + override var webUrls: String? = null + override var thumbnail_url: String? = null override var update_strategy: UpdateStrategy = UpdateStrategy.ALWAYS_UPDATE