diff --git a/CHANGELOG.md b/CHANGELOG.md index 6207aa1e7..1476c1137 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,15 @@ -Sometimes the changelog has notes (not comprehensive) acknowledging people's work. This does not mean the changes are their fault, only that their code was used. All changes to the script are chosen by and the fault of the maintainer (ccd0). +### v1.14.18 + +**v1.14.18.0** *(2020-04-28)* - [[Userscript](https://raw.githubusercontent.com/ccd0/4chan-x/1.14.18.0/builds/4chan-X-noupdate.user.js)] [[Chrome extension](https://raw.githubusercontent.com/ccd0/4chan-x/1.14.18.0/builds/4chan-X-noupdate.crx)] +- Based on v1.14.17.3. +- Switch to noembed.com for Youtube titles. This should fix most Youtube titles not loading. #2327 +- Use oEmbed for Clyp link titles so that they work in Chrome extension without additional permissions. +- Add AZcaptcha to solver service links. +- (saxamaphone69) CSS fixes for Quick Reply. + ### v1.14.17 **v1.14.17.3** *(2020-04-19)* - [[Userscript](https://raw.githubusercontent.com/ccd0/4chan-x/1.14.17.3/builds/4chan-X-noupdate.user.js)] [[Chrome extension](https://raw.githubusercontent.com/ccd0/4chan-x/1.14.17.3/builds/4chan-X-noupdate.crx)] diff --git a/builds/4chan-X-beta.crx b/builds/4chan-X-beta.crx index e39487330..f6a7340ad 100644 Binary files a/builds/4chan-X-beta.crx and b/builds/4chan-X-beta.crx differ diff --git a/builds/4chan-X-beta.meta.js b/builds/4chan-X-beta.meta.js index 298e8c2fa..4c569fbaa 100644 --- a/builds/4chan-X-beta.meta.js +++ b/builds/4chan-X-beta.meta.js @@ -1,6 +1,6 @@ // ==UserScript== // @name 4chan X beta -// @version 1.14.17.3 +// @version 1.14.18.0 // @minGMVer 1.14 // @minFFVer 26 // @namespace 4chan-X @@ -95,7 +95,7 @@ // @connect soundcloud.com // @connect api.streamable.com // @connect vimeo.com -// @connect www.googleapis.com +// @connect noembed.com // @connect * // @grant GM_getValue // @grant GM_setValue diff --git a/builds/4chan-X-beta.user.js b/builds/4chan-X-beta.user.js index dc706c098..dc3154494 100644 --- a/builds/4chan-X-beta.user.js +++ b/builds/4chan-X-beta.user.js @@ -1,6 +1,6 @@ // ==UserScript== // @name 4chan X beta -// @version 1.14.17.3 +// @version 1.14.18.0 // @minGMVer 1.14 // @minFFVer 26 // @namespace 4chan-X @@ -95,7 +95,7 @@ // @connect soundcloud.com // @connect api.streamable.com // @connect vimeo.com -// @connect www.googleapis.com +// @connect noembed.com // @connect * // @grant GM_getValue // @grant GM_setValue @@ -215,7 +215,7 @@ docSet = function() { }; g = { - VERSION: '1.14.17.3', + VERSION: '1.14.18.0', NAMESPACE: '4chan X.', sites: Object.create(null), boards: Object.create(null) @@ -587,16 +587,15 @@ Config = (function() { captchaServiceKey: [ { 'https://api.captcha.guru': '', + 'https://azcaptcha.com': '', 'https://2captcha.com': '' } ], fourchanImageHost: 'i.4cdn.org', hiddenPSAList: [{}], knownBanners: '0.jpg,1.jpg,2.jpg,4.jpg,6.jpg,7.jpg,8.jpg,9.jpg,10.jpg,11.jpg,12.jpg,13.jpg,14.jpg,16.jpg,17.jpg,18.jpg,19.jpg,20.jpg,21.jpg,22.jpg,24.jpg,25.jpg,26.jpg,28.jpg,29.jpg,33.jpg,38.jpg,39.jpg,43.jpg,44.jpg,45.jpg,46.jpg,47.jpg,52.jpg,54.jpg,57.jpg,59.jpg,60.jpg,61.jpg,64.jpg,66.jpg,67.jpg,69.jpg,71.jpg,72.jpg,76.jpg,77.jpg,81.jpg,82.jpg,83.jpg,84.jpg,88.jpg,90.jpg,91.jpg,96.jpg,98.jpg,99.jpg,100.jpg,104.jpg,106.jpg,116.jpg,119.jpg,137.jpg,140.jpg,148.jpg,149.jpg,150.jpg,154.jpg,156.jpg,157.jpg,158.jpg,159.jpg,161.jpg,162.jpg,164.jpg,165.jpg,166.jpg,167.jpg,168.jpg,169.jpg,170.jpg,171.jpg,172.jpg,173.jpg,174.jpg,175.jpg,176.jpg,178.jpg,179.jpg,180.jpg,181.jpg,182.jpg,183.jpg,186.jpg,189.jpg,190.jpg,192.jpg,193.jpg,194.jpg,197.jpg,198.jpg,200.jpg,201.jpg,202.jpg,203.jpg,205.jpg,206.jpg,207.jpg,208.jpg,210.jpg,213.jpg,214.jpg,215.jpg,216.jpg,218.jpg,219.jpg,220.jpg,221.jpg,222.jpg,223.jpg,224.jpg,227.jpg,0.png,1.png,2.png,3.png,5.png,6.png,9.png,10.png,11.png,12.png,14.png,16.png,19.png,20.png,21.png,22.png,23.png,24.png,26.png,27.png,28.png,29.png,30.png,31.png,32.png,33.png,34.png,37.png,39.png,40.png,41.png,42.png,43.png,44.png,45.png,48.png,49.png,50.png,51.png,52.png,53.png,57.png,58.png,59.png,64.png,66.png,67.png,68.png,69.png,70.png,71.png,72.png,76.png,78.png,79.png,81.png,82.png,85.png,86.png,87.png,89.png,95.png,98.png,100.png,101.png,102.png,105.png,106.png,107.png,109.png,110.png,111.png,112.png,113.png,114.png,115.png,116.png,118.png,119.png,120.png,121.png,122.png,123.png,126.png,128.png,130.png,134.png,136.png,138.png,139.png,140.png,142.png,145.png,146.png,149.png,150.png,151.png,152.png,153.png,154.png,155.png,156.png,157.png,158.png,159.png,160.png,163.png,164.png,165.png,166.png,167.png,168.png,169.png,170.png,171.png,172.png,173.png,174.png,178.png,179.png,180.png,181.png,182.png,184.png,186.png,188.png,190.png,192.png,193.png,194.png,195.png,196.png,197.png,198.png,200.png,202.png,203.png,205.png,206.png,207.png,209.png,212.png,213.png,214.png,216.png,217.png,218.png,219.png,220.png,221.png,222.png,223.png,224.png,225.png,226.png,229.png,231.png,232.png,233.png,234.png,235.png,237.png,238.png,239.png,240.png,241.png,242.png,244.png,245.png,246.png,247.png,248.png,249.png,250.png,253.png,254.png,255.png,256.png,257.png,258.png,259.png,260.png,262.png,268.png,0.gif,1.gif,2.gif,3.gif,4.gif,5.gif,6.gif,7.gif,8.gif,9.gif,10.gif,12.gif,13.gif,14.gif,15.gif,16.gif,18.gif,19.gif,20.gif,21.gif,22.gif,23.gif,24.gif,28.gif,29.gif,30.gif,33.gif,34.gif,35.gif,36.gif,37.gif,39.gif,40.gif,42.gif,44.gif,45.gif,46.gif,48.gif,50.gif,52.gif,54.gif,55.gif,57.gif,58.gif,59.gif,60.gif,61.gif,63.gif,64.gif,66.gif,67.gif,68.gif,69.gif,70.gif,72.gif,73.gif,75.gif,76.gif,77.gif,78.gif,80.gif,81.gif,82.gif,83.gif,86.gif,87.gif,88.gif,92.gif,93.gif,94.gif,95.gif,96.gif,97.gif,98.gif,99.gif,100.gif,101.gif,102.gif,103.gif,104.gif,105.gif,106.gif,108.gif,109.gif,110.gif,111.gif,112.gif,113.gif,115.gif,116.gif,117.gif,118.gif,119.gif,120.gif,122.gif,123.gif,124.gif,127.gif,129.gif,130.gif,131.gif,134.gif,135.gif,136.gif,138.gif,139.gif,141.gif,144.gif,146.gif,148.gif,149.gif,153.gif,154.gif,155.gif,157.gif,158.gif,159.gif,160.gif,161.gif,162.gif,164.gif,166.gif,167.gif,168.gif,169.gif,170.gif,171.gif,172.gif,173.gif,174.gif,175.gif,176.gif,177.gif,178.gif,181.gif,182.gif,183.gif,185.gif,186.gif,187.gif,188.gif,189.gif,190.gif,191.gif,192.gif,193.gif,195.gif,196.gif,197.gif,200.gif,201.gif,202.gif,203.gif,204.gif,205.gif,206.gif,207.gif,208.gif,209.gif,210.gif,211.gif,212.gif,213.gif,214.gif,215.gif,216.gif,217.gif,219.gif,220.gif,221.gif,222.gif,224.gif,225.gif,226.gif,227.gif,228.gif,230.gif,232.gif,233.gif,234.gif,235.gif,238.gif,240.gif,241.gif,243.gif,244.gif,245.gif,246.gif,247.gif,249.gif,250.gif,251.gif,253.gif', - cachedTitles: [[]], passMessageClosed: false, - 'Prerequest Captcha': false, - youtubeAPIKey: 'AIzaSyB5_zaen_-46Uhz1xGR-lz1YoUMHqCD6CE' + 'Prerequest Captcha': false }; return Config; @@ -2358,6 +2357,7 @@ div[data-checked=\"false\"] > .suboption-list {\n\ }\n\ .catalog-post .prettyprinted {\n\ max-width: 100%;\n\ + -moz-box-sizing: border-box;\n\ box-sizing: border-box;\n\ }\n\ .catalog-post .MathJax_Display {\n\ @@ -3030,6 +3030,7 @@ input.field.tripped:not(:hover):not(:focus) {\n\ }\n\ .field {\n\ -moz-box-sizing: border-box;\n\ + box-sizing: border-box;\n\ margin: 0px;\n\ padding: 2px 4px 3px;\n\ }\n\ @@ -3284,6 +3285,7 @@ input[type=\"checkbox\"]:checked ~ .checkbox-letter {\n\ }\n\ .qr-preview {\n\ -moz-box-sizing: border-box;\n\ + box-sizing: border-box;\n\ counter-increment: thumbnails;\n\ cursor: move;\n\ display: inline-block;\n\ @@ -3364,7 +3366,8 @@ a:only-of-type > .remove {\n\ position: absolute;\n\ bottom: 20px;\n\ right: 10px;\n\ - -moz-transform: translateY(-50%);\n\ + -webkit-transform: translateY(-50%);\n\ + transform: translateY(-50%);\n\ }\n\ .textarea {\n\ position: relative;\n\ @@ -13541,7 +13544,7 @@ Settings = (function() { }, advanced: function(section) { var applyCSS, boardSelect, customCSS, event, input, inputs, interval, items, itemsArchive, j, k, l, len, len1, len2, len3, listImageHost, m, name, ref, ref1, ref2, ref3, ref4, table, textContent, updateArchives, warning; - $.extend(section, {innerHTML: "
Archives
404 Redirect is disabled.
Thread redirectionPost fetchingFile redirection

Archive Lists: Each line below should be an archive list in this format or a URL to load an archive list from.
Archive properties can be overriden by another item with the same uid (or if absent, its name).
Last updated:
External Catalog
External Catalog is disabled. This will be used only as a fallback.
URLs of external catalog sites, where %board is to be replaced by the board name.
Each URL should be followed by ;boards: and optionally ;exclude: and a list of supported/excluded boards in the format explained in the Filter guide.
Override 4chan Image Host
Change 4chan image links to this domain. Leave blank for no change.
Captcha Language
Choose from list of language codes. Leave blank to autoselect.
Captcha Solving Service
Supported services include captcha.guru, 2captcha, and any other service implementing the 2captcha API.
Leave blank to disable.
Domain: API Key:
Youtube API Key
API key used to fetch Youtube link titles. You can obtain your own key here to make the feature work when the default key exceeds its quota.
Custom Board Navigation
New lines will be converted into spaces.

In the following examples for /g/, g can be changed to a different board ID (a, b, etc...), the current board (current), or the Twitter link (@).
Board link: g
Archive link: g-archive
Internal archive link: g-expired
Title link: g-title
Board link (Replace with title when on that board): g-replace
Full text link: g-full
Custom text link: g-text:"Install Gentoo"
Index-only link: g-index
Catalog-only link: g-catalog
Index mode: g-mode:"infinite scrolling"
Index sort: g-sort:"creation date rev"
External link: external-text:"Google","http://www.google.com"
Open in new tab: g-nt
Combinations are possible: g-index-text:"Technology Index"
Full board list toggle: toggle-all

[ toggle-all ] [current-title] [g-title / a-title / jp-title] [x / wsg / h] [t-text:"Piracy"]
will give you
[ + ] [Technology] [Technology / Anime & Manga / Otaku Culture] [x / wsg / h] [Piracy]
if you are on /g/.
Time Formatting is disabled.
:
Supported format specifiers:
Day: %a, %A, %d, %e
Month: %m, %b, %B
Year: %y, %Y
Hour: %k, %H, %l, %I, %p, %P
Minute: %M
Second: %S
Literal %: %%
Language tag:
Quote Backlinks formatting is disabled.
:
Default pasted content filename
.png
File Info Formatting is disabled.
:
Link: %l (truncated), %L (untruncated), %T (4chan filename)
Filename: %n (truncated), %N (untruncated), %t (4chan filename)
Download button: %d
Quick filter MD5: %f
Spoiler indicator: %p
Size: %B (Bytes), %K (KB), %M (MB), %s (4chan default)
Resolution: %r (Displays 'PDF' for PDF files)
Tag: %g
Literal %: %%
Quick Reply Personas

One item per line.
Items will be added in the relevant input's auto-completion list.
Password items will always be used, since there is no password input.
Lines starting with a # will be ignored.

Unread Favicon is disabled.
Thread Updater is disabled.
Interval: seconds
Custom Cooldown Time
Seconds:
For more information about customizing 4chan X's CSS, see the styling guide.
Javascript Whitelist
Sources from which Javascript is allowed to be loaded by Content Security Policy.
Lines starting with a # will be ignored.
Known Banners
List of known banners, used for click-to-change feature.
"}); + $.extend(section, {innerHTML: "
Archives
404 Redirect is disabled.
Thread redirectionPost fetchingFile redirection

Archive Lists: Each line below should be an archive list in this format or a URL to load an archive list from.
Archive properties can be overriden by another item with the same uid (or if absent, its name).
Last updated:
External Catalog
External Catalog is disabled. This will be used only as a fallback.
URLs of external catalog sites, where %board is to be replaced by the board name.
Each URL should be followed by ;boards: and optionally ;exclude: and a list of supported/excluded boards in the format explained in the Filter guide.
Override 4chan Image Host
Change 4chan image links to this domain. Leave blank for no change.
Captcha Language
Choose from list of language codes. Leave blank to autoselect.
Captcha Solving Service
Supported services include captcha.guru, AZcaptcha, 2captcha, and any other service implementing the 2captcha API.
Leave blank to disable.
Domain: API Key:
Custom Board Navigation
New lines will be converted into spaces.

In the following examples for /g/, g can be changed to a different board ID (a, b, etc...), the current board (current), or the Twitter link (@).
Board link: g
Archive link: g-archive
Internal archive link: g-expired
Title link: g-title
Board link (Replace with title when on that board): g-replace
Full text link: g-full
Custom text link: g-text:"Install Gentoo"
Index-only link: g-index
Catalog-only link: g-catalog
Index mode: g-mode:"infinite scrolling"
Index sort: g-sort:"creation date rev"
External link: external-text:"Google","http://www.google.com"
Open in new tab: g-nt
Combinations are possible: g-index-text:"Technology Index"
Full board list toggle: toggle-all

[ toggle-all ] [current-title] [g-title / a-title / jp-title] [x / wsg / h] [t-text:"Piracy"]
will give you
[ + ] [Technology] [Technology / Anime & Manga / Otaku Culture] [x / wsg / h] [Piracy]
if you are on /g/.
Time Formatting is disabled.
:
Supported format specifiers:
Day: %a, %A, %d, %e
Month: %m, %b, %B
Year: %y, %Y
Hour: %k, %H, %l, %I, %p, %P
Minute: %M
Second: %S
Literal %: %%
Language tag:
Quote Backlinks formatting is disabled.
:
Default pasted content filename
.png
File Info Formatting is disabled.
:
Link: %l (truncated), %L (untruncated), %T (4chan filename)
Filename: %n (truncated), %N (untruncated), %t (4chan filename)
Download button: %d
Quick filter MD5: %f
Spoiler indicator: %p
Size: %B (Bytes), %K (KB), %M (MB), %s (4chan default)
Resolution: %r (Displays 'PDF' for PDF files)
Tag: %g
Literal %: %%
Quick Reply Personas

One item per line.
Items will be added in the relevant input's auto-completion list.
Password items will always be used, since there is no password input.
Lines starting with a # will be ignored.

Unread Favicon is disabled.
Thread Updater is disabled.
Interval: seconds
Custom Cooldown Time
Seconds:
For more information about customizing 4chan X's CSS, see the styling guide.
Javascript Whitelist
Sources from which Javascript is allowed to be loaded by Content Security Policy.
Lines starting with a # will be ignored.
Known Banners
List of known banners, used for click-to-change feature.
"}); ref = $$('.warning', section); for (j = 0, len = ref.length; j < len; j++) { warning = ref[j]; @@ -16496,13 +16499,13 @@ Embedding = (function() { $.one(d, '4chanXInitFinished', this.ready); $.on(d, 'IndexRefreshInternal', function() { return g.posts.forEach(function(post) { - var embed, l, len1, len2, n, ref2, ref3; + var embed, k, l, len1, len2, ref2, ref3; ref2 = [post].concat(slice.call(post.clones)); - for (l = 0, len1 = ref2.length; l < len1; l++) { - post = ref2[l]; + for (k = 0, len1 = ref2.length; k < len1; k++) { + post = ref2[k]; ref3 = post.nodes.embedlinks; - for (n = 0, len2 = ref3.length; n < len2; n++) { - embed = ref3[n]; + for (l = 0, len2 = ref3.length; l < len2; l++) { + embed = ref3[l]; Embedding.cb.catalogRemove.call(embed); } } @@ -16510,7 +16513,7 @@ Embedding = (function() { }); } if (Conf['Link Title']) { - $.on(d, '4chanXInitFinished PostsInserted', function() { + return $.on(d, '4chanXInitFinished PostsInserted', function() { var key, ref2, ref3, service; ref2 = Embedding.types; for (key in ref2) { @@ -16520,8 +16523,6 @@ Embedding = (function() { } } }); - this.cache.init(Conf['cachedTitles']); - return $.sync('cachedTitles', this.cache.sync); } }, events: function(post) { @@ -16649,15 +16650,13 @@ Embedding = (function() { return style.pointerEvents = 'none'; }, title: function(data) { - var key, link, options, post, service, text, uid; + var key, link, options, post, service, uid; key = data.key, uid = data.uid, options = data.options, link = data.link, post = data.post; if (!(service = Embedding.types[key].title)) { return; } $.addClass(link, key.toLowerCase()); - if ((text = Embedding.cache.get(data))) { - return Embedding.cb.titleText(text, data); - } else if (service.batchSize) { + if (service.batchSize) { (service.queue || (service.queue = [])).push(data); if (service.queue.length >= service.batchSize) { return Embedding.flushTitles(service); @@ -16692,70 +16691,6 @@ Embedding = (function() { return results; })()), cb); }, - cache: (function() { - var get, init, newEntries, save, set, sync, titles; - titles = $.dict(); - newEntries = []; - init = function(data) { - var j, key, len, ref, text, uid; - try { - for (j = 0, len = data.length; j < len; j++) { - ref = data[j], key = ref.key, uid = ref.uid, text = ref.text; - titles[key + "." + uid] = text; - } - } catch (error) {} - }; - sync = function(data) { - var j, k, key, len, ref, text, uid; - try { - for (j = 0, len = data.length; j < len; j++) { - ref = data[j], key = ref.key, uid = ref.uid, text = ref.text; - k = key + "." + uid; - if (k in titles) { - break; - } - titles[k] = text; - } - } catch (error) {} - }; - get = function(arg) { - var key, uid; - key = arg.key, uid = arg.uid; - return titles[key + "." + uid]; - }; - set = function(arg, text) { - var key, uid; - key = arg.key, uid = arg.uid; - titles[key + "." + uid] = text; - newEntries.push({ - key: key, - uid: uid, - text: text - }); - return save(); - }; - save = $.debounce(2 * $.SECOND, function() { - return $.get('cachedTitles', Conf['cachedTitles'], function(arg) { - var cachedTitles; - cachedTitles = arg.cachedTitles; - sync(cachedTitles); - try { - cachedTitles = newEntries.concat(cachedTitles).slice(-1000); - } catch (error) { - cachedTitles = newEntries; - } - newEntries = []; - return $.set('cachedTitles', cachedTitles); - }); - }); - return { - init: init, - sync: sync, - get: get, - set: set, - save: save - }; - })(), preview: function(data) { var key, link, service, uid; key = data.key, uid = data.uid, link = data.link; @@ -16821,46 +16756,44 @@ Embedding = (function() { } }, title: function(req, data) { - var key, link, service, status, text, uid; - if (!req.status) { + var base1, j, k, key, len, len1, link, link2, options, post, post2, ref, ref1, service, status, text, uid; + key = data.key, uid = data.uid, options = data.options, link = data.link, post = data.post; + service = Embedding.types[key].title; + status = req.status; + if ((status === 200 || status === 304) && service.status) { + status = service.status(req.response)[0]; + } + if (!status) { return; } - key = data.key, uid = data.uid, link = data.link; - status = req.status; - service = Embedding.types[key].title; - switch (status) { - case 200: - case 304: - text = service.text(req.response, uid); - if (typeof text === 'string') { - Embedding.cache.set(data, text); - } else { - text = link.textContent; - } - break; - case 404: - text = "Not Found"; - break; - case 403: - text = service.ignore403 ? link.textContent : "Forbidden or Private"; - break; - default: - text = status + "'d"; - } - return Embedding.cb.titleText(text, data); - }, - titleText: function(text, data) { - var base1, j, key, l, len, len1, link, link2, post, post2, ref, ref1; - key = data.key, link = data.link, post = data.post; - text = "[" + key + "] " + text; + text = "[" + key + "] " + ((function() { + switch (status) { + case 200: + case 304: + text = service.text(req.response, uid); + if (typeof text === 'string') { + return text; + } else { + return text = link.textContent; + } + break; + case 404: + return "Not Found"; + case 403: + case 401: + return "Forbidden or Private"; + default: + return status + "'d"; + } + })()); link.dataset.original = link.textContent; link.textContent = text; ref = post.clones; for (j = 0, len = ref.length; j < len; j++) { post2 = ref[j]; ref1 = $$('a.linkify', post2.nodes.comment); - for (l = 0, len1 = ref1.length; l < len1; l++) { - link2 = ref1[l]; + for (k = 0, len1 = ref1.length; k < len1; k++) { + link2 = ref1[k]; if (!(link2.href === link.href)) { continue; } @@ -16947,10 +16880,10 @@ Embedding = (function() { }, title: { api: function(uid) { - return "https://api.clyp.it/" + uid; + return "https://api.clyp.it/oembed?url=https://clyp.it/" + uid; }, text: function(_) { - return _.Title; + return _.title; } } }, { @@ -17054,7 +16987,7 @@ Embedding = (function() { regExp: /^\w+:\/\/(?:www\.)?loopvid.appspot.com\/#?((?:pf|kd|lv|gd|gh|db|dx|nn|cp|wu|ig|ky|mf|m2|pc|1c|pi|ni|wl|ko|mm|ic|gc)\/[\w\-\/]+(?:,[\w\-\/]+)*|fc\/\w+\/\d+|https?:\/\/.+)/, style: 'max-width: 80vw; max-height: 80vh;', el: function(a) { - var _, base, el, host, j, l, len, len1, len2, n, name, names, ref, ref1, type, types, url, urls; + var _, base, el, host, j, k, l, len, len1, len2, name, names, ref, ref1, type, types, url, urls; el = $.el('video', { controls: true, preload: 'auto', @@ -17082,8 +17015,8 @@ Embedding = (function() { ref1 = names.split(','); for (j = 0, len = ref1.length; j < len; j++) { name = ref1[j]; - for (l = 0, len1 = types.length; l < len1; l++) { - type = types[l]; + for (k = 0, len1 = types.length; k < len1; k++) { + type = types[k]; base = "" + name + type; urls = (function() { switch (host) { @@ -17137,8 +17070,8 @@ Embedding = (function() { return ["https://" + type + ".gfycat.com/" + name + ".webm"]; } })(); - for (n = 0, len2 = urls.length; n < len2; n++) { - url = urls[n]; + for (l = 0, len2 = urls.length; l < len2; l++) { + url = urls[l]; $.add(el, $.el('source', { src: url })); @@ -17332,24 +17265,20 @@ Embedding = (function() { return el; }, title: { - batchSize: 50, - ignore403: true, - api: function(uids) { - var ids, key; - ids = encodeURIComponent(uids.join(',')); - key = Conf['youtubeAPIKey']; - return "https://www.googleapis.com/youtube/v3/videos?part=snippet&id=" + ids + "&fields=items%28id%2Csnippet%28title%29%29&key=" + key; + api: function(uid) { + return "https://noembed.com/embed?url=https%3A//www.youtube.com/watch%3Fv%3D" + uid + "&format=json"; }, - text: function(data, uid) { - var item, j, len, ref; - ref = data.items; - for (j = 0, len = ref.length; j < len; j++) { - item = ref[j]; - if (item.id === uid) { - return item.snippet.title; - } + text: function(_) { + return _.title; + }, + status: function(_) { + var m; + if (_.error) { + m = _.error.match(/^(\d*)\s*(.*)/); + return [+m[1], m[2]]; + } else { + return [200, 'OK']; } - return 'Not Found'; } }, preview: { diff --git a/builds/4chan-X-noupdate.crx b/builds/4chan-X-noupdate.crx index f3f7fef3f..263236945 100644 Binary files a/builds/4chan-X-noupdate.crx and b/builds/4chan-X-noupdate.crx differ diff --git a/builds/4chan-X-noupdate.user.js b/builds/4chan-X-noupdate.user.js index 608932059..6d3f4b984 100644 --- a/builds/4chan-X-noupdate.user.js +++ b/builds/4chan-X-noupdate.user.js @@ -1,6 +1,6 @@ // ==UserScript== // @name 4chan X -// @version 1.14.17.3 +// @version 1.14.18.0 // @minGMVer 1.14 // @minFFVer 26 // @namespace 4chan-X @@ -95,7 +95,7 @@ // @connect soundcloud.com // @connect api.streamable.com // @connect vimeo.com -// @connect www.googleapis.com +// @connect noembed.com // @connect * // @grant GM_getValue // @grant GM_setValue @@ -215,7 +215,7 @@ docSet = function() { }; g = { - VERSION: '1.14.17.3', + VERSION: '1.14.18.0', NAMESPACE: '4chan X.', sites: Object.create(null), boards: Object.create(null) @@ -587,16 +587,15 @@ Config = (function() { captchaServiceKey: [ { 'https://api.captcha.guru': '', + 'https://azcaptcha.com': '', 'https://2captcha.com': '' } ], fourchanImageHost: 'i.4cdn.org', hiddenPSAList: [{}], knownBanners: '0.jpg,1.jpg,2.jpg,4.jpg,6.jpg,7.jpg,8.jpg,9.jpg,10.jpg,11.jpg,12.jpg,13.jpg,14.jpg,16.jpg,17.jpg,18.jpg,19.jpg,20.jpg,21.jpg,22.jpg,24.jpg,25.jpg,26.jpg,28.jpg,29.jpg,33.jpg,38.jpg,39.jpg,43.jpg,44.jpg,45.jpg,46.jpg,47.jpg,52.jpg,54.jpg,57.jpg,59.jpg,60.jpg,61.jpg,64.jpg,66.jpg,67.jpg,69.jpg,71.jpg,72.jpg,76.jpg,77.jpg,81.jpg,82.jpg,83.jpg,84.jpg,88.jpg,90.jpg,91.jpg,96.jpg,98.jpg,99.jpg,100.jpg,104.jpg,106.jpg,116.jpg,119.jpg,137.jpg,140.jpg,148.jpg,149.jpg,150.jpg,154.jpg,156.jpg,157.jpg,158.jpg,159.jpg,161.jpg,162.jpg,164.jpg,165.jpg,166.jpg,167.jpg,168.jpg,169.jpg,170.jpg,171.jpg,172.jpg,173.jpg,174.jpg,175.jpg,176.jpg,178.jpg,179.jpg,180.jpg,181.jpg,182.jpg,183.jpg,186.jpg,189.jpg,190.jpg,192.jpg,193.jpg,194.jpg,197.jpg,198.jpg,200.jpg,201.jpg,202.jpg,203.jpg,205.jpg,206.jpg,207.jpg,208.jpg,210.jpg,213.jpg,214.jpg,215.jpg,216.jpg,218.jpg,219.jpg,220.jpg,221.jpg,222.jpg,223.jpg,224.jpg,227.jpg,0.png,1.png,2.png,3.png,5.png,6.png,9.png,10.png,11.png,12.png,14.png,16.png,19.png,20.png,21.png,22.png,23.png,24.png,26.png,27.png,28.png,29.png,30.png,31.png,32.png,33.png,34.png,37.png,39.png,40.png,41.png,42.png,43.png,44.png,45.png,48.png,49.png,50.png,51.png,52.png,53.png,57.png,58.png,59.png,64.png,66.png,67.png,68.png,69.png,70.png,71.png,72.png,76.png,78.png,79.png,81.png,82.png,85.png,86.png,87.png,89.png,95.png,98.png,100.png,101.png,102.png,105.png,106.png,107.png,109.png,110.png,111.png,112.png,113.png,114.png,115.png,116.png,118.png,119.png,120.png,121.png,122.png,123.png,126.png,128.png,130.png,134.png,136.png,138.png,139.png,140.png,142.png,145.png,146.png,149.png,150.png,151.png,152.png,153.png,154.png,155.png,156.png,157.png,158.png,159.png,160.png,163.png,164.png,165.png,166.png,167.png,168.png,169.png,170.png,171.png,172.png,173.png,174.png,178.png,179.png,180.png,181.png,182.png,184.png,186.png,188.png,190.png,192.png,193.png,194.png,195.png,196.png,197.png,198.png,200.png,202.png,203.png,205.png,206.png,207.png,209.png,212.png,213.png,214.png,216.png,217.png,218.png,219.png,220.png,221.png,222.png,223.png,224.png,225.png,226.png,229.png,231.png,232.png,233.png,234.png,235.png,237.png,238.png,239.png,240.png,241.png,242.png,244.png,245.png,246.png,247.png,248.png,249.png,250.png,253.png,254.png,255.png,256.png,257.png,258.png,259.png,260.png,262.png,268.png,0.gif,1.gif,2.gif,3.gif,4.gif,5.gif,6.gif,7.gif,8.gif,9.gif,10.gif,12.gif,13.gif,14.gif,15.gif,16.gif,18.gif,19.gif,20.gif,21.gif,22.gif,23.gif,24.gif,28.gif,29.gif,30.gif,33.gif,34.gif,35.gif,36.gif,37.gif,39.gif,40.gif,42.gif,44.gif,45.gif,46.gif,48.gif,50.gif,52.gif,54.gif,55.gif,57.gif,58.gif,59.gif,60.gif,61.gif,63.gif,64.gif,66.gif,67.gif,68.gif,69.gif,70.gif,72.gif,73.gif,75.gif,76.gif,77.gif,78.gif,80.gif,81.gif,82.gif,83.gif,86.gif,87.gif,88.gif,92.gif,93.gif,94.gif,95.gif,96.gif,97.gif,98.gif,99.gif,100.gif,101.gif,102.gif,103.gif,104.gif,105.gif,106.gif,108.gif,109.gif,110.gif,111.gif,112.gif,113.gif,115.gif,116.gif,117.gif,118.gif,119.gif,120.gif,122.gif,123.gif,124.gif,127.gif,129.gif,130.gif,131.gif,134.gif,135.gif,136.gif,138.gif,139.gif,141.gif,144.gif,146.gif,148.gif,149.gif,153.gif,154.gif,155.gif,157.gif,158.gif,159.gif,160.gif,161.gif,162.gif,164.gif,166.gif,167.gif,168.gif,169.gif,170.gif,171.gif,172.gif,173.gif,174.gif,175.gif,176.gif,177.gif,178.gif,181.gif,182.gif,183.gif,185.gif,186.gif,187.gif,188.gif,189.gif,190.gif,191.gif,192.gif,193.gif,195.gif,196.gif,197.gif,200.gif,201.gif,202.gif,203.gif,204.gif,205.gif,206.gif,207.gif,208.gif,209.gif,210.gif,211.gif,212.gif,213.gif,214.gif,215.gif,216.gif,217.gif,219.gif,220.gif,221.gif,222.gif,224.gif,225.gif,226.gif,227.gif,228.gif,230.gif,232.gif,233.gif,234.gif,235.gif,238.gif,240.gif,241.gif,243.gif,244.gif,245.gif,246.gif,247.gif,249.gif,250.gif,251.gif,253.gif', - cachedTitles: [[]], passMessageClosed: false, - 'Prerequest Captcha': false, - youtubeAPIKey: 'AIzaSyB5_zaen_-46Uhz1xGR-lz1YoUMHqCD6CE' + 'Prerequest Captcha': false }; return Config; @@ -2358,6 +2357,7 @@ div[data-checked=\"false\"] > .suboption-list {\n\ }\n\ .catalog-post .prettyprinted {\n\ max-width: 100%;\n\ + -moz-box-sizing: border-box;\n\ box-sizing: border-box;\n\ }\n\ .catalog-post .MathJax_Display {\n\ @@ -3030,6 +3030,7 @@ input.field.tripped:not(:hover):not(:focus) {\n\ }\n\ .field {\n\ -moz-box-sizing: border-box;\n\ + box-sizing: border-box;\n\ margin: 0px;\n\ padding: 2px 4px 3px;\n\ }\n\ @@ -3284,6 +3285,7 @@ input[type=\"checkbox\"]:checked ~ .checkbox-letter {\n\ }\n\ .qr-preview {\n\ -moz-box-sizing: border-box;\n\ + box-sizing: border-box;\n\ counter-increment: thumbnails;\n\ cursor: move;\n\ display: inline-block;\n\ @@ -3364,7 +3366,8 @@ a:only-of-type > .remove {\n\ position: absolute;\n\ bottom: 20px;\n\ right: 10px;\n\ - -moz-transform: translateY(-50%);\n\ + -webkit-transform: translateY(-50%);\n\ + transform: translateY(-50%);\n\ }\n\ .textarea {\n\ position: relative;\n\ @@ -13541,7 +13544,7 @@ Settings = (function() { }, advanced: function(section) { var applyCSS, boardSelect, customCSS, event, input, inputs, interval, items, itemsArchive, j, k, l, len, len1, len2, len3, listImageHost, m, name, ref, ref1, ref2, ref3, ref4, table, textContent, updateArchives, warning; - $.extend(section, {innerHTML: "
Archives
404 Redirect is disabled.
Thread redirectionPost fetchingFile redirection

Archive Lists: Each line below should be an archive list in this format or a URL to load an archive list from.
Archive properties can be overriden by another item with the same uid (or if absent, its name).
Last updated:
External Catalog
External Catalog is disabled. This will be used only as a fallback.
URLs of external catalog sites, where %board is to be replaced by the board name.
Each URL should be followed by ;boards: and optionally ;exclude: and a list of supported/excluded boards in the format explained in the Filter guide.
Override 4chan Image Host
Change 4chan image links to this domain. Leave blank for no change.
Captcha Language
Choose from list of language codes. Leave blank to autoselect.
Captcha Solving Service
Supported services include captcha.guru, 2captcha, and any other service implementing the 2captcha API.
Leave blank to disable.
Domain: API Key:
Youtube API Key
API key used to fetch Youtube link titles. You can obtain your own key here to make the feature work when the default key exceeds its quota.
Custom Board Navigation
New lines will be converted into spaces.

In the following examples for /g/, g can be changed to a different board ID (a, b, etc...), the current board (current), or the Twitter link (@).
Board link: g
Archive link: g-archive
Internal archive link: g-expired
Title link: g-title
Board link (Replace with title when on that board): g-replace
Full text link: g-full
Custom text link: g-text:"Install Gentoo"
Index-only link: g-index
Catalog-only link: g-catalog
Index mode: g-mode:"infinite scrolling"
Index sort: g-sort:"creation date rev"
External link: external-text:"Google","http://www.google.com"
Open in new tab: g-nt
Combinations are possible: g-index-text:"Technology Index"
Full board list toggle: toggle-all

[ toggle-all ] [current-title] [g-title / a-title / jp-title] [x / wsg / h] [t-text:"Piracy"]
will give you
[ + ] [Technology] [Technology / Anime & Manga / Otaku Culture] [x / wsg / h] [Piracy]
if you are on /g/.
Time Formatting is disabled.
:
Supported format specifiers:
Day: %a, %A, %d, %e
Month: %m, %b, %B
Year: %y, %Y
Hour: %k, %H, %l, %I, %p, %P
Minute: %M
Second: %S
Literal %: %%
Language tag:
Quote Backlinks formatting is disabled.
:
Default pasted content filename
.png
File Info Formatting is disabled.
:
Link: %l (truncated), %L (untruncated), %T (4chan filename)
Filename: %n (truncated), %N (untruncated), %t (4chan filename)
Download button: %d
Quick filter MD5: %f
Spoiler indicator: %p
Size: %B (Bytes), %K (KB), %M (MB), %s (4chan default)
Resolution: %r (Displays 'PDF' for PDF files)
Tag: %g
Literal %: %%
Quick Reply Personas

One item per line.
Items will be added in the relevant input's auto-completion list.
Password items will always be used, since there is no password input.
Lines starting with a # will be ignored.

Unread Favicon is disabled.
Thread Updater is disabled.
Interval: seconds
Custom Cooldown Time
Seconds:
For more information about customizing 4chan X's CSS, see the styling guide.
Javascript Whitelist
Sources from which Javascript is allowed to be loaded by Content Security Policy.
Lines starting with a # will be ignored.
Known Banners
List of known banners, used for click-to-change feature.
"}); + $.extend(section, {innerHTML: "
Archives
404 Redirect is disabled.
Thread redirectionPost fetchingFile redirection

Archive Lists: Each line below should be an archive list in this format or a URL to load an archive list from.
Archive properties can be overriden by another item with the same uid (or if absent, its name).
Last updated:
External Catalog
External Catalog is disabled. This will be used only as a fallback.
URLs of external catalog sites, where %board is to be replaced by the board name.
Each URL should be followed by ;boards: and optionally ;exclude: and a list of supported/excluded boards in the format explained in the Filter guide.
Override 4chan Image Host
Change 4chan image links to this domain. Leave blank for no change.
Captcha Language
Choose from list of language codes. Leave blank to autoselect.
Captcha Solving Service
Supported services include captcha.guru, AZcaptcha, 2captcha, and any other service implementing the 2captcha API.
Leave blank to disable.
Domain: API Key:
Custom Board Navigation
New lines will be converted into spaces.

In the following examples for /g/, g can be changed to a different board ID (a, b, etc...), the current board (current), or the Twitter link (@).
Board link: g
Archive link: g-archive
Internal archive link: g-expired
Title link: g-title
Board link (Replace with title when on that board): g-replace
Full text link: g-full
Custom text link: g-text:"Install Gentoo"
Index-only link: g-index
Catalog-only link: g-catalog
Index mode: g-mode:"infinite scrolling"
Index sort: g-sort:"creation date rev"
External link: external-text:"Google","http://www.google.com"
Open in new tab: g-nt
Combinations are possible: g-index-text:"Technology Index"
Full board list toggle: toggle-all

[ toggle-all ] [current-title] [g-title / a-title / jp-title] [x / wsg / h] [t-text:"Piracy"]
will give you
[ + ] [Technology] [Technology / Anime & Manga / Otaku Culture] [x / wsg / h] [Piracy]
if you are on /g/.
Time Formatting is disabled.
:
Supported format specifiers:
Day: %a, %A, %d, %e
Month: %m, %b, %B
Year: %y, %Y
Hour: %k, %H, %l, %I, %p, %P
Minute: %M
Second: %S
Literal %: %%
Language tag:
Quote Backlinks formatting is disabled.
:
Default pasted content filename
.png
File Info Formatting is disabled.
:
Link: %l (truncated), %L (untruncated), %T (4chan filename)
Filename: %n (truncated), %N (untruncated), %t (4chan filename)
Download button: %d
Quick filter MD5: %f
Spoiler indicator: %p
Size: %B (Bytes), %K (KB), %M (MB), %s (4chan default)
Resolution: %r (Displays 'PDF' for PDF files)
Tag: %g
Literal %: %%
Quick Reply Personas

One item per line.
Items will be added in the relevant input's auto-completion list.
Password items will always be used, since there is no password input.
Lines starting with a # will be ignored.

