diff --git a/package.json b/package.json
index d5d370b7d..4e7985316 100755
--- a/package.json
+++ b/package.json
@@ -10,6 +10,7 @@
"oldVersions": "https://raw.githubusercontent.com/ccd0/4chan-x/",
"faq": "https://github.com/ccd0/4chan-x/wiki/Frequently-Asked-Questions",
"appid": "lacclbnghgdicfifcamcmcnilckjamag",
+ "youtubeAPIKey": "AIzaSyB5_zaen_-46Uhz1xGR-lz1YoUMHqCD6CE",
"buildsPath": "builds/",
"mainBranch": "master",
"matches": [
@@ -66,4 +67,4 @@
"engines": {
"node": ">=0.10"
}
-}
\ No newline at end of file
+}
diff --git a/src/Linkification/Linkify.coffee b/src/Linkification/Linkify.coffee
index f882b8fab..582177911 100755
--- a/src/Linkification/Linkify.coffee
+++ b/src/Linkification/Linkify.coffee
@@ -12,6 +12,11 @@ Linkify =
name: 'Linkify'
cb: @node
+ $.on d, '4chanXInitFinished PostsInserted', ->
+ for key, service of Linkify.types when service.title?.batchSize
+ Linkify.flushTitles service.title
+ return
+
events: (post) ->
i = 0
items = $$ '.embedder', post.nodes.comment
@@ -69,7 +74,7 @@ Linkify =
embedProcess: (link, post) ->
if data = Linkify.services link
- data.push post
+ data.post = post
Linkify.embed data if Conf['Embedding']
Linkify.title data if Conf['Link Title']
@@ -146,11 +151,11 @@ Linkify =
{href} = link
for type in Linkify.ordered_types when match = type.regExp.exec href
return if type.dummy or type.httpOnly and location.protocol isnt 'http:'
- return [type.key, match[1], match[2], link]
+ return {key: type.key, uid: match[1], options: match[2], link}
return
embed: (data) ->
- [key, uid, options, link, post] = data
+ {key, uid, options, link, post} = data
embed = $.el 'a',
className: 'embedder'
rel: 'nofollow noreferrer'
@@ -169,10 +174,27 @@ Linkify =
Linkify.cb.toggle.call embed
title: (data) ->
- [key, uid, options, link, post] = data
+ {key, uid, options, link, post} = data
return unless service = Linkify.types[key].title
- unless $.cache service.api(uid), (-> Linkify.cb.title @, data), {responseType: 'json'}
- $.extend link, <%= html('[${key}] Title Link Blocked (are you using NoScript?)') %>
+ if service.batchSize
+ (service.queue or= []).push data
+ if service.queue.length >= service.batchSize
+ Linkify.flushTitles service
+ else
+ unless $.cache service.api(uid), (-> Linkify.cb.title @, data), {responseType: 'json'}
+ $.extend link, <%= html('[${key}] Title Link Blocked (are you using NoScript?)') %>
+
+ flushTitles: (service) ->
+ {queue} = service
+ return unless queue?.length
+ service.queue = []
+ cb = ->
+ Linkify.cb.title @, data for data in queue
+ return
+ unless $.cache service.api(data.uid for data in queue), cb, {responseType: 'json'}
+ for data in queue
+ $.extend data.link, <%= html('[${data.key}] Title Link Blocked (are you using NoScript?)') %>
+ return
cb:
toggle: (e) ->
@@ -200,13 +222,13 @@ Linkify =
return el
title: (req, data) ->
- [key, uid, options, link, post] = data
+ {key, uid, options, link, post} = data
{status} = req
service = Linkify.types[key].title
text = "[#{key}] #{switch status
when 200, 304
- service.text req.response
+ service.text req.response, uid
when 404
"Not Found"
when 403
@@ -394,8 +416,15 @@ Linkify =
el.setAttribute "allowfullscreen", "true"
el
title:
- api: (uid) -> "https://gdata.youtube.com/feeds/api/videos/#{uid}?alt=json&fields=title/text(),yt:noembed,app:control/yt:state/@reasonCode"
- text: (data) -> data.entry.title.$t
+ batchSize: 50
+ api: (uids) ->
+ ids = encodeURIComponent uids.join(',')
+ key = '<%= meta.youtubeAPIKey %>'
+ "https://www.googleapis.com/youtube/v3/videos?part=snippet&id=#{ids}&fields=items%28id%2Csnippet%28title%29%29&key=#{key}"
+ text: (data, uid) ->
+ for item in data.items when item.id is uid
+ return item.snippet.title
+ 'Not Found'
,
key: 'Loopvid'
regExp: /^\w+:\/\/(?:www\.)?loopvid.appspot.com\/((?:pf|kd|lv|mc|gd|gh|db|nn)\/[\w\-]+(,[\w\-]+)*|fc\/\w+\/\d+)/