mirror of
https://github.com/libre-tube/LibreTube.git
synced 2025-04-29 08:20:32 +05:30
Merge pull request #4924 from Isira-Seneviratne/Fix_date_parse
fix: Properly parse date strings
This commit is contained in:
commit
b17719feaa
@ -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,
|
||||||
|
@ -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()
|
||||||
|
@ -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()
|
|
||||||
|
@ -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())
|
||||||
|
}
|
||||||
|
}
|
@ -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)
|
||||||
|
@ -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 {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user