Unread Favicon is disabled.
Thread Updater is disabled.
Interval: seconds
Custom Cooldown Time
Seconds:
For more information about customizing 4chan X's CSS, see the styling guide.
Javascript Whitelist
Sources from which Javascript is allowed to be loaded by Content Security Policy.
Lines starting with a # will be ignored.
Known Banners
List of known banners, used for click-to-change feature.
"}); ref = $$('.warning', section); for (j = 0, len = ref.length; j < len; j++) { warning = ref[j]; @@ -16496,13 +16499,13 @@ Embedding = (function() { $.one(d, '4chanXInitFinished', this.ready); $.on(d, 'IndexRefreshInternal', function() { return g.posts.forEach(function(post) { - var embed, l, len1, len2, n, ref2, ref3; + var embed, k, l, len1, len2, ref2, ref3; ref2 = [post].concat(slice.call(post.clones)); - for (l = 0, len1 = ref2.length; l < len1; l++) { - post = ref2[l]; + for (k = 0, len1 = ref2.length; k < len1; k++) { + post = ref2[k]; ref3 = post.nodes.embedlinks; - for (n = 0, len2 = ref3.length; n < len2; n++) { - embed = ref3[n]; + for (l = 0, len2 = ref3.length; l < len2; l++) { + embed = ref3[l]; Embedding.cb.catalogRemove.call(embed); } } @@ -16510,7 +16513,7 @@ Embedding = (function() { }); } if (Conf['Link Title']) { - $.on(d, '4chanXInitFinished PostsInserted', function() { + return $.on(d, '4chanXInitFinished PostsInserted', function() { var key, ref2, ref3, service; ref2 = Embedding.types; for (key in ref2) { @@ -16520,8 +16523,6 @@ Embedding = (function() { } } }); - this.cache.init(Conf['cachedTitles']); - return $.sync('cachedTitles', this.cache.sync); } }, events: function(post) { @@ -16649,15 +16650,13 @@ Embedding = (function() { return style.pointerEvents = 'none'; }, title: function(data) { - var key, link, options, post, service, text, uid; + var key, link, options, post, service, uid; key = data.key, uid = data.uid, options = data.options, link = data.link, post = data.post; if (!(service = Embedding.types[key].title)) { return; } $.addClass(link, key.toLowerCase()); - if ((text = Embedding.cache.get(data))) { - return Embedding.cb.titleText(text, data); - } else if (service.batchSize) { + if (service.batchSize) { (service.queue || (service.queue = [])).push(data); if (service.queue.length >= service.batchSize) { return Embedding.flushTitles(service); @@ -16692,70 +16691,6 @@ Embedding = (function() { return results; })()), cb); }, - cache: (function() { - var get, init, newEntries, save, set, sync, titles; - titles = $.dict(); - newEntries = []; - init = function(data) { - var j, key, len, ref, text, uid; - try { - for (j = 0, len = data.length; j < len; j++) { - ref = data[j], key = ref.key, uid = ref.uid, text = ref.text; - titles[key + "." + uid] = text; - } - } catch (error) {} - }; - sync = function(data) { - var j, k, key, len, ref, text, uid; - try { - for (j = 0, len = data.length; j < len; j++) { - ref = data[j], key = ref.key, uid = ref.uid, text = ref.text; - k = key + "." + uid; - if (k in titles) { - break; - } - titles[k] = text; - } - } catch (error) {} - }; - get = function(arg) { - var key, uid; - key = arg.key, uid = arg.uid; - return titles[key + "." + uid]; - }; - set = function(arg, text) { - var key, uid; - key = arg.key, uid = arg.uid; - titles[key + "." + uid] = text; - newEntries.push({ - key: key, - uid: uid, - text: text - }); - return save(); - }; - save = $.debounce(2 * $.SECOND, function() { - return $.get('cachedTitles', Conf['cachedTitles'], function(arg) { - var cachedTitles; - cachedTitles = arg.cachedTitles; - sync(cachedTitles); - try { - cachedTitles = newEntries.concat(cachedTitles).slice(-1000); - } catch (error) { - cachedTitles = newEntries; - } - newEntries = []; - return $.set('cachedTitles', cachedTitles); - }); - }); - return { - init: init, - sync: sync, - get: get, - set: set, - save: save - }; - })(), preview: function(data) { var key, link, service, uid; key = data.key, uid = data.uid, link = data.link; @@ -16821,46 +16756,44 @@ Embedding = (function() { } }, title: function(req, data) { - var key, link, service, status, text, uid; - if (!req.status) { + var base1, j, k, key, len, len1, link, link2, options, post, post2, ref, ref1, service, status, text, uid; + key = data.key, uid = data.uid, options = data.options, link = data.link, post = data.post; + service = Embedding.types[key].title; + status = req.status; + if ((status === 200 || status === 304) && service.status) { + status = service.status(req.response)[0]; + } + if (!status) { return; } - key = data.key, uid = data.uid, link = data.link; - status = req.status; - service = Embedding.types[key].title; - switch (status) { - case 200: - case 304: - text = service.text(req.response, uid); - if (typeof text === 'string') { - Embedding.cache.set(data, text); - } else { - text = link.textContent; - } - break; - case 404: - text = "Not Found"; - break; - case 403: - text = service.ignore403 ? link.textContent : "Forbidden or Private"; - break; - default: - text = status + "'d"; - } - return Embedding.cb.titleText(text, data); - }, - titleText: function(text, data) { - var base1, j, key, l, len, len1, link, link2, post, post2, ref, ref1; - key = data.key, link = data.link, post = data.post; - text = "[" + key + "] " + text; + text = "[" + key + "] " + ((function() { + switch (status) { + case 200: + case 304: + text = service.text(req.response, uid); + if (typeof text === 'string') { + return text; + } else { + return text = link.textContent; + } + break; + case 404: + return "Not Found"; + case 403: + case 401: + return "Forbidden or Private"; + default: + return status + "'d"; + } + })()); link.dataset.original = link.textContent; link.textContent = text; ref = post.clones; for (j = 0, len = ref.length; j < len; j++) { post2 = ref[j]; ref1 = $$('a.linkify', post2.nodes.comment); - for (l = 0, len1 = ref1.length; l < len1; l++) { - link2 = ref1[l]; + for (k = 0, len1 = ref1.length; k < len1; k++) { + link2 = ref1[k]; if (!(link2.href === link.href)) { continue; } @@ -16947,10 +16880,10 @@ Embedding = (function() { }, title: { api: function(uid) { - return "https://api.clyp.it/" + uid; + return "https://api.clyp.it/oembed?url=https://clyp.it/" + uid; }, text: function(_) { - return _.Title; + return _.title; } } }, { @@ -17054,7 +16987,7 @@ Embedding = (function() { regExp: /^\w+:\/\/(?:www\.)?loopvid.appspot.com\/#?((?:pf|kd|lv|gd|gh|db|dx|nn|cp|wu|ig|ky|mf|m2|pc|1c|pi|ni|wl|ko|mm|ic|gc)\/[\w\-\/]+(?:,[\w\-\/]+)*|fc\/\w+\/\d+|https?:\/\/.+)/, style: 'max-width: 80vw; max-height: 80vh;', el: function(a) { - var _, base, el, host, j, l, len, len1, len2, n, name, names, ref, ref1, type, types, url, urls; + var _, base, el, host, j, k, l, len, len1, len2, name, names, ref, ref1, type, types, url, urls; el = $.el('video', { controls: true, preload: 'auto', @@ -17082,8 +17015,8 @@ Embedding = (function() { ref1 = names.split(','); for (j = 0, len = ref1.length; j < len; j++) { name = ref1[j]; - for (l = 0, len1 = types.length; l < len1; l++) { - type = types[l]; + for (k = 0, len1 = types.length; k < len1; k++) { + type = types[k]; base = "" + name + type; urls = (function() { switch (host) { @@ -17137,8 +17070,8 @@ Embedding = (function() { return ["https://" + type + ".gfycat.com/" + name + ".webm"]; } })(); - for (n = 0, len2 = urls.length; n < len2; n++) { - url = urls[n]; + for (l = 0, len2 = urls.length; l < len2; l++) { + url = urls[l]; $.add(el, $.el('source', { src: url })); @@ -17332,24 +17265,20 @@ Embedding = (function() { return el; }, title: { - batchSize: 50, - ignore403: true, - api: function(uids) { - var ids, key; - ids = encodeURIComponent(uids.join(',')); - key = Conf['youtubeAPIKey']; - return "https://www.googleapis.com/youtube/v3/videos?part=snippet&id=" + ids + "&fields=items%28id%2Csnippet%28title%29%29&key=" + key; + api: function(uid) { + return "https://noembed.com/embed?url=https%3A//www.youtube.com/watch%3Fv%3D" + uid + "&format=json"; }, - text: function(data, uid) { - var item, j, len, ref; - ref = data.items; - for (j = 0, len = ref.length; j < len; j++) { - item = ref[j]; - if (item.id === uid) { - return item.snippet.title; - } + text: function(_) { + return _.title; + }, + status: function(_) { + var m; + if (_.error) { + m = _.error.match(/^(\d*)\s*(.*)/); + return [+m[1], m[2]]; + } else { + return [200, 'OK']; } - return 'Not Found'; } }, preview: { diff --git a/builds/4chan-X.crx b/builds/4chan-X.crx index c4f5953b2..5d8689b7c 100644 Binary files a/builds/4chan-X.crx and b/builds/4chan-X.crx differ diff --git a/builds/4chan-X.meta.js b/builds/4chan-X.meta.js index 30de07bcd..2f5259a04 100644 --- a/builds/4chan-X.meta.js +++ b/builds/4chan-X.meta.js @@ -1,6 +1,6 @@ // ==UserScript== // @name 4chan X -// @version 1.14.17.3 +// @version 1.14.18.0 // @minGMVer 1.14 // @minFFVer 26 // @namespace 4chan-X @@ -95,7 +95,7 @@ // @connect soundcloud.com // @connect api.streamable.com // @connect vimeo.com -// @connect www.googleapis.com +// @connect noembed.com // @connect * // @grant GM_getValue // @grant GM_setValue diff --git a/builds/4chan-X.user.js b/builds/4chan-X.user.js index 2e9d1c00d..6bb3f3699 100644 --- a/builds/4chan-X.user.js +++ b/builds/4chan-X.user.js @@ -1,6 +1,6 @@ // ==UserScript== // @name 4chan X -// @version 1.14.17.3 +// @version 1.14.18.0 // @minGMVer 1.14 // @minFFVer 26 // @namespace 4chan-X @@ -95,7 +95,7 @@ // @connect soundcloud.com // @connect api.streamable.com // @connect vimeo.com -// @connect www.googleapis.com +// @connect noembed.com // @connect * // @grant GM_getValue // @grant GM_setValue @@ -215,7 +215,7 @@ docSet = function() { }; g = { - VERSION: '1.14.17.3', + VERSION: '1.14.18.0', NAMESPACE: '4chan X.', sites: Object.create(null), boards: Object.create(null) @@ -587,16 +587,15 @@ Config = (function() { captchaServiceKey: [ { 'https://api.captcha.guru': '', + 'https://azcaptcha.com': '', 'https://2captcha.com': '' } ], fourchanImageHost: 'i.4cdn.org', hiddenPSAList: [{}], knownBanners: '0.jpg,1.jpg,2.jpg,4.jpg,6.jpg,7.jpg,8.jpg,9.jpg,10.jpg,11.jpg,12.jpg,13.jpg,14.jpg,16.jpg,17.jpg,18.jpg,19.jpg,20.jpg,21.jpg,22.jpg,24.jpg,25.jpg,26.jpg,28.jpg,29.jpg,33.jpg,38.jpg,39.jpg,43.jpg,44.jpg,45.jpg,46.jpg,47.jpg,52.jpg,54.jpg,57.jpg,59.jpg,60.jpg,61.jpg,64.jpg,66.jpg,67.jpg,69.jpg,71.jpg,72.jpg,76.jpg,77.jpg,81.jpg,82.jpg,83.jpg,84.jpg,88.jpg,90.jpg,91.jpg,96.jpg,98.jpg,99.jpg,100.jpg,104.jpg,106.jpg,116.jpg,119.jpg,137.jpg,140.jpg,148.jpg,149.jpg,150.jpg,154.jpg,156.jpg,157.jpg,158.jpg,159.jpg,161.jpg,162.jpg,164.jpg,165.jpg,166.jpg,167.jpg,168.jpg,169.jpg,170.jpg,171.jpg,172.jpg,173.jpg,174.jpg,175.jpg,176.jpg,178.jpg,179.jpg,180.jpg,181.jpg,182.jpg,183.jpg,186.jpg,189.jpg,190.jpg,192.jpg,193.jpg,194.jpg,197.jpg,198.jpg,200.jpg,201.jpg,202.jpg,203.jpg,205.jpg,206.jpg,207.jpg,208.jpg,210.jpg,213.jpg,214.jpg,215.jpg,216.jpg,218.jpg,219.jpg,220.jpg,221.jpg,222.jpg,223.jpg,224.jpg,227.jpg,0.png,1.png,2.png,3.png,5.png,6.png,9.png,10.png,11.png,12.png,14.png,16.png,19.png,20.png,21.png,22.png,23.png,24.png,26.png,27.png,28.png,29.png,30.png,31.png,32.png,33.png,34.png,37.png,39.png,40.png,41.png,42.png,43.png,44.png,45.png,48.png,49.png,50.png,51.png,52.png,53.png,57.png,58.png,59.png,64.png,66.png,67.png,68.png,69.png,70.png,71.png,72.png,76.png,78.png,79.png,81.png,82.png,85.png,86.png,87.png,89.png,95.png,98.png,100.png,101.png,102.png,105.png,106.png,107.png,109.png,110.png,111.png,112.png,113.png,114.png,115.png,116.png,118.png,119.png,120.png,121.png,122.png,123.png,126.png,128.png,130.png,134.png,136.png,138.png,139.png,140.png,142.png,145.png,146.png,149.png,150.png,151.png,152.png,153.png,154.png,155.png,156.png,157.png,158.png,159.png,160.png,163.png,164.png,165.png,166.png,167.png,168.png,169.png,170.png,171.png,172.png,173.png,174.png,178.png,179.png,180.png,181.png,182.png,184.png,186.png,188.png,190.png,192.png,193.png,194.png,195.png,196.png,197.png,198.png,200.png,202.png,203.png,205.png,206.png,207.png,209.png,212.png,213.png,214.png,216.png,217.png,218.png,219.png,220.png,221.png,222.png,223.png,224.png,225.png,226.png,229.png,231.png,232.png,233.png,234.png,235.png,237.png,238.png,239.png,240.png,241.png,242.png,244.png,245.png,246.png,247.png,248.png,249.png,250.png,253.png,254.png,255.png,256.png,257.png,258.png,259.png,260.png,262.png,268.png,0.gif,1.gif,2.gif,3.gif,4.gif,5.gif,6.gif,7.gif,8.gif,9.gif,10.gif,12.gif,13.gif,14.gif,15.gif,16.gif,18.gif,19.gif,20.gif,21.gif,22.gif,23.gif,24.gif,28.gif,29.gif,30.gif,33.gif,34.gif,35.gif,36.gif,37.gif,39.gif,40.gif,42.gif,44.gif,45.gif,46.gif,48.gif,50.gif,52.gif,54.gif,55.gif,57.gif,58.gif,59.gif,60.gif,61.gif,63.gif,64.gif,66.gif,67.gif,68.gif,69.gif,70.gif,72.gif,73.gif,75.gif,76.gif,77.gif,78.gif,80.gif,81.gif,82.gif,83.gif,86.gif,87.gif,88.gif,92.gif,93.gif,94.gif,95.gif,96.gif,97.gif,98.gif,99.gif,100.gif,101.gif,102.gif,103.gif,104.gif,105.gif,106.gif,108.gif,109.gif,110.gif,111.gif,112.gif,113.gif,115.gif,116.gif,117.gif,118.gif,119.gif,120.gif,122.gif,123.gif,124.gif,127.gif,129.gif,130.gif,131.gif,134.gif,135.gif,136.gif,138.gif,139.gif,141.gif,144.gif,146.gif,148.gif,149.gif,153.gif,154.gif,155.gif,157.gif,158.gif,159.gif,160.gif,161.gif,162.gif,164.gif,166.gif,167.gif,168.gif,169.gif,170.gif,171.gif,172.gif,173.gif,174.gif,175.gif,176.gif,177.gif,178.gif,181.gif,182.gif,183.gif,185.gif,186.gif,187.gif,188.gif,189.gif,190.gif,191.gif,192.gif,193.gif,195.gif,196.gif,197.gif,200.gif,201.gif,202.gif,203.gif,204.gif,205.gif,206.gif,207.gif,208.gif,209.gif,210.gif,211.gif,212.gif,213.gif,214.gif,215.gif,216.gif,217.gif,219.gif,220.gif,221.gif,222.gif,224.gif,225.gif,226.gif,227.gif,228.gif,230.gif,232.gif,233.gif,234.gif,235.gif,238.gif,240.gif,241.gif,243.gif,244.gif,245.gif,246.gif,247.gif,249.gif,250.gif,251.gif,253.gif', - cachedTitles: [[]], passMessageClosed: false, - 'Prerequest Captcha': false, - youtubeAPIKey: 'AIzaSyB5_zaen_-46Uhz1xGR-lz1YoUMHqCD6CE' + 'Prerequest Captcha': false }; return Config; @@ -2358,6 +2357,7 @@ div[data-checked=\"false\"] > .suboption-list {\n\ }\n\ .catalog-post .prettyprinted {\n\ max-width: 100%;\n\ + -moz-box-sizing: border-box;\n\ box-sizing: border-box;\n\ }\n\ .catalog-post .MathJax_Display {\n\ @@ -3030,6 +3030,7 @@ input.field.tripped:not(:hover):not(:focus) {\n\ }\n\ .field {\n\ -moz-box-sizing: border-box;\n\ + box-sizing: border-box;\n\ margin: 0px;\n\ padding: 2px 4px 3px;\n\ }\n\ @@ -3284,6 +3285,7 @@ input[type=\"checkbox\"]:checked ~ .checkbox-letter {\n\ }\n\ .qr-preview {\n\ -moz-box-sizing: border-box;\n\ + box-sizing: border-box;\n\ counter-increment: thumbnails;\n\ cursor: move;\n\ display: inline-block;\n\ @@ -3364,7 +3366,8 @@ a:only-of-type > .remove {\n\ position: absolute;\n\ bottom: 20px;\n\ right: 10px;\n\ - -moz-transform: translateY(-50%);\n\ + -webkit-transform: translateY(-50%);\n\ + transform: translateY(-50%);\n\ }\n\ .textarea {\n\ position: relative;\n\ @@ -13541,7 +13544,7 @@ Settings = (function() { }, advanced: function(section) { var applyCSS, boardSelect, customCSS, event, input, inputs, interval, items, itemsArchive, j, k, l, len, len1, len2, len3, listImageHost, m, name, ref, ref1, ref2, ref3, ref4, table, textContent, updateArchives, warning; - $.extend(section, {innerHTML: "
Archives
404 Redirect is disabled.
Thread redirectionPost fetchingFile redirection

