diff --git a/tvmon-app/app/src/main/java/com/example/tvmon/data/model/Models.kt b/tvmon-app/app/src/main/java/com/example/tvmon/data/model/Models.kt index 20e64ef..bdc5dad 100644 --- a/tvmon-app/app/src/main/java/com/example/tvmon/data/model/Models.kt +++ b/tvmon-app/app/src/main/java/com/example/tvmon/data/model/Models.kt @@ -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 diff --git a/tvmon-app/app/src/main/java/com/example/tvmon/data/scraper/TvmonScraper.kt b/tvmon-app/app/src/main/java/com/example/tvmon/data/scraper/TvmonScraper.kt index 836b182..4e35128 100644 --- a/tvmon-app/app/src/main/java/com/example/tvmon/data/scraper/TvmonScraper.kt +++ b/tvmon-app/app/src/main/java/com/example/tvmon/data/scraper/TvmonScraper.kt @@ -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( diff --git a/tvmon-app/app/src/main/java/com/example/tvmon/ui/detail/DetailsFragment.kt b/tvmon-app/app/src/main/java/com/example/tvmon/ui/detail/DetailsFragment.kt index 3085098..5bc2585 100644 --- a/tvmon-app/app/src/main/java/com/example/tvmon/ui/detail/DetailsFragment.kt +++ b/tvmon-app/app/src/main/java/com/example/tvmon/ui/detail/DetailsFragment.kt @@ -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) } diff --git a/tvmon-app/app/src/main/java/com/example/tvmon/ui/presenter/EpisodePresenter.kt b/tvmon-app/app/src/main/java/com/example/tvmon/ui/presenter/EpisodePresenter.kt index 45cc5e7..1919928 100644 --- a/tvmon-app/app/src/main/java/com/example/tvmon/ui/presenter/EpisodePresenter.kt +++ b/tvmon-app/app/src/main/java/com/example/tvmon/ui/presenter/EpisodePresenter.kt @@ -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)