Preliminary video support
This commit is contained in:
		
							parent
							
								
									cea5cc0523
								
							
						
					
					
						commit
						a9826151e9
					
				| 
						 | 
					@ -559,3 +559,22 @@ nav {
 | 
				
			||||||
    font-size: 21px;
 | 
					    font-size: 21px;
 | 
				
			||||||
    font-weight: bold;
 | 
					    font-weight: bold;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.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;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -9,7 +9,7 @@ proc getAttr(node: XmlNode; attr: string; default=""): string =
 | 
				
			||||||
 | 
					
 | 
				
			||||||
proc selectAttr(node: XmlNode; selector: string; attr: string; default=""): string =
 | 
					proc selectAttr(node: XmlNode; selector: string; attr: string; default=""): string =
 | 
				
			||||||
  let res = node.querySelector(selector)
 | 
					  let res = node.querySelector(selector)
 | 
				
			||||||
  return res.getAttr(attr, default)
 | 
					  if res == nil: "" else: res.getAttr(attr, default)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
proc selectText(node: XmlNode; selector: string): string =
 | 
					proc selectText(node: XmlNode; selector: string): string =
 | 
				
			||||||
  let res = node.querySelector(selector)
 | 
					  let res = node.querySelector(selector)
 | 
				
			||||||
| 
						 | 
					@ -63,9 +63,8 @@ proc parseTweet*(tweet: XmlNode): Tweet =
 | 
				
			||||||
    let
 | 
					    let
 | 
				
			||||||
      text = action.innerText.split()
 | 
					      text = action.innerText.split()
 | 
				
			||||||
      num = text[0]
 | 
					      num = text[0]
 | 
				
			||||||
      act = text[1]
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case act
 | 
					    case text[1]
 | 
				
			||||||
    of "replies": result.replies = num
 | 
					    of "replies": result.replies = num
 | 
				
			||||||
    of "likes": result.likes = num
 | 
					    of "likes": result.likes = num
 | 
				
			||||||
    of "retweets": result.retweets = num
 | 
					    of "retweets": result.retweets = num
 | 
				
			||||||
| 
						 | 
					@ -74,9 +73,13 @@ proc parseTweet*(tweet: XmlNode): Tweet =
 | 
				
			||||||
  for photo in tweet.querySelectorAll(".AdaptiveMedia-photoContainer"):
 | 
					  for photo in tweet.querySelectorAll(".AdaptiveMedia-photoContainer"):
 | 
				
			||||||
    result.photos.add photo.attrs["data-image-url"]
 | 
					    result.photos.add photo.attrs["data-image-url"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  let gif = tweet.selectAttr(".PlayableMedia-player", "style")
 | 
					  let player = tweet.selectAttr(".PlayableMedia-player", "style")
 | 
				
			||||||
  if gif != "":
 | 
					  if player.len > 0:
 | 
				
			||||||
    result.gif = gif.replace(re".+thumb/([^\.']+)\.jpg.+", "$1")
 | 
					    let thumb = player.replace(re".+:url\('([^']+)'\)", "$1")
 | 
				
			||||||
 | 
					    if "tweet_video" in thumb:
 | 
				
			||||||
 | 
					      result.gif = thumb.replace(re".+thumb/([^\.']+)\.jpg.+", "$1")
 | 
				
			||||||
 | 
					    else:
 | 
				
			||||||
 | 
					      result.videoThumb = thumb
 | 
				
			||||||
 | 
					
 | 
				
			||||||
proc parseTweets*(node: XmlNode): Tweets =
 | 
					proc parseTweets*(node: XmlNode): Tweets =
 | 
				
			||||||
  if node.isNil: return
 | 
					  if node.isNil: return
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -27,6 +27,8 @@ type
 | 
				
			||||||
    pinned*: bool
 | 
					    pinned*: bool
 | 
				
			||||||
    photos*: seq[string]
 | 
					    photos*: seq[string]
 | 
				
			||||||
    gif*: string
 | 
					    gif*: string
 | 
				
			||||||
 | 
					    video*: string
 | 
				
			||||||
 | 
					    videoThumb*: string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Tweets* = seq[Tweet]
 | 
					  Tweets* = seq[Tweet]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -55,6 +55,19 @@
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
#end proc
 | 
					#end proc
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
 | 
					#proc renderVideo(tweet: Tweet): string =
 | 
				
			||||||
 | 
					<div class="attachments media-body">
 | 
				
			||||||
 | 
					  <div class="gallery-row" style="max-height: unset;">
 | 
				
			||||||
 | 
					    <div class="attachment image">
 | 
				
			||||||
 | 
					    <video poster=${tweet.videoThumb} style="width: 100%; height: 100%;" autoplay muted loop></video>
 | 
				
			||||||
 | 
					    <div class="video-overlay">
 | 
				
			||||||
 | 
					      <p>Video playback not supported</p>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					#end proc
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
#proc renderGif(tweet: Tweet): string =
 | 
					#proc renderGif(tweet: Tweet): string =
 | 
				
			||||||
#let thumbUrl = getGifThumb(tweet).getSigUrl("pic")
 | 
					#let thumbUrl = getGifThumb(tweet).getSigUrl("pic")
 | 
				
			||||||
#let videoUrl = getGifSrc(tweet).getSigUrl("video")
 | 
					#let videoUrl = getGifSrc(tweet).getSigUrl("video")
 | 
				
			||||||
| 
						 | 
					@ -89,6 +102,8 @@
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
      #if tweet.photos.len > 0:
 | 
					      #if tweet.photos.len > 0:
 | 
				
			||||||
        ${renderMediaGroup(tweet)}
 | 
					        ${renderMediaGroup(tweet)}
 | 
				
			||||||
 | 
					      #elif tweet.videoThumb.len > 0:
 | 
				
			||||||
 | 
					        ${renderVideo(tweet)}
 | 
				
			||||||
      #elif tweet.gif.len > 0:
 | 
					      #elif tweet.gif.len > 0:
 | 
				
			||||||
        ${renderGif(tweet)}
 | 
					        ${renderGif(tweet)}
 | 
				
			||||||
      #end if
 | 
					      #end if
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue