Skip to content

Commit a37555b

Browse files
authored
Merge pull request #102 from Hanfeng-Lin/main
Fix(parsing): Update selectors for Characters and Relates layout due to Bangumi DOM changes
2 parents a16b16c + bf45f3c commit a37555b

3 files changed

Lines changed: 39 additions & 20 deletions

File tree

app/src/main/java/com/xiaoyv/bangumi/ui/media/detail/character/MediaCharacterAdapter.kt

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,18 @@ class MediaCharacterAdapter : BaseQuickDiffBindingAdapter<MediaCharacterEntity,
2424
binding.tvComment.text = String.format("讨论:%s", item.commentCount)
2525
binding.tvComment.isVisible = item.commentCount.isNotBlank()
2626
binding.tvJob.text = buildString {
27-
append(item.personJob)
28-
append(";")
29-
append(item.personSex)
27+
if (!item.personJob.isNullOrBlank()) {
28+
append(item.personJob)
29+
}
30+
if (!item.personSex.isNullOrBlank()) {
31+
if (isNotEmpty()) append(" ; ")
32+
append(item.personSex)
33+
}
34+
if (!item.actors.isNullOrEmpty()) {
35+
if (isNotEmpty()) append("\n")
36+
append("CV: ")
37+
append(item.actors?.joinToString(" / ") { it.name.toString() })
38+
}
3039
}
3140
}
3241

app/src/main/java/com/xiaoyv/bangumi/ui/media/detail/overview/binder/OverviewCharacterBinder.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ class OverviewCharacterBinder(private val clickItemListener: (MediaDetailEntity.
5656
FragmentOverviewCharacterItemBinding>(IdDiffItemCallback()) {
5757
override fun BaseQuickBindingHolder<FragmentOverviewCharacterItemBinding>.converted(item: MediaDetailEntity.MediaCharacter) {
5858
binding.ivAvatar.loadImageAnimate(item.avatar, cropType = ImageView.ScaleType.FIT_START)
59-
binding.tvName.text = item.characterNameCn.ifBlank { item.characterName }
59+
binding.tvName.text = item.characterName.ifBlank { item.characterNameCn }
6060
binding.tvJobs.text = item.jobs.joinToString(";")
6161
binding.tvCommentCount.text = String.format("+%d", item.saveCount)
6262
binding.tvCommentCount.isVisible = item.saveCount != 0

lib-common/src/main/java/com/xiaoyv/common/api/parser/impl/MediaDetailParser.kt

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -172,21 +172,31 @@ fun Document.parserMediaMakers(): List<MediaMakerEntity> {
172172
fun Document.parserMediaCharacters(): List<MediaCharacterEntity> {
173173
requireNoError()
174174

175-
return select("#columnInSubjectA > div").map {
175+
return select("#columnInSubjectA .item").map {
176176
val entity = MediaCharacterEntity()
177-
entity.id = it.select("h2 a").hrefId()
177+
entity.id = it.select("a.avatar").hrefId()
178178
entity.avatar = it.select(".avatar img").attr("src").optImageUrl()
179-
entity.titleCn = it.select("h2 .tip").text()
180-
entity.titleNative = it.select("h2 a").firsTextNode()
181-
entity.commentCount = it.select(".rr > .na").text()
182-
entity.personJob = it.select(".prsn_info > .badge_job").text()
183-
entity.personSex = it.select(".prsn_info > .tip").text()
179+
entity.titleCn = it.select("h2 span.tip").text()
180+
entity.titleNative = it.select("h2 a.l").text()
181+
entity.commentCount = it.select(".rr > .primary").text()
182+
183+
entity.personJob = it.select(".badge_job_tip").text()
184+
// prsn_info contains the job text inside it. We substring it out to avoid duplication.
185+
val rawSex = it.select(".prsn_info").text()
186+
val jobStr = entity.personJob.orEmpty()
187+
entity.personSex = if (jobStr.isNotEmpty() && rawSex.startsWith(jobStr)) {
188+
rawSex.substringAfter(jobStr).trim()
189+
} else {
190+
rawSex
191+
}
192+
184193
entity.actors = it.select(".actorBadge").map { actor ->
185194
val actorBadge = MediaCharacterEntity.ActorBadge()
186195
actorBadge.id = actor.select("a.avatar").hrefId()
196+
// Fix: the image is usually located directly inside the a tag
187197
actorBadge.avatar = actor.select("a.avatar img").attr("src").optImageUrl()
188198
actorBadge.name = actor.select("p a.l").text()
189-
actorBadge.nameCn = actor.select("p small").text()
199+
actorBadge.nameCn = actor.select("p small.grey").text()
190200
actorBadge
191201
}
192202
entity
@@ -362,19 +372,19 @@ fun Document.parserMediaDetail(): MediaDetailEntity {
362372
}.filterNotNull()
363373

364374
// 角色
365-
entity.characters = subjectDetail.select("#browserItemList > li").map { item ->
375+
entity.characters = select("#browserItemList > li").map { item ->
366376
val mediaCharacter = MediaDetailEntity.MediaCharacter()
367-
mediaCharacter.saveCount = item.select(".userContainer .fade").text().parseCount()
368-
item.select(".userContainer a.avatar").apply {
377+
mediaCharacter.saveCount = item.select(".info .primary").text().parseCount()
378+
item.select("a.thumbTip").apply {
369379
mediaCharacter.id = hrefId()
370380
mediaCharacter.characterName = attr("title")
371-
mediaCharacter.avatar = select(".userImage > span").attr("style")
381+
mediaCharacter.avatar = select(".avatarNeue").attr("style")
372382
.fetchStyleBackgroundUrl().optImageUrl()
373383
}
374-
item.select(".info .tip_j").apply {
384+
item.select(".info").apply {
375385
mediaCharacter.jobs = select(".badge_job_tip").map { it.text() }
376-
mediaCharacter.characterNameCn = select("span.tip").text()
377-
mediaCharacter.persons = select("a").map { person ->
386+
mediaCharacter.characterNameCn = select(".title a").text()
387+
mediaCharacter.persons = select(".badge_actor a").map { person ->
378388
val characterPerson = MediaDetailEntity.MediaCharacterPerson()
379389
characterPerson.personName = person.text()
380390
characterPerson.personId = person.hrefId()
@@ -402,7 +412,7 @@ fun Document.parserMediaDetail(): MediaDetailEntity {
402412
}
403413

404414
// 关联的条目
405-
entity.relativeMedia = subjectDetail.select(".browserCoverMedium > li").map { item ->
415+
entity.relativeMedia = select("ul.browserCoverMedium:not(#browserItemList) > li").map { item ->
406416
val mediaRelative = MediaDetailEntity.MediaRelative()
407417
mediaRelative.type = item.select("span.sub").text()
408418
item.select("a.avatar").apply {

0 commit comments

Comments
 (0)