Archive Lists: Each line below should be an archive list in this format or a URL to load an archive list from.
Archive properties can be overriden by another item with the same uid (or if absent, its name).
Last updated:
External Catalog
External Catalog is disabled. This will be used only as a fallback.
URLs of external catalog sites, where %board is to be replaced by the board name.
Each URL should be followed by ;boards: and optionally ;exclude: and a list of supported/excluded boards in the format explained in the Filter guide.
Override 4chan Image Host
Change 4chan image links to this domain. Leave blank for no change.
Captcha Language
Choose from list of language codes. Leave blank to autoselect.
Captcha Solving Service
Supported services include captcha.guru, 2captcha, and any other service implementing the 2captcha API.
Leave blank to disable.
Domain: API Key:
Youtube API Key
API key used to fetch Youtube link titles. You can obtain your own key here to make the feature work when the default key exceeds its quota.
Custom Board Navigation
New lines will be converted into spaces.

In the following examples for /g/, g can be changed to a different board ID (a, b, etc...), the current board (current), or the Twitter link (@).
Board link: g
Archive link: g-archive
Internal archive link: g-expired
Title link: g-title
Board link (Replace with title when on that board): g-replace
Full text link: g-full
Custom text link: g-text:"Install Gentoo"
Index-only link: g-index
Catalog-only link: g-catalog
Index mode: g-mode:"infinite scrolling"
Index sort: g-sort:"creation date rev"
External link: external-text:"Google","http://www.google.com"
Open in new tab: g-nt
Combinations are possible: g-index-text:"Technology Index"
Full board list toggle: toggle-all

[ toggle-all ] [current-title] [g-title / a-title / jp-title] [x / wsg / h] [t-text:"Piracy"]
will give you
[ + ] [Technology] [Technology / Anime & Manga / Otaku Culture] [x / wsg / h] [Piracy]
if you are on /g/.
Time Formatting is disabled.
:
Supported format specifiers:
Day: %a, %A, %d, %e
Month: %m, %b, %B
Year: %y, %Y
Hour: %k, %H, %l, %I, %p, %P
Minute: %M
Second: %S
Literal %: %%
Language tag:
Quote Backlinks formatting is disabled.
:
Default pasted content filename
.png
File Info Formatting is disabled.
:
Link: %l (truncated), %L (untruncated), %T (4chan filename)
Filename: %n (truncated), %N (untruncated), %t (4chan filename)
Download button: %d
Quick filter MD5: %f
Spoiler indicator: %p
Size: %B (Bytes), %K (KB), %M (MB), %s (4chan default)
Resolution: %r (Displays 'PDF' for PDF files)
Tag: %g
Literal %: %%
Quick Reply Personas

One item per line.
Items will be added in the relevant input's auto-completion list.
Password items will always be used, since there is no password input.
Lines starting with a # will be ignored.

Unread Favicon is disabled.
Thread Updater is disabled.
Interval: seconds
Custom Cooldown Time
Seconds:
For more information about customizing 4chan X's CSS, see the styling guide.
Javascript Whitelist
Sources from which Javascript is allowed to be loaded by Content Security Policy.
Lines starting with a # will be ignored.
Known Banners
List of known banners, used for click-to-change feature.
"}); + $.extend(section, {innerHTML: "
Archives
404 Redirect is disabled.
Thread redirectionPost fetchingFile redirection

Archive Lists: Each line below should be an archive list in this format or a URL to load an archive list from.
Archive properties can be overriden by another item with the same uid (or if absent, its name).
Last updated:
External Catalog
External Catalog is disabled. This will be used only as a fallback.
URLs of external catalog sites, where %board is to be replaced by the board name.
Each URL should be followed by ;boards: and optionally ;exclude: and a list of supported/excluded boards in the format explained in the Filter guide.
Override 4chan Image Host
Change 4chan image links to this domain. Leave blank for no change.
Captcha Language
Choose from list of language codes. Leave blank to autoselect.
Captcha Solving Service
Supported services include captcha.guru, AZcaptcha, 2captcha, and any other service implementing the 2captcha API.
Leave blank to disable.
Domain: API Key:
Custom Board Navigation
New lines will be converted into spaces.

In the following examples for /g/, g can be changed to a different board ID (a, b, etc...), the current board (current), or the Twitter link (@).
Board link: g
Archive link: g-archive
Internal archive link: g-expired
Title link: g-title
Board link (Replace with title when on that board): g-replace
Full text link: g-full
Custom text link: g-text:"Install Gentoo"
Index-only link: g-index
Catalog-only link: g-catalog
Index mode: g-mode:"infinite scrolling"
Index sort: g-sort:"creation date rev"
External link: external-text:"Google","http://www.google.com"
Open in new tab: g-nt
Combinations are possible: g-index-text:"Technology Index"
Full board list toggle: toggle-all

[ toggle-all ] [current-title] [g-title / a-title / jp-title] [x / wsg / h] [t-text:"Piracy"]
will give you
[ + ] [Technology] [Technology / Anime & Manga / Otaku Culture] [x / wsg / h] [Piracy]
if you are on /g/.
Time Formatting is disabled.
:
Supported format specifiers:
Day: %a, %A, %d, %e
Month: %m, %b, %B
Year: %y, %Y
Hour: %k, %H, %l, %I, %p, %P
Minute: %M
Second: %S
Literal %: %%
Language tag:
Quote Backlinks formatting is disabled.
:
Default pasted content filename
.png
File Info Formatting is disabled.
:
Link: %l (truncated), %L (untruncated), %T (4chan filename)
Filename: %n (truncated), %N (untruncated), %t (4chan filename)
Download button: %d
Quick filter MD5: %f
Spoiler indicator: %p
Size: %B (Bytes), %K (KB), %M (MB), %s (4chan default)
Resolution: %r (Displays 'PDF' for PDF files)
Tag: %g
Literal %: %%
Quick Reply Personas

One item per line.
Items will be added in the relevant input's auto-completion list.
Password items will always be used, since there is no password input.
Lines starting with a # will be ignored.

