diff --git a/plugins/reddit.js b/plugins/reddit.js index c2a140d9d..83ea187f0 100644 --- a/plugins/reddit.js +++ b/plugins/reddit.js @@ -20,7 +20,7 @@ hoverZoomPlugins.push({ } $('.hoverZoomLink').each(function () { - var _this = $(this); + let _this = $(this); if (options.filterNSFW && _this.parents('.over18').length) { _this.removeClass('hoverZoomLink'); } @@ -88,19 +88,72 @@ hoverZoomPlugins.push({ } }); - // To load sh.reddit images - $('img.i18n-post-media-img').one('mouseover', function () { + // To load Image from thumbnail in searches in sh.reddit + $('faceplate-tracker[data-faceplate-tracking-context*="post_thumbnail"]').each(function () { + let img = $(this); + let url = this.children[0].href; + chrome.runtime.sendMessage({action:'ajaxRequest', url: url, method: 'GET'}, function(data) { + let doc = document.implementation.createHTMLDocument(); + doc.body.innerHTML = data; + + let post = $(doc.querySelector('shreddit-post')); + let link = post.attr('content-href'); + let type = post.attr('post-type'); + if (link.search('.gifv') != -1) { type = 'video' } + + switch (type) { + case 'video': { + let title = post.attr('post-title'); + img.data('hoverZoomSrc', [link + '/DASH_480.mp4', link + '/DASH_360.mp4']); + if (link.search('.gifv') != -1) { + img.data('hoverZoomSrc', [link.replace(/\.gifv?/, '.mp4'), link.replace(/\.gifv?/, '.webm')]); + } + img.data('hoverZoomCaption', [title]); + img.addClass('hoverZoomLink'); + return + } + case 'gallery': { + let galleryid = post.attr('id'); + $.get('https://www.reddit.com/by_id/' + galleryid + '.json?raw_json=1', data => processGalleryResponse(img, data)); + return + } + case 'link': + link = post.find('img[src*="external-preview.redd.it"]:first').attr('src'); + break + default: + break + } + hoverZoom.prepareLink(img, link); + }); + }); + + // Supports images in sh.reddit compact view + $('shreddit-post[content-href*="//i.redd.it"]').one('mouseover', function () { let post = $(this); - let link = post.attr('src'); - hoverZoom.prepareLink(post, link) + let link = post.attr('content-href'); + let thumbnail = post.find('div[slot*="thumbnail"]:first-child'); + + hoverZoom.prepareLink(thumbnail, link); }); - // To load sh.reddit videos + // Supports images in sh.reddit card view + $('img.i18n-post-media-img').one('mouseover', function () { + let post = $(this); + let link = post.attr('content-href'); + + hoverZoom.prepareLink(post, link); + }); + + // Supports videos in sh.reddit card view $('shreddit-player-2').one('mouseover', function () { let post = $(this); + let src = post.attr('src'); let packagedMedia = post.attr('packaged-media-json'); - let link = 'https://' + packagedMedia.match(/"source":{"url":".*(packaged-media.redd.it\/.*)","dimensions"/)[1]; - hoverZoom.prepareLink(post, link); + + if (packagedMedia) { + src = 'https://' + packagedMedia.match(/"source":{"url":".*(packaged-media.redd.it\/.*)","dimensions"/)[1]; + } + hoverZoom.prepareLink(post, src); }); var promises = []; @@ -138,49 +191,60 @@ hoverZoomPlugins.push({ } $('div[data-url*="//www.reddit.com/gallery/"]').one('mouseover', function () { - var post = $(this); + let post = $(this); if (post.data().hoverZoomMouseOver) return; post.data().hoverZoomMouseOver = true; - var link = post.attr('data-url'); + let link = post.attr('data-url'); var galleryid = link.substring(link.lastIndexOf('/') + 1); $.get('https://www.reddit.com/by_id/t3_' + galleryid + '.json?raw_json=1', data => processGalleryResponse(post, data)); }); $('a[href*="//www.reddit.com/gallery/"]').one('mouseover', function () { - var post = $(this); + let post = $(this); if (post.data().hoverZoomMouseOver) return; post.data().hoverZoomMouseOver = true; - var link = post.attr('href'); - var galleryid = link.substring(link.lastIndexOf('/') + 1); + let link = post.attr('href'); + let galleryid = link.substring(link.lastIndexOf('/') + 1); $.get('https://www.reddit.com/by_id/t3_' + galleryid + '.json?raw_json=1', data => processGalleryResponse(post, data)); }); - + $('div[data-is-gallery=true]').one('mouseover', function () { - var post = $(this); + let post = $(this); if (post.data().hoverZoomMouseOver) return; post.data().hoverZoomMouseOver = true; - var galleryid = post.attr('data-fullname'); + let galleryid = post.attr('data-fullname'); $.get('https://www.reddit.com/by_id/' + galleryid + '.json?raw_json=1', data => processGalleryResponse(post, data)); }); + + // supports sh.reddit compact view galleries + $('shreddit-post[content-href*="//www.reddit.com/gallery/"]').one('mouseover', function () { + let post = $(this); + if (post.data().hoverZoomMouseOver) return; + post.data().hoverZoomMouseOver = true; + let galleryid = post.attr('id'); + let thumbnail = post.find('div[slot*="thumbnail"]:first-child'); //finds thumbnail + $.get('https://www.reddit.com/by_id/' + galleryid + '.json?raw_json=1', data => processGalleryResponse(thumbnail, data)); + }); + // supports sh.reddit card view galleries $('gallery-carousel').one('mouseover', function () { - var post = $(this); + let post = $(this); if (post.data().hoverZoomMouseOver) return; post.data().hoverZoomMouseOver = true; - var galleryid = post.attr('post-id'); + let galleryid = post.attr('post-id'); $.get('https://www.reddit.com/by_id/' + galleryid + '.json?raw_json=1', data => processGalleryResponse(post, data)); }); - $('div[data-url*="//v.redd.it/"]').each(function () { - var post = $(this); - var link = post.attr('data-url'); - var title = post.find('a.title').text(); - - post.find('a.thumbnail,a.title').each(function() { - var img = $(this); - + $('div[data-url*="//v.redd.it/"], shreddit-post[content-href*="//v.redd.it/"], shreddit-post[content-href*="https://i.imgur.com/"]').each(function () { + let post = $(this); + let link = post.attr('data-url') || post.attr('content-href'); + let title = post.find('a.title').text() || post.attr('post-title'); + let hoverTargets = post.attr('data-url') ? 'a.thumbnail,a.title' : 'div[slot*="thumbnail"]:first-child' + post.find(hoverTargets).each(function() { + let img = $(this); // Use /DASH_600_K as a default if for any reason the ajax request below doesn't find a valid link - img.data('hoverZoomSrc', [link + '/DASH_600_K']); + // In case of imgur link, replace .gifv with .mp4 or .webm + img.data('hoverZoomSrc', [link + '/DASH_600_K',link.replace(/\.gifv?/, '.mp4'),link.replace(/\.gifv?/, '.webm')]); img.data('hoverZoomCaption', [title]); promises.push(new Promise(function (resolve, reject) { @@ -188,20 +252,20 @@ hoverZoomPlugins.push({ { action:'ajaxRequest', url: link + '/DASHPlaylist.mpd', method: 'GET' }, function (xml) { try { - var xmlDoc = (new DOMParser()).parseFromString(xml, 'application/xml'); - var highestRes = [].slice.call(xmlDoc.querySelectorAll('Representation[frameRate]')) + let xmlDoc = (new DOMParser()).parseFromString(xml, 'application/xml'); + let highestRes = [].slice.call(xmlDoc.querySelectorAll('Representation[frameRate]')) .sort(function (r1, r2) { - var w1 = parseInt(r1.getAttribute('width')), w2 = parseInt(r2.getAttribute('width')); + let w1 = parseInt(r1.getAttribute('width')), w2 = parseInt(r2.getAttribute('width')); return w1 > w2 ? -1 : (w1 < w2 ? 1 : 0); }) .find(function (repr) { return !!repr.querySelector('BaseURL'); }); if (highestRes) { - var baseUrl = highestRes.querySelector('BaseURL').textContent.trim(); + let baseUrl = highestRes.querySelector('BaseURL').textContent.trim(); img.data('hoverZoomSrc', [baseUrl.indexOf('//') !== -1 ? baseUrl : link + '/' + baseUrl]); } - var audio = xmlDoc.querySelector('Representation[audioSamplingRate]'), + let audio = xmlDoc.querySelector('Representation[audioSamplingRate]'), audioUrl = audio ? audio.querySelector('BaseURL').textContent.trim() : undefined; if (audioUrl) { img.data('hoverZoomAudioSrc', [audioUrl.indexOf('//') !== -1 ? audioUrl : link + '/' + audioUrl]);