Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Uploader to ChapterRow when No Group #2067

Merged
merged 6 commits into from
Mar 29, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
.DS_Store
/build
.idea/
.kotlin/
*iml
*.iml
*/build
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,16 @@

// J2K specific values
@ProtoNumber(800) var pagesLeft: Int = 0,
// Neko Values
@ProtoNumber(905) var uploader: String? = null,
) {
fun toChapterImpl(): ChapterImpl {
return ChapterImpl().apply {
url = [email protected]
name = [email protected]
chapter_number = [email protected]
scanlator = [email protected]
uploader = [email protected]
read = [email protected]
bookmark = [email protected]
last_page_read = [email protected]
Expand All @@ -48,6 +51,7 @@
name = chapter.name,
chapterNumber = chapter.chapter_number,
scanlator = chapter.scanlator,
uploader = chapter.uploader,
read = chapter.read,
bookmark = chapter.bookmark,
lastPageRead = chapter.last_page_read,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
const val DATABASE_NAME = "tachiyomi.db"

/** Version of the database. */
const val DATABASE_VERSION = 36
const val DATABASE_VERSION = 38
}

override fun onOpen(db: SupportSQLiteDatabase) {
Expand Down Expand Up @@ -169,5 +169,8 @@
if (oldVersion < 37) {
db.execSQL(TrackTable.updateMangaUpdatesScore)
}
if (oldVersion < 38) {
db.execSQL(ChapterTable.addUploader)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import eu.kanade.tachiyomi.data.database.tables.ChapterTable.COL_PAGES_LEFT
import eu.kanade.tachiyomi.data.database.tables.ChapterTable.COL_READ
import eu.kanade.tachiyomi.data.database.tables.ChapterTable.COL_SCANLATOR
import eu.kanade.tachiyomi.data.database.tables.ChapterTable.COL_SOURCE_ORDER
import eu.kanade.tachiyomi.data.database.tables.ChapterTable.COL_UPLOADER
import eu.kanade.tachiyomi.data.database.tables.ChapterTable.COL_URL
import eu.kanade.tachiyomi.data.database.tables.ChapterTable.COL_VOL
import eu.kanade.tachiyomi.data.database.tables.ChapterTable.TABLE
Expand All @@ -54,6 +55,7 @@ class ChapterPutResolver : DefaultPutResolver<Chapter>() {
put(COL_VOL, obj.vol)
put(COL_READ, obj.read)
put(COL_SCANLATOR, obj.scanlator)
put(COL_UPLOADER, obj.uploader)
put(COL_BOOKMARK, obj.bookmark)
put(COL_DATE_FETCH, obj.date_fetch)
put(COL_DATE_UPLOAD, obj.date_upload)
Expand All @@ -79,6 +81,7 @@ class ChapterGetResolver : DefaultGetResolver<Chapter>() {
chapter_txt = cursor.getString(cursor.getColumnIndex(COL_CHP_TXT))
chapter_title = cursor.getString(cursor.getColumnIndex(COL_CHP_TITLE))
scanlator = cursor.getString(cursor.getColumnIndex(COL_SCANLATOR))
uploader = cursor.getString(cursor.getColumnIndex(COL_UPLOADER))
read = cursor.getInt(cursor.getColumnIndex(COL_READ)) == 1
bookmark = cursor.getInt(cursor.getColumnIndex(COL_BOOKMARK)) == 1
date_fetch = cursor.getLong(cursor.getColumnIndex(COL_DATE_FETCH))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ class ChapterImpl : Chapter {

override var scanlator: String? = null

override var uploader: String? = null

override var read: Boolean = false

override var bookmark: Boolean = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ object ChapterTable {

const val COL_SCANLATOR = "scanlator"

const val COL_UPLOADER = "uploader"

const val COL_BOOKMARK = "bookmark"

const val COL_DATE_FETCH = "date_fetch"
Expand Down Expand Up @@ -53,6 +55,7 @@ object ChapterTable {
$COL_CHP_TITLE TEXT NOT NULL,
$COL_VOL TEXT NOT NULL,
$COL_SCANLATOR TEXT,
$COL_UPLOADER TEXT,
$COL_READ BOOLEAN NOT NULL,
$COL_BOOKMARK BOOLEAN NOT NULL,
$COL_LAST_PAGE_READ INT NOT NULL,
Expand Down Expand Up @@ -97,4 +100,7 @@ object ChapterTable {

val addLanguage: String
get() = "ALTER TABLE $TABLE ADD COLUMN $COL_LANGUAGE TEXT DEFAULT ''"

val addUploader: String
get() = "ALTER TABLE $TABLE ADD COLUMN $COL_UPLOADER TEXT DEFAULT ''"
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import eu.kanade.tachiyomi.source.online.models.dto.MangaListDto
import eu.kanade.tachiyomi.source.online.models.dto.RelationListDto
import eu.kanade.tachiyomi.source.online.models.dto.RelationshipDtoList
import eu.kanade.tachiyomi.source.online.models.dto.StatisticResponseDto
import eu.kanade.tachiyomi.source.online.models.dto.UploaderDto
import org.nekomanga.constants.MdConstants
import org.nekomanga.core.network.ProxyRetrofitQueryMap
import retrofit2.http.Body
Expand Down Expand Up @@ -114,6 +115,9 @@ interface MangaDexService {
@GET(MdConstants.Api.group)
suspend fun scanlatorGroup(@Query("name") scanlator: String): ApiResponse<GroupListDto>

@GET("${MdConstants.Api.user}/{id}")
suspend fun uploader(@Path("id") id: String): ApiResponse<UploaderDto>

@GET("${MdConstants.Api.list}/{id}")
suspend fun viewList(@Path("id") id: String): ApiResponse<ListDto>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ interface SChapter : Serializable {

var scanlator: String?

var uploader: String?

var language: String?

// chapter id from mangadex
Expand All @@ -46,6 +48,7 @@ interface SChapter : Serializable {
date_upload = other.date_upload
chapter_number = other.chapter_number
scanlator = other.scanlator
uploader = other.uploader
mangadex_chapter_id = other.mangadex_chapter_id
language = other.language
}
Expand All @@ -57,6 +60,7 @@ interface SChapter : Serializable {
date_upload = [email protected]_upload
chapter_number = [email protected]_number
scanlator = [email protected]
uploader = [email protected]
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ class SChapterImpl : SChapter {

override var scanlator: String? = null

override var uploader: String? = null

override var language: String? = null

override var mangadex_chapter_id: String = ""
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -141,12 +141,13 @@ class ApiMangaParser {
lastChapterNumber: Int?,
chapterListResponse: List<ChapterDataDto>,
groupMap: Map<String, String>,
uploaderMap: Map<String, String>,
): Result<List<SChapter>, ResultError> {
return runCatching {
Ok(
chapterListResponse
.asSequence()
.map { mapChapter(it, lastChapterNumber, groupMap) }
.map { mapChapter(it, lastChapterNumber, groupMap, uploaderMap) }
.toList()
)
}
Expand All @@ -161,6 +162,7 @@ class ApiMangaParser {
networkChapter: ChapterDataDto,
lastChapterNumber: Int?,
groups: Map<String, String>,
uploaders: Map<String, String>,
): SChapter {
val chapter = SChapter.create()
val attributes = networkChapter.attributes
Expand All @@ -177,13 +179,20 @@ class ApiMangaParser {
.mapNotNull { groups[it.id] }
.toMutableSet()

if (scanlatorName.contains("no group") || scanlatorName.isEmpty()) {
scanlatorName.remove("no group")
val uploaderName =
networkChapter.relationships
.filter { it.type == MdConstants.Types.uploader }
.map { uploaders[it.id] }
.firstOrNull()

if (scanlatorName.isEmpty()) {
scanlatorName.add("No Group")
}

chapter.scanlator = MdUtil.cleanString(ChapterUtil.getScanlatorString(scanlatorName))

chapter.uploader = uploaderName ?: ""

chapter.mangadex_chapter_id = MdUtil.getChapterUUID(chapter.url)

chapter.language = attributes.translatedLanguage
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,14 @@ class MangaHandler {
}
.andThen { results ->
val groupMap = getGroupMap(results)
apiMangaParser.chapterListParse(lastChapterNumber, results, groupMap)
val uploaderMap = getUploaderMap(results, groupMap)

apiMangaParser.chapterListParse(
lastChapterNumber,
results,
groupMap,
uploaderMap,
)
}
}
}
Expand Down Expand Up @@ -231,5 +238,28 @@ class MangaHandler {
.flatten()
.filter { it.type == MdConstants.Types.scanlator }
.associate { it.id to it.attributes!!.name!! }
.filterValues { it != "no group" }
}

private suspend fun getUploaderMap(
results: List<ChapterDataDto>,
groups: Map<String, String>,
): Map<String, String> {
return results
.asSequence()
.map { chapter -> chapter.relationships }
.filter { relationships -> !relationships.any { groups.containsKey(it.id) } }
.flatten()
.filter { it.type == MdConstants.Types.uploader }
.associate {
it.id to
service
.uploader(it.id)
.getOrResultError("Trying to get uploader username")
.mapBoth(
success = { user -> user.data.attributes.username },
failure = { "" },
)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -45,3 +45,9 @@ data class GroupListDto(
@Serializable data class GroupDto(val id: String, val attributes: GroupAttributesDto)

@Serializable data class GroupAttributesDto(val name: String, val description: String?)

@Serializable data class UploaderDto(val result: String, val data: UserDto)

@Serializable data class UserDto(val attributes: UserAttributesDto)

@Serializable data class UserAttributesDto(val username: String)
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ fun syncChaptersWithSource(
downloadManager.renameChapter(manga, dbChapter, sourceChapter)
}
dbChapter.scanlator = sourceChapter.scanlator
dbChapter.uploader = sourceChapter.uploader
dbChapter.name = sourceChapter.name
dbChapter.vol = sourceChapter.vol
dbChapter.chapter_txt = sourceChapter.chapter_txt
Expand Down Expand Up @@ -222,6 +223,7 @@ fun syncChaptersWithSource(
// checks if the chapter in db needs updated
private fun shouldUpdateDbChapter(dbChapter: Chapter, sourceChapter: Chapter): Boolean {
return dbChapter.scanlator != sourceChapter.scanlator ||
dbChapter.uploader != sourceChapter.uploader ||
dbChapter.name != sourceChapter.name ||
dbChapter.date_upload != sourceChapter.date_upload ||
dbChapter.chapter_number != sourceChapter.chapter_number ||
Expand Down
6 changes: 6 additions & 0 deletions app/src/main/java/org/nekomanga/domain/chapter/Chapter.kt
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ data class SimpleChapter(
val mangaDexChapterId: String,
val oldMangaDexChapterId: String?,
val scanlator: String,
val uploader: String,
val lastRead: Long = 0L,
) {
val isRecognizedNumber = chapterNumber >= 0f
Expand Down Expand Up @@ -68,6 +69,7 @@ data class SimpleChapter(
it.mangadex_chapter_id = mangaDexChapterId
it.old_mangadex_id = oldMangaDexChapterId
it.language = language
it.uploader = uploader
}
}

Expand All @@ -78,6 +80,7 @@ data class SimpleChapter(
dateUpload = sChapter.date_upload,
chapterNumber = sChapter.chapter_number,
scanlator = sChapter.scanlator ?: "",
uploader = sChapter.uploader ?: "",
volume = sChapter.vol,
)
}
Expand All @@ -101,6 +104,7 @@ data class SimpleChapter(
chapterTitle = "",
volume = "",
scanlator = "",
uploader = "",
mangaDexChapterId = "",
oldMangaDexChapterId = null,
language = "",
Expand All @@ -114,6 +118,7 @@ data class SimpleChapter(
it.url = url
it.name = name
it.scanlator = scanlator
it.uploader = uploader
it.read = read
it.bookmark = bookmark
it.last_page_read = lastPageRead
Expand Down Expand Up @@ -157,6 +162,7 @@ fun Chapter.toSimpleChapter(lastRead: Long = 0L): SimpleChapter? {
dateUpload = date_upload,
chapterNumber = chapter_number,
scanlator = scanlator ?: "",
uploader = uploader ?: "",
volume = vol,
chapterTitle = chapter_title,
chapterText = chapter_txt,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ fun ChapterRow(
themeColor: ThemeColorState,
title: String,
scanlator: String,
uploader: String,
language: String?,
chapterNumber: Double,
dateUploaded: Long,
Expand Down Expand Up @@ -161,6 +162,7 @@ fun ChapterRow(
markPrevious = markPrevious,
isMerged = isMerged,
blockScanlator = blockScanlator,
uploader = uploader,
)
}
}
Expand All @@ -187,6 +189,7 @@ private fun ChapterInfo(
shouldHideChapterTitles: Boolean,
title: String,
scanlator: String,
uploader: String,
language: String?,
chapterNumber: Double,
dateUploaded: Long,
Expand Down Expand Up @@ -319,6 +322,9 @@ private fun ChapterInfo(
}

if (scanlator.isNotBlank()) {
if (scanlator == "No Group") {
statuses.add(uploader)
}
statuses.add(scanlator)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -458,6 +458,7 @@ private fun ChapterRow(
themeColor = themeColorState,
title = chapterItem.chapter.name,
scanlator = chapterItem.chapter.scanlator,
uploader = chapterItem.chapter.uploader,
language = chapterItem.chapter.language,
chapterNumber = chapterItem.chapter.chapterNumber.toDouble(),
dateUploaded = chapterItem.chapter.dateUpload,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ class ChapterExtensionsTest {
mangaDexChapterId = "",
oldMangaDexChapterId = null,
scanlator = "",
uploader = "",
)
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ object MdConstants {
const val chapter = "/chapter"
const val cover = "/cover"
const val group = "/group"
const val user = "/user"
const val author = "/author"
const val userFollows = "/user/follows/manga"
const val readingStatusForAllManga = "/manga/status"
Expand Down Expand Up @@ -98,6 +99,7 @@ object MdConstants {
const val coverArt = "cover_art"
const val manga = "manga"
const val scanlator = "scanlation_group"
const val uploader = "user"
}

object ContentRating {
Expand Down
Loading