Notuom / netflix-activity-extract

// ==UserScript==
// @name         netflix-activity-extract
// @namespace    https://github.com/Notuom
// @version      1.0.0
// @license      ISC
// @description  Extract Netflix viewing activity in digestible form
// @author       Notuom
// @match        https://www.netflix.com/viewingactivity
// @grant        GM_registerMenuCommand
// ==/UserScript==

!function(t){var e={};function n(o){if(e[o])return e[o].exports;var r=e[o]={i:o,l:!1,exports:{}};return t[o].call(r.exports,r,r.exports,n),r.l=!0,r.exports}n.m=t,n.c=e,n.d=function(t,e,o){n.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:o})},n.r=function(t){Object.defineProperty(t,"__esModule",{value:!0})},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=1)}([function(t,e,n){var o,r=r||function(t){"use strict";if(!(void 0===t||"undefined"!=typeof navigator&&/MSIE [1-9]\./.test(navigator.userAgent))){var e=function(){return t.URL||t.webkitURL||t},n=t.document.createElementNS("http://www.w3.org/1999/xhtml","a"),o="download"in n,r=/constructor/i.test(t.HTMLElement)||t.safari,i=/CriOS\/[\d]+/.test(navigator.userAgent),a=function(e){(t.setImmediate||t.setTimeout)(function(){throw e},0)},c=function(t){setTimeout(function(){"string"==typeof t?e().revokeObjectURL(t):t.remove()},4e4)},l=function(t){return/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(t.type)?new Blob([String.fromCharCode(65279),t],{type:t.type}):t},s=function(s,u,d){d||(s=l(s));var f,p=this,v="application/octet-stream"===s.type,w=function(){!function(t,e,n){for(var o=(e=[].concat(e)).length;o--;){var r=t["on"+e[o]];if("function"==typeof r)try{r.call(t,n||t)}catch(t){a(t)}}}(p,"writestart progress write writeend".split(" "))};if(p.readyState=p.INIT,o)return f=e().createObjectURL(s),void setTimeout(function(){var t,e;n.href=f,n.download=u,t=n,e=new MouseEvent("click"),t.dispatchEvent(e),w(),c(f),p.readyState=p.DONE});!function(){if((i||v&&r)&&t.FileReader){var n=new FileReader;return n.onloadend=function(){var e=i?n.result:n.result.replace(/^data:[^;]*;/,"data:attachment/file;");t.open(e,"_blank")||(t.location.href=e),e=void 0,p.readyState=p.DONE,w()},n.readAsDataURL(s),void(p.readyState=p.INIT)}f||(f=e().createObjectURL(s)),v?t.location.href=f:t.open(f,"_blank")||(t.location.href=f);p.readyState=p.DONE,w(),c(f)}()},u=s.prototype;return"undefined"!=typeof navigator&&navigator.msSaveOrOpenBlob?function(t,e,n){return e=e||t.name||"download",n||(t=l(t)),navigator.msSaveOrOpenBlob(t,e)}:(u.abort=function(){},u.readyState=u.INIT=0,u.WRITING=1,u.DONE=2,u.error=u.onwritestart=u.onprogress=u.onwrite=u.onabort=u.onerror=u.onwriteend=null,function(t,e,n){return new s(t,e||t.name||"download",n)})}}("undefined"!=typeof self&&self||"undefined"!=typeof window&&window||this.content);
/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */void 0!==t&&t.exports?t.exports.saveAs=r:null!==n(3)&&null!==n(2)&&(void 0===(o=function(){return r}.call(e,n,e,t))||(t.exports=o))},function(t,e,n){"use strict";n.r(e);class o{constructor(t,e,n){this.title=t,this.date=e,this.isSeries=n,this.count=1}}var r=n(0);window.netflix_activity_extract__stop=(()=>{console.log("netflix-activity-extract: Stop"),clearInterval(window.netflix_activity_extract__interval)}),window.netflix_activity_extract__run=(()=>{console.log("netflix-activity-extract: Start"),window.netflix_activity_extract__interval=setInterval(()=>{scrollTo(0,document.body.scrollHeight),setTimeout(()=>{if(null===document.querySelector(".responsive-account-container > div > div > .basic-spinner")){window.netflix_activity_extract__stop();const t=document.querySelector(".retable");null!==t?(!function(t){const e=/^(.*?):(.*?):(.*?)$/,n={type:"text/plain;charset=utf-8"},i=[],a={};if(t.hasChildNodes()){let n,r,l,s,u;for(var c=0;c<t.childNodes.length;c++)n=t.childNodes[c].querySelector(".title a").text,r=t.childNodes[c].querySelector(".date").innerHTML,i.push(n),u=null!==(s=e.exec(n)),l=u?s[1]:n,a.hasOwnProperty(l)?a[l].count++:a[l]=new o(l,r,u)}const l=i.join("\n"),s=new Blob([l],n);Object(r.saveAs)(s,"titles.txt");const u='"Title","Count","Date","Series?"\n'+Object.values(a).sort((t,e)=>t.title.localeCompare(e.title)).map(t=>'"'+t.title.replace(/"/g,"''")+'",'+t.count+","+t.date+","+(t.isSeries?"Yes":"No")).join("\n"),d=new Blob([u],n);Object(r.saveAs)(d,"watched-titles.csv")}(t),alert("Done!")):alert("Can't find the activity list!")}},50)},500)})},function(t,e){(function(e){t.exports=e}).call(this,{})},function(t,e){t.exports=function(){throw new Error("define cannot be used indirect")}}]);

(function() {
    "use strict";
    GM_registerMenuCommand('Start', netflix_activity_extract__run);
    GM_registerMenuCommand('Stop', netflix_activity_extract__stop);
})();