Add support for mp4 videos
This commit is contained in:
parent
b31338dcc7
commit
ff01ab61d1
|
@ -230,8 +230,9 @@ nav {
|
||||||
min-width: 2em;
|
min-width: 2em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.gallery-row .attachment:last-child, .gallery-row .attachments:last-child {
|
.gallery-row .attachment:last-child, .gallery-row .attachments:last-child, .video-container {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
|
max-height: 500px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.attachments .attachment {
|
.attachments .attachment {
|
||||||
|
@ -241,14 +242,45 @@ nav {
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
.gallery-row .image-attachment {
|
.gallery-row .image-attachment, .attachments .image-attachment {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.attachments .image-attachment {
|
.gallery-video {
|
||||||
|
display: flex;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
video {
|
||||||
|
height: 100%;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.media-gif {
|
||||||
|
display: table-cell;
|
||||||
|
padding-top: 5px !important;
|
||||||
|
background-color: unset;
|
||||||
|
}
|
||||||
|
|
||||||
|
.video-overlay {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
z-index: 1;
|
||||||
|
background-color: #000000bd;
|
||||||
|
}
|
||||||
|
|
||||||
|
.video-overlay p {
|
||||||
|
position: relative;
|
||||||
|
z-index: 0;
|
||||||
|
color: #dcdcdc;
|
||||||
|
text-align: center;
|
||||||
|
top: calc(50% - 20px);
|
||||||
|
font-size: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
.still-image {
|
.still-image {
|
||||||
max-height: 379.5px;
|
max-height: 379.5px;
|
||||||
max-width: 506px;
|
max-width: 506px;
|
||||||
|
@ -611,36 +643,6 @@ nav {
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
}
|
}
|
||||||
|
|
||||||
.media-gif {
|
|
||||||
display: table-cell;
|
|
||||||
padding-top: 5px !important;
|
|
||||||
background-color: unset;
|
|
||||||
}
|
|
||||||
|
|
||||||
video {
|
|
||||||
height: 100%;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.video-overlay {
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
z-index: 1;
|
|
||||||
background-color: #000000bd;
|
|
||||||
}
|
|
||||||
|
|
||||||
.video-overlay p {
|
|
||||||
position: relative;
|
|
||||||
z-index: 0;
|
|
||||||
color: #dcdcdc;
|
|
||||||
text-align: center;
|
|
||||||
top: calc(50% - 20px);
|
|
||||||
font-size: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.unavailable-box {
|
.unavailable-box {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
|
|
@ -111,26 +111,28 @@ proc parseConversation*(node: XmlNode): Conversation =
|
||||||
result.replies.add parseTweets(thread)
|
result.replies.add parseTweets(thread)
|
||||||
|
|
||||||
proc parseVideo*(node: JsonNode): Video =
|
proc parseVideo*(node: JsonNode): Video =
|
||||||
let track = node{"track"}
|
let
|
||||||
let contentType = track["contentType"].to(string)
|
track = node{"track"}
|
||||||
|
cType = track["contentType"].to(string)
|
||||||
|
pType = track["playbackType"].to(string)
|
||||||
|
|
||||||
case contentType
|
case cType
|
||||||
of "media_entity":
|
of "media_entity":
|
||||||
result = Video(
|
result = Video(
|
||||||
contentType: m3u8,
|
playbackType: if "mp4" in pType: mp4 else: m3u8,
|
||||||
thumb: node["posterImage"].to(string),
|
contentId: track["contentId"].to(string),
|
||||||
id: track["contentId"].to(string),
|
durationMs: track["durationMs"].to(int),
|
||||||
length: track["durationMs"].to(int),
|
|
||||||
views: track["viewCount"].to(string),
|
views: track["viewCount"].to(string),
|
||||||
url: track["playbackUrl"].to(string),
|
url: track["playbackUrl"].to(string),
|
||||||
available: track{"mediaAvailability"}["status"].to(string) == "available"
|
available: track{"mediaAvailability"}["status"].to(string) == "available"
|
||||||
)
|
)
|
||||||
of "vmap":
|
of "vmap":
|
||||||
result = Video(
|
result = Video(
|
||||||
contentType: vmap,
|
playbackType: vmap,
|
||||||
thumb: node["posterImage"].to(string),
|
durationMs: track["durationMs"].to(int),
|
||||||
url: track["vmapUrl"].to(string),
|
url: track["vmapUrl"].to(string)
|
||||||
length: track["durationMs"].to(int),
|
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
echo "Can't parse video of type ", contentType
|
echo "Can't parse video of type ", cType
|
||||||
|
|
||||||
|
result.thumb = node["posterImage"].to(string)
|
||||||
|
|
|
@ -32,15 +32,15 @@ db("cache.db", "", "", ""):
|
||||||
|
|
||||||
type
|
type
|
||||||
VideoType* = enum
|
VideoType* = enum
|
||||||
vmap, m3u8
|
vmap, m3u8, mp4
|
||||||
|
|
||||||
Video* = object
|
Video* = object
|
||||||
contentType*: VideoType
|
contentId*: string
|
||||||
|
playbackType*: VideoType
|
||||||
|
durationMs*: int
|
||||||
url*: string
|
url*: string
|
||||||
thumb*: string
|
thumb*: string
|
||||||
id*: string
|
|
||||||
views*: string
|
views*: string
|
||||||
length*: int
|
|
||||||
available*: bool
|
available*: bool
|
||||||
|
|
||||||
Gif* = object
|
Gif* = object
|
||||||
|
|
|
@ -88,12 +88,19 @@
|
||||||
#
|
#
|
||||||
#proc renderVideo(video: Video): string =
|
#proc renderVideo(video: Video): string =
|
||||||
<div class="attachments">
|
<div class="attachments">
|
||||||
<div class="gallery-row" style="max-height: unset;">
|
<div class="gallery-video">
|
||||||
<div class="attachment image">
|
<div class="attachment video-container">
|
||||||
|
#case video.playbackType
|
||||||
|
#of mp4:
|
||||||
|
<video poster=${video.thumb.getSigUrl("pic")} controls>
|
||||||
|
<source src=${video.url.getSigUrl("video")} type="video/mp4">
|
||||||
|
</video>
|
||||||
|
#of m3u8, vmap:
|
||||||
<video poster=${video.thumb.getSigUrl("pic")} autoplay muted loop></video>
|
<video poster=${video.thumb.getSigUrl("pic")} autoplay muted loop></video>
|
||||||
<div class="video-overlay">
|
<div class="video-overlay">
|
||||||
<p>Video playback not supported</p>
|
<p>Video playback not supported</p>
|
||||||
</div>
|
</div>
|
||||||
|
#end case
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
Loading…
Reference in New Issue