diff --git a/asset-manifest.json b/asset-manifest.json index 6ca2222..7946dfa 100644 --- a/asset-manifest.json +++ b/asset-manifest.json @@ -1,8 +1,8 @@ { "files": { "main.css": "/static/css/main.b6f0cd93.chunk.css", - "main.js": "/static/js/main.378ff0eb.chunk.js", - "main.js.map": "/static/js/main.378ff0eb.chunk.js.map", + "main.js": "/static/js/main.2fbc33af.chunk.js", + "main.js.map": "/static/js/main.2fbc33af.chunk.js.map", "runtime-main.js": "/static/js/runtime-main.8ef242c9.js", "runtime-main.js.map": "/static/js/runtime-main.8ef242c9.js.map", "static/css/2.d1c75e18.chunk.css": "/static/css/2.d1c75e18.chunk.css", @@ -18,6 +18,6 @@ "static/css/2.d1c75e18.chunk.css", "static/js/2.e7b7c349.chunk.js", "static/css/main.b6f0cd93.chunk.css", - "static/js/main.378ff0eb.chunk.js" + "static/js/main.2fbc33af.chunk.js" ] } \ No newline at end of file diff --git a/index.html b/index.html index b86582e..31d4aba 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -Audible Tools
\ No newline at end of file +Audible Tools
\ No newline at end of file diff --git a/static/js/main.2fbc33af.chunk.js b/static/js/main.2fbc33af.chunk.js new file mode 100644 index 0000000..5c4b91c --- /dev/null +++ b/static/js/main.2fbc33af.chunk.js @@ -0,0 +1,2 @@ +(this["webpackJsonpmaterial-pg-01"]=this["webpackJsonpmaterial-pg-01"]||[]).push([[0],{105:function(e,t,a){},132:function(e,t,a){"use strict";a.r(t);var n=a(0),r=a.n(n),i=a(10),c=a.n(i);a(105),Boolean("localhost"===window.location.hostname||"[::1]"===window.location.hostname||window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/));var o=a(67),s=a(15),l=a.n(s),u=a(31),d=a(21),p=a(22),h=a(30),m=a(29),f=a(6),j=a(180),b=a(174),v=a(173),x=a(175),y=a(171),O=a(177),g=a(83),k=a.n(g),C=a(88),_=a(172),w=a(86),S=a(134),B=a(66),A=a.n(B),F=a(84),I=a.n(F),N=a(40),D=a(5),T=function(e){Object(h.a)(a,e);var t=Object(m.a)(a);function a(e){var n;return Object(d.a)(this,a),(n=t.call(this,e))._handleUpload=n._handleUpload.bind(Object(N.a)(n)),n}return Object(p.a)(a,[{key:"_handleUpload",value:function(e){var t=e.target.files[0];this.props.onChange(t),this.fileInput.value=null}},{key:"render",value:function(){var e=this;return Object(D.jsxs)("div",{style:this.props.style,children:[Object(D.jsx)("input",{accept:this.props.accept,type:"file",style:{display:"none"},onChange:this._handleUpload,ref:function(t){return e.fileInput=t}}),r.a.cloneElement(this.props.children,{onClick:function(){return e.fileInput.click()}})]})}}]),a}(r.a.Component),R=function(e){Object(h.a)(a,e);var t=Object(m.a)(a);function a(e){var n;return Object(d.a)(this,a),(n=t.call(this,e))._validate=n._validate.bind(Object(N.a)(n)),n}return Object(p.a)(a,[{key:"_validate",value:function(e){var t=this.props,a=t.onError,n=t.onChange,r=t.maxSize,i=t.extensions;if(e){if(i){var c=e.name.split(".").pop().toLowerCase();if(!i.map((function(e){return e.toLowerCase()})).includes(c))return void a("Must upload a file of type: ".concat(i.join(" or ")))}var o=1e6*r;e.size>o?a("File size must be less than ".concat(r," MB.")):n(e)}else a("Failed to upload a file.")}},{key:"render",value:function(){var e=this.props,t=e.children,a=e.style,n=this.props.extensions.map((function(e){return".".concat(e)})).join(",");return Object(D.jsx)(T,{onChange:this._validate,style:a,accept:n,children:t})}}]),a}(r.a.Component);R.defaultProps={maxSize:2};var z=R,H=a(56),P=a(179),U=a(169),W=a(170),E=a(82),M=a.n(E),q=a(178),L=a(182),V=a(167),J=a(163),X=a(166);function G(e){var t=e.outputFormat,a=e.setOutputFormat,n=e.style;return Object(D.jsxs)(J.a,{component:"fieldset",style:n,children:[Object(D.jsx)(X.a,{component:"legend",children:"Output Format"}),Object(D.jsxs)(L.a,{"aria-label":"format",name:"format",value:t,onChange:function(e){a(e.target.value)},children:[Object(D.jsx)(V.a,{value:"m4b",control:Object(D.jsx)(q.a,{}),label:"AAC m4b"}),Object(D.jsx)(V.a,{value:"flac",control:Object(D.jsx)(q.a,{}),label:"FLAC hq"}),Object(D.jsx)(V.a,{value:"mp3",control:Object(D.jsx)(q.a,{}),label:"Lame mp3"})]})]})}function K(e){var t=e.operatingSystem,a=e.setOperatingSystem,n=e.style;return Object(D.jsxs)(J.a,{component:"fieldset",style:n,children:[Object(D.jsx)(X.a,{component:"legend",children:"Environment"}),Object(D.jsxs)(L.a,{"aria-label":"format",name:"format",value:t,onChange:function(e){return a(e.target.value)},children:[Object(D.jsx)(V.a,{value:"linux",control:Object(D.jsx)(q.a,{}),label:"Powershell, Bash, Mac"}),Object(D.jsx)(V.a,{value:"winCmd",control:Object(D.jsx)(q.a,{}),label:"Cmd (Windows)"})]})]})}var Y=function(e){Object(h.a)(a,e);var t=Object(m.a)(a);function a(e){var n;return Object(d.a)(this,a),(n=t.call(this,e)).DarkerDisabledTextField=Object(f.a)({root:{marginRight:8,"& .MuiInputBase-root.Mui-disabled":{color:"rgba(0, 0, 0, 0.6)"}}})(x.a),n.setExpanded=function(e){return n.setState({expanded:e})},n.handleChange=function(e){return function(t,a){n.setExpanded(!!a&&e)}},n.getCommand=function(){var e,t=n.state,a=t.outputFormat,r=t.operatingSystem,i=n.props,c=i.fileName,o=i.activationBytes;o=null!==(e=o)&&void 0!==e?e:"00000000";var s=c.split(".")[0];s="input"==s?"output":s;var l=[{os:"winCmd",cmd:"ffmpeg",discriminator:'"'},{os:"linux",cmd:"ffmpeg",discriminator:"'"}].filter((function(e){return e.os==r}))[0],u=[{format:"m4b",codec:"copy"},{format:"flac",codec:"flac"},{format:"mp3",codec:"libmp3lame"}].filter((function(e){return e.format==a}))[0].codec,d=l.cmd,p=l.discriminator;return"".concat(d," -y")+" -activation_bytes ".concat(o," -i ").concat(p).concat(c).concat(p)+" -map_metadata 0 -id3v2_version 3"+" -codec:a ".concat(u)+" -vn ".concat(p).concat(s,".").concat(a).concat(p)},n.state={expanded:"",outputFormat:"m4b",operatingSystem:"linux"},n}return Object(p.a)(a,[{key:"render",value:function(){var e=this,t=this.props.classes,a=this.state,n=a.expanded,r=a.outputFormat,i=a.operatingSystem;return Object(D.jsx)("div",{className:t.root,children:Object(D.jsxs)(P.a,{expanded:"panel2"===n,onChange:this.handleChange("panel2"),children:[Object(D.jsxs)(U.a,{expandIcon:Object(D.jsx)(M.a,{}),"aria-controls":"panel2bh-content",id:"panel2bh-header",children:[Object(D.jsx)(C.a,{className:t.heading,children:"Command"}),Object(D.jsx)(C.a,{className:t.secondaryHeading,children:"Generate ffmpeg command"})]}),Object(D.jsxs)(W.a,{style:{display:"block"},children:[Object(D.jsx)(G,{outputFormat:r,setOutputFormat:function(t){return e.setState({outputFormat:t})}}),Object(D.jsx)(K,{operatingSystem:i,setOperatingSystem:function(t){return e.setState({operatingSystem:t})},style:{paddingLeft:"20px"}}),Object(D.jsx)(this.DarkerDisabledTextField,{value:this.getCommand(),disabled:!0,multiline:!0,variant:"outlined",margin:"normal",fullWidth:!0,id:"activationBytes",label:"cmd",name:"activationBytes",autoComplete:"activationBytes","aria-readonly":!0,fontSize:5,InputProps:{readOnly:!0,endAdornment:Object(D.jsx)(H.CopyToClipboard,{text:this.getCommand(),children:Object(D.jsx)(S.a,{children:Object(D.jsx)(A.a,{})})})}})]})]})})}}]),a}(r.a.Component),$=Object(f.a)((function(e){return{root:{width:"100%"},heading:{fontSize:e.typography.pxToRem(15),flexBasis:"33.33%",flexShrink:0},secondaryHeading:{fontSize:e.typography.pxToRem(15),color:e.palette.text.secondary}}}))(Y),Q=(a(115),a(47)),Z=a.n(Q),ee=function(){function e(){Object(d.a)(this,e),this.__fixed_key=[119,33,77,75,25,106,135,205,82,0,69,253,32,165,29,103]}return Object(p.a)(e,[{key:"__hexToBytes",value:function(e){for(var t=[],a=0;a>>4).toString(16)),t.push((15&n).toString(16))}return t.join("")}},{key:"__HashData",value:function(){var e=Object(u.a)(l.a.mark((function e(t){var a,n;return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a=new Uint8Array(t),e.next=3,crypto.subtle.digest("SHA-1",a);case 3:return n=e.sent,e.abrupt("return",Array.from(new Uint8Array(n)));case 5:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()},{key:"CalculateChecksum",value:function(){var e=Object(u.a)(l.a.mark((function e(t){var a,n,r,i;return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a=this.__hexToBytes(t),e.next=3,this.__HashData(this.__fixed_key.concat(a));case 3:return n=e.sent,e.next=6,this.__HashData(this.__fixed_key.concat(n).concat(a));case 6:return r=e.sent,e.next=9,this.__HashData(n.slice(0,16).concat(r.slice(0,16)));case 9:return i=e.sent,e.abrupt("return",this.__bytesToHex(i));case 11:case"end":return e.stop()}}),e,this)})));return function(t){return e.apply(this,arguments)}}()}],[{key:"CalculateChecksum",value:function(){var t=Object(u.a)(l.a.mark((function t(a){return l.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",e.Instance.CalculateChecksum(a));case 1:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}()}]),e}();ee.Instance=new ee;var te=function(e){Object(h.a)(a,e);var t=Object(m.a)(a);function a(e){var n;return Object(d.a)(this,a),(n=t.call(this,e)).DarkerDisabledTextField=Object(f.a)({root:{marginRight:8,"& .MuiInputBase-root.Mui-disabled":{color:"rgba(0, 0, 0, 0.6)"}}})(x.a),n.Copyright=function(){return Object(D.jsxs)(C.a,{variant:"body2",color:"textSecondary",align:"center",children:["Copyright \xa9 ",Object(D.jsx)(y.a,{color:"inherit",href:"https://audible-tools.github.io/",children:"audible-tools"})," ",(new Date).getFullYear(),"."]})},n.setChecksum=function(e){e.length>40||n.setState({checksum:e})},n.isChecksumValid=function(){var e=n.state.checksum;return RegExp("[a-f0-9]{40}").test(e)},n.isInputInvalid=function(){var e=n.state.checksum;return!(!e||""===e)&&!n.isChecksumValid()},n.addNotification=function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];Q.store.addNotification({message:e,type:t?"success":"danger",insert:"bottom-left",container:"top-full",animationIn:["animate__animated","animate__fadeIn"],animationOut:["animate__animated","animate__fadeOut"],dismiss:{duration:3e3,onScreen:!1}})},n.requestActivationBytes=Object(u.a)(l.a.mark((function e(){var t,a,r,i,c;return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=n.state.checksum,e.prev=1,e.next=4,fetch("https://aax.api.j-kit.me/api/v2/activation/"+t);case 4:return a=e.sent,e.next=7,a.json();case 7:if(r=e.sent,i=r.success,c=r.activationBytes,!0===i){e.next=13;break}return n.setState({activationBytes:"UNKNOWN"}),n.addNotification("An error occured while resolving the activation bytes, please check your inputs",!1),e.abrupt("return");case 13:if(!0!==i){e.next=23;break}return e.next=16,ee.CalculateChecksum(c);case 16:if(e.sent!=t){e.next=21;break}return n.setState({activationBytes:c}),n.addNotification("Successfully resolved the activation bytes"),e.abrupt("return");case 21:n.setState({activationBytes:"API ERROR"}),n.addNotification("An unexpected error occured while resolving the activation bytes, please try again",!1);case 23:e.next=29;break;case 25:e.prev=25,e.t0=e.catch(1),n.setState({activationBytes:e.t0}),n.addNotification("An error occured while resolving the activation bytes, please check your inputs",!1);case 29:case"end":return e.stop()}}),e,null,[[1,25]])}))),n.acceptFiles=function(){var e=Object(u.a)(l.a.mark((function e(t){var a;return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a=t[0],e.next=3,n.acceptFile(a);case 3:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),n.acceptFile=function(){var e=Object(u.a)(l.a.mark((function e(t){var a,r;return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n.setState({fileName:t.name}),a=t.slice(653,673),e.t0=n,e.next=5,a.arrayBuffer();case 5:e.t1=e.sent,r=e.t0.buf2hex.call(e.t0,e.t1),n.setChecksum(r),n.requestActivationBytes();case 9:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),n.state={checksum:"",fileName:"input.aax"},n}return Object(p.a)(a,[{key:"buf2hex",value:function(e){return Array.prototype.map.call(new Uint8Array(e),(function(e){return("00"+e.toString(16)).slice(-2)})).join("")}},{key:"render",value:function(){var e=this,t=this.props.classes,a=this.state,n=a.checksum,r=a.activationBytes,i=a.fileName;return Object(D.jsxs)(_.a,{component:"main",maxWidth:"md",children:[Object(D.jsx)(v.a,{}),Object(D.jsxs)("div",{className:t.paper,children:[Object(D.jsx)(j.a,{className:t.avatar,children:Object(D.jsx)(k.a,{})}),Object(D.jsx)(C.a,{component:"h1",variant:"h5",children:"AAX Checksum Resolver"}),Object(D.jsxs)("form",{className:t.form,noValidate:!0,children:[Object(D.jsx)(w.a,{noClick:!0,onDrop:function(t){console.log(t),e.acceptFiles(t)},children:function(t){var a=t.getRootProps,r=t.getInputProps;return Object(D.jsx)("section",{children:Object(D.jsxs)("div",Object(o.a)(Object(o.a)({},a()),{},{children:[Object(D.jsx)("input",Object(o.a)({},r())),Object(D.jsx)(x.a,{error:e.isInputInvalid(),variant:"outlined",margin:"normal",required:!0,fullWidth:!0,id:"checksum",label:"Checksum or Drag&Drop .aax file -",name:"checksum",autoComplete:"checksum",autoFocus:!0,onChange:function(t){return e.setChecksum(t.target.value)},value:n,InputProps:{readOnly:!1,endAdornment:Object(D.jsx)(z,{extensions:["aax","AAX"],maxSize:99999,onChange:e.acceptFile,children:Object(D.jsx)(S.a,{children:Object(D.jsx)(I.a,{})})})}})]}))})}}),Object(D.jsx)(b.a,{fullWidth:!0,variant:"contained",onClick:function(){e.requestActivationBytes()},disabled:!this.isChecksumValid(),children:"Request Activation Bytes"}),Object(D.jsx)(this.DarkerDisabledTextField,{value:r,disabled:!0,variant:"outlined",margin:"normal",fullWidth:!0,id:"activationBytes",label:r?"":"Activation Bytes",name:"activationBytes",autoComplete:"activationBytes","aria-readonly":!0,InputProps:{readOnly:!0,endAdornment:Object(D.jsx)(H.CopyToClipboard,{text:r,children:Object(D.jsx)(S.a,{children:Object(D.jsx)(A.a,{})})})}})]})]}),Object(D.jsx)($,{fileName:i,activationBytes:r}),Object(D.jsx)(O.a,{mt:1,children:Object(D.jsx)(this.Copyright,{})})]})}}]),a}(r.a.Component),ae=Object(f.a)((function(e){return{paper:{marginTop:e.spacing(8),display:"flex",flexDirection:"column",alignItems:"center"},avatar:{margin:e.spacing(1),backgroundColor:e.palette.secondary.main},form:{width:"100%",marginTop:e.spacing(1)},heading:{fontSize:e.typography.pxToRem(15),flexBasis:"33.33%",flexShrink:0},secondaryHeading:{fontSize:e.typography.pxToRem(15),color:e.palette.text.secondary}}}))(te),ne=a(85),re=a.n(ne),ie=a(71);ie.a.initialize("UA-174657678-1"),ie.a.pageview(window.location.pathname+window.location.search),c.a.render(Object(D.jsxs)("div",{children:[Object(D.jsxs)("div",{style:{display:"flex"},children:[Object(D.jsx)(Z.a,{}),Object(D.jsx)(re.a,{repo:"//github.com/audible-tools/audible-tools.github.io",colorOctocat:"black",isPride:!0})]}),Object(D.jsx)(ae,{})]}),document.getElementById("root")),"serviceWorker"in navigator&&navigator.serviceWorker.ready.then((function(e){e.unregister()})).catch((function(e){console.error(e.message)}))}},[[132,1,2]]]); +//# sourceMappingURL=main.2fbc33af.chunk.js.map \ No newline at end of file diff --git a/static/js/main.2fbc33af.chunk.js.map b/static/js/main.2fbc33af.chunk.js.map new file mode 100644 index 0000000..7092325 --- /dev/null +++ b/static/js/main.2fbc33af.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["serviceWorker.js","Components/FileInput/index.js","Components/FilePicker/index.js","OutputFormatSelection.js","OSSelector.js","ControlledAccordions.js","Utils/AaxHashAlgorithm.js","ChecksumResolver.js","index.js"],"names":["Boolean","window","location","hostname","match","FileInput","props","_handleUpload","bind","evt","file","target","files","this","onChange","fileInput","value","style","accept","type","display","ref","ele","React","cloneElement","children","onClick","click","Component","FilePicker","_validate","onError","maxSize","extensions","uploadedFileExt","name","split","pop","toLowerCase","map","ext","includes","join","maxBytes","size","defaultProps","OutputFormatSelection","outputFormat","setOutputFormat","FormControl","component","FormLabel","RadioGroup","aria-label","event","FormControlLabel","control","Radio","label","OSSelector","operatingSystem","setOperatingSystem","ControlledAccordions","DarkerDisabledTextField","withStyles","root","marginRight","color","TextField","setExpanded","x","setState","expanded","handleChange","panel","isExpanded","getCommand","state","fileName","activationBytes","fileNameWithoutExtension","osMap","os","cmd","discriminator","filter","codec","format","bin","di","classes","className","Accordion","AccordionSummary","expandIcon","aria-controls","id","Typography","heading","secondaryHeading","AccordionDetails","paddingLeft","disabled","multiline","variant","margin","fullWidth","autoComplete","aria-readonly","fontSize","InputProps","readOnly","endAdornment","text","IconButton","theme","width","typography","pxToRem","flexBasis","flexShrink","palette","secondary","AaxHashAlgorithm","__fixed_key","hex","bytes","c","length","push","parseInt","substr","i","current","toString","data","a","source","Uint8Array","crypto","subtle","digest","buffer","Array","from","__hexToBytes","__HashData","concat","intermediate_key","intermediate_iv","slice","checksum","__bytesToHex","Instance","CalculateChecksum","ChecksumResolver","Copyright","align","Link","href","Date","getFullYear","setChecksum","isChecksumValid","RegExp","test","isInputInvalid","addNotification","success","store","message","insert","container","animationIn","animationOut","dismiss","duration","onScreen","requestActivationBytes","fetch","request","json","result","acceptFiles","acceptFile","slic","arrayBuffer","results","buf2hex","prototype","call","Container","maxWidth","CssBaseline","paper","Avatar","avatar","form","noValidate","noClick","onDrop","acceptedFiles","console","log","getRootProps","getInputProps","error","required","autoFocus","Button","Box","mt","marginTop","spacing","flexDirection","alignItems","backgroundColor","main","ReactGA","initialize","pageview","pathname","search","ReactDOM","render","repo","colorOctocat","isPride","document","getElementById","navigator","serviceWorker","ready","then","registration","unregister","catch"],"mappings":"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","file":"static/js/main.2fbc33af.chunk.js","sourcesContent":["// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' },\n })\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready\n .then(registration => {\n registration.unregister();\n })\n .catch(error => {\n console.error(error.message);\n });\n }\n}\n","// external imports\r\nimport React from 'react'\r\nimport PropTypes from 'prop-types'\r\n\r\nclass FileInput extends React.Component {\r\n constructor(props) {\r\n super(props)\r\n\r\n this._handleUpload = this._handleUpload.bind(this)\r\n }\r\n\r\n _handleUpload(evt) {\r\n const file = evt.target.files[0]\r\n this.props.onChange(file)\r\n\r\n // free up the fileInput again\r\n this.fileInput.value = null\r\n }\r\n\r\n render() {\r\n return (\r\n
\r\n (this.fileInput = ele)}\r\n />\r\n {React.cloneElement(this.props.children, {\r\n onClick: () => this.fileInput.click()\r\n })}\r\n
\r\n )\r\n }\r\n}\r\n\r\nFileInput.propTypes = {\r\n style: PropTypes.object,\r\n accept: PropTypes.string,\r\n children: PropTypes.node.isRequired,\r\n onChange: PropTypes.func.isRequired\r\n}\r\n\r\nexport default FileInput\r\n","// external imports\r\nimport React from 'react'\r\nimport PropTypes from 'prop-types'\r\n// local imports\r\nimport FileInput from '../FileInput'\r\n\r\nclass FilePicker extends React.Component {\r\n constructor(props) {\r\n super(props)\r\n\r\n this._validate = this._validate.bind(this)\r\n }\r\n\r\n _validate(file) {\r\n const { onError, onChange, maxSize, extensions } = this.props\r\n\r\n // make sure a file was provided in the first place\r\n if (!file) {\r\n onError('Failed to upload a file.')\r\n return\r\n }\r\n\r\n // if we care about file extensions\r\n if (extensions) {\r\n const uploadedFileExt = file.name\r\n .split('.')\r\n .pop()\r\n .toLowerCase()\r\n const isValidFileExt = extensions\r\n .map(ext => ext.toLowerCase())\r\n .includes(uploadedFileExt)\r\n\r\n if (!isValidFileExt) {\r\n onError(`Must upload a file of type: ${extensions.join(' or ')}`)\r\n return\r\n }\r\n }\r\n\r\n // convert maxSize from megabytes to bytes\r\n const maxBytes = maxSize * 1000000\r\n\r\n if (file.size > maxBytes) {\r\n onError(`File size must be less than ${maxSize} MB.`)\r\n return\r\n }\r\n\r\n // return native file object\r\n onChange(file)\r\n }\r\n\r\n render() {\r\n const { children, style } = this.props;\r\n const accept = this.props.extensions.map(ext => `.${ext}`).join(',')\r\n\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n }\r\n}\r\n\r\nFilePicker.propTypes = {\r\n children: PropTypes.node.isRequired,\r\n onChange: PropTypes.func.isRequired,\r\n onError: PropTypes.func.isRequired,\r\n // max file size in MB\r\n maxSize: PropTypes.number,\r\n // file extension\r\n extensions: PropTypes.array,\r\n // validate file contents\r\n validateContent: PropTypes.func,\r\n style: PropTypes.object\r\n}\r\n\r\nFilePicker.defaultProps = {\r\n maxSize: 2\r\n}\r\n\r\nexport default FilePicker\r\n","import React from 'react';\r\nimport Radio from '@material-ui/core/Radio';\r\nimport RadioGroup from '@material-ui/core/RadioGroup';\r\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\r\nimport FormControl from '@material-ui/core/FormControl';\r\nimport FormLabel from '@material-ui/core/FormLabel';\r\n\r\n\r\n\r\nexport default function OutputFormatSelection(props) {\r\n\r\n const { outputFormat, setOutputFormat, style } = props;\r\n \r\n const handleChange = (event) => {\r\n \r\n setOutputFormat(event.target.value);\r\n };\r\n\r\n return (\r\n \r\n Output Format\r\n \r\n } label=\"AAC m4b\" />\r\n } label=\"FLAC hq\" />\r\n } label=\"Lame mp3\" />\r\n \r\n \r\n );\r\n}\r\n","import React from 'react';\r\nimport Radio from '@material-ui/core/Radio';\r\nimport RadioGroup from '@material-ui/core/RadioGroup';\r\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\r\nimport FormControl from '@material-ui/core/FormControl';\r\nimport FormLabel from '@material-ui/core/FormLabel';\r\n\r\n\r\n\r\nexport default function OSSelector(props) {\r\n\r\n const { operatingSystem, setOperatingSystem, style } = props;\r\n\r\n const handleChange = (event) => setOperatingSystem(event.target.value);\r\n\r\n return (\r\n \r\n Environment\r\n \r\n } label=\"Powershell, Bash, Mac\" />\r\n } label=\"Cmd (Windows)\" />\r\n \r\n \r\n );\r\n}\r\n","import React from 'react';\r\nimport { makeStyles, withStyles } from '@material-ui/core/styles';\r\n\r\nimport { Accordion, AccordionDetails, AccordionSummary } from '@material-ui/core';\r\n\r\nimport Typography from '@material-ui/core/Typography';\r\nimport TextField from '@material-ui/core/TextField';\r\nimport { CopyToClipboard } from 'react-copy-to-clipboard';\r\nimport IconButton from '@material-ui/core/IconButton';\r\n\r\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\r\nimport FileCopyOutlined from '@material-ui/icons/FileCopyOutlined';\r\n\r\n// import {ExpandMoreIcon, FileCopyOutlined} from '@material-ui/icons';\r\n\r\nimport OutputFormatSelection from './OutputFormatSelection'\r\nimport OSSelector from './OSSelector'\r\n\r\n\r\nimport { Radio, RadioGroup } from '@material-ui/core';\r\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\r\nimport FormControl from '@material-ui/core/FormControl';\r\nimport FormLabel from '@material-ui/core/FormLabel';\r\n\r\nclass ControlledAccordions extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n expanded: \"\",\r\n outputFormat: \"m4b\",\r\n operatingSystem: \"linux\"\r\n };\r\n }\r\n DarkerDisabledTextField = withStyles({\r\n root: {\r\n marginRight: 8,\r\n \"& .MuiInputBase-root.Mui-disabled\": {\r\n color: \"rgba(0, 0, 0, 0.6)\"\r\n }\r\n }\r\n })(TextField);\r\n\r\n setExpanded = x => this.setState({ expanded: x })\r\n handleChange = (panel) => (event, isExpanded) => {\r\n this.setExpanded(isExpanded ? panel : false);\r\n };\r\n\r\n getCommand = () => {\r\n const { outputFormat, operatingSystem } = this.state;\r\n let { fileName, activationBytes } = this.props;\r\n\r\n activationBytes = activationBytes ?? \"00000000\";\r\n\r\n // ffmpeg.exe -y -activation_bytes 9f786605 -i '.\\INFINITUM - Die Ewigkeit der Sterne.AAX' -ss 5 -to 20 -c copy out-t01.m4a\r\n // faster:\r\n // ffmpeg.exe -y -activation_bytes 9f786605 -i '.\\INFINITUM - Die Ewigkeit der Sterne.AAX' -map_metadata 0 -id3v2_version 3 -ss 5 -to 20 -vn out-t02.m4a\r\n // ffmpeg.exe -y -activation_bytes 9f786605 -i '.\\INFINITUM - Die Ewigkeit der Sterne.AAX' -map_metadata 0 -ss 5 -to 20 -vn out-t02.m4a\r\n\r\n // -vn: As an output option, disables video recording i.e. automatic selection or mapping of any video stream. For full manual control see the -map option.\r\n // \" works on ps and cmd as discriminator\r\n\r\n const outputFormatCodecMaps = [\r\n { format: \"m4b\", codec: \"copy\" },\r\n { format: \"flac\", codec: \"flac\" },\r\n { format: \"mp3\", codec: \"libmp3lame\" },\r\n ];\r\n\r\n const osToBinMaps = [\r\n { os: \"winCmd\", cmd: \"ffmpeg\", discriminator: '\"' },\r\n // \"Linux\" works on mac; pwsh and bash\r\n { os: \"linux\", cmd: \"ffmpeg\", discriminator: '\\'' },\r\n ];\r\n\r\n\r\n let fileNameWithoutExtension = fileName.split('.')[0];\r\n fileNameWithoutExtension = fileNameWithoutExtension == 'input' ? 'output' : fileNameWithoutExtension;\r\n\r\n const osMap = osToBinMaps.filter(x => x.os == operatingSystem)[0];\r\n\r\n const codec = outputFormatCodecMaps.filter(x => x.format == outputFormat)[0].codec;\r\n const bin = osMap.cmd;\r\n const di = osMap.discriminator;\r\n \r\n return `${bin} -y`\r\n + ` -activation_bytes ${activationBytes} -i ${di}${fileName}${di}`\r\n + ` -map_metadata 0`\r\n + ` -id3v2_version 3`\r\n + ` -codec:a ${codec}`\r\n + ` -vn ${di}${fileNameWithoutExtension}.${outputFormat}${di}`;\r\n }\r\n\r\n render() {\r\n const { classes } = this.props;\r\n const { expanded, outputFormat, operatingSystem } = this.state;\r\n\r\n\r\n return (\r\n
\r\n \r\n }\r\n aria-controls=\"panel2bh-content\"\r\n id=\"panel2bh-header\"\r\n >\r\n Command\r\n \r\n Generate ffmpeg command\r\n \r\n \r\n \r\n this.setState({ outputFormat: x })}\r\n />\r\n\r\n this.setState({ operatingSystem: x })}\r\n style={{ paddingLeft: '20px' }}\r\n />\r\n\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n\r\n />\r\n \r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nconst useStyles = theme => ({\r\n root: {\r\n width: '100%',\r\n\r\n },\r\n heading: {\r\n fontSize: theme.typography.pxToRem(15),\r\n flexBasis: '33.33%',\r\n flexShrink: 0,\r\n },\r\n secondaryHeading: {\r\n fontSize: theme.typography.pxToRem(15),\r\n color: theme.palette.text.secondary,\r\n },\r\n\r\n});\r\n\r\nexport default withStyles(useStyles)(ControlledAccordions);\r\n","export default class AaxHashAlgorithm {\r\n static Instance = new AaxHashAlgorithm();\r\n \r\n __fixed_key = [0x77, 0x21, 0x4d, 0x4b, 0x19, 0x6a, 0x87, 0xcd, 0x52, 0x00, 0x45, 0xfd, 0x20, 0xa5, 0x1d, 0x67];\r\n \r\n \r\n // Convert a hex string to a byte array\r\n __hexToBytes(hex) {\r\n for (var bytes = [], c = 0; c < hex.length; c += 2)\r\n bytes.push(parseInt(hex.substr(c, 2), 16));\r\n \r\n return bytes;\r\n }\r\n \r\n // Convert a byte array to a hex string\r\n __bytesToHex(bytes) {\r\n for (var hex = [], i = 0; i < bytes.length; i++) {\r\n var current = bytes[i] < 0 ? bytes[i] + 256 : bytes[i];\r\n hex.push((current >>> 4).toString(16));\r\n hex.push((current & 0xF).toString(16));\r\n }\r\n return hex.join(\"\");\r\n }\r\n \r\n async __HashData(data) {\r\n let source = new Uint8Array(data);\r\n let buffer = await crypto.subtle.digest('SHA-1', source);\r\n return Array.from(new Uint8Array(buffer));\r\n }\r\n \r\n async CalculateChecksum(activationBytes) {\r\n let data = this.__hexToBytes(activationBytes);\r\n \r\n let intermediate_key = await this.__HashData(this.__fixed_key.concat(data));\r\n let intermediate_iv = await this.__HashData(this.__fixed_key.concat(intermediate_key).concat(data));\r\n let checksum = await this.__HashData(intermediate_key.slice(0, 16).concat(intermediate_iv.slice(0, 16)));\r\n \r\n return this.__bytesToHex(checksum);\r\n }\r\n \r\n static async CalculateChecksum(activationBytes){\r\n return AaxHashAlgorithm.Instance.CalculateChecksum(activationBytes);\r\n }\r\n}","import React, { useState } from 'react';\r\nimport { withStyles } from \"@material-ui/core/styles\";\r\nimport Avatar from '@material-ui/core/Avatar';\r\nimport Button from '@material-ui/core/Button';\r\nimport CssBaseline from '@material-ui/core/CssBaseline';\r\nimport TextField from '@material-ui/core/TextField';\r\n\r\nimport Link from '@material-ui/core/Link';\r\nimport Box from '@material-ui/core/Box';\r\nimport LockOutlinedIcon from '@material-ui/icons/LockOutlined';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Container from '@material-ui/core/Container';\r\n\r\nimport Dropzone from 'react-dropzone'\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport FileCopyOutlined from '@material-ui/icons/FileCopyOutlined';\r\nimport PublishOutlined from '@material-ui/icons/PublishOutlined';\r\n\r\n// import { useFilePicker } from 'react-sage'\r\n// import { FilePicker } from 'react-file-picker'\r\n\r\nimport { FilePicker } from '../src/Components'\r\n\r\n\r\nimport { CopyToClipboard } from 'react-copy-to-clipboard';\r\n\r\nimport ControlledAccordions from './ControlledAccordions'\r\n\r\nimport 'react-notifications-component/dist/theme.css'\r\n\r\nimport ReactNotification from 'react-notifications-component'\r\nimport { store } from 'react-notifications-component';\r\n// import 'animate.css/animate.compat.css'\r\n\r\nimport AaxHashAlgorithm from './Utils/AaxHashAlgorithm'\r\n\r\n\r\nconst useStyles = theme => ({\r\n paper: {\r\n marginTop: theme.spacing(8),\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n },\r\n avatar: {\r\n margin: theme.spacing(1),\r\n backgroundColor: theme.palette.secondary.main,\r\n },\r\n form: {\r\n width: '100%', // Fix IE 11 issue.\r\n marginTop: theme.spacing(1),\r\n },\r\n\r\n //Accordeon\r\n heading: {\r\n fontSize: theme.typography.pxToRem(15),\r\n flexBasis: '33.33%',\r\n flexShrink: 0,\r\n },\r\n secondaryHeading: {\r\n fontSize: theme.typography.pxToRem(15),\r\n color: theme.palette.text.secondary,\r\n },\r\n});\r\n\r\nclass ChecksumResolver extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n checksum: \"\",\r\n fileName: \"input.aax\"\r\n }\r\n }\r\n\r\n DarkerDisabledTextField = withStyles({\r\n root: {\r\n marginRight: 8,\r\n \"& .MuiInputBase-root.Mui-disabled\": {\r\n color: \"rgba(0, 0, 0, 0.6)\"\r\n }\r\n }\r\n })(TextField);\r\n\r\n Copyright = (function () {\r\n return (\r\n \r\n {'Copyright © '}\r\n \r\n audible-tools\r\n {' '}\r\n {new Date().getFullYear()}\r\n {'.'}\r\n \r\n );\r\n })\r\n\r\n setChecksum = (value) => {\r\n if (value.length > 40) {\r\n return;\r\n }\r\n this.setState({ checksum: value })\r\n }\r\n\r\n isChecksumValid = () => {\r\n const { checksum } = this.state;\r\n const regex = RegExp('[a-f0-9]{40}');\r\n const testResults = regex.test(checksum);\r\n\r\n return testResults;\r\n }\r\n\r\n isInputInvalid = () => {\r\n const { checksum } = this.state;\r\n if (!checksum || checksum === '') {\r\n return false;\r\n }\r\n return !this.isChecksumValid();\r\n };\r\n\r\n addNotification = function (text, success = true) {\r\n store.addNotification({\r\n message: text,\r\n type: success ? \"success\" : \"danger\",\r\n // type: \"danger\",\r\n insert: \"bottom-left\",\r\n container: \"top-full\",\r\n animationIn: [\"animate__animated\", \"animate__fadeIn\"],\r\n animationOut: [\"animate__animated\", \"animate__fadeOut\"],\r\n dismiss: {\r\n duration: 3000,\r\n onScreen: false\r\n }\r\n });\r\n }\r\n\r\n requestActivationBytes = async () => {\r\n const { checksum } = this.state;\r\n try {\r\n let request = await fetch(\"https://aax.api.j-kit.me/api/v2/activation/\" + checksum);\r\n let result = await request.json();\r\n const { success, activationBytes } = result;\r\n\r\n if (success !== true) {\r\n this.setState({ activationBytes: 'UNKNOWN' });\r\n this.addNotification(\"An error occured while resolving the activation bytes, please check your inputs\", false);\r\n return;\r\n }\r\n\r\n if (success === true) {\r\n const calculatedChecksum = await AaxHashAlgorithm.CalculateChecksum(activationBytes);\r\n if (calculatedChecksum == checksum) {\r\n this.setState({ activationBytes: activationBytes });\r\n this.addNotification(\"Successfully resolved the activation bytes\");\r\n return;\r\n }\r\n \r\n this.setState({ activationBytes: \"API ERROR\" });\r\n this.addNotification(\"An unexpected error occured while resolving the activation bytes, please try again\", false);\r\n\r\n }\r\n } catch (error) {\r\n this.setState({ activationBytes: error });\r\n this.addNotification(\"An error occured while resolving the activation bytes, please check your inputs\", false);\r\n }\r\n }\r\n\r\n buf2hex(buffer) { // buffer is an ArrayBuffer\r\n return Array.prototype.map.call(new Uint8Array(buffer), x => ('00' + x.toString(16)).slice(-2)).join('');\r\n }\r\n\r\n acceptFiles = async files => {\r\n const file = files[0];\r\n await this.acceptFile(file);\r\n }\r\n\r\n acceptFile = async file => {\r\n // if (!file.name.toLowerCase().endsWith(\".aax\")) {\r\n // alert('FileType not supported!');\r\n // return;\r\n // }\r\n\r\n this.setState({ fileName: file.name });\r\n const slic = file.slice(653, 653 + 20);\r\n const results = this.buf2hex(await slic.arrayBuffer());\r\n this.setChecksum(results)\r\n this.requestActivationBytes();\r\n\r\n }\r\n\r\n render() {\r\n const { classes } = this.props;\r\n const { checksum, activationBytes, fileName } = this.state;\r\n\r\n // const { files, onClick, errors, HiddenFileInput } = useFilePicker({\r\n // maxFileSize: 1000000,\r\n // maxImageWidth: 1000,\r\n // imageQuality: 0.92,\r\n // resizeImage: true\r\n // });\r\n\r\n return (\r\n \r\n\r\n \r\n
\r\n \r\n \r\n \r\n \r\n AAX Checksum Resolver\r\n \r\n\r\n
\r\n {\r\n console.log(acceptedFiles);\r\n this.acceptFiles(acceptedFiles);\r\n }}>\r\n {({ getRootProps, getInputProps }) => (\r\n
\r\n
\r\n \r\n this.setChecksum(x.target.value)}\r\n value={checksum}\r\n InputProps={{\r\n readOnly: false,\r\n endAdornment: (\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n\r\n />\r\n
\r\n
\r\n )}\r\n \r\n\r\n {\r\n this.requestActivationBytes();\r\n }}\r\n disabled={!this.isChecksumValid()}\r\n >\r\n Request Activation Bytes\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n\r\n />\r\n\r\n \r\n
\r\n \r\n \r\n \r\n \r\n\r\n\r\n\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(useStyles)(ChecksumResolver);\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport './index.css';\r\nimport * as serviceWorker from './serviceWorker';\r\nimport ChecksumResolver from './ChecksumResolver';\r\n\r\nimport ReactNotification from 'react-notifications-component'\r\nimport ForkMeOnGithub from 'fork-me-on-github';\r\n\r\n\r\nimport ReactGA from 'react-ga';\r\nReactGA.initialize('UA-174657678-1');\r\nReactGA.pageview(window.location.pathname + window.location.search);\r\n\r\nReactDOM.render(\r\n
\r\n
\r\n \r\n {/* \r\n Fork me on GitHub\r\n */}\r\n \r\n
\r\n\r\n \r\n
,\r\n document.getElementById('root')\r\n);\r\n\r\n// If you want your app to work offline and load faster, you can change\r\n// unregister() to register() below. Note this comes with some pitfalls.\r\n// Learn more about service workers: https://bit.ly/CRA-PWA\r\nserviceWorker.unregister();\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/static/js/main.378ff0eb.chunk.js b/static/js/main.378ff0eb.chunk.js deleted file mode 100644 index 0454bb0..0000000 --- a/static/js/main.378ff0eb.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this["webpackJsonpmaterial-pg-01"]=this["webpackJsonpmaterial-pg-01"]||[]).push([[0],{105:function(e,t,a){},132:function(e,t,a){"use strict";a.r(t);var n=a(0),r=a.n(n),i=a(10),c=a.n(i);a(105),Boolean("localhost"===window.location.hostname||"[::1]"===window.location.hostname||window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/));var o=a(67),s=a(15),l=a.n(s),u=a(31),d=a(21),p=a(22),h=a(30),m=a(29),f=a(6),j=a(180),b=a(174),v=a(173),x=a(175),y=a(171),O=a(177),g=a(83),k=a.n(g),C=a(88),_=a(172),w=a(86),S=a(134),B=a(66),A=a.n(B),F=a(84),I=a.n(F),N=a(40),D=a(5),T=function(e){Object(h.a)(a,e);var t=Object(m.a)(a);function a(e){var n;return Object(d.a)(this,a),(n=t.call(this,e))._handleUpload=n._handleUpload.bind(Object(N.a)(n)),n}return Object(p.a)(a,[{key:"_handleUpload",value:function(e){var t=e.target.files[0];this.props.onChange(t),this.fileInput.value=null}},{key:"render",value:function(){var e=this;return Object(D.jsxs)("div",{style:this.props.style,children:[Object(D.jsx)("input",{accept:this.props.accept,type:"file",style:{display:"none"},onChange:this._handleUpload,ref:function(t){return e.fileInput=t}}),r.a.cloneElement(this.props.children,{onClick:function(){return e.fileInput.click()}})]})}}]),a}(r.a.Component),R=function(e){Object(h.a)(a,e);var t=Object(m.a)(a);function a(e){var n;return Object(d.a)(this,a),(n=t.call(this,e))._validate=n._validate.bind(Object(N.a)(n)),n}return Object(p.a)(a,[{key:"_validate",value:function(e){var t=this.props,a=t.onError,n=t.onChange,r=t.maxSize,i=t.extensions;if(e){if(i){var c=e.name.split(".").pop().toLowerCase();if(!i.map((function(e){return e.toLowerCase()})).includes(c))return void a("Must upload a file of type: ".concat(i.join(" or ")))}var o=1e6*r;e.size>o?a("File size must be less than ".concat(r," MB.")):n(e)}else a("Failed to upload a file.")}},{key:"render",value:function(){var e=this.props,t=e.children,a=e.style,n=this.props.extensions.map((function(e){return".".concat(e)})).join(",");return Object(D.jsx)(T,{onChange:this._validate,style:a,accept:n,children:t})}}]),a}(r.a.Component);R.defaultProps={maxSize:2};var z=R,H=a(56),U=a(179),W=a(169),P=a(170),E=a(82),M=a.n(E),q=a(178),L=a(182),V=a(167),J=a(163),X=a(166);function G(e){var t=e.outputFormat,a=e.setOutputFormat,n=e.style;return Object(D.jsxs)(J.a,{component:"fieldset",style:n,children:[Object(D.jsx)(X.a,{component:"legend",children:"Output Format"}),Object(D.jsxs)(L.a,{"aria-label":"format",name:"format",value:t,onChange:function(e){a(e.target.value)},children:[Object(D.jsx)(V.a,{value:"m4b",control:Object(D.jsx)(q.a,{}),label:"AAC m4b"}),Object(D.jsx)(V.a,{value:"flac",control:Object(D.jsx)(q.a,{}),label:"FLAC hq"}),Object(D.jsx)(V.a,{value:"mp3",control:Object(D.jsx)(q.a,{}),label:"Lame mp3"})]})]})}function K(e){var t=e.operatingSystem,a=e.setOperatingSystem,n=e.style;return Object(D.jsxs)(J.a,{component:"fieldset",style:n,children:[Object(D.jsx)(X.a,{component:"legend",children:"Operating System"}),Object(D.jsxs)(L.a,{"aria-label":"format",name:"format",value:t,onChange:function(e){return a(e.target.value)},children:[Object(D.jsx)(V.a,{value:"win",control:Object(D.jsx)(q.a,{}),label:"Windows"}),Object(D.jsx)(V.a,{value:"linux",control:Object(D.jsx)(q.a,{}),label:"Linux"}),Object(D.jsx)(V.a,{value:"osx",control:Object(D.jsx)(q.a,{}),label:"Mac"})]})]})}var Y=function(e){Object(h.a)(a,e);var t=Object(m.a)(a);function a(e){var n;return Object(d.a)(this,a),(n=t.call(this,e)).DarkerDisabledTextField=Object(f.a)({root:{marginRight:8,"& .MuiInputBase-root.Mui-disabled":{color:"rgba(0, 0, 0, 0.6)"}}})(x.a),n.setExpanded=function(e){return n.setState({expanded:e})},n.handleChange=function(e){return function(t,a){n.setExpanded(!!a&&e)}},n.getCommand=function(){var e,t=n.state,a=t.outputFormat,r=t.operatingSystem,i=n.props,c=i.fileName,o=i.activationBytes;o=null!==(e=o)&&void 0!==e?e:"00000000";var s=c.split(".")[0];s="input"==s?"output":s;var l=[{os:"win",cmd:"ffmpeg.exe",discriminator:'"'},{os:"linux",cmd:"./ffmpeg",discriminator:"'"},{os:"osx",cmd:"./ffmpeg",discriminator:"'"}].filter((function(e){return e.os==r}))[0],u=[{format:"m4b",codec:"copy"},{format:"flac",codec:"flac"},{format:"mp3",codec:"libmp3lame"}].filter((function(e){return e.format==a}))[0].codec,d=l.cmd,p=l.discriminator;return"".concat(d," -y")+" -activation_bytes ".concat(o," -i ").concat(p,".\\").concat(c).concat(p)+" -map_metadata 0 -id3v2_version 3"+" -codec:a ".concat(u)+" -vn ".concat(p).concat(s,".").concat(a).concat(p)},n.state={expanded:"",outputFormat:"m4b",operatingSystem:"win"},n}return Object(p.a)(a,[{key:"render",value:function(){var e=this,t=this.props.classes,a=this.state,n=a.expanded,r=a.outputFormat,i=a.operatingSystem;return Object(D.jsx)("div",{className:t.root,children:Object(D.jsxs)(U.a,{expanded:"panel2"===n,onChange:this.handleChange("panel2"),children:[Object(D.jsxs)(W.a,{expandIcon:Object(D.jsx)(M.a,{}),"aria-controls":"panel2bh-content",id:"panel2bh-header",children:[Object(D.jsx)(C.a,{className:t.heading,children:"Command"}),Object(D.jsx)(C.a,{className:t.secondaryHeading,children:"Generate ffmpeg command"})]}),Object(D.jsxs)(P.a,{style:{display:"block"},children:[Object(D.jsx)(G,{outputFormat:r,setOutputFormat:function(t){return e.setState({outputFormat:t})}}),Object(D.jsx)(K,{operatingSystem:i,setOperatingSystem:function(t){return e.setState({operatingSystem:t})},style:{paddingLeft:"20px"}}),Object(D.jsx)(this.DarkerDisabledTextField,{value:this.getCommand(),disabled:!0,multiline:!0,variant:"outlined",margin:"normal",fullWidth:!0,id:"activationBytes",label:"cmd",name:"activationBytes",autoComplete:"activationBytes","aria-readonly":!0,fontSize:5,InputProps:{readOnly:!0,endAdornment:Object(D.jsx)(H.CopyToClipboard,{text:this.getCommand(),children:Object(D.jsx)(S.a,{children:Object(D.jsx)(A.a,{})})})}})]})]})})}}]),a}(r.a.Component),$=Object(f.a)((function(e){return{root:{width:"100%"},heading:{fontSize:e.typography.pxToRem(15),flexBasis:"33.33%",flexShrink:0},secondaryHeading:{fontSize:e.typography.pxToRem(15),color:e.palette.text.secondary}}}))(Y),Q=(a(115),a(47)),Z=a.n(Q),ee=function(){function e(){Object(d.a)(this,e),this.__fixed_key=[119,33,77,75,25,106,135,205,82,0,69,253,32,165,29,103]}return Object(p.a)(e,[{key:"__hexToBytes",value:function(e){for(var t=[],a=0;a>>4).toString(16)),t.push((15&n).toString(16))}return t.join("")}},{key:"__HashData",value:function(){var e=Object(u.a)(l.a.mark((function e(t){var a,n;return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a=new Uint8Array(t),e.next=3,crypto.subtle.digest("SHA-1",a);case 3:return n=e.sent,e.abrupt("return",Array.from(new Uint8Array(n)));case 5:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()},{key:"CalculateChecksum",value:function(){var e=Object(u.a)(l.a.mark((function e(t){var a,n,r,i;return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a=this.__hexToBytes(t),e.next=3,this.__HashData(this.__fixed_key.concat(a));case 3:return n=e.sent,e.next=6,this.__HashData(this.__fixed_key.concat(n).concat(a));case 6:return r=e.sent,e.next=9,this.__HashData(n.slice(0,16).concat(r.slice(0,16)));case 9:return i=e.sent,e.abrupt("return",this.__bytesToHex(i));case 11:case"end":return e.stop()}}),e,this)})));return function(t){return e.apply(this,arguments)}}()}],[{key:"CalculateChecksum",value:function(){var t=Object(u.a)(l.a.mark((function t(a){return l.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",e.Instance.CalculateChecksum(a));case 1:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}()}]),e}();ee.Instance=new ee;var te=function(e){Object(h.a)(a,e);var t=Object(m.a)(a);function a(e){var n;return Object(d.a)(this,a),(n=t.call(this,e)).DarkerDisabledTextField=Object(f.a)({root:{marginRight:8,"& .MuiInputBase-root.Mui-disabled":{color:"rgba(0, 0, 0, 0.6)"}}})(x.a),n.Copyright=function(){return Object(D.jsxs)(C.a,{variant:"body2",color:"textSecondary",align:"center",children:["Copyright \xa9 ",Object(D.jsx)(y.a,{color:"inherit",href:"https://audible-tools.github.io/",children:"audible-tools"})," ",(new Date).getFullYear(),"."]})},n.setChecksum=function(e){e.length>40||n.setState({checksum:e})},n.isChecksumValid=function(){var e=n.state.checksum;return RegExp("[a-f0-9]{40}").test(e)},n.isInputInvalid=function(){var e=n.state.checksum;return!(!e||""===e)&&!n.isChecksumValid()},n.addNotification=function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];Q.store.addNotification({message:e,type:t?"success":"danger",insert:"bottom-left",container:"top-full",animationIn:["animate__animated","animate__fadeIn"],animationOut:["animate__animated","animate__fadeOut"],dismiss:{duration:3e3,onScreen:!1}})},n.requestActivationBytes=Object(u.a)(l.a.mark((function e(){var t,a,r,i,c;return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=n.state.checksum,e.prev=1,e.next=4,fetch("https://aax.api.j-kit.me/api/v2/activation/"+t);case 4:return a=e.sent,e.next=7,a.json();case 7:if(r=e.sent,i=r.success,c=r.activationBytes,!0===i){e.next=13;break}return n.setState({activationBytes:"UNKNOWN"}),n.addNotification("An error occured while resolving the activation bytes, please check your inputs",!1),e.abrupt("return");case 13:if(!0!==i){e.next=23;break}return e.next=16,ee.CalculateChecksum(c);case 16:if(e.sent!=t){e.next=21;break}return n.setState({activationBytes:c}),n.addNotification("Successfully resolved the activation bytes"),e.abrupt("return");case 21:n.setState({activationBytes:"API ERROR"}),n.addNotification("An unexpected error occured while resolving the activation bytes, please try again",!1);case 23:e.next=29;break;case 25:e.prev=25,e.t0=e.catch(1),n.setState({activationBytes:e.t0}),n.addNotification("An error occured while resolving the activation bytes, please check your inputs",!1);case 29:case"end":return e.stop()}}),e,null,[[1,25]])}))),n.acceptFiles=function(){var e=Object(u.a)(l.a.mark((function e(t){var a;return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a=t[0],e.next=3,n.acceptFile(a);case 3:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),n.acceptFile=function(){var e=Object(u.a)(l.a.mark((function e(t){var a,r;return l.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n.setState({fileName:t.name}),a=t.slice(653,673),e.t0=n,e.next=5,a.arrayBuffer();case 5:e.t1=e.sent,r=e.t0.buf2hex.call(e.t0,e.t1),n.setChecksum(r),n.requestActivationBytes();case 9:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),n.state={checksum:"",fileName:"input.aax"},n}return Object(p.a)(a,[{key:"buf2hex",value:function(e){return Array.prototype.map.call(new Uint8Array(e),(function(e){return("00"+e.toString(16)).slice(-2)})).join("")}},{key:"render",value:function(){var e=this,t=this.props.classes,a=this.state,n=a.checksum,r=a.activationBytes,i=a.fileName;return Object(D.jsxs)(_.a,{component:"main",maxWidth:"md",children:[Object(D.jsx)(v.a,{}),Object(D.jsxs)("div",{className:t.paper,children:[Object(D.jsx)(j.a,{className:t.avatar,children:Object(D.jsx)(k.a,{})}),Object(D.jsx)(C.a,{component:"h1",variant:"h5",children:"AAX Checksum Resolver"}),Object(D.jsxs)("form",{className:t.form,noValidate:!0,children:[Object(D.jsx)(w.a,{noClick:!0,onDrop:function(t){console.log(t),e.acceptFiles(t)},children:function(t){var a=t.getRootProps,r=t.getInputProps;return Object(D.jsx)("section",{children:Object(D.jsxs)("div",Object(o.a)(Object(o.a)({},a()),{},{children:[Object(D.jsx)("input",Object(o.a)({},r())),Object(D.jsx)(x.a,{error:e.isInputInvalid(),variant:"outlined",margin:"normal",required:!0,fullWidth:!0,id:"checksum",label:"Checksum or Drag&Drop .aax file -",name:"checksum",autoComplete:"checksum",autoFocus:!0,onChange:function(t){return e.setChecksum(t.target.value)},value:n,InputProps:{readOnly:!1,endAdornment:Object(D.jsx)(z,{extensions:["aax","AAX"],maxSize:99999,onChange:e.acceptFile,children:Object(D.jsx)(S.a,{children:Object(D.jsx)(I.a,{})})})}})]}))})}}),Object(D.jsx)(b.a,{fullWidth:!0,variant:"contained",onClick:function(){e.requestActivationBytes()},disabled:!this.isChecksumValid(),children:"Request Activation Bytes"}),Object(D.jsx)(this.DarkerDisabledTextField,{value:r,disabled:!0,variant:"outlined",margin:"normal",fullWidth:!0,id:"activationBytes",label:r?"":"Activation Bytes",name:"activationBytes",autoComplete:"activationBytes","aria-readonly":!0,InputProps:{readOnly:!0,endAdornment:Object(D.jsx)(H.CopyToClipboard,{text:r,children:Object(D.jsx)(S.a,{children:Object(D.jsx)(A.a,{})})})}})]})]}),Object(D.jsx)($,{fileName:i,activationBytes:r}),Object(D.jsx)(O.a,{mt:1,children:Object(D.jsx)(this.Copyright,{})})]})}}]),a}(r.a.Component),ae=Object(f.a)((function(e){return{paper:{marginTop:e.spacing(8),display:"flex",flexDirection:"column",alignItems:"center"},avatar:{margin:e.spacing(1),backgroundColor:e.palette.secondary.main},form:{width:"100%",marginTop:e.spacing(1)},heading:{fontSize:e.typography.pxToRem(15),flexBasis:"33.33%",flexShrink:0},secondaryHeading:{fontSize:e.typography.pxToRem(15),color:e.palette.text.secondary}}}))(te),ne=a(85),re=a.n(ne),ie=a(71);ie.a.initialize("UA-174657678-1"),ie.a.pageview(window.location.pathname+window.location.search),c.a.render(Object(D.jsxs)("div",{children:[Object(D.jsxs)("div",{style:{display:"flex"},children:[Object(D.jsx)(Z.a,{}),Object(D.jsx)(re.a,{repo:"//github.com/audible-tools/audible-tools.github.io",colorOctocat:"black",isPride:!0})]}),Object(D.jsx)(ae,{})]}),document.getElementById("root")),"serviceWorker"in navigator&&navigator.serviceWorker.ready.then((function(e){e.unregister()})).catch((function(e){console.error(e.message)}))}},[[132,1,2]]]); -//# sourceMappingURL=main.378ff0eb.chunk.js.map \ No newline at end of file diff --git a/static/js/main.378ff0eb.chunk.js.map b/static/js/main.378ff0eb.chunk.js.map deleted file mode 100644 index 547d124..0000000 --- a/static/js/main.378ff0eb.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["serviceWorker.js","Components/FileInput/index.js","Components/FilePicker/index.js","OutputFormatSelection.js","OSSelector.js","ControlledAccordions.js","Utils/AaxHashAlgorithm.js","ChecksumResolver.js","index.js"],"names":["Boolean","window","location","hostname","match","FileInput","props","_handleUpload","bind","evt","file","target","files","this","onChange","fileInput","value","style","accept","type","display","ref","ele","React","cloneElement","children","onClick","click","Component","FilePicker","_validate","onError","maxSize","extensions","uploadedFileExt","name","split","pop","toLowerCase","map","ext","includes","join","maxBytes","size","defaultProps","OutputFormatSelection","outputFormat","setOutputFormat","FormControl","component","FormLabel","RadioGroup","aria-label","event","FormControlLabel","control","Radio","label","OSSelector","operatingSystem","setOperatingSystem","ControlledAccordions","DarkerDisabledTextField","withStyles","root","marginRight","color","TextField","setExpanded","x","setState","expanded","handleChange","panel","isExpanded","getCommand","state","fileName","activationBytes","fileNameWithoutExtension","osMap","os","cmd","discriminator","filter","codec","format","bin","di","classes","className","Accordion","AccordionSummary","expandIcon","aria-controls","id","Typography","heading","secondaryHeading","AccordionDetails","paddingLeft","disabled","multiline","variant","margin","fullWidth","autoComplete","aria-readonly","fontSize","InputProps","readOnly","endAdornment","text","IconButton","theme","width","typography","pxToRem","flexBasis","flexShrink","palette","secondary","AaxHashAlgorithm","__fixed_key","hex","bytes","c","length","push","parseInt","substr","i","current","toString","data","a","source","Uint8Array","crypto","subtle","digest","buffer","Array","from","__hexToBytes","__HashData","concat","intermediate_key","intermediate_iv","slice","checksum","__bytesToHex","Instance","CalculateChecksum","ChecksumResolver","Copyright","align","Link","href","Date","getFullYear","setChecksum","isChecksumValid","RegExp","test","isInputInvalid","addNotification","success","store","message","insert","container","animationIn","animationOut","dismiss","duration","onScreen","requestActivationBytes","fetch","request","json","result","acceptFiles","acceptFile","slic","arrayBuffer","results","buf2hex","prototype","call","Container","maxWidth","CssBaseline","paper","Avatar","avatar","form","noValidate","noClick","onDrop","acceptedFiles","console","log","getRootProps","getInputProps","error","required","autoFocus","Button","Box","mt","marginTop","spacing","flexDirection","alignItems","backgroundColor","main","ReactGA","initialize","pageview","pathname","search","ReactDOM","render","repo","colorOctocat","isPride","document","getElementById","navigator","serviceWorker","ready","then","registration","unregister","catch"],"mappings":"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","file":"static/js/main.378ff0eb.chunk.js","sourcesContent":["// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' },\n })\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready\n .then(registration => {\n registration.unregister();\n })\n .catch(error => {\n console.error(error.message);\n });\n }\n}\n","// external imports\r\nimport React from 'react'\r\nimport PropTypes from 'prop-types'\r\n\r\nclass FileInput extends React.Component {\r\n constructor(props) {\r\n super(props)\r\n\r\n this._handleUpload = this._handleUpload.bind(this)\r\n }\r\n\r\n _handleUpload(evt) {\r\n const file = evt.target.files[0]\r\n this.props.onChange(file)\r\n\r\n // free up the fileInput again\r\n this.fileInput.value = null\r\n }\r\n\r\n render() {\r\n return (\r\n
\r\n (this.fileInput = ele)}\r\n />\r\n {React.cloneElement(this.props.children, {\r\n onClick: () => this.fileInput.click()\r\n })}\r\n
\r\n )\r\n }\r\n}\r\n\r\nFileInput.propTypes = {\r\n style: PropTypes.object,\r\n accept: PropTypes.string,\r\n children: PropTypes.node.isRequired,\r\n onChange: PropTypes.func.isRequired\r\n}\r\n\r\nexport default FileInput\r\n","// external imports\r\nimport React from 'react'\r\nimport PropTypes from 'prop-types'\r\n// local imports\r\nimport FileInput from '../FileInput'\r\n\r\nclass FilePicker extends React.Component {\r\n constructor(props) {\r\n super(props)\r\n\r\n this._validate = this._validate.bind(this)\r\n }\r\n\r\n _validate(file) {\r\n const { onError, onChange, maxSize, extensions } = this.props\r\n\r\n // make sure a file was provided in the first place\r\n if (!file) {\r\n onError('Failed to upload a file.')\r\n return\r\n }\r\n\r\n // if we care about file extensions\r\n if (extensions) {\r\n const uploadedFileExt = file.name\r\n .split('.')\r\n .pop()\r\n .toLowerCase()\r\n const isValidFileExt = extensions\r\n .map(ext => ext.toLowerCase())\r\n .includes(uploadedFileExt)\r\n\r\n if (!isValidFileExt) {\r\n onError(`Must upload a file of type: ${extensions.join(' or ')}`)\r\n return\r\n }\r\n }\r\n\r\n // convert maxSize from megabytes to bytes\r\n const maxBytes = maxSize * 1000000\r\n\r\n if (file.size > maxBytes) {\r\n onError(`File size must be less than ${maxSize} MB.`)\r\n return\r\n }\r\n\r\n // return native file object\r\n onChange(file)\r\n }\r\n\r\n render() {\r\n const { children, style } = this.props;\r\n const accept = this.props.extensions.map(ext => `.${ext}`).join(',')\r\n\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n }\r\n}\r\n\r\nFilePicker.propTypes = {\r\n children: PropTypes.node.isRequired,\r\n onChange: PropTypes.func.isRequired,\r\n onError: PropTypes.func.isRequired,\r\n // max file size in MB\r\n maxSize: PropTypes.number,\r\n // file extension\r\n extensions: PropTypes.array,\r\n // validate file contents\r\n validateContent: PropTypes.func,\r\n style: PropTypes.object\r\n}\r\n\r\nFilePicker.defaultProps = {\r\n maxSize: 2\r\n}\r\n\r\nexport default FilePicker\r\n","import React from 'react';\r\nimport Radio from '@material-ui/core/Radio';\r\nimport RadioGroup from '@material-ui/core/RadioGroup';\r\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\r\nimport FormControl from '@material-ui/core/FormControl';\r\nimport FormLabel from '@material-ui/core/FormLabel';\r\n\r\n\r\n\r\nexport default function OutputFormatSelection(props) {\r\n\r\n const { outputFormat, setOutputFormat, style } = props;\r\n \r\n const handleChange = (event) => {\r\n \r\n setOutputFormat(event.target.value);\r\n };\r\n\r\n return (\r\n \r\n Output Format\r\n \r\n } label=\"AAC m4b\" />\r\n } label=\"FLAC hq\" />\r\n } label=\"Lame mp3\" />\r\n \r\n \r\n );\r\n}\r\n","import React from 'react';\r\nimport Radio from '@material-ui/core/Radio';\r\nimport RadioGroup from '@material-ui/core/RadioGroup';\r\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\r\nimport FormControl from '@material-ui/core/FormControl';\r\nimport FormLabel from '@material-ui/core/FormLabel';\r\n\r\n\r\n\r\nexport default function OSSelector(props) {\r\n\r\n const { operatingSystem, setOperatingSystem, style } = props;\r\n\r\n const handleChange = (event) => setOperatingSystem(event.target.value);\r\n\r\n return (\r\n \r\n Operating System\r\n \r\n } label=\"Windows\" />\r\n } label=\"Linux\" />\r\n } label=\"Mac\" />\r\n \r\n \r\n );\r\n}\r\n","import React from 'react';\r\nimport { makeStyles, withStyles } from '@material-ui/core/styles';\r\n\r\nimport { Accordion, AccordionDetails, AccordionSummary } from '@material-ui/core';\r\n\r\nimport Typography from '@material-ui/core/Typography';\r\nimport TextField from '@material-ui/core/TextField';\r\nimport { CopyToClipboard } from 'react-copy-to-clipboard';\r\nimport IconButton from '@material-ui/core/IconButton';\r\n\r\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\r\nimport FileCopyOutlined from '@material-ui/icons/FileCopyOutlined';\r\n\r\n// import {ExpandMoreIcon, FileCopyOutlined} from '@material-ui/icons';\r\n\r\nimport OutputFormatSelection from './OutputFormatSelection'\r\nimport OSSelector from './OSSelector'\r\n\r\n\r\nimport { Radio, RadioGroup } from '@material-ui/core';\r\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\r\nimport FormControl from '@material-ui/core/FormControl';\r\nimport FormLabel from '@material-ui/core/FormLabel';\r\n\r\nclass ControlledAccordions extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n expanded: \"\",\r\n outputFormat: \"m4b\",\r\n operatingSystem: \"win\"\r\n };\r\n }\r\n DarkerDisabledTextField = withStyles({\r\n root: {\r\n marginRight: 8,\r\n \"& .MuiInputBase-root.Mui-disabled\": {\r\n color: \"rgba(0, 0, 0, 0.6)\"\r\n }\r\n }\r\n })(TextField);\r\n\r\n setExpanded = x => this.setState({ expanded: x })\r\n handleChange = (panel) => (event, isExpanded) => {\r\n this.setExpanded(isExpanded ? panel : false);\r\n };\r\n\r\n getCommand = () => {\r\n const { outputFormat, operatingSystem } = this.state;\r\n let { fileName, activationBytes } = this.props;\r\n\r\n activationBytes = activationBytes ?? \"00000000\";\r\n\r\n // ffmpeg.exe -y -activation_bytes 9f786605 -i '.\\INFINITUM - Die Ewigkeit der Sterne.AAX' -ss 5 -to 20 -c copy out-t01.m4a\r\n // faster:\r\n // ffmpeg.exe -y -activation_bytes 9f786605 -i '.\\INFINITUM - Die Ewigkeit der Sterne.AAX' -map_metadata 0 -id3v2_version 3 -ss 5 -to 20 -vn out-t02.m4a\r\n // ffmpeg.exe -y -activation_bytes 9f786605 -i '.\\INFINITUM - Die Ewigkeit der Sterne.AAX' -map_metadata 0 -ss 5 -to 20 -vn out-t02.m4a\r\n\r\n // -vn: As an output option, disables video recording i.e. automatic selection or mapping of any video stream. For full manual control see the -map option.\r\n // \" works on ps and cmd as discriminator\r\n\r\n const outputFormatCodecMaps = [\r\n { format: \"m4b\", codec: \"copy\" },\r\n { format: \"flac\", codec: \"flac\" },\r\n { format: \"mp3\", codec: \"libmp3lame\" },\r\n ];\r\n\r\n const osToBinMaps = [\r\n { os: \"win\", cmd: \"ffmpeg.exe\", discriminator: '\"' },\r\n { os: \"linux\", cmd: \"./ffmpeg\", discriminator: '\\'' },\r\n { os: \"osx\", cmd: \"./ffmpeg\", discriminator: '\\'' },\r\n ];\r\n\r\n let fileNameWithoutExtension = fileName.split('.')[0];\r\n fileNameWithoutExtension = fileNameWithoutExtension == 'input' ? 'output' : fileNameWithoutExtension;\r\n\r\n const osMap = osToBinMaps.filter(x => x.os == operatingSystem)[0];\r\n\r\n const codec = outputFormatCodecMaps.filter(x => x.format == outputFormat)[0].codec;\r\n const bin = osMap.cmd;\r\n const di = osMap.discriminator;\r\n \r\n return `${bin} -y`\r\n + ` -activation_bytes ${activationBytes} -i ${di}.\\\\${fileName}${di}`\r\n + ` -map_metadata 0`\r\n + ` -id3v2_version 3`\r\n + ` -codec:a ${codec}`\r\n + ` -vn ${di}${fileNameWithoutExtension}.${outputFormat}${di}`;\r\n }\r\n\r\n render() {\r\n const { classes } = this.props;\r\n const { expanded, outputFormat, operatingSystem } = this.state;\r\n\r\n\r\n return (\r\n
\r\n \r\n }\r\n aria-controls=\"panel2bh-content\"\r\n id=\"panel2bh-header\"\r\n >\r\n Command\r\n \r\n Generate ffmpeg command\r\n \r\n \r\n \r\n this.setState({ outputFormat: x })}\r\n />\r\n\r\n this.setState({ operatingSystem: x })}\r\n style={{ paddingLeft: '20px' }}\r\n />\r\n\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n\r\n />\r\n \r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nconst useStyles = theme => ({\r\n root: {\r\n width: '100%',\r\n\r\n },\r\n heading: {\r\n fontSize: theme.typography.pxToRem(15),\r\n flexBasis: '33.33%',\r\n flexShrink: 0,\r\n },\r\n secondaryHeading: {\r\n fontSize: theme.typography.pxToRem(15),\r\n color: theme.palette.text.secondary,\r\n },\r\n\r\n});\r\n\r\nexport default withStyles(useStyles)(ControlledAccordions);\r\n","export default class AaxHashAlgorithm {\r\n static Instance = new AaxHashAlgorithm();\r\n \r\n __fixed_key = [0x77, 0x21, 0x4d, 0x4b, 0x19, 0x6a, 0x87, 0xcd, 0x52, 0x00, 0x45, 0xfd, 0x20, 0xa5, 0x1d, 0x67];\r\n \r\n \r\n // Convert a hex string to a byte array\r\n __hexToBytes(hex) {\r\n for (var bytes = [], c = 0; c < hex.length; c += 2)\r\n bytes.push(parseInt(hex.substr(c, 2), 16));\r\n \r\n return bytes;\r\n }\r\n \r\n // Convert a byte array to a hex string\r\n __bytesToHex(bytes) {\r\n for (var hex = [], i = 0; i < bytes.length; i++) {\r\n var current = bytes[i] < 0 ? bytes[i] + 256 : bytes[i];\r\n hex.push((current >>> 4).toString(16));\r\n hex.push((current & 0xF).toString(16));\r\n }\r\n return hex.join(\"\");\r\n }\r\n \r\n async __HashData(data) {\r\n let source = new Uint8Array(data);\r\n let buffer = await crypto.subtle.digest('SHA-1', source);\r\n return Array.from(new Uint8Array(buffer));\r\n }\r\n \r\n async CalculateChecksum(activationBytes) {\r\n let data = this.__hexToBytes(activationBytes);\r\n \r\n let intermediate_key = await this.__HashData(this.__fixed_key.concat(data));\r\n let intermediate_iv = await this.__HashData(this.__fixed_key.concat(intermediate_key).concat(data));\r\n let checksum = await this.__HashData(intermediate_key.slice(0, 16).concat(intermediate_iv.slice(0, 16)));\r\n \r\n return this.__bytesToHex(checksum);\r\n }\r\n \r\n static async CalculateChecksum(activationBytes){\r\n return AaxHashAlgorithm.Instance.CalculateChecksum(activationBytes);\r\n }\r\n}","import React, { useState } from 'react';\r\nimport { withStyles } from \"@material-ui/core/styles\";\r\nimport Avatar from '@material-ui/core/Avatar';\r\nimport Button from '@material-ui/core/Button';\r\nimport CssBaseline from '@material-ui/core/CssBaseline';\r\nimport TextField from '@material-ui/core/TextField';\r\n\r\nimport Link from '@material-ui/core/Link';\r\nimport Box from '@material-ui/core/Box';\r\nimport LockOutlinedIcon from '@material-ui/icons/LockOutlined';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Container from '@material-ui/core/Container';\r\n\r\nimport Dropzone from 'react-dropzone'\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport FileCopyOutlined from '@material-ui/icons/FileCopyOutlined';\r\nimport PublishOutlined from '@material-ui/icons/PublishOutlined';\r\n\r\n// import { useFilePicker } from 'react-sage'\r\n// import { FilePicker } from 'react-file-picker'\r\n\r\nimport { FilePicker } from '../src/Components'\r\n\r\n\r\nimport { CopyToClipboard } from 'react-copy-to-clipboard';\r\n\r\nimport ControlledAccordions from './ControlledAccordions'\r\n\r\nimport 'react-notifications-component/dist/theme.css'\r\n\r\nimport ReactNotification from 'react-notifications-component'\r\nimport { store } from 'react-notifications-component';\r\n// import 'animate.css/animate.compat.css'\r\n\r\nimport AaxHashAlgorithm from './Utils/AaxHashAlgorithm'\r\n\r\n\r\nconst useStyles = theme => ({\r\n paper: {\r\n marginTop: theme.spacing(8),\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n },\r\n avatar: {\r\n margin: theme.spacing(1),\r\n backgroundColor: theme.palette.secondary.main,\r\n },\r\n form: {\r\n width: '100%', // Fix IE 11 issue.\r\n marginTop: theme.spacing(1),\r\n },\r\n\r\n //Accordeon\r\n heading: {\r\n fontSize: theme.typography.pxToRem(15),\r\n flexBasis: '33.33%',\r\n flexShrink: 0,\r\n },\r\n secondaryHeading: {\r\n fontSize: theme.typography.pxToRem(15),\r\n color: theme.palette.text.secondary,\r\n },\r\n});\r\n\r\nclass ChecksumResolver extends React.Component {\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n checksum: \"\",\r\n fileName: \"input.aax\"\r\n }\r\n }\r\n\r\n DarkerDisabledTextField = withStyles({\r\n root: {\r\n marginRight: 8,\r\n \"& .MuiInputBase-root.Mui-disabled\": {\r\n color: \"rgba(0, 0, 0, 0.6)\"\r\n }\r\n }\r\n })(TextField);\r\n\r\n Copyright = (function () {\r\n return (\r\n \r\n {'Copyright © '}\r\n \r\n audible-tools\r\n {' '}\r\n {new Date().getFullYear()}\r\n {'.'}\r\n \r\n );\r\n })\r\n\r\n setChecksum = (value) => {\r\n if (value.length > 40) {\r\n return;\r\n }\r\n this.setState({ checksum: value })\r\n }\r\n\r\n isChecksumValid = () => {\r\n const { checksum } = this.state;\r\n const regex = RegExp('[a-f0-9]{40}');\r\n const testResults = regex.test(checksum);\r\n\r\n return testResults;\r\n }\r\n\r\n isInputInvalid = () => {\r\n const { checksum } = this.state;\r\n if (!checksum || checksum === '') {\r\n return false;\r\n }\r\n return !this.isChecksumValid();\r\n };\r\n\r\n addNotification = function (text, success = true) {\r\n store.addNotification({\r\n message: text,\r\n type: success ? \"success\" : \"danger\",\r\n // type: \"danger\",\r\n insert: \"bottom-left\",\r\n container: \"top-full\",\r\n animationIn: [\"animate__animated\", \"animate__fadeIn\"],\r\n animationOut: [\"animate__animated\", \"animate__fadeOut\"],\r\n dismiss: {\r\n duration: 3000,\r\n onScreen: false\r\n }\r\n });\r\n }\r\n\r\n requestActivationBytes = async () => {\r\n const { checksum } = this.state;\r\n try {\r\n let request = await fetch(\"https://aax.api.j-kit.me/api/v2/activation/\" + checksum);\r\n let result = await request.json();\r\n const { success, activationBytes } = result;\r\n\r\n if (success !== true) {\r\n this.setState({ activationBytes: 'UNKNOWN' });\r\n this.addNotification(\"An error occured while resolving the activation bytes, please check your inputs\", false);\r\n return;\r\n }\r\n\r\n if (success === true) {\r\n const calculatedChecksum = await AaxHashAlgorithm.CalculateChecksum(activationBytes);\r\n if (calculatedChecksum == checksum) {\r\n this.setState({ activationBytes: activationBytes });\r\n this.addNotification(\"Successfully resolved the activation bytes\");\r\n return;\r\n }\r\n \r\n this.setState({ activationBytes: \"API ERROR\" });\r\n this.addNotification(\"An unexpected error occured while resolving the activation bytes, please try again\", false);\r\n\r\n }\r\n } catch (error) {\r\n this.setState({ activationBytes: error });\r\n this.addNotification(\"An error occured while resolving the activation bytes, please check your inputs\", false);\r\n }\r\n }\r\n\r\n buf2hex(buffer) { // buffer is an ArrayBuffer\r\n return Array.prototype.map.call(new Uint8Array(buffer), x => ('00' + x.toString(16)).slice(-2)).join('');\r\n }\r\n\r\n acceptFiles = async files => {\r\n const file = files[0];\r\n await this.acceptFile(file);\r\n }\r\n\r\n acceptFile = async file => {\r\n // if (!file.name.toLowerCase().endsWith(\".aax\")) {\r\n // alert('FileType not supported!');\r\n // return;\r\n // }\r\n\r\n this.setState({ fileName: file.name });\r\n const slic = file.slice(653, 653 + 20);\r\n const results = this.buf2hex(await slic.arrayBuffer());\r\n this.setChecksum(results)\r\n this.requestActivationBytes();\r\n\r\n }\r\n\r\n render() {\r\n const { classes } = this.props;\r\n const { checksum, activationBytes, fileName } = this.state;\r\n\r\n // const { files, onClick, errors, HiddenFileInput } = useFilePicker({\r\n // maxFileSize: 1000000,\r\n // maxImageWidth: 1000,\r\n // imageQuality: 0.92,\r\n // resizeImage: true\r\n // });\r\n\r\n return (\r\n \r\n\r\n \r\n
\r\n \r\n \r\n \r\n \r\n AAX Checksum Resolver\r\n \r\n\r\n
\r\n {\r\n console.log(acceptedFiles);\r\n this.acceptFiles(acceptedFiles);\r\n }}>\r\n {({ getRootProps, getInputProps }) => (\r\n
\r\n
\r\n \r\n this.setChecksum(x.target.value)}\r\n value={checksum}\r\n InputProps={{\r\n readOnly: false,\r\n endAdornment: (\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n\r\n />\r\n
\r\n
\r\n )}\r\n \r\n\r\n {\r\n this.requestActivationBytes();\r\n }}\r\n disabled={!this.isChecksumValid()}\r\n >\r\n Request Activation Bytes\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }}\r\n\r\n />\r\n\r\n \r\n
\r\n \r\n \r\n \r\n \r\n\r\n\r\n\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(useStyles)(ChecksumResolver);\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport './index.css';\r\nimport * as serviceWorker from './serviceWorker';\r\nimport ChecksumResolver from './ChecksumResolver';\r\n\r\nimport ReactNotification from 'react-notifications-component'\r\nimport ForkMeOnGithub from 'fork-me-on-github';\r\n\r\n\r\nimport ReactGA from 'react-ga';\r\nReactGA.initialize('UA-174657678-1');\r\nReactGA.pageview(window.location.pathname + window.location.search);\r\n\r\nReactDOM.render(\r\n
\r\n
\r\n \r\n {/* \r\n Fork me on GitHub\r\n */}\r\n \r\n
\r\n\r\n \r\n
,\r\n document.getElementById('root')\r\n);\r\n\r\n// If you want your app to work offline and load faster, you can change\r\n// unregister() to register() below. Note this comes with some pitfalls.\r\n// Learn more about service workers: https://bit.ly/CRA-PWA\r\nserviceWorker.unregister();\r\n"],"sourceRoot":""} \ No newline at end of file