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

View File

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

View File

@ -62,6 +62,8 @@ import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.firstOrNull
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import kotlinx.datetime.TimeZone
import kotlinx.datetime.toLocalDateTime
import okio.buffer import okio.buffer
import okio.sink import okio.sink
import okio.source import okio.source
@ -115,7 +117,7 @@ class DownloadService : LifecycleService() {
streams.title, streams.title,
streams.description, streams.description,
streams.uploader, streams.uploader,
streams.uploadDate, streams.uploadTimestamp.toLocalDateTime(TimeZone.currentSystemDefault()).date,
thumbnailTargetPath thumbnailTargetPath
) )
Database.downloadDao().insertDownload(download) 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.api.obj.Streams
import com.github.libretube.databinding.DescriptionLayoutBinding import com.github.libretube.databinding.DescriptionLayoutBinding
import com.github.libretube.extensions.formatShort import com.github.libretube.extensions.formatShort
import com.github.libretube.extensions.toLocalDateSafe
import com.github.libretube.ui.activities.VideoTagsAdapter import com.github.libretube.ui.activities.VideoTagsAdapter
import com.github.libretube.util.HtmlParser import com.github.libretube.util.HtmlParser
import com.github.libretube.util.LinkHandler import com.github.libretube.util.LinkHandler
import com.github.libretube.util.TextUtils import com.github.libretube.util.TextUtils
import kotlinx.datetime.TimeZone
import kotlinx.datetime.toLocalDateTime
import java.util.Locale import java.util.Locale
class DescriptionLayout( class DescriptionLayout(
@ -135,7 +136,8 @@ class DescriptionLayout(
private fun localizeDate(streams: Streams): String { private fun localizeDate(streams: Streams): String {
if (streams.livestream) return "" 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 { companion object {