Unread Favicon is disabled.
Thread Updater is disabled.
Interval: seconds
Custom Cooldown Time
Seconds:
For more information about customizing 4chan X's CSS, see the styling guide.
Javascript Whitelist
Sources from which Javascript is allowed to be loaded by Content Security Policy.
Lines starting with a # will be ignored.
Known Banners
List of known banners, used for click-to-change feature.
"}); ref = $$('.warning', section); for (j = 0, len = ref.length; j < len; j++) { warning = ref[j]; @@ -16496,13 +16499,13 @@ Embedding = (function() { $.one(d, '4chanXInitFinished', this.ready); $.on(d, 'IndexRefreshInternal', function() { return g.posts.forEach(function(post) { - var embed, l, len1, len2, n, ref2, ref3; + var embed, k, l, len1, len2, ref2, ref3; ref2 = [post].concat(slice.call(post.clones)); - for (l = 0, len1 = ref2.length; l < len1; l++) { - post = ref2[l]; + for (k = 0, len1 = ref2.length; k < len1; k++) { + post = ref2[k]; ref3 = post.nodes.embedlinks; - for (n = 0, len2 = ref3.length; n < len2; n++) { - embed = ref3[n]; + for (l = 0, len2 = ref3.length; l < len2; l++) { + embed = ref3[l]; Embedding.cb.catalogRemove.call(embed); } } @@ -16510,7 +16513,7 @@ Embedding = (function() { }); } if (Conf['Link Title']) { - $.on(d, '4chanXInitFinished PostsInserted', function() { + return $.on(d, '4chanXInitFinished PostsInserted', function() { var key, ref2, ref3, service; ref2 = Embedding.types; for (key in ref2) { @@ -16520,8 +16523,6 @@ Embedding = (function() { } } }); - this.cache.init(Conf['cachedTitles']); - return $.sync('cachedTitles', this.cache.sync); } }, events: function(post) { @@ -16649,15 +16650,13 @@ Embedding = (function() { return style.pointerEvents = 'none'; }, title: function(data) { - var key, link, options, post, service, text, uid; + var key, link, options, post, service, uid; key = data.key, uid = data.uid, options = data.options, link = data.link, post = data.post; if (!(service = Embedding.types[key].title)) { return; } $.addClass(link, key.toLowerCase()); - if ((text = Embedding.cache.get(data))) { - return Embedding.cb.titleText(text, data); - } else if (service.batchSize) { + if (service.batchSize) { (service.queue || (service.queue = [])).push(data); if (service.queue.length >= service.batchSize) { return Embedding.flushTitles(service); @@ -16692,70 +16691,6 @@ Embedding = (function() { return results; })()), cb); }, - cache: (function() { - var get, init, newEntries, save, set, sync, titles; - titles = $.dict(); - newEntries = []; - init = function(data) { - var j, key, len, ref, text, uid; - try { - for (j = 0, len = data.length; j < len; j++) { - ref = data[j], key = ref.key, uid = ref.uid, text = ref.text; - titles[key + "." + uid] = text; - } - } catch (error) {} - }; - sync = function(data) { - var j, k, key, len, ref, text, uid; - try { - for (j = 0, len = data.length; j < len; j++) { - ref = data[j], key = ref.key, uid = ref.uid, text = ref.text; - k = key + "." + uid; - if (k in titles) { - break; - } - titles[k] = text; - } - } catch (error) {} - }; - get = function(arg) { - var key, uid; - key = arg.key, uid = arg.uid; - return titles[key + "." + uid]; - }; - set = function(arg, text) { - var key, uid; - key = arg.key, uid = arg.uid; - titles[key + "." + uid] = text; - newEntries.push({ - key: key, - uid: uid, - text: text - }); - return save(); - }; - save = $.debounce(2 * $.SECOND, function() { - return $.get('cachedTitles', Conf['cachedTitles'], function(arg) { - var cachedTitles; - cachedTitles = arg.cachedTitles; - sync(cachedTitles); - try { - cachedTitles = newEntries.concat(cachedTitles).slice(-1000); - } catch (error) { - cachedTitles = newEntries; - } - newEntries = []; - return $.set('cachedTitles', cachedTitles); - }); - }); - return { - init: init, - sync: sync, - get: get, - set: set, - save: save - }; - })(), preview: function(data) { var key, link, service, uid; key = data.key, uid = data.uid, link = data.link; @@ -16821,46 +16756,44 @@ Embedding = (function() { } }, title: function(req, data) { - var key, link, service, status, text, uid; - if (!req.status) { + var base1, j, k, key, len, len1, link, link2, options, post, post2, ref, ref1, service, status, text, uid; + key = data.key, uid = data.uid, options = data.options, link = data.link, post = data.post; + service = Embedding.types[key].title; + status = req.status; + if ((status === 200 || status === 304) && service.status) { + status = service.status(req.response)[0]; + } + if (!status) { return; } - key = data.key, uid = data.uid, link = data.link; - status = req.status; - service = Embedding.types[key].title; - switch (status) { - case 200: - case 304: - text = service.text(req.response, uid); - if (typeof text === 'string') { - Embedding.cache.set(data, text); - } else { - text = link.textContent; - } - break; - case 404: - text = "Not Found"; - break; - case 403: - text = service.ignore403 ? link.textContent : "Forbidden or Private"; - break; - default: - text = status + "'d"; - } - return Embedding.cb.titleText(text, data); - }, - titleText: function(text, data) { - var base1, j, key, l, len, len1, link, link2, post, post2, ref, ref1; - key = data.key, link = data.link, post = data.post; - text = "[" + key + "] " + text; + text = "[" + key + "] " + ((function() { + switch (status) { + case 200: + case 304: + text = service.text(req.response, uid); + if (typeof text === 'string') { + return text; + } else { + return text = link.textContent; + } + break; + case 404: + return "Not Found"; + case 403: + case 401: + return "Forbidden or Private"; + default: + return status + "'d"; + } + })()); link.dataset.original = link.textContent; link.textContent = text; ref = post.clones; for (j = 0, len = ref.length; j < len; j++) { post2 = ref[j]; ref1 = $$('a.linkify', post2.nodes.comment); - for (l = 0, len1 = ref1.length; l < len1; l++) { - link2 = ref1[l]; + for (k = 0, len1 = ref1.length; k < len1; k++) { + link2 = ref1[k]; if (!(link2.href === link.href)) { continue; } @@ -16947,10 +16880,10 @@ Embedding = (function() { }, title: { api: function(uid) { - return "https://api.clyp.it/" + uid; + return "https://api.clyp.it/oembed?url=https://clyp.it/" + uid; }, text: function(_) { - return _.Title; + return _.title; } } }, { @@ -17054,7 +16987,7 @@ Embedding = (function() { regExp: /^\w+:\/\/(?:www\.)?loopvid.appspot.com\/#?((?:pf|kd|lv|gd|gh|db|dx|nn|cp|wu|ig|ky|mf|m2|pc|1c|pi|ni|wl|ko|mm|ic|gc)\/[\w\-\/]+(?:,[\w\-\/]+)*|fc\/\w+\/\d+|https?:\/\/.+)/, style: 'max-width: 80vw; max-height: 80vh;', el: function(a) { - var _, base, el, host, j, l, len, len1, len2, n, name, names, ref, ref1, type, types, url, urls; + var _, base, el, host, j, k, l, len, len1, len2, name, names, ref, ref1, type, types, url, urls; el = $.el('video', { controls: true, preload: 'auto', @@ -17082,8 +17015,8 @@ Embedding = (function() { ref1 = names.split(','); for (j = 0, len = ref1.length; j < len; j++) { name = ref1[j]; - for (l = 0, len1 = types.length; l < len1; l++) { - type = types[l]; + for (k = 0, len1 = types.length; k < len1; k++) { + type = types[k]; base = "" + name + type; urls = (function() { switch (host) { @@ -17137,8 +17070,8 @@ Embedding = (function() { return ["https://" + type + ".gfycat.com/" + name + ".webm"]; } })(); - for (n = 0, len2 = urls.length; n < len2; n++) { - url = urls[n]; + for (l = 0, len2 = urls.length; l < len2; l++) { + url = urls[l]; $.add(el, $.el('source', { src: url })); @@ -17332,24 +17265,20 @@ Embedding = (function() { return el; }, title: { - batchSize: 50, - ignore403: true, - api: function(uids) { - var ids, key; - ids = encodeURIComponent(uids.join(',')); - key = Conf['youtubeAPIKey']; - return "https://www.googleapis.com/youtube/v3/videos?part=snippet&id=" + ids + "&fields=items%28id%2Csnippet%28title%29%29&key=" + key; + api: function(uid) { + return "https://noembed.com/embed?url=https%3A//www.youtube.com/watch%3Fv%3D" + uid + "&format=json"; }, - text: function(data, uid) { - var item, j, len, ref; - ref = data.items; - for (j = 0, len = ref.length; j < len; j++) { - item = ref[j]; - if (item.id === uid) { - return item.snippet.title; - } + text: function(_) { + return _.title; + }, + status: function(_) { + var m; + if (_.error) { + m = _.error.match(/^(\d*)\s*(.*)/); + return [+m[1], m[2]]; + } else { + return [200, 'OK']; } - return 'Not Found'; } }, preview: { diff --git a/builds/4chan-X.zip b/builds/4chan-X.zip index 35fb3f526..b983d85b8 100644 Binary files a/builds/4chan-X.zip and b/builds/4chan-X.zip differ diff --git a/builds/updates-beta.json b/builds/updates-beta.json index 222a660dc..82cc099ef 100644 --- a/builds/updates-beta.json +++ b/builds/updates-beta.json @@ -3,7 +3,7 @@ "4chan-x@4chan-x.net": { "updates": [ { - "version": "1.14.17.3", + "version": "1.14.18.0", "update_link": "https://www.4chan-x.net/builds/4chan-X-beta.crx" } ] diff --git a/builds/updates-beta.xml b/builds/updates-beta.xml index 403ade524..92752ddbb 100644 --- a/builds/updates-beta.xml +++ b/builds/updates-beta.xml @@ -1,7 +1,7 @@ - + diff --git a/builds/updates.json b/builds/updates.json index 26aba22c8..da238111e 100644 --- a/builds/updates.json +++ b/builds/updates.json @@ -3,7 +3,7 @@ "4chan-x@4chan-x.net": { "updates": [ { - "version": "1.14.17.3", + "version": "1.14.18.0", "update_link": "https://www.4chan-x.net/builds/4chan-X.crx" } ] diff --git a/builds/updates.xml b/builds/updates.xml index 13339d219..9971e74e1 100644 --- a/builds/updates.xml +++ b/builds/updates.xml @@ -1,7 +1,7 @@ - + diff --git a/version.json b/version.json index 6e8c8217f..908af7fe4 100644 --- a/version.json +++ b/version.json @@ -1,4 +1,4 @@ { - "version": "1.14.17.3", - "date": "2020-04-19T20:32:21.455Z" + "version": "1.14.18.0", + "date": "2020-04-28T20:35:56.435Z" } \ No newline at end of file