93 lines
3.0 KiB
CoffeeScript
93 lines
3.0 KiB
CoffeeScript
ImageCommon =
|
|
# Pause and mute video in preparation for removing the element from the document.
|
|
pause: (video) ->
|
|
return unless video.nodeName is 'VIDEO'
|
|
video.pause()
|
|
$.off video, 'volumechange', Volume.change
|
|
video.muted = true
|
|
|
|
pushCache: (el) ->
|
|
ImageCommon.cache = el
|
|
$.on el, 'error', ImageCommon.cacheError
|
|
|
|
popCache: ->
|
|
el = ImageCommon.cache
|
|
$.off el, 'error', ImageCommon.cacheError
|
|
delete ImageCommon.cache
|
|
el
|
|
|
|
cacheError: ->
|
|
delete ImageCommon.cache if ImageCommon.cache is @
|
|
|
|
decodeError: (file, post) ->
|
|
return false unless file.error?.code is MediaError.MEDIA_ERR_DECODE
|
|
unless message = $ '.warning', post.file.thumb.parentNode
|
|
message = $.el 'div', className: 'warning'
|
|
$.after post.file.thumb, message
|
|
message.textContent = 'Error: Corrupt or unplayable video'
|
|
return true
|
|
|
|
error: (file, post, delay, cb) ->
|
|
src = post.file.url.split '/'
|
|
URL = Redirect.to 'file',
|
|
boardID: post.board.ID
|
|
filename: src[src.length - 1]
|
|
unless Conf['404 Redirect'] and URL and Redirect.securityCheck URL
|
|
URL = null
|
|
|
|
return cb URL if (post.isDead or post.file.isDead) and file.src.split('/')[2] is 'i.4cdn.org'
|
|
|
|
timeoutID = setTimeout (-> cb URL), delay if delay?
|
|
return if post.isDead or post.file.isDead
|
|
redirect = ->
|
|
if file.src.split('/')[2] is 'i.4cdn.org'
|
|
clearTimeout timeoutID if delay?
|
|
cb URL
|
|
|
|
$.ajax "//a.4cdn.org/#{post.board}/thread/#{post.thread}.json", onload: ->
|
|
post.kill !post.isClone if @status is 404
|
|
return redirect() if @status isnt 200
|
|
for postObj in @response.posts
|
|
break if postObj.no is post.ID
|
|
if postObj.no isnt post.ID
|
|
post.kill()
|
|
redirect()
|
|
else if postObj.filedeleted
|
|
post.kill true
|
|
redirect()
|
|
else
|
|
URL = post.file.url
|
|
|
|
# Add controls, but not until the mouse is moved over the video.
|
|
addControls: (video) ->
|
|
handler = ->
|
|
$.off video, 'mouseover', handler
|
|
# Hacky workaround for Firefox forever-loading bug for very short videos
|
|
t = new Date().getTime()
|
|
$.asap (-> $.engine isnt 'gecko' or (video.readyState >= 3 and video.currentTime <= Math.max 0.1, (video.duration - 0.5)) or new Date().getTime() >= t + 1000), ->
|
|
video.controls = true
|
|
$.on video, 'mouseover', handler
|
|
|
|
# XXX Estimate whether clicks are on the video controls and should be ignored.
|
|
onControls: (e) ->
|
|
(Conf['Show Controls'] and Conf['Click Passthrough'] and e.target.nodeName is 'VIDEO') or
|
|
(e.target.controls and e.target.getBoundingClientRect().bottom - e.clientY < 35)
|
|
|
|
download: (e) ->
|
|
return true if @protocol is 'blob:'
|
|
e.preventDefault()
|
|
{href, download} = @
|
|
CrossOrigin.file href, (blob) ->
|
|
if blob
|
|
a = $.el 'a',
|
|
href: URL.createObjectURL(blob)
|
|
download: download
|
|
hidden: true
|
|
$.add d.body, a
|
|
a.click()
|
|
$.rm a
|
|
else
|
|
new Notice 'warning', "Could not download #{href}", 20
|
|
|
|
return ImageCommon
|