Skip to content

Commit

Permalink
fix(Feed): extract shorts uploadDate from feedInfo
Browse files Browse the repository at this point in the history
Shorts extracted from the Shorts tab do not have an uploadDate.
They are currently saved with their uploadDate set to -1. This results
in them to appear at the end of the feed. To fix this, we can use the
generic FeedInfo that contains the uploadDate. This also fixes an issue,
where old shorts were fetched on every refresh.

Ref: libre-tube#7111
  • Loading branch information
FineFindus committed Mar 1, 2025
1 parent 387933c commit 8dc0119
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 24 deletions.
46 changes: 27 additions & 19 deletions app/src/main/java/com/github/libretube/api/StreamsExtractor.kt
Original file line number Diff line number Diff line change
Expand Up @@ -62,25 +62,33 @@ fun AudioStream.toPipedStream() = PipedStream(
)

fun StreamInfoItem.toStreamItem(
uploaderAvatarUrl: String? = null
) = StreamItem(
type = StreamItem.TYPE_STREAM,
url = url.toID(),
title = name,
uploaded = uploadDate?.offsetDateTime()?.toEpochSecond()?.times(1000) ?: -1,
uploadedDate = textualUploadDate ?: uploadDate?.offsetDateTime()?.toLocalDateTime()
?.toLocalDate()
?.toString(),
uploaderName = uploaderName,
uploaderUrl = uploaderUrl.toID(),
uploaderAvatar = uploaderAvatarUrl ?: uploaderAvatars.maxByOrNull { it.height }?.url,
thumbnail = thumbnails.maxByOrNull { it.height }?.url,
duration = duration,
views = viewCount,
uploaderVerified = isUploaderVerified,
shortDescription = shortDescription,
isShort = isShortFormContent
)
uploaderAvatarUrl: String? = null,
feedInfo: StreamInfoItem? = null,
): StreamItem {
val uploadDate = uploadDate ?: feedInfo?.uploadDate
val textualUploadDate = textualUploadDate ?: feedInfo?.textualUploadDate

return StreamItem(
type = StreamItem.TYPE_STREAM,
url = url.toID(),
title = name,
uploaded = uploadDate?.offsetDateTime()?.toEpochSecond()?.times(1000)
?: -1,
uploadedDate = textualUploadDate ?: uploadDate
?.offsetDateTime()?.toLocalDateTime()
?.toLocalDate()
?.toString(),
uploaderName = uploaderName,
uploaderUrl = uploaderUrl.toID(),
uploaderAvatar = uploaderAvatarUrl ?: uploaderAvatars.maxByOrNull { it.height }?.url,
thumbnail = thumbnails.maxByOrNull { it.height }?.url,
duration = duration,
views = viewCount,
uploaderVerified = isUploaderVerified,
shortDescription = shortDescription,
isShort = isShortFormContent
)
}

object StreamsExtractor {
suspend fun extractStreams(videoId: String): Streams = withContext(Dispatchers.IO) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ class LocalFeedRepository : FeedRepository {
): List<StreamItem> {
val channelUrl = "$YOUTUBE_FRONTEND_URL/channel/${channelId}"
val feedInfo = FeedInfo.getInfo(channelUrl)
val feedInfoItems = feedInfo.relatedItems.associateBy { it.url }

val mostRecentChannelVideo = feedInfo.relatedItems.maxBy {
it.uploadDate?.offsetDateTime()?.toInstant()?.toEpochMilli() ?: 0
Expand All @@ -122,13 +123,15 @@ class LocalFeedRepository : FeedRepository {
}.getOrElse { emptyList() }
}.flatten().filterIsInstance<StreamInfoItem>()

val channelAvatar = channelInfo.avatars.maxByOrNull { it.height }?.url
return related.map { item ->
// avatar is not always included in these info items, thus must be taken from channel info response
item.toStreamItem(channelInfo.avatars.maxByOrNull { it.height }?.url)
}.filter {
// shorts don't have upload dates apparently
it.isShort || it.uploaded > minimumDateMillis
}
item.toStreamItem(
channelAvatar,
// shorts fetched via the shorts tab don't have upload dates so we fall back to the feedInfo
feedInfoItems[item.url]
)
}.filter { it.uploaded > minimumDateMillis }
}

companion object {
Expand Down

0 comments on commit 8dc0119

Please sign in to comment.