Add: watched episode highlight and date display
This commit is contained in:
@@ -55,7 +55,8 @@ data class Episode(
|
|||||||
val number: String,
|
val number: String,
|
||||||
val title: String,
|
val title: String,
|
||||||
val url: String,
|
val url: String,
|
||||||
val type: String = "webview"
|
val type: String = "webview",
|
||||||
|
val date: String = ""
|
||||||
) : Parcelable
|
) : Parcelable
|
||||||
|
|
||||||
@Parcelize
|
@Parcelize
|
||||||
|
|||||||
@@ -452,11 +452,29 @@ class TvmonScraper {
|
|||||||
episodeIndex++.toString()
|
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(
|
episodes.add(Episode(
|
||||||
number = finalNumber,
|
number = finalNumber,
|
||||||
title = linkText.ifBlank { finalNumber },
|
title = linkText.ifBlank { finalNumber },
|
||||||
url = fullUrl,
|
url = fullUrl,
|
||||||
type = "webview"
|
type = "webview",
|
||||||
|
date = dateStr
|
||||||
))
|
))
|
||||||
|
|
||||||
videoLinks.add(VideoLink(
|
videoLinks.add(VideoLink(
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ class DetailsFragment : DetailsSupportFragment() {
|
|||||||
private lateinit var rowsAdapter: ArrayObjectAdapter
|
private lateinit var rowsAdapter: ArrayObjectAdapter
|
||||||
private var cachedDetail: ContentDetail? = null
|
private var cachedDetail: ContentDetail? = null
|
||||||
private var isDataLoaded = false
|
private var isDataLoaded = false
|
||||||
|
private var lastWatchedEpisodeUrl: String? = null
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
@@ -151,13 +152,16 @@ class DetailsFragment : DetailsSupportFragment() {
|
|||||||
Log.w(TAG, "loadDetailInfo: Fetching detail for ${content.url}")
|
Log.w(TAG, "loadDetailInfo: Fetching detail for ${content.url}")
|
||||||
lifecycleScope.launch {
|
lifecycleScope.launch {
|
||||||
try {
|
try {
|
||||||
|
val history = watchHistoryRepository.getHistory(content.id)
|
||||||
|
lastWatchedEpisodeUrl = history?.lastEpisodeUrl
|
||||||
|
|
||||||
val detail = scraper.getDetail(content.url, content.category)
|
val detail = scraper.getDetail(content.url, content.category)
|
||||||
Log.w(TAG, "loadDetailInfo: success=${detail.success}, episodes=${detail.episodes.size}")
|
Log.w(TAG, "loadDetailInfo: success=${detail.success}, episodes=${detail.episodes.size}")
|
||||||
|
|
||||||
cachedDetail = detail
|
cachedDetail = detail
|
||||||
|
|
||||||
if (detail.success && detail.episodes.isNotEmpty()) {
|
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)
|
updateDetailsOverview(detail)
|
||||||
addEpisodesRow(detail.episodes)
|
addEpisodesRow(detail.episodes)
|
||||||
@@ -245,9 +249,10 @@ class DetailsFragment : DetailsSupportFragment() {
|
|||||||
rowsAdapter.removeItems(existingRowIndex, 1)
|
rowsAdapter.removeItems(existingRowIndex, 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
val episodesRowAdapter = ArrayObjectAdapter(EpisodePresenter())
|
val presenter = EpisodePresenter(lastWatchedEpisodeUrl)
|
||||||
|
val episodesRowAdapter = ArrayObjectAdapter(presenter)
|
||||||
episodes.forEachIndexed { index, episode ->
|
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)
|
episodesRowAdapter.add(episode)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,9 @@ import androidx.leanback.widget.Presenter
|
|||||||
import com.example.tvmon.R
|
import com.example.tvmon.R
|
||||||
import com.example.tvmon.data.model.Episode
|
import com.example.tvmon.data.model.Episode
|
||||||
|
|
||||||
class EpisodePresenter : Presenter() {
|
class EpisodePresenter(
|
||||||
|
private val watchedEpisodeUrl: String? = null
|
||||||
|
) : Presenter() {
|
||||||
|
|
||||||
override fun onCreateViewHolder(parent: ViewGroup): ViewHolder {
|
override fun onCreateViewHolder(parent: ViewGroup): ViewHolder {
|
||||||
val cardView = ImageCardView(parent.context).apply {
|
val cardView = ImageCardView(parent.context).apply {
|
||||||
@@ -22,9 +24,21 @@ class EpisodePresenter : Presenter() {
|
|||||||
val cardView = viewHolder.view as ImageCardView
|
val cardView = viewHolder.view as ImageCardView
|
||||||
val res = cardView.context.resources
|
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
|
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 width = res.getDimensionPixelSize(R.dimen.episode_card_width)
|
||||||
val height = res.getDimensionPixelSize(R.dimen.episode_card_height)
|
val height = res.getDimensionPixelSize(R.dimen.episode_card_height)
|
||||||
cardView.setMainImageDimensions(width, height)
|
cardView.setMainImageDimensions(width, height)
|
||||||
|
|||||||
Reference in New Issue
Block a user