Merge pull request #4924 from Isira-Seneviratne/Fix_date_parse

fix: Properly parse date strings
This commit is contained in:
Isira Seneviratne 2023-10-19 05:24:14 +05:30 committed by GitHub
commit b17719feaa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 57 additions and 17 deletions

View File

@ -2,18 +2,25 @@ 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.toLocalDateSafe
import com.github.libretube.extensions.toMillis
import com.github.libretube.helpers.ProxyHelper import com.github.libretube.helpers.ProxyHelper
import com.github.libretube.json.SafeInstantSerializer
import com.github.libretube.parcelable.DownloadData import com.github.libretube.parcelable.DownloadData
import kotlin.io.path.Path 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
@Serializable @Serializable
data class Streams( data class Streams(
val title: String, val title: String,
val description: String, val description: String,
val uploadDate: String,
@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,
@ -84,8 +91,9 @@ data class Streams(
uploaderName = uploader, uploaderName = uploader,
uploaderUrl = uploaderUrl, uploaderUrl = uploaderUrl,
uploaderAvatar = uploaderAvatar, uploaderAvatar = uploaderAvatar,
uploadedDate = uploadDate, uploadedDate = uploadTimestamp.toLocalDateTime(TimeZone.currentSystemDefault()).date
uploaded = uploadDate.toLocalDateSafe().toMillis(), .toString(),
uploaded = uploadTimestamp.toEpochMilliseconds(),
duration = duration, duration = duration,
views = views, views = views,
uploaderVerified = uploaderVerified, uploaderVerified = uploaderVerified,

View File

@ -2,18 +2,18 @@ package com.github.libretube.db
import androidx.room.TypeConverter import androidx.room.TypeConverter
import com.github.libretube.api.JsonHelper import com.github.libretube.api.JsonHelper
import com.github.libretube.extensions.toLocalDateSafe import kotlinx.datetime.LocalDate
import kotlinx.datetime.toLocalDate
import kotlinx.serialization.encodeToString
import java.nio.file.Path import java.nio.file.Path
import kotlin.io.path.Path import kotlin.io.path.Path
import kotlinx.datetime.LocalDate
import kotlinx.serialization.encodeToString
object Converters { object Converters {
@TypeConverter @TypeConverter
fun localDateToString(localDate: LocalDate?) = localDate?.toString() fun localDateToString(localDate: LocalDate?) = localDate?.toString()
@TypeConverter @TypeConverter
fun stringToLocalDate(string: String?) = string?.toLocalDateSafe() fun stringToLocalDate(string: String?) = string?.toLocalDate()
@TypeConverter @TypeConverter
fun pathToString(path: Path?) = path?.toString() fun pathToString(path: Path?) = path?.toString()

View File

@ -3,8 +3,5 @@ package com.github.libretube.extensions
import kotlinx.datetime.LocalDate import kotlinx.datetime.LocalDate
import kotlinx.datetime.TimeZone import kotlinx.datetime.TimeZone
import kotlinx.datetime.atStartOfDayIn import kotlinx.datetime.atStartOfDayIn
import kotlinx.datetime.toLocalDate
fun LocalDate.toMillis() = this.atStartOfDayIn(TimeZone.UTC).toEpochMilliseconds() fun LocalDate.toMillis() = this.atStartOfDayIn(TimeZone.UTC).toEpochMilliseconds()
fun String.toLocalDateSafe() = this.substring(0, 10).toLocalDate()

View File

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

View File

@ -28,7 +28,6 @@ import com.github.libretube.enums.FileType
import com.github.libretube.extensions.formatAsFileSize import com.github.libretube.extensions.formatAsFileSize
import com.github.libretube.extensions.getContentLength import com.github.libretube.extensions.getContentLength
import com.github.libretube.extensions.parcelableExtra import com.github.libretube.extensions.parcelableExtra
import com.github.libretube.extensions.toLocalDateSafe
import com.github.libretube.extensions.toastFromMainThread import com.github.libretube.extensions.toastFromMainThread
import com.github.libretube.helpers.DownloadHelper import com.github.libretube.helpers.DownloadHelper
import com.github.libretube.helpers.DownloadHelper.getNotificationId import com.github.libretube.helpers.DownloadHelper.getNotificationId
@ -63,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
@ -116,7 +117,7 @@ class DownloadService : LifecycleService() {
streams.title, streams.title,
streams.description, streams.description,
streams.uploader, streams.uploader,
streams.uploadDate.toLocalDateSafe(), 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 {