Add: watched episode highlight and date display

This commit is contained in:
tvmon-dev
2026-04-15 21:07:12 +09:00
parent 181dbf2b82
commit 08917e96c7
4 changed files with 45 additions and 7 deletions

View File

@@ -55,7 +55,8 @@ data class Episode(
val number: String,
val title: String,
val url: String,
val type: String = "webview"
val type: String = "webview",
val date: String = ""
) : Parcelable
@Parcelize

View File

@@ -452,11 +452,29 @@ class TvmonScraper {
episodeIndex++.toString()
}
val dateEl = link.parent()?.parent()?.selectFirst("td, div, span")
var dateStr = ""
if (dateEl != null) {
val dateText = dateEl.text().trim()
val dateMatch = Pattern.compile("(\\d{2})[./](\\d{2})[./](\\d{2,4})").matcher(dateText)
if (dateMatch.find()) {
val day = dateMatch.group(1)
val month = dateMatch.group(2)
val year = dateMatch.group(3)
dateStr = if (year.length == 2) {
"20$year/$month/$day"
} else {
"$year/$month/$day"
}
}
}
episodes.add(Episode(
number = finalNumber,
title = linkText.ifBlank { finalNumber },
url = fullUrl,
type = "webview"
type = "webview",
date = dateStr
))
videoLinks.add(VideoLink(

View File

@@ -51,6 +51,7 @@ class DetailsFragment : DetailsSupportFragment() {
private lateinit var rowsAdapter: ArrayObjectAdapter
private var cachedDetail: ContentDetail? = null
private var isDataLoaded = false
private var lastWatchedEpisodeUrl: String? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -151,13 +152,16 @@ class DetailsFragment : DetailsSupportFragment() {
Log.w(TAG, "loadDetailInfo: Fetching detail for ${content.url}")
lifecycleScope.launch {
try {
val history = watchHistoryRepository.getHistory(content.id)
lastWatchedEpisodeUrl = history?.lastEpisodeUrl
val detail = scraper.getDetail(content.url, content.category)
Log.w(TAG, "loadDetailInfo: success=${detail.success}, episodes=${detail.episodes.size}")
cachedDetail = detail
if (detail.success && detail.episodes.isNotEmpty()) {
Log.w(TAG, "loadDetailInfo: Adding ${detail.episodes.size} episodes")
Log.w(TAG, "loadDetailInfo: Adding ${detail.episodes.size} episodes, watched=${lastWatchedEpisodeUrl}")
updateDetailsOverview(detail)
addEpisodesRow(detail.episodes)
@@ -245,9 +249,10 @@ class DetailsFragment : DetailsSupportFragment() {
rowsAdapter.removeItems(existingRowIndex, 1)
}
val episodesRowAdapter = ArrayObjectAdapter(EpisodePresenter())
val presenter = EpisodePresenter(lastWatchedEpisodeUrl)
val episodesRowAdapter = ArrayObjectAdapter(presenter)
episodes.forEachIndexed { index, episode ->
Log.d(TAG, " Episode $index: ${episode.number} - ${episode.title}")
Log.d(TAG, " Episode $index: ${episode.number} - ${episode.title} date=${episode.date}")
episodesRowAdapter.add(episode)
}

View File

@@ -6,7 +6,9 @@ import androidx.leanback.widget.Presenter
import com.example.tvmon.R
import com.example.tvmon.data.model.Episode
class EpisodePresenter : Presenter() {
class EpisodePresenter(
private val watchedEpisodeUrl: String? = null
) : Presenter() {
override fun onCreateViewHolder(parent: ViewGroup): ViewHolder {
val cardView = ImageCardView(parent.context).apply {
@@ -22,9 +24,21 @@ class EpisodePresenter : Presenter() {
val cardView = viewHolder.view as ImageCardView
val res = cardView.context.resources
cardView.titleText = episode.number
val displayNumber = if (episode.date.isNotBlank()) {
episode.date
} else {
episode.number
}
cardView.titleText = displayNumber
cardView.contentText = episode.title
if (episode.url == watchedEpisodeUrl) {
cardView.setBackgroundColor(res.getColor(R.color.accent))
} else {
cardView.setBackgroundColor(res.getColor(R.color.default_background))
}
val width = res.getDimensionPixelSize(R.dimen.episode_card_width)
val height = res.getDimensionPixelSize(R.dimen.episode_card_height)
cardView.setMainImageDimensions(width, height)