refactor: Obtain stream upload date as an Instant

This commit is contained in:
Isira Seneviratne 2023-10-18 06:17:57 +05:30
parent 1ccb857f2a
commit 36ae0e867c
4 changed files with 28 additions and 17 deletions

View File

@ -2,11 +2,13 @@ package com.github.libretube.api.obj
import com.github.libretube.db.obj.DownloadItem
import com.github.libretube.enums.FileType
import com.github.libretube.extensions.toMillis
import com.github.libretube.helpers.ProxyHelper
import com.github.libretube.json.SafeLocalDateSerializer
import com.github.libretube.json.SafeInstantSerializer
import com.github.libretube.parcelable.DownloadData
import kotlinx.datetime.LocalDate
import kotlinx.datetime.Instant
import kotlinx.datetime.TimeZone
import kotlinx.datetime.toLocalDateTime
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlin.io.path.Path
@ -14,7 +16,11 @@ import kotlin.io.path.Path
data class Streams(
val title: String,
val description: String,
@Serializable(SafeLocalDateSerializer::class) val uploadDate: LocalDate,
@Serializable(SafeInstantSerializer::class)
@SerialName("uploadDate")
val uploadTimestamp: Instant,
val uploader: String,
val uploaderUrl: String,
val uploaderAvatar: String? = null,
@ -85,8 +91,9 @@ data class Streams(
uploaderName = uploader,
uploaderUrl = uploaderUrl,
uploaderAvatar = uploaderAvatar,
uploadedDate = uploadDate.toString(),
uploaded = uploadDate.toMillis(),
uploadedDate = uploadTimestamp.toLocalDateTime(TimeZone.currentSystemDefault()).date
.toString(),
uploaded = uploadTimestamp.toEpochMilliseconds(),
duration = duration,
views = views,
uploaderVerified = uploaderVerified,

View File

@ -2,31 +2,31 @@ package com.github.libretube.json
import android.util.Log
import com.github.libretube.extensions.TAG
import kotlinx.datetime.LocalDate
import kotlinx.datetime.Instant
import kotlinx.datetime.TimeZone
import kotlinx.datetime.atStartOfDayIn
import kotlinx.datetime.toInstant
import kotlinx.datetime.toLocalDate
import kotlinx.datetime.toLocalDateTime
import kotlinx.serialization.KSerializer
import kotlinx.serialization.descriptors.PrimitiveKind.STRING
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
object SafeLocalDateSerializer : KSerializer<LocalDate> {
override val descriptor = PrimitiveSerialDescriptor("LocalDate", STRING)
object SafeInstantSerializer : KSerializer<Instant> {
override val descriptor = PrimitiveSerialDescriptor("Instant", STRING)
override fun deserialize(decoder: Decoder): LocalDate {
override fun deserialize(decoder: Decoder): Instant {
val string = decoder.decodeString()
return try {
string.toLocalDate()
string.toInstant()
} catch (e: IllegalArgumentException) {
Log.e(TAG(), "Error parsing date '$string'", e)
string.toInstant().toLocalDateTime(TimeZone.currentSystemDefault()).date
string.toLocalDate().atStartOfDayIn(TimeZone.currentSystemDefault())
}
}
override fun serialize(encoder: Encoder, value: LocalDate) {
override fun serialize(encoder: Encoder, value: Instant) {
encoder.encodeString(value.toString())
}
}

View File

@ -62,6 +62,8 @@ import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.firstOrNull
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import kotlinx.datetime.TimeZone
import kotlinx.datetime.toLocalDateTime
import okio.buffer
import okio.sink
import okio.source
@ -115,7 +117,7 @@ class DownloadService : LifecycleService() {
streams.title,
streams.description,
streams.uploader,
streams.uploadDate,
streams.uploadTimestamp.toLocalDateTime(TimeZone.currentSystemDefault()).date,
thumbnailTargetPath
)
Database.downloadDao().insertDownload(download)

View File

@ -15,11 +15,12 @@ import com.github.libretube.R
import com.github.libretube.api.obj.Streams
import com.github.libretube.databinding.DescriptionLayoutBinding
import com.github.libretube.extensions.formatShort
import com.github.libretube.extensions.toLocalDateSafe
import com.github.libretube.ui.activities.VideoTagsAdapter
import com.github.libretube.util.HtmlParser
import com.github.libretube.util.LinkHandler
import com.github.libretube.util.TextUtils
import kotlinx.datetime.TimeZone
import kotlinx.datetime.toLocalDateTime
import java.util.Locale
class DescriptionLayout(
@ -135,7 +136,8 @@ class DescriptionLayout(
private fun localizeDate(streams: Streams): String {
if (streams.livestream) return ""
return TextUtils.SEPARATOR + TextUtils.localizeDate(streams.uploadDate.toLocalDateSafe())
val date = streams.uploadTimestamp.toLocalDateTime(TimeZone.currentSystemDefault()).date
return TextUtils.SEPARATOR + TextUtils.localizeDate(date)
}
companion object {