diff --git a/itad_importer.user.coffee b/itad_importer.user.coffee index 1d5b176..f98394a 100644 --- a/itad_importer.user.coffee +++ b/itad_importer.user.coffee @@ -15,6 +15,8 @@ // @match *://www.flyingbundle.com/users/account* // @match *://www.gog.com/account* // @match *://www.gog.com/order/status/* +// @match *://itch.io/my-purchases* +// @match *://*.itch.io/* // @match *://groupees.com/purchases* // @match *://groupees.com/users/* // @match *://www.humblebundle.com/home* @@ -60,11 +62,38 @@ this.$ = this.jQuery = jQuery.noConflict(true) # Less overhead than instantiating a new jQuery object attr = (node, name) -> node.getAttribute(name) +#from http://blog.stevenlevithan.com/archives/javascript-roman-numeral-converter + +romanise_numbers = (elem) -> + elem = elem.replace(/1/g,"i") + elem = elem.replace(/2/g,"ii") + elem = elem.replace(/3/g,"iii") + elem = elem.replace(/4/g,"iv") + elem = elem.replace(/5/g,"v") + elem = elem.replace(/6/g,"vi") + elem = elem.replace(/7/g,"vii") + elem = elem.replace(/8/g,"viii") + elem = elem.replace(/9/g,"ix") + elem = elem.replace(/9/g,"ix") + + gog_prepare_title = (elem) -> dom = $('.product-title', elem).clone() $('._product-flag', dom).remove() dom.text() +itch_plain = (elem) -> + elem.toLowerCase(); + +title_plain = (elem) -> + plain = elem; + plain = plain.toLowerCase() + plain = plain.replace(/\bthe\b/g,"") + plain = plain.replace(/ & /g," and ") + plain = plain.replace(" ","") + plain = plain.replace(/[\s\.\!@"#$%^&'*\(\)\-:_+=;,\?]/g,"") + return romanise_numbers(plain); + humble_make_button = -> # Humble Library uses very weird button markup label = $('').html(BUTTON_LABEL) @@ -238,6 +267,83 @@ scrapers = .html(BUTTON_LABEL + " (This Page)") .prependTo($('.collection-header').filter(':first')) + 'itch.io': +# '^https?://itch\\.io/my-purchases': +# 'source_id': 'itchio' +# 'game_list': -> +# old_date=0 +# new_date=null +# console.debug("game_list called for itch.io collection page") +# { +# # new_date=0 +# "version": "02", +# "data": { +# # id: attr(x, 'gog-account-product') +# #.attr('title').trim() +# title: $('.title.game_link',x).first().text().trim() +# copies: [{ +# new_date: new Date($('span',$('.date_header',x)).first().attr('title')).getTime()/1000 +# #if (new_date == null) +# # new_date=o +# added: new Date($('span',$('.date_header',x)).first().attr('title')).getTime()/1000 +# type: 'itchio', +# status: 'redeemed', +# owned: 1, +# }] +# } for x in $('.game_cell') +# } +# +# 'insert_button': -> +# console.debug("insert_button called for itch.io collection page") +# $("") +# .css +# float: 'right' +# cursor: 'pointer' +# # TODO: Replace the following hacks with whatever GOG uses +# position: 'relative' +# marginBottom: '-2em' +# zIndex: 1 +# .html(BUTTON_LABEL + " (This Page)") +# .appendTo($('.header_tabs').filter(':first')) + + '^https?://.+\\.itch\\.io/.+/download/.+': +# '^https?://itch\\.io/my-purchases': + 'source_id': 'itchio' + 'game_list': -> + console.debug("game_list called for itch.io download page") + { + "version": "02", + "data": { + # id: attr(x, 'gog-account-product') + #.attr('title').trim() + title: $('.object_title',x).first().text().replace(" "," ").trim() + plain: title_plain($('.object_title',x).first().text().trim()) + copies: [{ + added: new Date($('p > abbr',x).attr('title').replace('@','') + " UTC").getTime()/1000 +#if (new_date == null) +# new_date=o +# added: new Date($('span',$('.date_header',x)).first().attr('title')).getTime()/1000 + type: 'itchio', + status: 'redeemed', + owned: 1, + }] + } for x in $('.inner_column').filter(':first') + } + + 'insert_button': -> + console.debug("insert_button called for itch.io download page") + $("") + .css + float: 'right' + cursor: 'pointer' + # TODO: Replace the following hacks with whatever GOG uses + position: 'relative' + marginBottom: '-2em' + zIndex: 1 + .html(BUTTON_LABEL + " (This Page)") + .appendTo($('.header_nav_tabs').filter(':first')) + + 'groupees.com': # TODO: Support the new UI beta @@ -378,6 +484,8 @@ $ -> # It seems we don't need an explicit `if location.host of scrapers` # before the `for` loop console.log("Loading ITAD importer...") + if location.host.match(/\.itch\.io/) + scrapers[location.host] = scrapers['itch.io'] if scrapers[location.host] console.log("Matched domain: " + location.host) for regex, profile of scrapers[location.host] diff --git a/itad_importer.user.js b/itad_importer.user.js index a89fa89..af100ec 100644 --- a/itad_importer.user.js +++ b/itad_importer.user.js @@ -1,4 +1,4 @@ -// Generated by CoffeeScript 1.7.1 +// Generated by CoffeeScript 1.12.8 /* IsThereAnyDeal.com Collection Importer // ==UserScript== @@ -17,6 +17,8 @@ // @match *://www.flyingbundle.com/users/account* // @match *://www.gog.com/account* // @match *://www.gog.com/order/status/* +// @match *://itch.io/my-purchases* +// @match *://*.itch.io/* // @match *://groupees.com/purchases* // @match *://groupees.com/users/* // @match *://www.humblebundle.com/home* @@ -35,445 +37,523 @@ License: MIT (http://opensource.org/licenses/MIT) TODO: - Add a `@downloadURL` for the script */ -var BUTTON_LABEL, ITAD_12X12, ITAD_14X14_GRAY, attr, gog_prepare_title, humble_make_button, humble_parse, scrapeGames, scrapers; -BUTTON_LABEL = "Export to ITAD"; +(function() { + var BUTTON_LABEL, ITAD_12X12, ITAD_14X14_GRAY, attr, gog_prepare_title, humble_make_button, humble_parse, itch_plain, romanise_numbers, scrapeGames, scrapers, title_plain; -ITAD_12X12 = "data:image/png;base64,\niVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAMAAABhq6zVAAAAZlBMVEUEbrIEbrIJcbQLcrQefboo\ng70rhb4thr8vh78zicA6jcNCksVLl8hWnctZn8xdoc1ipM9ipc9kptB5stZ6staCt9mHutqJu9ud\nxuGozeSrz+W72OrA2+zJ4O7U5vLX6PPn8fj3+vyC0mvkAAAAAXRSTlMAQObYZgAAAFdJREFUCB0F\nwYkCgUAABcA3CpElRyRH6/9/0kwCQALtZSwNglN9Pt5LR+jqGuelEaYbeBXh04P7KMwDeF6E8l1h\nW1vh8PsO/bWeiGPdl/kzdYjdBkACQP5LygQ7CM8T6wAAAABJRU5ErkJggg=="; + BUTTON_LABEL = "Export to ITAD"; -ITAD_14X14_GRAY = "data:image/png;base64,\niVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAMAAAAolt3jAAAAdVBMVEUEbrKTlaCTlZ+TlZ+UlqCY\nmaSYmqWcnqednqieoKmfoaugoqulprCvsLivsbiwsrmztLuztby2uL7BwsjDxcrExcvIyc7V1trW\n1trX2Nvn5+rp6evx8vP19fb39/j4+Pn5+fr7+/v7+/z8/Pz8/P39/f3///8J+FboAAAAJHRSTlMA\ny+rw8PHx8fHx8vLy9PT09PT19vf39/n5+fz8/f3+/v7+/v695LIzAAAAcUlEQVQIHQXBhwGCQAAE\nsHui2FHsBeyy/4gmSQGgJKWCeTNFVQJNN9yH2xJB+z3WZuf3kjDuD+B8I6wfIzAbpsLuCrg3QtsD\n9TAXJq8tOHYEl9+W0eHbEPaf06u/PvoWsXmuTNrdegwp1QJAVZICQMkf1qQG7Yh+Z60AAAAASUVO\nRK5CYII="; + ITAD_12X12 = "data:image/png;base64,\niVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAMAAABhq6zVAAAAZlBMVEUEbrIEbrIJcbQLcrQefboo\ng70rhb4thr8vh78zicA6jcNCksVLl8hWnctZn8xdoc1ipM9ipc9kptB5stZ6staCt9mHutqJu9ud\nxuGozeSrz+W72OrA2+zJ4O7U5vLX6PPn8fj3+vyC0mvkAAAAAXRSTlMAQObYZgAAAFdJREFUCB0F\nwYkCgUAABcA3CpElRyRH6/9/0kwCQALtZSwNglN9Pt5LR+jqGuelEaYbeBXh04P7KMwDeF6E8l1h\nW1vh8PsO/bWeiGPdl/kzdYjdBkACQP5LygQ7CM8T6wAAAABJRU5ErkJggg=="; -this.$ = this.jQuery = jQuery.noConflict(true); + ITAD_14X14_GRAY = "data:image/png;base64,\niVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAMAAAAolt3jAAAAdVBMVEUEbrKTlaCTlZ+TlZ+UlqCY\nmaSYmqWcnqednqieoKmfoaugoqulprCvsLivsbiwsrmztLuztby2uL7BwsjDxcrExcvIyc7V1trW\n1trX2Nvn5+rp6evx8vP19fb39/j4+Pn5+fr7+/v7+/z8/Pz8/P39/f3///8J+FboAAAAJHRSTlMA\ny+rw8PHx8fHx8vLy9PT09PT19vf39/n5+fz8/f3+/v7+/v695LIzAAAAcUlEQVQIHQXBhwGCQAAE\nsHui2FHsBeyy/4gmSQGgJKWCeTNFVQJNN9yH2xJB+z3WZuf3kjDuD+B8I6wfIzAbpsLuCrg3QtsD\n9TAXJq8tOHYEl9+W0eHbEPaf06u/PvoWsXmuTNrdegwp1QJAVZICQMkf1qQG7Yh+Z60AAAAASUVO\nRK5CYII="; -attr = function(node, name) { - return node.getAttribute(name); -}; + this.$ = this.jQuery = jQuery.noConflict(true); -gog_prepare_title = function(elem) { - var dom; - dom = $('.product-title', elem).clone(); - $('._product-flag', dom).remove(); - return dom.text(); -}; + attr = function(node, name) { + return node.getAttribute(name); + }; -humble_make_button = function() { - var a, button, label; - label = $('').html(BUTTON_LABEL); - a = $('').html(BUTTON_LABEL).css('padding-left', '9px'); - return button = $('
').append('
').append(label).append(a); -}; + romanise_numbers = function(elem) { + elem = elem.replace(/1/g, "i"); + elem = elem.replace(/2/g, "ii"); + elem = elem.replace(/3/g, "iii"); + elem = elem.replace(/4/g, "iv"); + elem = elem.replace(/5/g, "v"); + elem = elem.replace(/6/g, "vi"); + elem = elem.replace(/7/g, "vii"); + elem = elem.replace(/8/g, "viii"); + elem = elem.replace(/9/g, "ix"); + return elem = elem.replace(/9/g, "ix"); + }; -humble_parse = function() { - var x; - return { - version: "02", - data: (function() { - var _i, _len, _ref, _results; - _ref = $('div.row').has(' .downloads.windows .download, .downloads.linux .download, .downloads.mac .download, .downloads.android .download').find('div.title'); - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - x = _ref[_i]; - _results.push({ - title: x.textContent.trim(), - copies: [ - { - type: 'humblestore' - } - ] - }); - } - return _results; - })() + gog_prepare_title = function(elem) { + var dom; + dom = $('.product-title', elem).clone(); + $('._product-flag', dom).remove(); + return dom.text(); }; -}; -scrapers = { - 'fireflowergames.com': { - '^https://fireflowergames\\.com/my-account/?': { - 'source_id': 'fireflower', - 'game_list': function() { - var results, title, titles, uniques, x; - results = $('ul.digital-downloads li a'); - titles = [ - (function() { - var _i, _len, _results; - _results = []; - for (_i = 0, _len = results.length; _i < _len; _i++) { - x = results[_i]; - _results.push($(x).text().split(" – ")[0].trim()); - } - return _results; - })() - ][0]; - uniques = titles.filter(function(title, pos) { - return titles.indexOf(title) === pos; - }); - return { - version: "02", - data: (function() { - var _i, _len, _results; - _results = []; - for (_i = 0, _len = uniques.length; _i < _len; _i++) { - title = uniques[_i]; - _results.push({ - title: title, - copies: [ - { - type: 'fireflower', - status: 'redeemed', - owned: 1 - } - ] - }); - } - return _results; - })() - }; - }, - 'insert_button': function() { - return $('
').html(BUTTON_LABEL).css({ - verticalAlign: '20%', - marginLeft: '1em' - }).appendTo($('ul.digital-downloads').prev()); - } - }, - '^http://fireflowergames\\.com/my-lists/(edit-my|view-a)-list/\\?.+': { - 'source_id': 'fireflower', - 'game_list': function() { - var results, x; - results = $('table.wl-table tbody td.check-column input:checked').parents('tr').find('td.product-name a'); - if (!results.length) { - results = $('table.wl-table td.product-name a'); + itch_plain = function(elem) { + return elem.toLowerCase(); + }; + + title_plain = function(elem) { + var plain; + plain = elem; + plain = plain.toLowerCase(); + plain = plain.replace(/\bthe\b/g, ""); + plain = plain.replace(/ & /g, " and "); + plain = plain.replace(" ", ""); + plain = plain.replace(/[\s\.\!@"#$%^&'*\(\)\-:_+=;,\?]/g, ""); + return romanise_numbers(plain); + }; + + humble_make_button = function() { + var a, button, label; + label = $('').html(BUTTON_LABEL); + a = $('').html(BUTTON_LABEL).css('padding-left', '9px'); + return button = $('
').append('
').append(label).append(a); + }; + + humble_parse = function() { + var x; + return { + version: "02", + data: (function() { + var i, len, ref, results1; + ref = $('div.row').has(' .downloads.windows .download, .downloads.linux .download, .downloads.mac .download, .downloads.android .download').find('div.title'); + results1 = []; + for (i = 0, len = ref.length; i < len; i++) { + x = ref[i]; + results1.push({ + title: x.textContent.trim(), + copies: [ + { + type: 'humblestore' + } + ] + }); } - return { - version: "02", - data: (function() { - var _i, _len, _results; - _results = []; - for (_i = 0, _len = results.length; _i < _len; _i++) { - x = results[_i]; - _results.push({ - title: $(x).text().trim() - }); - } - return _results; - })() - }; - }, - 'insert_button': function() { - return $('
').html(BUTTON_LABEL).wrap('').appendTo($('table.wl-actions-table tbody:first').find('tr:last')); - }, - 'is_wishlist': true - } - }, - 'flyingbundle.com': { - 'https?://(www\\.)?flyingbundle\\.com/users/account#?': { - 'source_id': 'flying_bundle', - 'game_list': function() { - var x; - return { - version: "02", - data: (function() { - var _i, _len, _ref, _results; - _ref = $(".div_btn_download[href^='/users/sources']").parents('li').find(':first'); - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - x = _ref[_i]; - _results.push({ - title: $(x).text(), - copies: [ - { - type: 'Flying Bundle', - status: 'redeemed', - owned: 1, - source: { - type: "s", - id: "other" + return results1; + })() + }; + }; + + scrapers = { + 'fireflowergames.com': { + '^https://fireflowergames\\.com/my-account/?': { + 'source_id': 'fireflower', + 'game_list': function() { + var results, title, titles, uniques, x; + results = $('ul.digital-downloads li a'); + titles = [ + (function() { + var i, len, results1; + results1 = []; + for (i = 0, len = results.length; i < len; i++) { + x = results[i]; + results1.push($(x).text().split(" – ")[0].trim()); + } + return results1; + })() + ][0]; + uniques = titles.filter(function(title, pos) { + return titles.indexOf(title) === pos; + }); + return { + version: "02", + data: (function() { + var i, len, results1; + results1 = []; + for (i = 0, len = uniques.length; i < len; i++) { + title = uniques[i]; + results1.push({ + title: title, + copies: [ + { + type: 'fireflower', + status: 'redeemed', + owned: 1 } - } - ] - }); - } - return _results; - })() - }; - }, - 'insert_button': function() { - var li; - li = $("
  • ").appendTo('.legenda_points ul'); - return $('' + BUTTON_LABEL + ' ').css('text-transform', 'uppercase').wrap("
  • ").appendTo(li); - } - } - }, - 'www.gog.com': { - '^https://www\\.gog\\.com/order/status/.+': { - 'source_id': 'gog', - 'game_list': function() { - var x; - console.debug("game_list called for GOG order status page"); - return { - "version": "02", - "data": (function() { - var _i, _len, _ref, _results; - _ref = $('.order + .container .product-row'); - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - x = _ref[_i]; - _results.push({ - title: gog_prepare_title(x), - copies: [ - { - type: 'gog', - status: 'redeemed', - owned: 1 - } - ] - }); - } - return _results; - })() - }; + ] + }); + } + return results1; + })() + }; + }, + 'insert_button': function() { + return $('').html(BUTTON_LABEL).css({ + verticalAlign: '20%', + marginLeft: '1em' + }).appendTo($('ul.digital-downloads').prev()); + } }, - 'insert_button': function() { - console.debug("insert_button called for GOG order status page"); - $(".order-article__btn-pointer-wrapper .order-article__btn-pointer").css({ - marginTop: -4, - zIndex: 20 - }); - $('.order-article__dropdown-items').css('z-index', 10); - return $("").html("On ITAD").prependTo($('.order-message__actions ._dropdown__items').filter(':first')); + '^http://fireflowergames\\.com/my-lists/(edit-my|view-a)-list/\\?.+': { + 'source_id': 'fireflower', + 'game_list': function() { + var results, x; + results = $('table.wl-table tbody td.check-column input:checked').parents('tr').find('td.product-name a'); + if (!results.length) { + results = $('table.wl-table td.product-name a'); + } + return { + version: "02", + data: (function() { + var i, len, results1; + results1 = []; + for (i = 0, len = results.length; i < len; i++) { + x = results[i]; + results1.push({ + title: $(x).text().trim() + }); + } + return results1; + })() + }; + }, + 'insert_button': function() { + return $('').html(BUTTON_LABEL).wrap('').appendTo($('table.wl-actions-table tbody:first').find('tr:last')); + }, + 'is_wishlist': true } }, - '^https?://www\\.gog\\.com/account(/games(/(shelf|list))?)?/?(\\?|$)': { - 'source_id': 'gog', - 'game_list': function() { - var x; - console.debug("game_list called for GOG collection page"); - return { - "version": "02", - "data": (function() { - var _i, _len, _ref, _results; - _ref = $('.product-row'); - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - x = _ref[_i]; - _results.push({ - title: gog_prepare_title(x), - copies: [ - { - type: 'gog', - status: 'redeemed', - owned: 1 - } - ] - }); - } - return _results; - })() - }; - }, - 'insert_button': function() { - console.debug("insert_button called for GOG collection page"); - return $("").css({ - float: 'right', - cursor: 'pointer', - position: 'relative', - marginBottom: '-2em', - zIndex: 1 - }).html(BUTTON_LABEL + " (This Page)").prependTo($('.collection-header').filter(':first')); + 'flyingbundle.com': { + 'https?://(www\\.)?flyingbundle\\.com/users/account#?': { + 'source_id': 'flying_bundle', + 'game_list': function() { + var x; + return { + version: "02", + data: (function() { + var i, len, ref, results1; + ref = $(".div_btn_download[href^='/users/sources']").parents('li').find(':first'); + results1 = []; + for (i = 0, len = ref.length; i < len; i++) { + x = ref[i]; + results1.push({ + title: $(x).text(), + copies: [ + { + type: 'Flying Bundle', + status: 'redeemed', + owned: 1, + source: { + type: "s", + id: "other" + } + } + ] + }); + } + return results1; + })() + }; + }, + 'insert_button': function() { + var li; + li = $("
  • ").appendTo('.legenda_points ul'); + return $('' + BUTTON_LABEL + ' ').css('text-transform', 'uppercase').wrap("
  • ").appendTo(li); + } } - } - }, - 'groupees.com': { - 'https?://(www\\.)?groupees\\.com/(purchases|users/\\d+)': { - 'source_id': 'other', - 'game_list': function() { - var x; - return { - "version": "02", - "data": (function() { - var _i, _len, _ref, _results; - _ref = $('.product ul.dropdown-menu').parents('.details').find('h3'); - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - x = _ref[_i]; - _results.push({ - title: x.textContent.trim(), - copies: [ - { - type: 'Groupees.com', - status: 'redeemed', - owned: 1, - source: { - type: "s", - id: "other" + }, + 'www.gog.com': { + '^https://www\\.gog\\.com/order/status/.+': { + 'source_id': 'gog', + 'game_list': function() { + var x; + console.debug("game_list called for GOG order status page"); + return { + "version": "02", + "data": (function() { + var i, len, ref, results1; + ref = $('.order + .container .product-row'); + results1 = []; + for (i = 0, len = ref.length; i < len; i++) { + x = ref[i]; + results1.push({ + title: gog_prepare_title(x), + copies: [ + { + type: 'gog', + status: 'redeemed', + owned: 1 } - } - ] - }); - } - return _results; - })() - }; + ] + }); + } + return results1; + })() + }; + }, + 'insert_button': function() { + console.debug("insert_button called for GOG order status page"); + $(".order-article__btn-pointer-wrapper .order-article__btn-pointer").css({ + marginTop: -4, + zIndex: 20 + }); + $('.order-article__dropdown-items').css('z-index', 10); + return $("").html("On ITAD").prependTo($('.order-message__actions ._dropdown__items').filter(':first')); + } }, - 'insert_button': function() { - return $("").css({ - float: 'right' - }).addClass('button btn btn-sm btn-primary').html(BUTTON_LABEL + " (Selected Bundle)").insertBefore("input[name='search']"); + '^https?://www\\.gog\\.com/account(/games(/(shelf|list))?)?/?(\\?|$)': { + 'source_id': 'gog', + 'game_list': function() { + var x; + console.debug("game_list called for GOG collection page"); + return { + "version": "02", + "data": (function() { + var i, len, ref, results1; + ref = $('.product-row'); + results1 = []; + for (i = 0, len = ref.length; i < len; i++) { + x = ref[i]; + results1.push({ + title: gog_prepare_title(x), + copies: [ + { + type: 'gog', + status: 'redeemed', + owned: 1 + } + ] + }); + } + return results1; + })() + }; + }, + 'insert_button': function() { + console.debug("insert_button called for GOG collection page"); + return $("").css({ + float: 'right', + cursor: 'pointer', + position: 'relative', + marginBottom: '-2em', + zIndex: 1 + }).html(BUTTON_LABEL + " (This Page)").prependTo($('.collection-header').filter(':first')); + } } - } - }, - 'www.humblebundle.com': { - 'https://www\\.humblebundle\\.com/home/library/?': { - 'source_id': 'humblestore', - 'game_list': function() { - var x; - return { - "version": "02", - "data": (function() { - var _i, _len, _ref, _results; - _ref = $('.subproduct-selector h2'); - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - x = _ref[_i]; - _results.push({ - title: x.textContent.trim(), - copies: [ - { - type: 'humblestore', - status: 'redeemed', - owned: 1 - } - ] - }); - } - return _results; - })() - }; - }, - 'insert_button': function() { - var button, config, found_early, observer; - config = { - childList: true, - subtree: true - }; - button = $('').html(BUTTON_LABEL).css({ - display: 'inline', - border: '1px solid #CCC', - background: '#F1F3F6', - padding: '5px 10px 5px 10px', - marginLeft: '10px' - }); - found_early = $(".top-controls"); - if (found_early.length > 0) { - console.log("Inserting button immediately."); - button.appendTo(found_early); - } else { - console.log("Using MutationObserver for deferred button insertion."); - observer = new MutationObserver(function(mutations) { - return mutations.forEach(function(mutation) { - var found, tnode_cls; - tnode_cls = mutation.target.getAttribute("class"); - found = $(".top-controls", mutation.target); - if (found.length > 0) { - observer.disconnect(); - return button.appendTo(found); + }, + 'itch.io': { + '^https?://.+\\.itch\\.io/.+/download/.+': { + 'source_id': 'itchio', + 'game_list': function() { + var x; + console.debug("game_list called for itch.io download page"); + return { + "version": "02", + "data": (function() { + var i, len, ref, results1; + ref = $('.inner_column').filter(':first'); + results1 = []; + for (i = 0, len = ref.length; i < len; i++) { + x = ref[i]; + results1.push({ + title: $('.object_title', x).first().text().replace(" ", " ").trim(), + plain: title_plain($('.object_title', x).first().text().trim()), + copies: [ + { + added: new Date($('p > abbr', x).attr('title').replace('@', '') + " UTC").getTime() / 1000, + type: 'itchio', + status: 'redeemed', + owned: 1 + } + ] + }); } - }); - }); - observer.observe(document.querySelector('.js-library-holder'), config); + return results1; + })() + }; + }, + 'insert_button': function() { + console.debug("insert_button called for itch.io download page"); + return $("").css({ + float: 'right', + cursor: 'pointer', + position: 'relative', + marginBottom: '-2em', + zIndex: 1 + }).html(BUTTON_LABEL + " (This Page)").appendTo($('.header_nav_tabs').filter(':first')); } - return button; } }, - 'https://www\\.humblebundle\\.com/home/?': { - 'source_id': 'humblestore', - 'game_list': humble_parse, - 'insert_button': function() { - return humble_make_button().css({ - float: 'right', - fontSize: '14px', - fontWeight: 'normal' - }).prependTo('.base-main-wrapper h1'); + 'groupees.com': { + 'https?://(www\\.)?groupees\\.com/(purchases|users/\\d+)': { + 'source_id': 'other', + 'game_list': function() { + var x; + return { + "version": "02", + "data": (function() { + var i, len, ref, results1; + ref = $('.product ul.dropdown-menu').parents('.details').find('h3'); + results1 = []; + for (i = 0, len = ref.length; i < len; i++) { + x = ref[i]; + results1.push({ + title: x.textContent.trim(), + copies: [ + { + type: 'Groupees.com', + status: 'redeemed', + owned: 1, + source: { + type: "s", + id: "other" + } + } + ] + }); + } + return results1; + })() + }; + }, + 'insert_button': function() { + return $("").css({ + float: 'right' + }).addClass('button btn btn-sm btn-primary').html(BUTTON_LABEL + " (Selected Bundle)").insertBefore("input[name='search']"); + } } }, - 'https://www\\.humblebundle\\.com/(download)?s\\?key=.+': { - 'source_id': 'humblestore', - 'game_list': humble_parse, - 'insert_button': function() { - var parent; - parent = $('.js-gamelist-holder').parents('.whitebox'); - parent.find('.staple.s4').remove(); - return humble_make_button().css({ - position: 'absolute', - top: 11, - right: 17 - }).appendTo(parent); + 'www.humblebundle.com': { + 'https://www\\.humblebundle\\.com/home/library/?': { + 'source_id': 'humblestore', + 'game_list': function() { + var x; + return { + "version": "02", + "data": (function() { + var i, len, ref, results1; + ref = $('.subproduct-selector h2'); + results1 = []; + for (i = 0, len = ref.length; i < len; i++) { + x = ref[i]; + results1.push({ + title: x.textContent.trim(), + copies: [ + { + type: 'humblestore', + status: 'redeemed', + owned: 1 + } + ] + }); + } + return results1; + })() + }; + }, + 'insert_button': function() { + var button, config, found_early, observer; + config = { + childList: true, + subtree: true + }; + button = $('').html(BUTTON_LABEL).css({ + display: 'inline', + border: '1px solid #CCC', + background: '#F1F3F6', + padding: '5px 10px 5px 10px', + marginLeft: '10px' + }); + found_early = $(".top-controls"); + if (found_early.length > 0) { + console.log("Inserting button immediately."); + button.appendTo(found_early); + } else { + console.log("Using MutationObserver for deferred button insertion."); + observer = new MutationObserver(function(mutations) { + return mutations.forEach(function(mutation) { + var found, tnode_cls; + tnode_cls = mutation.target.getAttribute("class"); + found = $(".top-controls", mutation.target); + if (found.length > 0) { + observer.disconnect(); + return button.appendTo(found); + } + }); + }); + observer.observe(document.querySelector('.js-library-holder'), config); + } + return button; + } + }, + 'https://www\\.humblebundle\\.com/home/?': { + 'source_id': 'humblestore', + 'game_list': humble_parse, + 'insert_button': function() { + return humble_make_button().css({ + float: 'right', + fontSize: '14px', + fontWeight: 'normal' + }).prependTo('.base-main-wrapper h1'); + } + }, + 'https://www\\.humblebundle\\.com/(download)?s\\?key=.+': { + 'source_id': 'humblestore', + 'game_list': humble_parse, + 'insert_button': function() { + var parent; + parent = $('.js-gamelist-holder').parents('.whitebox'); + parent.find('.staple.s4').remove(); + return humble_make_button().css({ + position: 'absolute', + top: 11, + right: 17 + }).appendTo(parent); + } } } - } -}; + }; -scrapers['www.flyingbundle.com'] = scrapers['flyingbundle.com']; + scrapers['www.flyingbundle.com'] = scrapers['flyingbundle.com']; -scrapers['www.groupees.com'] = scrapers['groupees.com']; + scrapers['www.groupees.com'] = scrapers['groupees.com']; -scrapeGames = function(scraper_obj) { - var form, params, url; - params = { - file: btoa(unescape(encodeURIComponent(JSON.stringify(scraper_obj.game_list())))), - upload: 'x' + scrapeGames = function(scraper_obj) { + var form, params, url; + params = { + file: btoa(unescape(encodeURIComponent(JSON.stringify(scraper_obj.game_list())))), + upload: 'x' + }; + url = scraper_obj.is_wishlist != null ? 'https://isthereanydeal.com/waitlist/import/' : 'https://isthereanydeal.com/collection/import/'; + form = $("
    ").attr('action', url); + params['returnTo'] = location.href; + form.css({ + display: 'none' + }); + $.each(params, function(key, value) { + return $("").attr("name", key).attr("value", value).appendTo(form); + }); + $(document.body).append(form); + return form.submit(); }; - url = scraper_obj.is_wishlist != null ? 'https://isthereanydeal.com/waitlist/import/' : 'https://isthereanydeal.com/collection/import/'; - form = $("").attr('action', url); - params['returnTo'] = location.href; - form.css({ - display: 'none' - }); - $.each(params, function(key, value) { - return $("").attr("name", key).attr("value", value).appendTo(form); - }); - $(document.body).append(form); - return form.submit(); -}; -$(function() { - var e, profile, profile_matched, regex, scraper, _fn, _i, _len, _ref, _results; - console.log("Loading ITAD importer..."); - if (scrapers[location.host]) { - console.log("Matched domain: " + location.host); - _ref = scrapers[location.host]; - _results = []; - for (regex in _ref) { - profile = _ref[regex]; - try { - profile_matched = location.href.match(regex); - } catch (_error) { - e = _error; - console.error("Bad regex: " + regex); - } - if (profile_matched) { - console.log("Matched profile: " + regex); - $('.itad_btn, #itad_dlg, .itad_close').remove(); - if (!Array.isArray(profile)) { - profile = [profile]; + $(function() { + var e, fn, i, len, profile, profile_matched, ref, regex, results1, scraper; + console.log("Loading ITAD importer..."); + if (location.host.match(/\.itch\.io/)) { + scrapers[location.host] = scrapers['itch.io']; + } + if (scrapers[location.host]) { + console.log("Matched domain: " + location.host); + ref = scrapers[location.host]; + results1 = []; + for (regex in ref) { + profile = ref[regex]; + try { + profile_matched = location.href.match(regex); + } catch (error) { + e = error; + console.error("Bad regex: " + regex); } - _fn = function(scraper) { - console.log("Inserting ITAD button for source ID: " + scraper.source_id); - return typeof scraper.insert_button === "function" ? scraper.insert_button().addClass('itad_btn').click(function() { - console.log("ITAD button clicked"); - return scrapeGames(scraper); - }) : void 0; - }; - for (_i = 0, _len = profile.length; _i < _len; _i++) { - scraper = profile[_i]; - _fn(scraper); + if (profile_matched) { + console.log("Matched profile: " + regex); + $('.itad_btn, #itad_dlg, .itad_close').remove(); + if (!Array.isArray(profile)) { + profile = [profile]; + } + fn = function(scraper) { + console.log("Inserting ITAD button for source ID: " + scraper.source_id); + return typeof scraper.insert_button === "function" ? scraper.insert_button().addClass('itad_btn').click(function() { + console.log("ITAD button clicked"); + return scrapeGames(scraper); + }) : void 0; + }; + for (i = 0, len = profile.length; i < len; i++) { + scraper = profile[i]; + fn(scraper); + } + break; + } else { + results1.push(void 0); } - break; - } else { - _results.push(void 0); } + return results1; } - return _results; - } -}); + }); + +}).call(this);