Fixes the bugs from migrating video events to imeta tags

This commit is contained in:
Vitor Pamplona
2024-12-06 10:19:55 -05:00
parent 4610519bb3
commit 0d6760360f
3 changed files with 80 additions and 102 deletions

View File

@@ -752,6 +752,7 @@ private fun RenderVideoPlayer(
modifier = videoModifier, modifier = videoModifier,
factory = { context: Context -> factory = { context: Context ->
PlayerView(context).apply { PlayerView(context).apply {
clipToOutline = true
player = controller player = controller
layoutParams = layoutParams =
FrameLayout.LayoutParams( FrameLayout.LayoutParams(

View File

@@ -33,7 +33,6 @@ import androidx.compose.foundation.lazy.grid.GridCells
import androidx.compose.foundation.lazy.grid.LazyGridState import androidx.compose.foundation.lazy.grid.LazyGridState
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
import androidx.compose.foundation.lazy.grid.itemsIndexed import androidx.compose.foundation.lazy.grid.itemsIndexed
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Surface import androidx.compose.material3.Surface
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.Immutable import androidx.compose.runtime.Immutable
@@ -49,7 +48,6 @@ import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.distinctUntilChanged import androidx.lifecycle.distinctUntilChanged
import androidx.lifecycle.map import androidx.lifecycle.map
import com.vitorpamplona.amethyst.commons.richtext.BaseMediaContent
import com.vitorpamplona.amethyst.commons.richtext.MediaUrlImage import com.vitorpamplona.amethyst.commons.richtext.MediaUrlImage
import com.vitorpamplona.amethyst.commons.richtext.MediaUrlVideo import com.vitorpamplona.amethyst.commons.richtext.MediaUrlVideo
import com.vitorpamplona.amethyst.commons.richtext.RichTextParser.Companion.isVideoUrl import com.vitorpamplona.amethyst.commons.richtext.RichTextParser.Companion.isVideoUrl
@@ -73,11 +71,9 @@ import com.vitorpamplona.amethyst.ui.note.elements.BannerImage
import com.vitorpamplona.amethyst.ui.screen.FeedViewModel import com.vitorpamplona.amethyst.ui.screen.FeedViewModel
import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
import com.vitorpamplona.amethyst.ui.screen.loggedIn.mockAccountViewModel import com.vitorpamplona.amethyst.ui.screen.loggedIn.mockAccountViewModel
import com.vitorpamplona.amethyst.ui.theme.DividerThickness
import com.vitorpamplona.amethyst.ui.theme.FeedPadding import com.vitorpamplona.amethyst.ui.theme.FeedPadding
import com.vitorpamplona.amethyst.ui.theme.HalfPadding import com.vitorpamplona.amethyst.ui.theme.HalfPadding
import com.vitorpamplona.amethyst.ui.theme.QuoteBorder import com.vitorpamplona.amethyst.ui.theme.QuoteBorder
import com.vitorpamplona.quartz.events.Dimension
import com.vitorpamplona.quartz.events.PictureEvent import com.vitorpamplona.quartz.events.PictureEvent
import com.vitorpamplona.quartz.events.ProfileGalleryEntryEvent import com.vitorpamplona.quartz.events.ProfileGalleryEntryEvent
import com.vitorpamplona.quartz.events.VideoEvent import com.vitorpamplona.quartz.events.VideoEvent
@@ -141,15 +137,11 @@ private fun GalleryFeedLoaded(
GalleryCardCompose( GalleryCardCompose(
baseNote = item, baseNote = item,
routeForLastRead = routeForLastRead, routeForLastRead = routeForLastRead,
modifier = Modifier, modifier = HalfPadding,
accountViewModel = accountViewModel, accountViewModel = accountViewModel,
nav = nav, nav = nav,
) )
} }
HorizontalDivider(
thickness = DividerThickness,
)
} }
} }
} }
@@ -173,30 +165,22 @@ fun GalleryCardCompose(
accountViewModel = accountViewModel, accountViewModel = accountViewModel,
nav = nav, nav = nav,
) { canPreview -> ) { canPreview ->
val (url, sourceEvent) =
when (val galleryEvent = baseNote.event) {
is ProfileGalleryEntryEvent -> Pair(galleryEvent.url(), galleryEvent.fromEvent())
is PictureEvent -> Pair(galleryEvent.imetaTags().getOrNull(0)?.url, galleryEvent.id())
is VideoEvent -> Pair(galleryEvent.imetaTags().getOrNull(0)?.url, galleryEvent.id())
else -> Pair(null, null)
}
var galleryEvent = baseNote.event url?.let { imageUrl ->
var url = ""
var sourceEvent = galleryEvent?.id()
if (baseNote.event is ProfileGalleryEntryEvent) {
url = (baseNote.event as ProfileGalleryEntryEvent).url().toString()
sourceEvent = (baseNote.event as? ProfileGalleryEntryEvent)?.fromEvent()
} else if (baseNote.event is PictureEvent) {
url = (baseNote.event as PictureEvent).imetaTags()[0].url
sourceEvent = (baseNote.event as PictureEvent).id()
} else if (baseNote.event is VideoEvent) {
url = (baseNote.event as VideoEvent).url().toString()
sourceEvent = (baseNote.event as VideoEvent).id()
}
url.let { image ->
if (sourceEvent != null) { if (sourceEvent != null) {
LoadNote(baseNoteHex = sourceEvent, accountViewModel = accountViewModel) { sourceNote -> LoadNote(baseNoteHex = sourceEvent, accountViewModel = accountViewModel) { sourceNote ->
if (sourceNote != null) { if (sourceNote != null) {
ClickableGalleryCard( ClickableGalleryCard(
galleryNote = baseNote, galleryNote = baseNote,
baseNote = sourceNote, baseNote = sourceNote,
image = image, image = imageUrl,
modifier = modifier, modifier = modifier,
parentBackgroundColor = parentBackgroundColor, parentBackgroundColor = parentBackgroundColor,
accountViewModel = accountViewModel, accountViewModel = accountViewModel,
@@ -205,7 +189,7 @@ fun GalleryCardCompose(
} else { } else {
GalleryCard( GalleryCard(
galleryNote = baseNote, galleryNote = baseNote,
image = image, image = imageUrl,
modifier = modifier, modifier = modifier,
accountViewModel = accountViewModel, accountViewModel = accountViewModel,
nav = nav, nav = nav,
@@ -215,7 +199,7 @@ fun GalleryCardCompose(
} else { } else {
GalleryCard( GalleryCard(
galleryNote = baseNote, galleryNote = baseNote,
image = image, image = imageUrl,
modifier = modifier, modifier = modifier,
accountViewModel = accountViewModel, accountViewModel = accountViewModel,
nav = nav, nav = nav,
@@ -280,13 +264,11 @@ fun InnerGalleryCardBox(
accountViewModel: AccountViewModel, accountViewModel: AccountViewModel,
nav: INav, nav: INav,
) { ) {
Column(HalfPadding) { SensitivityWarning(
SensitivityWarning( note = baseNote,
note = baseNote, accountViewModel = accountViewModel,
accountViewModel = accountViewModel, ) {
) { RenderGalleryThumb(baseNote, image, accountViewModel, nav)
RenderGalleryThumb(baseNote, image, accountViewModel, nav)
}
} }
} }
@@ -352,74 +334,69 @@ fun InnerRenderGalleryThumb(
note: Note, note: Note,
accountViewModel: AccountViewModel, accountViewModel: AccountViewModel,
) { ) {
var noteEvent = note.event val noteEvent = note.event
var blurHash = "" val content =
var description = "" if (card.image == null) {
var dimensions: Dimension? = null null
var mimeType = "" } else if (noteEvent is ProfileGalleryEntryEvent) {
if (note.event is ProfileGalleryEntryEvent) { if (isVideoUrl(card.image)) {
noteEvent = (note.event as ProfileGalleryEntryEvent) MediaUrlVideo(
blurHash = noteEvent.blurhash().toString() url = card.image,
description = noteEvent.content description = noteEvent.content,
// var hash = (note.event as ProfileGalleryEntryEvent).hash() hash = null,
dimensions = noteEvent.dimensions() blurhash = noteEvent.blurhash(),
mimeType = noteEvent.mimeType().toString() dim = noteEvent.dimensions(),
} else if (note.event is PictureEvent) { uri = null,
noteEvent = (note.event as PictureEvent) mimeType = noteEvent.mimeType(),
blurHash = noteEvent.blurhash().toString() )
description = noteEvent.content
dimensions = noteEvent.dimensions()
mimeType = noteEvent.mimeType().toString()
} else if (note.event is VideoEvent) {
noteEvent = (note.event as VideoEvent)
blurHash = noteEvent.blurhash().toString()
description = noteEvent.content
dimensions = noteEvent.dimensions()
mimeType = noteEvent.mimeType().toString()
}
Box(
Modifier
.fillMaxWidth()
.aspectRatio(1f),
contentAlignment = BottomStart,
) {
card.image?.let {
var content: BaseMediaContent? = null
if (isVideoUrl(it)) {
content =
MediaUrlVideo(
url = it,
description = description,
hash = null,
blurhash = blurHash,
dim = dimensions,
uri = null,
mimeType = mimeType,
)
} else { } else {
content = MediaUrlImage(
MediaUrlImage( url = card.image,
url = it, description = noteEvent.content,
description = description, hash = null, // We don't want to show the hash banner here
hash = null, // We don't want to show the hash banner here blurhash = noteEvent.blurhash(),
blurhash = blurHash, dim = noteEvent.dimensions(),
dim = dimensions, uri = null,
uri = null, mimeType = noteEvent.mimeType(),
mimeType = mimeType, )
)
} }
} else if (noteEvent is PictureEvent) {
val imeta = noteEvent.imetaTags().firstOrNull()
MediaUrlImage(
url = card.image,
description = noteEvent.content,
hash = null, // We don't want to show the hash banner here
blurhash = imeta?.blurhash,
dim = imeta?.dimension,
uri = null,
mimeType = imeta?.mimeType,
)
} else if (noteEvent is VideoEvent) {
val imeta = noteEvent.imetaTags().firstOrNull()
MediaUrlVideo(
url = card.image,
description = noteEvent.content,
hash = null, // We don't want to show the hash banner here
blurhash = imeta?.blurhash,
dim = imeta?.dimension,
uri = null,
mimeType = imeta?.mimeType,
)
} else {
null
}
Box(Modifier.fillMaxWidth().aspectRatio(1f), BottomStart) {
if (content != null) {
GalleryContentView( GalleryContentView(
content = content, content = content,
roundedCorner = false, roundedCorner = false,
isFiniteHeight = false, isFiniteHeight = false,
accountViewModel = accountViewModel, accountViewModel = accountViewModel,
) )
} else {
DisplayGalleryAuthorBanner(note)
} }
// }
?: run { DisplayGalleryAuthorBanner(note) }
} }
} }

View File

@@ -46,23 +46,23 @@ class PictureEvent(
fun title() = tags.firstOrNull { it.size > 1 && it[0] == TITLE }?.get(1) fun title() = tags.firstOrNull { it.size > 1 && it[0] == TITLE }?.get(1)
fun url() = tags.firstOrNull { it.size > 1 && it[0] == PictureMeta.URL }?.get(1) private fun url() = tags.firstOrNull { it.size > 1 && it[0] == PictureMeta.URL }?.get(1)
fun urls() = tags.filter { it.size > 1 && it[0] == PictureMeta.URL }.map { it[1] } private fun urls() = tags.filter { it.size > 1 && it[0] == PictureMeta.URL }.map { it[1] }
fun mimeType() = tags.firstOrNull { it.size > 1 && it[0] == PictureMeta.MIME_TYPE }?.get(1) private fun mimeType() = tags.firstOrNull { it.size > 1 && it[0] == PictureMeta.MIME_TYPE }?.get(1)
fun hash() = tags.firstOrNull { it.size > 1 && it[0] == PictureMeta.HASH }?.get(1) private fun hash() = tags.firstOrNull { it.size > 1 && it[0] == PictureMeta.HASH }?.get(1)
fun size() = tags.firstOrNull { it.size > 1 && it[0] == PictureMeta.FILE_SIZE }?.get(1) private fun size() = tags.firstOrNull { it.size > 1 && it[0] == PictureMeta.FILE_SIZE }?.get(1)
fun alt() = tags.firstOrNull { it.size > 1 && it[0] == PictureMeta.ALT }?.get(1) private fun alt() = tags.firstOrNull { it.size > 1 && it[0] == PictureMeta.ALT }?.get(1)
fun dimensions() = tags.firstOrNull { it.size > 1 && it[0] == PictureMeta.DIMENSION }?.get(1)?.let { Dimension.parse(it) } private fun dimensions() = tags.firstOrNull { it.size > 1 && it[0] == PictureMeta.DIMENSION }?.get(1)?.let { Dimension.parse(it) }
fun blurhash() = tags.firstOrNull { it.size > 1 && it[0] == PictureMeta.BLUR_HASH }?.get(1) private fun blurhash() = tags.firstOrNull { it.size > 1 && it[0] == PictureMeta.BLUR_HASH }?.get(1)
fun hasUrl() = tags.any { it.size > 1 && it[0] == PictureMeta.URL } private fun hasUrl() = tags.any { it.size > 1 && it[0] == PictureMeta.URL }
// hack to fix pablo's bug // hack to fix pablo's bug
fun rootImage() = fun rootImage() =