├── favicon.ico
├── img
└── icons
│ ├── favicon-16x16.png
│ ├── favicon-32x32.png
│ ├── android-chrome-192x192.png
│ ├── android-chrome-512x512.png
│ ├── apple-touch-icon-152x152.png
│ ├── msapplication-icon-144x144.png
│ └── safari-pinned-tab.svg
├── fonts
├── element-icons.732389de.ttf
└── element-icons.535877f5.woff
├── docker-compose.yml
├── Dockerfile
├── nginx.conf
├── manifest.json
├── css
└── app.efaf15ea.css
├── README.md
├── precache-manifest.20dc3e99613cc2639ea2889020209f36.js
├── LICENSE
├── service-worker.js
├── .github
└── workflows
│ └── static.yml
├── index.html
└── js
├── app.7646e312.js
└── app.7646e312.js.map
/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rong6/unlock-music/HEAD/favicon.ico
--------------------------------------------------------------------------------
/img/icons/favicon-16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rong6/unlock-music/HEAD/img/icons/favicon-16x16.png
--------------------------------------------------------------------------------
/img/icons/favicon-32x32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rong6/unlock-music/HEAD/img/icons/favicon-32x32.png
--------------------------------------------------------------------------------
/fonts/element-icons.732389de.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rong6/unlock-music/HEAD/fonts/element-icons.732389de.ttf
--------------------------------------------------------------------------------
/fonts/element-icons.535877f5.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rong6/unlock-music/HEAD/fonts/element-icons.535877f5.woff
--------------------------------------------------------------------------------
/img/icons/android-chrome-192x192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rong6/unlock-music/HEAD/img/icons/android-chrome-192x192.png
--------------------------------------------------------------------------------
/img/icons/android-chrome-512x512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rong6/unlock-music/HEAD/img/icons/android-chrome-512x512.png
--------------------------------------------------------------------------------
/img/icons/apple-touch-icon-152x152.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rong6/unlock-music/HEAD/img/icons/apple-touch-icon-152x152.png
--------------------------------------------------------------------------------
/img/icons/msapplication-icon-144x144.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rong6/unlock-music/HEAD/img/icons/msapplication-icon-144x144.png
--------------------------------------------------------------------------------
/docker-compose.yml:
--------------------------------------------------------------------------------
1 | version: '3.8'
2 |
3 | services:
4 | unlock-music:
5 | build: .
6 | container_name: unlock-music
7 | ports:
8 | - "9200:9200"
9 | restart: unless-stopped
10 | networks:
11 | - unlock-music-net
12 |
13 | networks:
14 | unlock-music-net:
15 | driver: bridge
16 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | # 使用官方nginx镜像作为基础
2 | FROM nginx:alpine
3 |
4 | # 删除默认的nginx配置
5 | RUN rm /etc/nginx/conf.d/default.conf
6 |
7 | # 复制项目文件到nginx的html目录
8 | COPY . /usr/share/nginx/html
9 |
10 | # 复制自定义nginx配置
11 | COPY nginx.conf /etc/nginx/conf.d/
12 |
13 | # 暴露9200端口
14 | EXPOSE 9200
15 |
16 | # 启动nginx
17 | CMD ["nginx", "-g", "daemon off;"]
18 |
--------------------------------------------------------------------------------
/nginx.conf:
--------------------------------------------------------------------------------
1 | server {
2 | listen 9200;
3 | server_name localhost;
4 |
5 | location / {
6 | root /usr/share/nginx/html;
7 | index index.html;
8 | try_files $uri $uri/ /index.html;
9 | }
10 |
11 | error_page 500 502 503 504 /50x.html;
12 | location = /50x.html {
13 | root /usr/share/nginx/html;
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/manifest.json:
--------------------------------------------------------------------------------
1 | { "name": "音乐解锁", "short_name": "音乐解锁", "theme_color": "#4DBA87", "icons": [{ "src": "./img/icons/android-chrome-192x192.png", "sizes": "192x192", "type": "image/png" }, { "src": "./img/icons/android-chrome-512x512.png", "sizes": "512x512", "type": "image/png" }], "start_url": "./index.html", "display": "standalone", "background_color": "#000000", "description": "在任何设备上解锁已购的加密音乐!支持QQ音乐与网易云音乐!" }
--------------------------------------------------------------------------------
/css/app.efaf15ea.css:
--------------------------------------------------------------------------------
1 | .el-upload-dragger[data-v-36dd009c]{width:80vw!important}#app{font-family:Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei,微软雅黑,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-align:center;color:#2c3e50;padding-top:30px}#app-footer a{padding-left:.2em;padding-right:.2em}#app-footer{text-align:center;font-size:small}#app-control{padding-top:1em;padding-bottom:1em}
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # unlock-music
2 | 音乐解锁:移除已购音乐的加密保护。 目前支持网易云音乐(ncm)、QQ音乐(qmc, mflac, tkm, ogg) 。
3 |
4 | 原仓库为[git.unlock-music.dev/um/web](https://git.unlock-music.dev/um/web),本仓库为预构建版本,具体版本不得而知,可在[git.unlock-music.dev/um/web/releases](https://git.unlock-music.dev/um/web/releases/)下载最新版本。
5 |
6 | 直接部署可使用Fork本仓库后使用GitHub Pages。
7 |
8 | 或者使用 `Docker` 部署:
9 |
10 | 使用以下命令构建和运行容器:
11 |
12 | ```
13 | docker build -t unlock-music .
14 | docker run -d -p 9200:9200 unlock-music
15 | ```
16 |
17 | 或者使用 `docker-compose` 部署:
18 |
19 | ```
20 | docker-compose up -d
21 | ```
22 |
--------------------------------------------------------------------------------
/precache-manifest.20dc3e99613cc2639ea2889020209f36.js:
--------------------------------------------------------------------------------
1 | self.__precacheManifest = (self.__precacheManifest || []).concat([
2 | {
3 | "revision": "411dd765dba081c26f5f",
4 | "url": "css/app.efaf15ea.css"
5 | },
6 | {
7 | "revision": "8e974c4cf7f32554892d",
8 | "url": "css/chunk-vendors.a870fc53.css"
9 | },
10 | {
11 | "revision": "dba54e9349efa24110bb48974493c94f",
12 | "url": "e495d03829e7f9f45920.worker.js"
13 | },
14 | {
15 | "revision": "535877f50039c0cb49a6196a5b7517cd",
16 | "url": "fonts/element-icons.535877f5.woff"
17 | },
18 | {
19 | "revision": "732389ded34cb9c52dd88271f1345af9",
20 | "url": "fonts/element-icons.732389de.ttf"
21 | },
22 | {
23 | "revision": "0d8d589481bd98e13dbe34e09ccf0054",
24 | "url": "index.html"
25 | },
26 | {
27 | "revision": "411dd765dba081c26f5f",
28 | "url": "js/app.7646e312.js"
29 | },
30 | {
31 | "revision": "8e974c4cf7f32554892d",
32 | "url": "js/chunk-vendors.e2253095.js"
33 | },
34 | {
35 | "revision": "28f3e13ec88073aa1b85b7d66358f613",
36 | "url": "manifest.json"
37 | }
38 | ]);
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2023 rong6
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/service-worker.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Welcome to your Workbox-powered service worker!
3 | *
4 | * You'll need to register this file in your web app and you should
5 | * disable HTTP caching for this file too.
6 | * See https://goo.gl/nhQhGp
7 | *
8 | * The rest of the code is auto-generated. Please don't update this file
9 | * directly; instead, make changes to your Workbox build configuration
10 | * and re-run your build process.
11 | * See https://goo.gl/2aRDsh
12 | */
13 |
14 | importScripts("https://storage.googleapis.com/workbox-cdn/releases/4.3.1/workbox-sw.js");
15 |
16 | importScripts(
17 | "precache-manifest.20dc3e99613cc2639ea2889020209f36.js"
18 | );
19 |
20 | workbox.core.setCacheNameDetails({prefix: "unlock-music"});
21 |
22 | self.addEventListener('message', (event) => {
23 | if (event.data && event.data.type === 'SKIP_WAITING') {
24 | self.skipWaiting();
25 | }
26 | });
27 |
28 | /**
29 | * The workboxSW.precacheAndRoute() method efficiently caches and responds to
30 | * requests for URLs in the manifest.
31 | * See https://goo.gl/S9QRab
32 | */
33 | self.__precacheManifest = [].concat(self.__precacheManifest || []);
34 | workbox.precaching.precacheAndRoute(self.__precacheManifest, {});
35 |
--------------------------------------------------------------------------------
/.github/workflows/static.yml:
--------------------------------------------------------------------------------
1 | # Simple workflow for deploying static content to GitHub Pages
2 | name: Deploy static content to Pages
3 |
4 | on:
5 | # Runs on pushes targeting the default branch
6 | push:
7 | branches: ["main"]
8 |
9 | # Allows you to run this workflow manually from the Actions tab
10 | workflow_dispatch:
11 |
12 | # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
13 | permissions:
14 | contents: read
15 | pages: write
16 | id-token: write
17 |
18 | # Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
19 | # However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
20 | concurrency:
21 | group: "pages"
22 | cancel-in-progress: false
23 |
24 | jobs:
25 | # Single deploy job since we're just deploying
26 | deploy:
27 | environment:
28 | name: github-pages
29 | url: ${{ steps.deployment.outputs.page_url }}
30 | runs-on: ubuntu-latest
31 | steps:
32 | - name: Checkout
33 | uses: actions/checkout@v3
34 | - name: Setup Pages
35 | uses: actions/configure-pages@v3
36 | - name: Upload artifact
37 | uses: actions/upload-pages-artifact@v2
38 | with:
39 | # Upload entire repository
40 | path: '.'
41 | - name: Deploy to GitHub Pages
42 | id: deployment
43 | uses: actions/deploy-pages@v2
44 |
--------------------------------------------------------------------------------
/img/icons/safari-pinned-tab.svg:
--------------------------------------------------------------------------------
1 |
3 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | 音乐解锁
9 |
10 |
11 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
--------------------------------------------------------------------------------
/js/app.7646e312.js:
--------------------------------------------------------------------------------
1 | (function(e) {
2 | function t(t) {
3 | for (var n, o, i = t[0], s = t[1], u = t[2], f = 0, d = []; f < i.length; f++) o = i[f], Object.prototype.hasOwnProperty.call(a, o) && a[o] && d.push(a[o][0]), a[o] = 0;
4 | for (n in s) Object.prototype.hasOwnProperty.call(s, n) && (e[n] = s[n]);
5 | l && l(t);
6 | while (d.length) d.shift()();
7 | return c.push.apply(c, u || []), r()
8 | }
9 |
10 | function r() {
11 | for (var e, t = 0; t < c.length; t++) {
12 | for (var r = c[t], n = !0, i = 1; i < r.length; i++) {
13 | var s = r[i];
14 | 0 !== a[s] && (n = !1)
15 | }
16 | n && (c.splice(t--, 1), e = o(o.s = r[0]))
17 | }
18 | return e
19 | }
20 | var n = {},
21 | a = { app: 0 },
22 | c = [];
23 |
24 | function o(t) { if (n[t]) return n[t].exports; var r = n[t] = { i: t, l: !1, exports: {} }; return e[t].call(r.exports, r, r.exports, o), r.l = !0, r.exports }
25 | o.m = e, o.c = n, o.d = function(e, t, r) { o.o(e, t) || Object.defineProperty(e, t, { enumerable: !0, get: r }) }, o.r = function(e) { "undefined" !== typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, { value: "Module" }), Object.defineProperty(e, "__esModule", { value: !0 }) }, o.t = function(e, t) {
26 | if (1 & t && (e = o(e)), 8 & t) return e;
27 | if (4 & t && "object" === typeof e && e && e.__esModule) return e;
28 | var r = Object.create(null);
29 | if (o.r(r), Object.defineProperty(r, "default", { enumerable: !0, value: e }), 2 & t && "string" != typeof e)
30 | for (var n in e) o.d(r, n, function(t) { return e[t] }.bind(null, n));
31 | return r
32 | }, o.n = function(e) { var t = e && e.__esModule ? function() { return e["default"] } : function() { return e }; return o.d(t, "a", t), t }, o.o = function(e, t) { return Object.prototype.hasOwnProperty.call(e, t) }, o.p = "";
33 | var i = window["webpackJsonp"] = window["webpackJsonp"] || [],
34 | s = i.push.bind(i);
35 | i.push = t, i = i.slice();
36 | for (var u = 0; u < i.length; u++) t(i[u]);
37 | var l = s;
38 | c.push([0, "chunk-vendors"]), r()
39 | })({
40 | 0: function(e, t, r) { e.exports = r("56d7") },
41 | "034f": function(e, t, r) {
42 | "use strict";
43 | var n = r("85ec"),
44 | a = r.n(n);
45 | a.a
46 | },
47 | "06dc": function(e, t, r) {
48 | "use strict";
49 | r.d(t, "c", (function() { return a })), r.d(t, "a", (function() { return s })), r.d(t, "d", (function() { return u })), r.d(t, "f", (function() { return f })), r.d(t, "e", (function() { return d })), r.d(t, "g", (function() { return p })), r.d(t, "b", (function() { return m }));
50 | r("a623"), r("fb6a"), r("d3b7"), r("ac1f"), r("3ca3"), r("1276"), r("498a"), r("ddb0"), r("2b3d"), r("96cf");
51 | var n = r("1da1"),
52 | a = [102, 76, 97, 67],
53 | c = [73, 68, 51],
54 | o = [79, 103, 103, 83],
55 | i = [102, 116, 121, 112],
56 | s = { mp3: "audio/mpeg", flac: "audio/flac", m4a: "audio/mp4", ogg: "audio/ogg" };
57 |
58 | function u(e) { return l.apply(this, arguments) }
59 |
60 | function l() {
61 | return l = Object(n["a"])(regeneratorRuntime.mark((function e(t) {
62 | return regeneratorRuntime.wrap((function(e) {
63 | while (1) switch (e.prev = e.next) {
64 | case 0:
65 | return e.next = 2, new Promise((function(e) {
66 | var r = new FileReader;
67 | r.onload = function(t) { e(t.target.result) }, r.readAsArrayBuffer(t)
68 | }));
69 | case 2:
70 | return e.abrupt("return", e.sent);
71 | case 3:
72 | case "end":
73 | return e.stop()
74 | }
75 | }), e)
76 | }))), l.apply(this, arguments)
77 | }
78 |
79 | function f(e, t, r) {
80 | var n = "",
81 | a = "",
82 | c = r.split("-");
83 | return c.length > 1 ? (n = c[0].trim(), a = c[1].trim()) : 1 === c.length && (a = c[0].trim()), "string" == typeof e && "" !== e && (n = e), "string" == typeof t && "" !== t && (a = t), { artist: n, title: a }
84 | }
85 |
86 | function d(e) {
87 | var t = "";
88 | if (void 0 !== e.common.picture && e.common.picture.length > 0) {
89 | var r = new Blob([e.common.picture[0].data], { type: e.common.picture[0].format });
90 | t = URL.createObjectURL(r)
91 | }
92 | return t
93 | }
94 |
95 | function p(e, t) { return e.every((function(e, r) { return e === t[r] })) }
96 |
97 | function m(e, t) { return p(c, e.slice(0, c.length)) ? "mp3" : p(a, e.slice(0, a.length)) ? "flac" : p(o, e.slice(0, o.length)) ? "ogg" : p(i, e.slice(4, 8)) ? "m4a" : t }
98 | },
99 | 1: function(e, t) {},
100 | 2: function(e, t) {},
101 | "56d7": function(e, t, r) {
102 | "use strict";
103 | r.r(t);
104 | r("46a1"), r("450d");
105 | var n = r("e5f2"),
106 | a = r.n(n),
107 | c = (r("b5d8"), r("f494")),
108 | o = r.n(c),
109 | i = (r("560b"), r("dcdc")),
110 | s = r.n(i),
111 | u = (r("f225"), r("89a9")),
112 | l = r.n(u),
113 | f = (r("f4f9"), r("c2cc")),
114 | d = r.n(f),
115 | p = (r("7a0f"), r("0f6c")),
116 | m = r.n(p),
117 | h = (r("aaa5"), r("a578")),
118 | b = r.n(h),
119 | g = (r("adec"), r("3d2d")),
120 | w = r.n(g),
121 | v = (r("bdc7"), r("aa2f")),
122 | y = r.n(v),
123 | k = (r("de31"), r("c69e")),
124 | x = r.n(k),
125 | _ = (r("5466"), r("ecdf")),
126 | O = r.n(_),
127 | j = (r("38a0"), r("ad41")),
128 | D = r.n(j),
129 | S = (r("1951"), r("eedf")),
130 | A = r.n(S),
131 | M = (r("acb6"), r("c673")),
132 | U = r.n(M),
133 | R = (r("fd71"), r("a447")),
134 | C = r.n(R),
135 | F = (r("e260"), r("e6cf"), r("cca6"), r("a79d"), r("2b0e")),
136 | P = function() {
137 | var e = this,
138 | t = e.$createElement,
139 | r = e._self._c || t;
140 | return r("el-container", { attrs: { id: "app" } }, [r("el-main", [r("x-upload", { on: { handle_finish: e.showSuccess, handle_error: e.showFail } }), r("el-row", { attrs: { id: "app-control" } }, [r("el-row", { staticStyle: { "padding-bottom": "1em", "font-size": "14px" } }, [e._v(" 歌曲命名格式: "), r("el-radio", { attrs: { name: "format", label: "1" }, model: { value: e.download_format, callback: function(t) { e.download_format = t }, expression: "download_format" } }, [e._v("歌曲名")]), r("el-radio", { attrs: { name: "format", label: "2" }, model: { value: e.download_format, callback: function(t) { e.download_format = t }, expression: "download_format" } }, [e._v("歌手-歌曲名")]), r("el-radio", { attrs: { name: "format", label: "3" }, model: { value: e.download_format, callback: function(t) { e.download_format = t }, expression: "download_format" } }, [e._v("歌曲名-歌手")]), r("el-checkbox", { attrs: { border: "" }, model: { value: e.instant_download, callback: function(t) { e.instant_download = t }, expression: "instant_download" } }, [e._v("立即保存")])], 1), r("el-button", { attrs: { icon: "el-icon-download", plain: "" }, on: { click: e.handleDownloadAll } }, [e._v("下载全部")]), r("el-button", { attrs: { icon: "el-icon-delete", plain: "", type: "danger" }, on: { click: e.handleDeleteAll } }, [e._v("删除全部")])], 1), r("audio", { attrs: { autoplay: e.playing_auto, src: e.playing_url, controls: "" } }), r("x-preview", { attrs: { "table-data": e.tableData, download_format: e.download_format }, on: { music_changed: e.changePlaying } })], 1), r("el-footer", { attrs: { id: "app-footer" } }, [r("el-row", [e._v(" 音乐解锁:移除已购音乐的加密保护。 目前支持网易云音乐(ncm)、QQ音乐(qmc, mflac, tkm, ogg) "), e._v("。 "), ])], 1)], 1)
141 | },
142 | B = [],
143 | E = (r("4160"), r("159b"), function() {
144 | var e = this,
145 | t = e.$createElement,
146 | r = e._self._c || t;
147 | return r("el-upload", { attrs: { "auto-upload": !1, "on-change": e.handleFile, "show-file-list": !1, action: "", drag: "", multiple: "" } }, [r("i", { staticClass: "el-icon-upload" }), r("div", { staticClass: "el-upload__text" }, [e._v("将文件拖到此处,或"), r("em", [e._v("点击选择")])]), r("div", { staticClass: "el-upload__tip", attrs: { slot: "tip" }, slot: "tip" }, [e._v("本工具可以在浏览器内对文件进行解锁,无需消耗流量")])])
148 | }),
149 | L = [],
150 | T = (r("b0c0"), {
151 | name: "upload",
152 | data: function() { return { cacheQueue: [], workers: [], idle_workers: [], thread_num: 1 } },
153 | mounted: function() {
154 | var e = this;
155 | if ("" !== document.location.host) {
156 | this.thread_num = navigator.hardwareConcurrency || 1;
157 | var t = r("bfa2");
158 | this.workers.push(t().CommonDecrypt), this.idle_workers.push(0), setTimeout((function() { for (var r = 1; r < e.thread_num; r++) e.workers.push(t().CommonDecrypt), e.idle_workers.push(r) }), 1e3)
159 | } else {
160 | var n = r("bd2e");
161 | this.workers.push(n.CommonDecrypt), this.idle_workers.push(0)
162 | }
163 | },
164 | methods: {
165 | handleFile: function(e) { this.idle_workers.length > 0 ? this.handleDoFile(e, this.idle_workers.shift()) : this.cacheQueue.push(e) },
166 | handleCacheQueue: function(e) { 0 !== this.cacheQueue.length ? this.handleDoFile(this.cacheQueue.shift(), e) : this.idle_workers.push(e) },
167 | handleDoFile: function(e, t) {
168 | var r = this;
169 | this.workers[t](e).then((function(e) { r.$emit("handle_finish", e), r.handleCacheQueue(t) })).catch((function(n) { r.$emit("handle_error", n, e.name), r.handleCacheQueue(t) }))
170 | }
171 | }
172 | }),
173 | q = T,
174 | $ = (r("b646"), r("2877")),
175 | I = Object($["a"])(q, E, L, !1, null, "36dd009c", null),
176 | N = I.exports,
177 | Q = function() {
178 | var e = this,
179 | t = e.$createElement,
180 | r = e._self._c || t;
181 | return r("el-table", { staticStyle: { width: "100%" }, attrs: { data: e.tableData } }, [r("el-table-column", { attrs: { label: "封面" }, scopedSlots: e._u([{ key: "default", fn: function(t) { return [r("el-image", { staticStyle: { width: "100px", height: "100px" }, attrs: { src: t.row.picture } }, [r("div", { staticClass: "image-slot el-image__error", attrs: { slot: "error" }, slot: "error" }, [e._v(" 暂无封面 ")])])] } }]) }), r("el-table-column", { attrs: { label: "歌曲" }, scopedSlots: e._u([{ key: "default", fn: function(t) { return [r("span", { staticStyle: { "margin-left": "10px" } }, [e._v(e._s(t.row.title))])] } }]) }), r("el-table-column", { attrs: { label: "歌手" }, scopedSlots: e._u([{ key: "default", fn: function(t) { return [r("p", [e._v(e._s(t.row.artist))])] } }]) }), r("el-table-column", { attrs: { label: "专辑" }, scopedSlots: e._u([{ key: "default", fn: function(t) { return [r("p", [e._v(e._s(t.row.album))])] } }]) }), r("el-table-column", { attrs: { label: "操作" }, scopedSlots: e._u([{ key: "default", fn: function(t) { return [r("el-button", { attrs: { circle: "", icon: "el-icon-video-play", type: "success" }, on: { click: function(r) { return e.handlePlay(t.$index, t.row) } } }), r("el-button", { attrs: { circle: "", icon: "el-icon-download" }, on: { click: function(r) { return e.handleDownload(t.row) } } }), r("el-button", { attrs: { circle: "", icon: "el-icon-delete", type: "danger" }, on: { click: function(r) { return e.handleDelete(t.$index, t.row) } } })] } }]) })], 1)
182 | },
183 | J = [];
184 | r("a434"), r("d3b7"), r("3ca3"), r("ddb0"), r("2b3d");
185 |
186 | function H(e, t) {
187 | var r = document.createElement("a");
188 | switch (r.href = e.file, t) {
189 | case "1":
190 | r.download = e.title + "." + e.ext;
191 | break;
192 | default:
193 | case "2":
194 | r.download = e.artist + " - " + e.title + "." + e.ext;
195 | break;
196 | case "3":
197 | r.download = e.title + " - " + e.artist + "." + e.ext;
198 | break
199 | }
200 | document.body.append(r), r.click(), r.remove()
201 | }
202 |
203 | function W(e) { URL.revokeObjectURL(e.file), URL.revokeObjectURL(e.picture) }
204 | var K = { name: "preview", props: { tableData: { type: Array, required: !0 }, download_format: { type: String, required: !0 } }, methods: { handlePlay: function(e, t) { this.$emit("music_changed", t.file) }, handleDelete: function(e, t) { W(t), this.tableData.splice(e, 1) }, handleDownload: function(e) { H(e, this.download_format) } } },
205 | z = K,
206 | V = Object($["a"])(z, Q, J, !1, null, "6856848d", null),
207 | X = V.exports,
208 | Y = {
209 | name: "app",
210 | components: { xUpload: N, xPreview: X },
211 | data: function() { return { activeIndex: "1", tableData: [], playing_url: "", playing_auto: !1, download_format: "2", instant_download: !1 } },
212 | created: function() { this.$nextTick((function() { this.finishLoad() })) },
213 | methods: {
214 | finishLoad: function() {
215 | var e = document.getElementById("loader-mask");
216 | e && e.remove(), this.$notify.info({ title: "", message: '我们使用PWA技术,无网络也能使用
最近更新:提供实验性ogg支持', dangerouslyUseHTMLString: !0, duration: 1e4, position: "top-left" })
217 | },
218 | showSuccess: function(e) {
219 | if (e.status) {
220 | this.instant_download ? (H(e, this.download_format), W(e)) : (this.tableData.push(e), this.$notify.success({ title: "解锁成功", message: "成功解锁 " + e.title, duration: 3e3 }));
221 | var t = [e.title, e.artist, e.album];
222 | window._paq.push(["trackEvent", "Unlock", e.rawExt + "," + e.mime, JSON.stringify(t)])
223 | } else this.showFail(e.message, e.rawFilename + "." + e.rawExt)
224 | },
225 | showFail: function(e, t) { this.$notify.error({ title: "出现问题", message: e + "," + t + ',参考使用提示', dangerouslyUseHTMLString: !0, duration: 6e3 }), window._paq.push(["trackEvent", "Error", e, t]), console.error(e, t) },
226 | changePlaying: function(e) { this.playing_url = e, this.playing_auto = !0 },
227 | handleDeleteAll: function() { this.tableData.forEach((function(e) { W(e) })), this.tableData = [] },
228 | handleDownloadAll: function() {
229 | var e = this,
230 | t = 0,
231 | r = setInterval((function() { t < e.tableData.length ? (H(e.tableData[t], e.download_format), t++) : clearInterval(r) }), 300)
232 | }
233 | }
234 | },
235 | G = Y,
236 | Z = (r("034f"), Object($["a"])(G, P, B, !1, null, null, null)),
237 | ee = Z.exports,
238 | te = r("9483");
239 | Object(te["a"])("".concat("", "service-worker.js"), { ready: function() { console.log("App is being served from cache by a service worker.\nFor more details, visit https://goo.gl/AFskqB") }, registered: function() { console.log("Service worker has been registered.") }, cached: function() { console.log("Content has been cached for offline use.") }, updatefound: function() { console.log("New content is downloading.") }, updated: function() { console.log("New content is available; please refresh.") }, offline: function() { console.log("No internet connection found. App is running in offline mode.") }, error: function(e) { console.error("Error during service worker registration:", e) } });
240 | r("0fae");
241 | F["default"].use(C.a), F["default"].use(U.a), F["default"].use(A.a), F["default"].use(D.a), F["default"].use(O.a), F["default"].use(x.a), F["default"].use(y.a), F["default"].use(w.a), F["default"].use(b.a), F["default"].use(m.a), F["default"].use(d.a), F["default"].use(l.a), F["default"].use(s.a), F["default"].use(o.a), F["default"].prototype.$notify = a.a, F["default"].config.productionTip = !1, new F["default"]({ render: function(e) { return e(ee) } }).$mount("#app")
242 | },
243 | "85ec": function(e, t, r) {},
244 | "8a1e": function(e, t, r) {},
245 | a8ee: function(e, t, r) {
246 | "use strict";
247 | r.r(t), r.d(t, "Decrypt", (function() { return i }));
248 | r("ace4"), r("d3b7"), r("5cc6"), r("9a8c"), r("a975"), r("735e"), r("c1ac"), r("d139"), r("3a7b"), r("d5d6"), r("82f8"), r("e91f"), r("60bd"), r("5f96"), r("3280"), r("3fcc"), r("ca91"), r("25a1"), r("cd26"), r("3c5d"), r("2954"), r("649e"), r("219c"), r("170b"), r("b39a"), r("72f7"), r("96cf");
249 | var n = r("1da1"),
250 | a = r("fd2f"),
251 | c = r("06dc"),
252 | o = [0, 0, 0, 32, 102, 116, 121, 112];
253 |
254 | function i(e, t) { return s.apply(this, arguments) }
255 |
256 | function s() {
257 | return s = Object(n["a"])(regeneratorRuntime.mark((function e(t, r) {
258 | var n, i, s, u;
259 | return regeneratorRuntime.wrap((function(e) {
260 | while (1) switch (e.prev = e.next) {
261 | case 0:
262 | return e.next = 2, Object(c["d"])(t);
263 | case 2:
264 | for (n = e.sent, i = new Uint8Array(n), s = 0; s < 8; ++s) i[s] = o[s];
265 | return u = new Blob([i], { type: "audio/mp4" }), e.next = 8, Object(a["Decrypt"])(u, r, "m4a", !1);
266 | case 8:
267 | return e.abrupt("return", e.sent);
268 | case 9:
269 | case "end":
270 | return e.stop()
271 | }
272 | }), e)
273 | }))), s.apply(this, arguments)
274 | }
275 | },
276 | b646: function(e, t, r) {
277 | "use strict";
278 | var n = r("8a1e"),
279 | a = r.n(n);
280 | a.a
281 | },
282 | b6cf: function(e, t, r) {
283 | "use strict";
284 | r.r(t);
285 | r("a630"), r("fb6a"), r("ace4"), r("d3b7"), r("3ca3"), r("5cc6"), r("9a8c"), r("a975"), r("735e"), r("c1ac"), r("d139"), r("3a7b"), r("d5d6"), r("82f8"), r("e91f"), r("60bd"), r("5f96"), r("3280"), r("3fcc"), r("ca91"), r("25a1"), r("cd26"), r("3c5d"), r("2954"), r("649e"), r("219c"), r("170b"), r("b39a"), r("72f7"), r("ddb0"), r("2b3d"), r("96cf");
286 | var n = r("1da1"),
287 | a = r("06dc"),
288 | c = (r("99af"), r("d4ec")),
289 | o = r("bee2"),
290 | i = [79, 103, 103, 83, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 30, 1, 118, 111, 114, 98, 105, 115, 0, 0, 0, 0, 2, 68, 172, 0, 0, 0, 0, 0, 0, 0, 238, 2, 0, 0, 0, 0, 0, 184, 1, 79, 103, 103, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 16, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 3, 118, 111, 114, 98, 105, 115, 44, 0, 0, 0, 88, 105, 112, 104, 46, 79, 114, 103, 32, 108, 105, 98, 86, 111, 114, 98, 105, 115, 32, 73, 32, 50, 48, 49, 53, 48, 49, 48, 53, 32, 40, 226, 155, 132, 226, 155, 132, 226, 155, 132, 226, 155, 132, 41, 0, 0, 0, 0, 0, 0, 0, 0, 84, 73, 84, 76, 69, 61],
291 | s = [9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 6, 3, 3, 3, 3, 6, 6, 6, 6, 3, 3, 3, 3, 6, 6, 6, 6, 6, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, 6, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 1, 9, 9, 0, 1, 9, 9, 9, 9, 9, 9, 9, 9],
292 | u = [74, 214, 202, 144, 103, 247, 82, 94, 149, 35, 159, 19, 17, 126, 71, 116, 61, 144, 170, 63, 81, 198, 9, 213, 159, 250, 102, 249, 243, 214, 161, 144, 160, 247, 240, 29, 149, 222, 159, 132, 17, 244, 14, 116, 187, 144, 188, 63, 146, 0, 9, 91, 159, 98, 102, 161],
293 | l = 195,
294 | f = 216,
295 | d = function() {
296 | function e(t, r, n) { Object(c["a"])(this, e), void 0 === r || void 0 === n ? (this.Matrix128 = t, this.generateMask58from128()) : (this.Matrix58 = t, this.Super58A = r, this.Super58B = n, this.generateMask128from58()) }
297 | return Object(o["a"])(e, [{
298 | key: "generateMask128from58",
299 | value: function() {
300 | if (56 !== this.Matrix58.length) throw "incorrect mask58 matrix length";
301 | for (var e = [], t = 0; t < 8; t += 1) e = e.concat([this.Super58A], this.Matrix58.slice(7 * t, 7 * t + 7), [this.Super58B], this.Matrix58.slice(49 - 7 * t, 56 - 7 * t).reverse());
302 | this.Matrix128 = e
303 | }
304 | }, {
305 | key: "generateMask58from128",
306 | value: function() {
307 | if (128 !== this.Matrix128.length) throw "incorrect mask128 length";
308 | for (var e = this.Matrix128[0], t = this.Matrix128[8], r = [], n = 0; n < 8; n += 1) {
309 | var c = 16 * n,
310 | o = 120 - c;
311 | if (this.Matrix128[c] !== e || this.Matrix128[c + 8] !== t) throw "decode mask-128 to mask-58 failed";
312 | var i = this.Matrix128.slice(c + 1, c + 8),
313 | s = this.Matrix128.slice(o + 1, o + 8).reverse();
314 | if (!Object(a["g"])(i, s)) throw "decode mask-128 to mask-58 failed";
315 | r = r.concat(i)
316 | }
317 | this.Matrix58 = r, this.Super58A = e, this.Super58B = t
318 | }
319 | }, { key: "Decrypt", value: function(e) { for (var t = e.slice(0), r = -1, n = -1, a = 0; a < e.length; a++) r++, n++, (32768 === r || r > 32768 && (r + 1) % 32768 === 0) && (r++, n++), n >= 128 && (n -= 128), t[a] ^= this.Matrix128[n]; return t } }]), e
320 | }();
321 |
322 | function p() { return new d(u, l, f) }
323 |
324 | function m(e) {
325 | for (var t, r = Math.min(32768, e.length), n = 0; n < r; n += 128) try { if (t = new d(e.slice(n, n + 128)), Object(a["g"])(a["c"], t.Decrypt(e.slice(0, a["c"].length)))) break } catch (c) {}
326 | return t
327 | }
328 |
329 | function h(e) {
330 | if (!(e.length < i.length)) {
331 | for (var t = {}, r = 0; r < 58; r++) t[r] = {};
332 | for (var n = 0; n < i.length; n++)
333 | if (0 !== s[n]) {
334 | var a = w(n),
335 | c = e[n] ^ i[n],
336 | o = s[n];
337 | c in t[a] ? t[a][c] += o : t[a][c] = o
338 | }
339 | var u, l, f = [];
340 | try {
341 | for (var p = 0; p < 56; p++) f[p] = g(t[p]);
342 | u = g(t[56]), l = g(t[57])
343 | } catch (m) { return }
344 | return new d(f, u, l)
345 | }
346 | }
347 |
348 | function b(e, t, r) { return new d(e, t, r) }
349 |
350 | function g(e) { if (0 === e.length) throw "can not match at least one key"; var t, r = 0; for (var n in e) e[n] > r && (t = n, r = e[n]); return parseInt(t) }
351 |
352 | function w(e) {
353 | e > 127 && (e %= 128);
354 | var t = e % 16,
355 | r = (e - t) / 16;
356 | switch (t) {
357 | case 0:
358 | r = 8, t = 0;
359 | break;
360 | case 8:
361 | r = 8, t = 1;
362 | break;
363 | default:
364 | t > 7 ? (r = 7 - r, t = 15 - t) : t -= 1;
365 | break
366 | }
367 | return 7 * r + t
368 | }
369 | r.d(t, "Decrypt", (function() { return k }));
370 | var v = r("cb96"),
371 | y = { mgg: { handler: h, ext: "ogg", detect: !0 }, mflac: { handler: m, ext: "flac", detect: !0 }, qmc0: { handler: p, ext: "mp3", detect: !1 }, qmc3: { handler: p, ext: "mp3", detect: !1 }, qmcogg: { handler: p, ext: "ogg", detect: !1 }, qmcflac: { handler: p, ext: "flac", detect: !1 }, bkcmp3: { handler: p, ext: "mp3", detect: !1 }, bkcflac: { handler: p, ext: "flac", detect: !1 }, tkm: { handler: p, ext: "m4a", detect: !1 } };
372 |
373 | function k(e, t, r) { return x.apply(this, arguments) }
374 |
375 | function x() {
376 | return x = Object(n["a"])(regeneratorRuntime.mark((function e(t, r, n) {
377 | var c, o, i, s, u, l, f, d, p, m, h;
378 | return regeneratorRuntime.wrap((function(e) {
379 | while (1) switch (e.prev = e.next) {
380 | case 0:
381 | if (n in y) { e.next = 2; break }
382 | return e.abrupt("return", { status: !1, message: "File type is incorrect!" });
383 | case 2:
384 | return c = y[n], e.t0 = Uint8Array, e.next = 6, Object(a["d"])(t);
385 | case 6:
386 | if (e.t1 = e.sent, o = new e.t0(e.t1), !c.detect) { e.next = 20; break }
387 | if (i = o.slice(0, -368), s = c.handler(i), u = o.slice(-368), void 0 !== s) { e.next = 16; break }
388 | return e.next = 15, O(u, r, n);
389 | case 15:
390 | s = e.sent;
391 | case 16:
392 | if (void 0 !== s) { e.next = 18; break }
393 | return e.abrupt("return", { status: !1, message: n + "格式仅提供实验性支持!" });
394 | case 18:
395 | e.next = 22;
396 | break;
397 | case 20:
398 | i = o, s = c.handler(i);
399 | case 22:
400 | return l = s.Decrypt(i), f = Object(a["b"])(l, c.ext), d = a["a"][f], p = new Blob([l], { type: d }), e.next = 28, v.parseBlob(p);
401 | case 28:
402 | return m = e.sent, h = Object(a["f"])(m.common.artist, m.common.title, r), c.detect && _(u, s.Matrix128, h.artist, h.title, m.common.album, r, n), e.abrupt("return", { status: !0, title: h.title, artist: h.artist, ext: f, album: m.common.album, picture: Object(a["e"])(m), file: URL.createObjectURL(p), mime: d });
403 | case 32:
404 | case "end":
405 | return e.stop()
406 | }
407 | }), e)
408 | }))), x.apply(this, arguments)
409 | }
410 |
411 | function _(e, t, r, n, a, c, o) { fetch("https://stats.ixarea.com/collect/qmcmask/usage", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ Mask: Array.from(t), Key: Array.from(e), Artist: r, Title: n, Album: a, Filename: c, Format: o }) }).then().catch() }
412 |
413 | function O(e, t, r) { return j.apply(this, arguments) }
414 |
415 | function j() {
416 | return j = Object(n["a"])(regeneratorRuntime.mark((function e(t, r, n) {
417 | var a, c;
418 | return regeneratorRuntime.wrap((function(e) {
419 | while (1) switch (e.prev = e.next) {
420 | case 0:
421 | return e.prev = 0, e.next = 3, fetch("https://stats.ixarea.com/collect/qmcmask/query", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ Format: n, Key: Array.from(t), Filename: r }) });
422 | case 3:
423 | return a = e.sent, e.next = 6, a.json();
424 | case 6:
425 | return c = e.sent, e.abrupt("return", b(c.Matrix58, c.Super58A, c.Super58B));
426 | case 10:
427 | e.prev = 10, e.t0 = e["catch"](0);
428 | case 12:
429 | case "end":
430 | return e.stop()
431 | }
432 | }), e, null, [
433 | [0, 10]
434 | ])
435 | }))), j.apply(this, arguments)
436 | }
437 | },
438 | bd2e: function(e, t, r) {
439 | "use strict";
440 | r.r(t), r.d(t, "CommonDecrypt", (function() { return s }));
441 | r("baa5"), r("b0c0"), r("96cf");
442 | var n = r("1da1"),
443 | a = r("dde9"),
444 | c = r("b6cf"),
445 | o = r("fd2f"),
446 | i = r("a8ee");
447 |
448 | function s(e) { return u.apply(this, arguments) }
449 |
450 | function u() {
451 | return u = Object(n["a"])(regeneratorRuntime.mark((function e(t) {
452 | var r, n, s;
453 | return regeneratorRuntime.wrap((function(e) {
454 | while (1) switch (e.prev = e.next) {
455 | case 0:
456 | r = t.name.substring(t.name.lastIndexOf(".") + 1, t.name.length).toLowerCase(), n = t.name.substring(0, t.name.lastIndexOf(".")), e.t0 = r, e.next = "ncm" === e.t0 ? 5 : "mp3" === e.t0 ? 9 : "flac" === e.t0 ? 9 : "m4a" === e.t0 ? 9 : "ogg" === e.t0 ? 9 : "tm0" === e.t0 ? 13 : "tm3" === e.t0 ? 13 : "qmc3" === e.t0 ? 17 : "qmc0" === e.t0 ? 17 : "qmcflac" === e.t0 ? 17 : "qmcogg" === e.t0 ? 17 : "tkm" === e.t0 ? 17 : "bkcmp3" === e.t0 ? 17 : "bkcflac" === e.t0 ? 17 : "mflac" === e.t0 ? 17 : "mgg" === e.t0 ? 17 : "tm2" === e.t0 ? 21 : "tm6" === e.t0 ? 21 : 25;
457 | break;
458 | case 5:
459 | return e.next = 7, a.Decrypt(t.raw);
460 | case 7:
461 | return s = e.sent, e.abrupt("break", 26);
462 | case 9:
463 | return e.next = 11, o.Decrypt(t.raw, n, r);
464 | case 11:
465 | return s = e.sent, e.abrupt("break", 26);
466 | case 13:
467 | return e.next = 15, o.Decrypt(t.raw, n, "mp3");
468 | case 15:
469 | return s = e.sent, e.abrupt("break", 26);
470 | case 17:
471 | return e.next = 19, c.Decrypt(t.raw, n, r);
472 | case 19:
473 | return s = e.sent, e.abrupt("break", 26);
474 | case 21:
475 | return e.next = 23, i.Decrypt(t.raw, n);
476 | case 23:
477 | return s = e.sent, e.abrupt("break", 26);
478 | case 25:
479 | s = { status: !1, message: "不支持此文件格式" };
480 | case 26:
481 | return s.rawExt = r, s.rawFilename = n, e.abrupt("return", s);
482 | case 29:
483 | case "end":
484 | return e.stop()
485 | }
486 | }), e)
487 | }))), u.apply(this, arguments)
488 | }
489 | },
490 | bfa2: function(e, t, r) {
491 | var n = r("3d67"),
492 | a = ["CommonDecrypt"];
493 | e.exports = function() { var e = new Worker(r.p + "e495d03829e7f9f45920.worker.js", { name: "[hash].worker.js" }); return n(e, a), e }
494 | },
495 | dde9: function(e, t, r) {
496 | "use strict";
497 | r.r(t), r.d(t, "Decrypt", (function() { return u }));
498 | r("4160"), r("a15b"), r("d81d"), r("fb6a"), r("ace4"), r("d3b7"), r("ac1f"), r("25f0"), r("3ca3"), r("5319"), r("5cc6"), r("9a8c"), r("a975"), r("735e"), r("c1ac"), r("d139"), r("3a7b"), r("d5d6"), r("82f8"), r("e91f"), r("60bd"), r("5f96"), r("3280"), r("3fcc"), r("ca91"), r("25a1"), r("cd26"), r("3c5d"), r("2954"), r("649e"), r("219c"), r("170b"), r("b39a"), r("72f7"), r("159b"), r("ddb0"), r("2b3d"), r("96cf");
499 | var n = r("1da1"),
500 | a = r("06dc"),
501 | c = r("3452"),
502 | o = r("7907"),
503 | i = c.enc.Hex.parse("687a4852416d736f356b496e62617857"),
504 | s = c.enc.Hex.parse("2331346C6A6B5F215C5D2630553C2728");
505 |
506 | function u(e) { return l.apply(this, arguments) }
507 |
508 | function l() {
509 | return l = Object(n["a"])(regeneratorRuntime.mark((function e(t) {
510 | var r, n, c, o, i, s, u, l, d, b, g, w;
511 | return regeneratorRuntime.wrap((function(e) {
512 | while (1) switch (e.prev = e.next) {
513 | case 0:
514 | return e.next = 2, Object(a["d"])(t);
515 | case 2:
516 | if (r = e.sent, n = new DataView(r), 1313166403 === n.getUint32(0, !0) && 1296122950 === n.getUint32(4, !0)) { e.next = 6; break }
517 | return e.abrupt("return", { status: !1, message: "此ncm文件已损坏" });
518 | case 6:
519 | for (c = p(n, r, 10), o = m(c.data), i = h(n, r, c.offset), s = i.data, u = i.offset + n.getUint32(i.offset + 5, !0) + 13, l = new Uint8Array(r, u), d = 0; d < l.length; ++d) l[d] ^= o[255 & d];
520 | if (void 0 === s.format && (s.format = Object(a["b"])(l, "mp3")), b = a["a"][s.format], g = [], s.artist.forEach((function(e) { return g.push(e[0]) })), "mp3" !== s.format) { e.next = 21; break }
521 | return e.next = 20, f(l, g, s.musicName, s.album, s.albumPic);
522 | case 20:
523 | l = e.sent;
524 | case 21:
525 | return w = new Blob([l], { type: b }), e.abrupt("return", { status: !0, title: s.musicName, artist: g.join(" & "), ext: s.format, album: s.album, picture: s.albumPic, file: URL.createObjectURL(w), mime: b });
526 | case 23:
527 | case "end":
528 | return e.stop()
529 | }
530 | }), e)
531 | }))), l.apply(this, arguments)
532 | }
533 |
534 | function f(e, t, r, n, a) { return d.apply(this, arguments) }
535 |
536 | function d() {
537 | return d = Object(n["a"])(regeneratorRuntime.mark((function e(t, r, n, a, c) {
538 | var i, s;
539 | return regeneratorRuntime.wrap((function(e) {
540 | while (1) switch (e.prev = e.next) {
541 | case 0:
542 | if (i = new o(t), i.setFrame("TPE1", r).setFrame("TIT2", n).setFrame("TALB", a), "" === c) { e.next = 15; break }
543 | return e.prev = 3, e.next = 6, fetch(c);
544 | case 6:
545 | return e.next = 8, e.sent.arrayBuffer();
546 | case 8:
547 | s = e.sent, i.setFrame("APIC", { type: 3, data: s, description: "Cover" }), e.next = 15;
548 | break;
549 | case 12:
550 | e.prev = 12, e.t0 = e["catch"](3), console.log("Fail to write cover image!");
551 | case 15:
552 | return i.addTag(), e.abrupt("return", i.arrayBuffer);
553 | case 17:
554 | case "end":
555 | return e.stop()
556 | }
557 | }), e, null, [
558 | [3, 12]
559 | ])
560 | }))), d.apply(this, arguments)
561 | }
562 |
563 | function p(e, t, r) {
564 | var n = e.getUint32(r, !0);
565 | r += 4;
566 | var a = new Uint8Array(t, r, n).map((function(e) { return 100 ^ e }));
567 | r += n;
568 | for (var o = c.AES.decrypt({ ciphertext: c.lib.WordArray.create(a) }, i, { mode: c.mode.ECB, padding: c.pad.Pkcs7 }), s = new Uint8Array(o.sigBytes), u = o.words, l = o.sigBytes, f = 0; f < l; f++) s[f] = u[f >>> 2] >>> 24 - f % 4 * 8 & 255;
569 | return { offset: r, data: s.slice(17) }
570 | }
571 |
572 | function m(e) {
573 | for (var t = new Uint8Array(Array(256).keys()), r = e.length, n = 0, a = 0; a < 256; a++) {
574 | n = t[a] + n + e[a % r] & 255;
575 | var c = [t[n], t[a]];
576 | t[a] = c[0], t[n] = c[1]
577 | }
578 | return t.map((function(e, t, r) {
579 | t = t + 1 & 255;
580 | var n = r[t],
581 | a = r[t + n & 255];
582 | return r[n + a & 255]
583 | }))
584 | }
585 |
586 | function h(e, t, r) {
587 | var n = e.getUint32(r, !0);
588 | if (r += 4, 0 === n) return {};
589 | var a = new Uint8Array(t, r, n).map((function(e) { return 99 ^ e }));
590 | r += n;
591 | var o = c.AES.decrypt({ ciphertext: c.enc.Base64.parse(c.lib.WordArray.create(a.slice(22)).toString(c.enc.Utf8)) }, s, { mode: c.mode.ECB, padding: c.pad.Pkcs7 }),
592 | i = JSON.parse(o.toString(c.enc.Utf8).slice(6));
593 | return i.albumPic = i.albumPic.replace("http:", "https:"), { data: i, offset: r }
594 | }
595 | },
596 | fd2f: function(e, t, r) {
597 | "use strict";
598 | r.r(t), r.d(t, "Decrypt", (function() { return o }));
599 | r("ace4"), r("d3b7"), r("3ca3"), r("5cc6"), r("9a8c"), r("a975"), r("735e"), r("c1ac"), r("d139"), r("3a7b"), r("d5d6"), r("82f8"), r("e91f"), r("60bd"), r("5f96"), r("3280"), r("3fcc"), r("ca91"), r("25a1"), r("cd26"), r("3c5d"), r("2954"), r("649e"), r("219c"), r("170b"), r("b39a"), r("72f7"), r("ddb0"), r("2b3d"), r("96cf");
600 | var n = r("1da1"),
601 | a = r("06dc"),
602 | c = r("cb96");
603 |
604 | function o(e, t, r) { return i.apply(this, arguments) }
605 |
606 | function i() {
607 | return i = Object(n["a"])(regeneratorRuntime.mark((function e(t, r, n) {
608 | var o, i, s, u, l, f = arguments;
609 | return regeneratorRuntime.wrap((function(e) {
610 | while (1) switch (e.prev = e.next) {
611 | case 0:
612 | if (o = !(f.length > 3 && void 0 !== f[3]) || f[3], i = n, !o) { e.next = 10; break }
613 | return e.t0 = Uint8Array, e.next = 6, Object(a["d"])(t);
614 | case 6:
615 | e.t1 = e.sent, s = new e.t0(e.t1), i = Object(a["b"])(s, n), i !== n && (t = new Blob([s], { type: a["a"][i] }));
616 | case 10:
617 | return e.next = 12, c.parseBlob(t);
618 | case 12:
619 | return u = e.sent, l = Object(a["f"])(u.common.artist, u.common.title, r), e.abrupt("return", { status: !0, title: l.title, artist: l.artist, ext: i, album: u.common.album, picture: Object(a["e"])(u), file: URL.createObjectURL(t), mime: a["a"][i] });
620 | case 15:
621 | case "end":
622 | return e.stop()
623 | }
624 | }), e)
625 | }))), i.apply(this, arguments)
626 | }
627 | }
628 | });
629 | //# sourceMappingURL=app.7646e312.js.map
--------------------------------------------------------------------------------
/js/app.7646e312.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/App.vue?9b05","webpack:///./src/decrypt/util.js","webpack:///./src/App.vue?e5d3","webpack:///./src/component/upload.vue?efac","webpack:///src/component/upload.vue","webpack:///./src/component/upload.vue?6c85","webpack:///./src/component/upload.vue","webpack:///./src/component/preview.vue?812f","webpack:///./src/component/util.js","webpack:///src/component/preview.vue","webpack:///./src/component/preview.vue?3643","webpack:///./src/component/preview.vue","webpack:///src/App.vue","webpack:///./src/App.vue?7a5c","webpack:///./src/App.vue","webpack:///./src/registerServiceWorker.js","webpack:///./src/main.js","webpack:///./src/decrypt/tm.js","webpack:///./src/component/upload.vue?1162","webpack:///./src/decrypt/qmcMask.js","webpack:///./src/decrypt/qmc.js","webpack:///./src/decrypt/common.js","webpack:///./src/decrypt/common.js?00cc","webpack:///./src/decrypt/ncm.js","webpack:///./src/decrypt/raw.js"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","window","oldJsonpFunction","slice","FLAC_HEADER","MP3_HEADER","OGG_HEADER","M4A_HEADER","AudioMimeType","mp3","flac","m4a","ogg","GetArrayBuffer","blobObject","Promise","resolve","reader","FileReader","onload","e","target","readAsArrayBuffer","GetFileInfo","artist","title","filenameNoExt","newArtist","newTitle","filenameArray","split","trim","GetCoverURL","metadata","pic_url","undefined","common","picture","pic","Blob","type","format","URL","createObjectURL","IsBytesEqual","first","second","every","val","idx","DetectAudioExt","fallbackExt","_vm","this","_h","$createElement","_c","_self","attrs","on","showSuccess","showFail","staticStyle","_v","model","callback","$$v","download_format","expression","instant_download","handleDownloadAll","handleDeleteAll","playing_auto","playing_url","tableData","changePlaying","staticRenderFns","handleFile","staticClass","slot","component","scopedSlots","_u","fn","scope","row","_s","album","$event","handlePlay","$index","handleDownload","handleDelete","DownloadBlobMusic","a","document","createElement","href","file","download","ext","body","append","click","remove","RemoveBlobMusic","revokeObjectURL","register","process","ready","console","log","registered","cached","updatefound","updated","offline","error","Vue","use","$notify","config","productionTip","render","h","App","$mount","TM_HEADER","Decrypt","raw_filename","fileBuffer","audioData","Uint8Array","cur","musicData","RawDecrypt","QMOggConstHeader","QMOggConstHeaderConfidence","QMCDefaultMaskMatrix","QMCDefaultMaskSuperA","QMCDefaultMaskSuperB","QmcMask","matrix","superA","superB","Matrix128","generateMask58from128","Matrix58","Super58A","Super58B","generateMask128from58","matrix128","rowIdx","concat","reverse","matrix58","lenStart","lenRightStart","rowLeft","rowRight","dst","index","maskIdx","QmcMaskGetDefault","QmcMaskDetectMflac","mask","search_len","Math","min","block_idx","QmcMaskDetectMgg","input","matrixConfidence","idx128","idx58","GetMask58Index","confidence","getMaskConfidenceResult","QmcMaskCreate58","conf","parseInt","col","musicMetadata","require","HandlerMap","handler","detect","raw_ext","status","message","fileData","seed","keyData","queryKeyInfo","dec","mime","parseBlob","tag","info","reportKeyUsage","maskData","filename","fetch","method","headers","JSON","stringify","Mask","Array","from","Key","Artist","Title","Album","Filename","Format","then","catch","resp","json","NcmDecrypt","QmcDecrypt","TmDecrypt","CommonDecrypt","substring","lastIndexOf","toLowerCase","raw","rt_data","rawExt","rawFilename","addMethods","methods","w","Worker","CryptoJS","ID3Writer","CORE_KEY","enc","Hex","parse","META_KEY","dataView","DataView","getUint32","keyDataObj","getKeyData","keyBox","getKeyBox","musicMetaObj","getMetaData","offset","musicMeta","audioOffset","artists","forEach","arr","writeID3","musicName","albumPic","join","artistList","writer","setFrame","arrayBuffer","img","description","addTag","keyLen","cipherText","map","uint8","plainText","AES","decrypt","ciphertext","lib","WordArray","ECB","padding","pad","Pkcs7","sigBytes","words","box","keys","keyDataLen","_","si","sj","metaDataLen","Base64","toString","Utf8","replace","buffer"],"mappings":"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","file":"js/app.7646e312.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"app\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([0,\"chunk-vendors\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","import mod from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=style&index=0&lang=css&\"; export default mod; export * from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=style&index=0&lang=css&\"","export const FLAC_HEADER = [0x66, 0x4C, 0x61, 0x43];\nexport const MP3_HEADER = [0x49, 0x44, 0x33];\nexport const OGG_HEADER = [0x4F, 0x67, 0x67, 0x53];\nexport const M4A_HEADER = [0x66, 0x74, 0x79, 0x70];\nexport const AudioMimeType = {\n mp3: \"audio/mpeg\",\n flac: \"audio/flac\",\n m4a: \"audio/mp4\",\n ogg: \"audio/ogg\"\n};\n\n// Also a new draft API: blob.arrayBuffer()\nexport async function GetArrayBuffer(blobObject) {\n return await new Promise(resolve => {\n const reader = new FileReader();\n reader.onload = (e) => {\n resolve(e.target.result);\n };\n reader.readAsArrayBuffer(blobObject);\n });\n}\n\nexport function GetFileInfo(artist, title, filenameNoExt) {\n let newArtist = \"\", newTitle = \"\";\n let filenameArray = filenameNoExt.split(\"-\");\n if (filenameArray.length > 1) {\n newArtist = filenameArray[0].trim();\n newTitle = filenameArray[1].trim();\n } else if (filenameArray.length === 1) {\n newTitle = filenameArray[0].trim();\n }\n\n if (typeof artist == \"string\" && artist !== \"\") newArtist = artist;\n if (typeof title == \"string\" && title !== \"\") newTitle = title;\n return {artist: newArtist, title: newTitle};\n}\n\n/**\n * @return {string}\n */\nexport function GetCoverURL(metadata) {\n let pic_url = \"\";\n if (metadata.common.picture !== undefined && metadata.common.picture.length > 0) {\n let pic = new Blob([metadata.common.picture[0].data], {type: metadata.common.picture[0].format});\n pic_url = URL.createObjectURL(pic);\n }\n return pic_url;\n}\n\nexport function IsBytesEqual(first, second) {\n // if want wholly check, should length first>=second\n return first.every((val, idx) => {\n return val === second[idx];\n })\n}\n\n/**\n * @return {string}\n */\nexport function DetectAudioExt(data, fallbackExt) {\n if (IsBytesEqual(MP3_HEADER, data.slice(0, MP3_HEADER.length))) return \"mp3\";\n if (IsBytesEqual(FLAC_HEADER, data.slice(0, FLAC_HEADER.length))) return \"flac\";\n if (IsBytesEqual(OGG_HEADER, data.slice(0, OGG_HEADER.length))) return \"ogg\";\n if (IsBytesEqual(M4A_HEADER, data.slice(4, 8))) return \"m4a\";\n return fallbackExt;\n}\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-container',{attrs:{\"id\":\"app\"}},[_c('el-main',[_c('x-upload',{on:{\"handle_finish\":_vm.showSuccess,\"handle_error\":_vm.showFail}}),_c('el-row',{attrs:{\"id\":\"app-control\"}},[_c('el-row',{staticStyle:{\"padding-bottom\":\"1em\",\"font-size\":\"14px\"}},[_vm._v(\" 歌曲命名格式: \"),_c('el-radio',{attrs:{\"name\":\"format\",\"label\":\"1\"},model:{value:(_vm.download_format),callback:function ($$v) {_vm.download_format=$$v},expression:\"download_format\"}},[_vm._v(\"歌曲名\")]),_c('el-radio',{attrs:{\"name\":\"format\",\"label\":\"2\"},model:{value:(_vm.download_format),callback:function ($$v) {_vm.download_format=$$v},expression:\"download_format\"}},[_vm._v(\"歌手-歌曲名\")]),_c('el-radio',{attrs:{\"name\":\"format\",\"label\":\"3\"},model:{value:(_vm.download_format),callback:function ($$v) {_vm.download_format=$$v},expression:\"download_format\"}},[_vm._v(\"歌曲名-歌手\")]),_c('el-checkbox',{attrs:{\"border\":\"\"},model:{value:(_vm.instant_download),callback:function ($$v) {_vm.instant_download=$$v},expression:\"instant_download\"}},[_vm._v(\"立即保存\")])],1),_c('el-button',{attrs:{\"icon\":\"el-icon-download\",\"plain\":\"\"},on:{\"click\":_vm.handleDownloadAll}},[_vm._v(\"下载全部\")]),_c('el-button',{attrs:{\"icon\":\"el-icon-delete\",\"plain\":\"\",\"type\":\"danger\"},on:{\"click\":_vm.handleDeleteAll}},[_vm._v(\"删除全部\")])],1),_c('audio',{attrs:{\"autoplay\":_vm.playing_auto,\"src\":_vm.playing_url,\"controls\":\"\"}}),_c('x-preview',{attrs:{\"table-data\":_vm.tableData,\"download_format\":_vm.download_format},on:{\"music_changed\":_vm.changePlaying}})],1),_c('el-footer',{attrs:{\"id\":\"app-footer\"}},[_c('el-row',[_vm._v(\" 音乐解锁:移除已购音乐的加密保护。 目前支持网易云音乐(ncm)、QQ音乐(qmc, mflac, tkm)以及 \"),_c('a',{attrs:{\"href\":\"https://github.com/ix64/unlock-music/blob/master/README.md\",\"target\":\"_blank\"}},[_vm._v(\"其他格式\")]),_vm._v(\"。 \"),_c('a',{attrs:{\"href\":\"https://github.com/ix64/unlock-music/wiki/使用提示\",\"target\":\"_blank\"}},[_vm._v(\"使用提示\")])]),_c('el-row',[_c('span',[_vm._v(\"Copyright © 2019\")]),_c('a',{attrs:{\"href\":\"https://github.com/ix64\",\"target\":\"_blank\"}},[_vm._v(\"MengYX\")]),_vm._v(\" 音乐解锁使用 \"),_c('a',{attrs:{\"href\":\"https://github.com/ix64/unlock-music/blob/master/LICENSE\",\"target\":\"_blank\"}},[_vm._v(\"MIT许可协议\")]),_vm._v(\" 开放 \"),_c('a',{attrs:{\"href\":\"https://github.com/ix64/unlock-music\",\"target\":\"_blank\"}},[_vm._v(\"源代码\")])])],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-upload',{attrs:{\"auto-upload\":false,\"on-change\":_vm.handleFile,\"show-file-list\":false,\"action\":\"\",\"drag\":\"\",\"multiple\":\"\"}},[_c('i',{staticClass:\"el-icon-upload\"}),_c('div',{staticClass:\"el-upload__text\"},[_vm._v(\"将文件拖到此处,或\"),_c('em',[_vm._v(\"点击选择\")])]),_c('div',{staticClass:\"el-upload__tip\",attrs:{\"slot\":\"tip\"},slot:\"tip\"},[_vm._v(\"本工具仅在浏览器内对文件进行解锁,无需消耗流量\")])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n \n \n 将文件拖到此处,或点击选择
\n 本工具仅在浏览器内对文件进行解锁,无需消耗流量
\n \n\n\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./upload.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./upload.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./upload.vue?vue&type=template&id=36dd009c&scoped=true&\"\nimport script from \"./upload.vue?vue&type=script&lang=js&\"\nexport * from \"./upload.vue?vue&type=script&lang=js&\"\nimport style0 from \"./upload.vue?vue&type=style&index=0&id=36dd009c&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"36dd009c\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-table',{staticStyle:{\"width\":\"100%\"},attrs:{\"data\":_vm.tableData}},[_c('el-table-column',{attrs:{\"label\":\"封面\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('el-image',{staticStyle:{\"width\":\"100px\",\"height\":\"100px\"},attrs:{\"src\":scope.row.picture}},[_c('div',{staticClass:\"image-slot el-image__error\",attrs:{\"slot\":\"error\"},slot:\"error\"},[_vm._v(\" 暂无封面 \")])])]}}])}),_c('el-table-column',{attrs:{\"label\":\"歌曲\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('span',{staticStyle:{\"margin-left\":\"10px\"}},[_vm._v(_vm._s(scope.row.title))])]}}])}),_c('el-table-column',{attrs:{\"label\":\"歌手\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('p',[_vm._v(_vm._s(scope.row.artist))])]}}])}),_c('el-table-column',{attrs:{\"label\":\"专辑\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('p',[_vm._v(_vm._s(scope.row.album))])]}}])}),_c('el-table-column',{attrs:{\"label\":\"操作\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('el-button',{attrs:{\"circle\":\"\",\"icon\":\"el-icon-video-play\",\"type\":\"success\"},on:{\"click\":function($event){return _vm.handlePlay(scope.$index, scope.row)}}}),_c('el-button',{attrs:{\"circle\":\"\",\"icon\":\"el-icon-download\"},on:{\"click\":function($event){return _vm.handleDownload(scope.row)}}}),_c('el-button',{attrs:{\"circle\":\"\",\"icon\":\"el-icon-delete\",\"type\":\"danger\"},on:{\"click\":function($event){return _vm.handleDelete(scope.$index, scope.row)}}})]}}])})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","export function DownloadBlobMusic(data, format) {\n const a = document.createElement('a');\n a.href = data.file;\n switch (format) {\n case \"1\":\n a.download = data.title + \".\" + data.ext;\n break;\n default:\n case \"2\":\n a.download = data.artist + \" - \" + data.title + \".\" + data.ext;\n break;\n case \"3\":\n a.download = data.title + \" - \" + data.artist + \".\" + data.ext;\n break;\n }\n document.body.append(a);\n a.click();\n a.remove();\n}\n\nexport function RemoveBlobMusic(data) {\n URL.revokeObjectURL(data.file);\n URL.revokeObjectURL(data.picture);\n}\n","\n \n\n \n \n \n \n 暂无封面\n
\n \n \n \n \n \n {{ scope.row.title }}\n \n \n \n \n {{ scope.row.artist }}
\n \n \n \n \n {{ scope.row.album }}
\n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./preview.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./preview.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./preview.vue?vue&type=template&id=6856848d&scoped=true&\"\nimport script from \"./preview.vue?vue&type=script&lang=js&\"\nexport * from \"./preview.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"6856848d\",\n null\n \n)\n\nexport default component.exports","\n\n \n \n \n\n \n \n 歌曲命名格式:\n 歌曲名\n 歌手-歌曲名\n 歌曲名-歌手\n 立即保存\n \n 下载全部\n 删除全部\n \n \n\n \n\n \n \n \n\n\n\n\n\n\n","import mod from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=4d42a0d0&\"\nimport script from \"./App.vue?vue&type=script&lang=js&\"\nexport * from \"./App.vue?vue&type=script&lang=js&\"\nimport style0 from \"./App.vue?vue&type=style&index=0&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","/* eslint-disable no-console */\n\nimport {register} from 'register-service-worker'\n\nif (process.env.NODE_ENV === 'production') {\n register(`${process.env.BASE_URL}service-worker.js`, {\n ready() {\n console.log(\n 'App is being served from cache by a service worker.\\n' +\n 'For more details, visit https://goo.gl/AFskqB'\n )\n },\n registered() {\n console.log('Service worker has been registered.')\n },\n cached() {\n console.log('Content has been cached for offline use.')\n },\n updatefound() {\n console.log('New content is downloading.')\n },\n updated() {\n console.log('New content is available; please refresh.')\n },\n offline() {\n console.log('No internet connection found. App is running in offline mode.')\n },\n error(error) {\n console.error('Error during service worker registration:', error)\n }\n })\n}\n","import Vue from 'vue'\nimport App from './App.vue'\nimport './registerServiceWorker'\nimport {\n Button, Col, Container, Footer, Icon, Image, Link, Main,\n Row, Table, TableColumn, Upload, Radio, Checkbox,\n Notification,\n} from 'element-ui';\nimport 'element-ui/lib/theme-chalk/index.css'\n\nVue.use(Link);\nVue.use(Image);\nVue.use(Button);\nVue.use(Table);\nVue.use(TableColumn);\nVue.use(Main);\nVue.use(Footer);\nVue.use(Container);\nVue.use(Icon);\nVue.use(Row);\nVue.use(Col);\nVue.use(Upload);\nVue.use(Checkbox);\nVue.use(Radio);\nVue.prototype.$notify = Notification;\n\nVue.config.productionTip = false;\n\nnew Vue({\n render: h => h(App),\n}).$mount('#app');\n","import {Decrypt as RawDecrypt} from \"./raw\";\nimport {GetArrayBuffer} from \"./util\";\n\nconst TM_HEADER = [0x00, 0x00, 0x00, 0x20, 0x66, 0x74, 0x79, 0x70];\n\nexport async function Decrypt(file, raw_filename) {\n const fileBuffer = await GetArrayBuffer(file);\n const audioData = new Uint8Array(fileBuffer);\n for (let cur = 0; cur < 8; ++cur) {\n audioData[cur] = TM_HEADER[cur];\n }\n const musicData = new Blob([audioData], {type: \"audio/mp4\"});\n return await RawDecrypt(musicData, raw_filename, \"m4a\", false)\n}\n","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./upload.vue?vue&type=style&index=0&id=36dd009c&scoped=true&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./upload.vue?vue&type=style&index=0&id=36dd009c&scoped=true&lang=css&\"","import {FLAC_HEADER, IsBytesEqual} from \"./util\"\n\nconst QMOggConstHeader = [\n 0x4F, 0x67, 0x67, 0x53, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1E, 0x01, 0x76, 0x6F, 0x72,\n 0x62, 0x69, 0x73, 0x00, 0x00, 0x00, 0x00, 0x02, 0x44, 0xAC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0xEE, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB8, 0x01, 0x4F, 0x67, 0x67, 0x53, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,\n 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x03, 0x76, 0x6F, 0x72, 0x62, 0x69, 0x73, 0x2C, 0x00, 0x00, 0x00,\n 0x58, 0x69, 0x70, 0x68, 0x2E, 0x4F, 0x72, 0x67, 0x20, 0x6C, 0x69, 0x62, 0x56, 0x6F, 0x72, 0x62,\n 0x69, 0x73, 0x20, 0x49, 0x20, 0x32, 0x30, 0x31, 0x35, 0x30, 0x31, 0x30, 0x35, 0x20, 0x28, 0xE2,\n 0x9B, 0x84, 0xE2, 0x9B, 0x84, 0xE2, 0x9B, 0x84, 0xE2, 0x9B, 0x84, 0x29, 0x00, 0x00, 0x00, 0x00,\n 0x00, 0x00, 0x00, 0x00, 0x54, 0x49, 0x54, 0x4C, 0x45, 0x3D];\nconst QMOggConstHeaderConfidence = [\n 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0,\n 0, 0, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9,\n 9, 9, 9, 9, 9, 9, 9, 6, 3, 3, 3, 3, 6, 6, 6, 6,\n 3, 3, 3, 3, 6, 6, 6, 6, 6, 9, 9, 9, 9, 9, 9, 9,\n 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 9, 9, 9, 9,\n 0, 0, 0, 0, 6, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n 3, 3, 3, 3, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,\n 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,\n 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,\n 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 1, 9, 9,\n 0, 1, 9, 9, 9, 9, 9, 9, 9, 9];\nconst QMCDefaultMaskMatrix = [\n 0x4A, 0xD6, 0xCA, 0x90, 0x67, 0xF7, 0x52, 0x5E,\n 0x95, 0x23, 0x9F, 0x13, 0x11, 0x7E, 0x47, 0x74,\n 0x3D, 0x90, 0xAA, 0x3F, 0x51, 0xC6, 0x09, 0xD5,\n 0x9F, 0xFA, 0x66, 0xF9, 0xF3, 0xD6, 0xA1, 0x90,\n 0xA0, 0xF7, 0xF0, 0x1D, 0x95, 0xDE, 0x9F, 0x84,\n 0x11, 0xF4, 0x0E, 0x74, 0xBB, 0x90, 0xBC, 0x3F,\n 0x92, 0x00, 0x09, 0x5B, 0x9F, 0x62, 0x66, 0xA1];\nconst QMCDefaultMaskSuperA = 0xC3;\nconst QMCDefaultMaskSuperB = 0xD8;\n\nclass QmcMask {\n constructor(matrix, superA, superB) {\n if (superA === undefined || superB === undefined) {\n this.Matrix128 = matrix;\n this.generateMask58from128()\n } else {\n this.Matrix58 = matrix;\n this.Super58A = superA;\n this.Super58B = superB;\n this.generateMask128from58();\n }\n }\n\n generateMask128from58() {\n if (this.Matrix58.length !== 56) throw \"incorrect mask58 matrix length\";\n\n let matrix128 = [];\n for (let rowIdx = 0; rowIdx < 8; rowIdx += 1) {\n matrix128 = matrix128.concat(\n [this.Super58A],\n this.Matrix58.slice(7 * rowIdx, 7 * rowIdx + 7),\n [this.Super58B],\n this.Matrix58.slice(56 - 7 - 7 * rowIdx, 56 - 7 * rowIdx).reverse()\n );\n }\n this.Matrix128 = matrix128;\n }\n\n generateMask58from128() {\n if (this.Matrix128.length !== 128) throw \"incorrect mask128 length\";\n\n const superA = this.Matrix128[0], superB = this.Matrix128[8];\n let matrix58 = [];\n\n for (let rowIdx = 0; rowIdx < 8; rowIdx += 1) {\n let lenStart = 16 * rowIdx;\n let lenRightStart = 120 - lenStart;\n if (this.Matrix128[lenStart] !== superA || this.Matrix128[lenStart + 8] !== superB) {\n throw \"decode mask-128 to mask-58 failed\"\n }\n let rowLeft = this.Matrix128.slice(lenStart + 1, lenStart + 8);\n let rowRight = this.Matrix128.slice(lenRightStart + 1, lenRightStart + 8).reverse();\n if (IsBytesEqual(rowLeft, rowRight)) {\n matrix58 = matrix58.concat(rowLeft);\n } else {\n throw \"decode mask-128 to mask-58 failed\"\n }\n }\n this.Matrix58 = matrix58;\n this.Super58A = superA;\n this.Super58B = superB;\n }\n\n Decrypt(data) {\n let dst = data.slice(0);\n let index = -1;\n let maskIdx = -1;\n for (let cur = 0; cur < data.length; cur++) {\n index++;\n maskIdx++;\n if (index === 0x8000 || (index > 0x8000 && (index + 1) % 0x8000 === 0)) {\n index++;\n maskIdx++;\n }\n if (maskIdx >= 128) maskIdx -= 128;\n dst[cur] ^= this.Matrix128[maskIdx];\n }\n return dst;\n }\n}\n\nexport function QmcMaskGetDefault() {\n return new QmcMask(QMCDefaultMaskMatrix, QMCDefaultMaskSuperA, QMCDefaultMaskSuperB)\n}\n\nexport function QmcMaskDetectMflac(data) {\n let search_len = Math.min(0x8000, data.length), mask;\n for (let block_idx = 0; block_idx < search_len; block_idx += 128) {\n try {\n mask = new QmcMask(data.slice(block_idx, block_idx + 128));\n if (IsBytesEqual(FLAC_HEADER, mask.Decrypt(data.slice(0, FLAC_HEADER.length)))) break;\n } catch (e) {\n }\n }\n return mask\n}\n\nexport function QmcMaskDetectMgg(input) {\n if (input.length < QMOggConstHeader.length) return;\n let matrixConfidence = {};\n for (let i = 0; i < 58; i++) matrixConfidence[i] = {};\n\n for (let idx128 = 0; idx128 < QMOggConstHeader.length; idx128++) {\n if (QMOggConstHeaderConfidence[idx128] === 0) continue;\n let idx58 = GetMask58Index(idx128);\n let mask = input[idx128] ^ QMOggConstHeader[idx128];\n let confidence = QMOggConstHeaderConfidence[idx128];\n if (mask in matrixConfidence[idx58]) {\n matrixConfidence[idx58][mask] += confidence\n } else {\n matrixConfidence[idx58][mask] = confidence\n }\n }\n let matrix = [], superA, superB;\n try {\n for (let i = 0; i < 56; i++) matrix[i] = getMaskConfidenceResult(matrixConfidence[i]);\n superA = getMaskConfidenceResult(matrixConfidence[56]);\n superB = getMaskConfidenceResult(matrixConfidence[57]);\n } catch (e) {\n return;\n }\n return new QmcMask(matrix, superA, superB);\n}\n\nexport function QmcMaskCreate128(mask128) {\n return new QmcMask(mask128)\n}\n\nexport function QmcMaskCreate58(matrix, superA, superB) {\n return new QmcMask(matrix, superA, superB)\n}\n\n/**\n * @param confidence {{}}\n * @returns {number}\n */\nfunction getMaskConfidenceResult(confidence) {\n if (confidence.length === 0) throw \"can not match at least one key\";\n let result, conf = 0;\n for (let idx in confidence) {\n if (confidence[idx] > conf) {\n result = idx;\n conf = confidence[idx];\n }\n }\n return parseInt(result)\n}\n\n/**\n * @return {number}\n */\nfunction GetMask58Index(idx128) {\n if (idx128 > 127) idx128 = idx128 % 128;\n let col = idx128 % 16;\n let row = (idx128 - col) / 16;\n switch (col) {\n case 0://Super 1\n row = 8;\n col = 0;\n break;\n case 8://Super 2\n row = 8;\n col = 1;\n break;\n default:\n if (col > 7) {\n row = 7 - row;\n col = 15 - col;\n } else {\n col -= 1;\n }\n break;\n }\n return row * 7 + col\n}\n","import {AudioMimeType, DetectAudioExt, GetArrayBuffer, GetCoverURL, GetFileInfo} from \"./util\";\nimport {QmcMaskCreate58, QmcMaskGetDefault, QmcMaskDetectMgg, QmcMaskDetectMflac} from \"./qmcMask\";\n\nconst musicMetadata = require(\"music-metadata-browser\");\n\nconst HandlerMap = {\n \"mgg\": {handler: QmcMaskDetectMgg, ext: \"ogg\", detect: true},\n \"mflac\": {handler: QmcMaskDetectMflac, ext: \"flac\", detect: true},\n \"qmc0\": {handler: QmcMaskGetDefault, ext: \"mp3\", detect: false},\n \"qmc3\": {handler: QmcMaskGetDefault, ext: \"mp3\", detect: false},\n \"qmcogg\": {handler: QmcMaskGetDefault, ext: \"ogg\", detect: false},\n \"qmcflac\": {handler: QmcMaskGetDefault, ext: \"flac\", detect: false},\n \"bkcmp3\": {handler: QmcMaskGetDefault, ext: \"mp3\", detect: false},\n \"bkcflac\": {handler: QmcMaskGetDefault, ext: \"flac\", detect: false},\n \"tkm\": {handler: QmcMaskGetDefault, ext: \"m4a\", detect: false}\n};\n\nexport async function Decrypt(file, raw_filename, raw_ext) {\n if (!(raw_ext in HandlerMap)) return {status: false, message: \"File type is incorrect!\"};\n const handler = HandlerMap[raw_ext];\n\n const fileData = new Uint8Array(await GetArrayBuffer(file));\n let audioData, seed, keyData;\n if (handler.detect) {\n audioData = fileData.slice(0, -0x170);\n seed = handler.handler(audioData);\n keyData = fileData.slice(-0x170);\n if (seed === undefined) seed = await queryKeyInfo(keyData, raw_filename, raw_ext);\n if (seed === undefined) return {status: false, message: raw_ext + \"格式仅提供实验性支持!\"};\n } else {\n audioData = fileData;\n seed = handler.handler(audioData);\n }\n const dec = seed.Decrypt(audioData);\n\n const ext = DetectAudioExt(dec, handler.ext);\n const mime = AudioMimeType[ext];\n\n const musicData = new Blob([dec], {type: mime});\n\n const tag = await musicMetadata.parseBlob(musicData);\n const info = GetFileInfo(tag.common.artist, tag.common.title, raw_filename);\n if (handler.detect) reportKeyUsage(keyData, seed.Matrix128,\n info.artist, info.title, tag.common.album, raw_filename, raw_ext);\n return {\n status: true,\n title: info.title,\n artist: info.artist,\n ext: ext,\n album: tag.common.album,\n picture: GetCoverURL(tag),\n file: URL.createObjectURL(musicData),\n mime: mime\n }\n}\n\nfunction reportKeyUsage(keyData, maskData, artist, title, album, filename, format) {\n fetch(\"https://stats.ixarea.com/collect/qmcmask/usage\", {\n method: \"POST\",\n headers: {\"Content-Type\": \"application/json\"},\n body: JSON.stringify({\n Mask: Array.from(maskData), Key: Array.from(keyData),\n Artist: artist, Title: title, Album: album, Filename: filename, Format: format\n }),\n }).then().catch()\n}\n\nasync function queryKeyInfo(keyData, filename, format) {\n try {\n const resp = await fetch(\"https://stats.ixarea.com/collect/qmcmask/query\", {\n method: \"POST\",\n headers: {\"Content-Type\": \"application/json\"},\n body: JSON.stringify({Format: format, Key: Array.from(keyData), Filename: filename}),\n });\n let data = await resp.json();\n return QmcMaskCreate58(data.Matrix58, data.Super58A, data.Super58B);\n } catch (e) {\n }\n}\n","const NcmDecrypt = require(\"./ncm\");\nconst QmcDecrypt = require(\"./qmc\");\nconst RawDecrypt = require(\"./raw\");\nconst TmDecrypt = require(\"./tm\");\n\nexport async function CommonDecrypt(file) {\n let raw_ext = file.name.substring(file.name.lastIndexOf(\".\") + 1, file.name.length).toLowerCase();\n let raw_filename = file.name.substring(0, file.name.lastIndexOf(\".\"));\n let rt_data;\n switch (raw_ext) {\n case \"ncm\":// Netease Mp3/Flac\n rt_data = await NcmDecrypt.Decrypt(file.raw);\n break;\n case \"mp3\":// Raw Mp3\n case \"flac\"://Raw Flac\n case \"m4a\":// Raw M4a\n case \"ogg\":// Raw Ogg\n rt_data = await RawDecrypt.Decrypt(file.raw, raw_filename, raw_ext);\n break;\n case \"tm0\":// QQ Music IOS Mp3\n case \"tm3\":// QQ Music IOS Mp3\n rt_data = await RawDecrypt.Decrypt(file.raw, raw_filename, \"mp3\");\n break;\n case \"qmc3\"://QQ Music Android Mp3\n case \"qmc0\"://QQ Music Android Mp3\n case \"qmcflac\"://QQ Music Android Flac\n case \"qmcogg\"://QQ Music Android Ogg\n case \"tkm\"://QQ Music Accompaniment M4a\n case \"bkcmp3\"://Moo Music Mp3\n case \"bkcflac\"://Moo Music Flac\n case \"mflac\"://QQ Music Desktop Flac\n case \"mgg\": //QQ Music Desktop Ogg\n rt_data = await QmcDecrypt.Decrypt(file.raw, raw_filename, raw_ext);\n break;\n case \"tm2\":// QQ Music IOS M4a\n case \"tm6\":// QQ Music IOS M4a\n rt_data = await TmDecrypt.Decrypt(file.raw, raw_filename);\n break;\n default:\n rt_data = {status: false, message: \"不支持此文件格式\",}\n }\n\n rt_data.rawExt = raw_ext;\n rt_data.rawFilename = raw_filename;\n\n return rt_data;\n}\n","\n\t\t\t\tvar addMethods = require(\"../../node_modules/workerize-loader/dist/rpc-wrapper.js\")\n\t\t\t\tvar methods = [\"CommonDecrypt\"]\n\t\t\t\tmodule.exports = function() {\n\t\t\t\t\tvar w = new Worker(__webpack_public_path__ + \"e495d03829e7f9f45920.worker.js\", { name: \"[hash].worker.js\" })\n\t\t\t\t\taddMethods(w, methods)\n\t\t\t\t\t\n\t\t\t\t\treturn w\n\t\t\t\t}\n\t\t\t","const CryptoJS = require(\"crypto-js\");\nconst ID3Writer = require(\"browser-id3-writer\");\nconst CORE_KEY = CryptoJS.enc.Hex.parse(\"687a4852416d736f356b496e62617857\");\nconst META_KEY = CryptoJS.enc.Hex.parse(\"2331346C6A6B5F215C5D2630553C2728\");\nimport {AudioMimeType, DetectAudioExt, GetArrayBuffer} from \"./util\"\n\nexport async function Decrypt(file) {\n\n const fileBuffer = await GetArrayBuffer(file);\n const dataView = new DataView(fileBuffer);\n\n if (dataView.getUint32(0, true) !== 0x4e455443 ||\n dataView.getUint32(4, true) !== 0x4d414446)\n return {status: false, message: \"此ncm文件已损坏\"};\n\n\n const keyDataObj = getKeyData(dataView, fileBuffer, 10);\n const keyBox = getKeyBox(keyDataObj.data);\n\n const musicMetaObj = getMetaData(dataView, fileBuffer, keyDataObj.offset);\n const musicMeta = musicMetaObj.data;\n\n let audioOffset = musicMetaObj.offset + dataView.getUint32(musicMetaObj.offset + 5, true) + 13;\n let audioData = new Uint8Array(fileBuffer, audioOffset);\n\n for (let cur = 0; cur < audioData.length; ++cur) audioData[cur] ^= keyBox[cur & 0xff];\n\n if (musicMeta.format === undefined) musicMeta.format = DetectAudioExt(audioData, \"mp3\");\n\n const mime = AudioMimeType[musicMeta.format];\n\n const artists = [];\n musicMeta.artist.forEach(arr => artists.push(arr[0]));\n if (musicMeta.format === \"mp3\")\n audioData = await writeID3(audioData, artists, musicMeta.musicName, musicMeta.album, musicMeta.albumPic)\n\n const musicData = new Blob([audioData], {type: mime});\n return {\n status: true,\n title: musicMeta.musicName,\n artist: artists.join(\" & \"),\n ext: musicMeta.format,\n album: musicMeta.album,\n picture: musicMeta.albumPic,\n file: URL.createObjectURL(musicData),\n mime: mime\n };\n}\n\nasync function writeID3(audioData, artistList, title, album, picture) {\n const writer = new ID3Writer(audioData);\n writer.setFrame(\"TPE1\", artistList)\n .setFrame(\"TIT2\", title)\n .setFrame(\"TALB\", album);\n if (picture !== \"\") {\n try {\n const img = await (await fetch(picture)).arrayBuffer();\n writer.setFrame('APIC', {\n type: 3,\n data: img,\n description: 'Cover'\n })\n } catch (e) {\n console.log(\"Fail to write cover image!\");\n }\n }\n writer.addTag();\n return writer.arrayBuffer;\n}\n\nfunction getKeyData(dataView, fileBuffer, offset) {\n const keyLen = dataView.getUint32(offset, true);\n offset += 4;\n const cipherText = new Uint8Array(fileBuffer, offset, keyLen).map(\n uint8 => uint8 ^ 0x64\n );\n offset += keyLen;\n\n const plainText = CryptoJS.AES.decrypt(\n {ciphertext: CryptoJS.lib.WordArray.create(cipherText)},\n CORE_KEY,\n {\n mode: CryptoJS.mode.ECB,\n padding: CryptoJS.pad.Pkcs7\n }\n );\n\n const result = new Uint8Array(plainText.sigBytes);\n\n const words = plainText.words;\n const sigBytes = plainText.sigBytes;\n for (let i = 0; i < sigBytes; i++) {\n result[i] = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n }\n\n return {offset: offset, data: result.slice(17)};\n}\n\nfunction getKeyBox(keyData) {\n const box = new Uint8Array(Array(256).keys());\n\n const keyDataLen = keyData.length;\n\n let j = 0;\n\n for (let i = 0; i < 256; i++) {\n j = (box[i] + j + keyData[i % keyDataLen]) & 0xff;\n [box[i], box[j]] = [box[j], box[i]];\n }\n\n return box.map((_, i, arr) => {\n i = (i + 1) & 0xff;\n const si = arr[i];\n const sj = arr[(i + si) & 0xff];\n return arr[(si + sj) & 0xff];\n });\n}\n\n/**\n * @typedef {Object} MusicMetaType\n * @property {Number} musicId\n * @property {String} musicName\n * @property {[[String, Number]]} artist\n * @property {String} album\n * @property {\"flac\"|\"mp3\"} format\n * @property {String} albumPic\n */\n\nfunction getMetaData(dataView, fileBuffer, offset) {\n const metaDataLen = dataView.getUint32(offset, true);\n offset += 4;\n if (metaDataLen === 0) {\n return {};\n }\n\n const cipherText = new Uint8Array(fileBuffer, offset, metaDataLen).map(\n data => data ^ 0x63\n );\n offset += metaDataLen;\n\n const plainText = CryptoJS.AES.decrypt({\n ciphertext: CryptoJS.enc.Base64.parse(\n CryptoJS.lib.WordArray.create(cipherText.slice(22)).toString(CryptoJS.enc.Utf8)\n )\n },\n META_KEY,\n {mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7}\n );\n\n const result = JSON.parse(plainText.toString(CryptoJS.enc.Utf8).slice(6));\n result.albumPic = result.albumPic.replace(\"http:\", \"https:\");\n return {data: result, offset: offset};\n}\n\n\n","const musicMetadata = require(\"music-metadata-browser\");\nimport {GetCoverURL, GetFileInfo, AudioMimeType, DetectAudioExt, GetArrayBuffer} from \"./util\";\n\nexport async function Decrypt(file, raw_filename, raw_ext, detect = true) {\n let ext = raw_ext;\n if (detect) {\n const buffer = new Uint8Array(await GetArrayBuffer(file));\n ext = DetectAudioExt(buffer, raw_ext);\n if (ext !== raw_ext) file = new Blob([buffer], {type: AudioMimeType[ext]})\n }\n const tag = await musicMetadata.parseBlob(file);\n const info = GetFileInfo(tag.common.artist, tag.common.title, raw_filename);\n return {\n status: true,\n title: info.title,\n artist: info.artist,\n ext: ext,\n album: tag.common.album,\n picture: GetCoverURL(tag),\n file: URL.createObjectURL(file),\n mime: AudioMimeType[ext]\n }\n}\n"],"sourceRoot":""}
--------------------------------------------------------------------------------