mirror of
				https://git.unlock-music.dev/um/web.git
				synced 2025-11-04 09:13:32 +08:00 
			
		
		
		
	Merge branch 'feature/extension'
This commit is contained in:
		
						commit
						22312959f3
					
				
							
								
								
									
										17
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							@ -27,9 +27,11 @@ jobs:
 | 
			
		||||
        build: [ legacy, modern ]
 | 
			
		||||
        include:
 | 
			
		||||
          - build: legacy
 | 
			
		||||
            BUILD_ARGS:
 | 
			
		||||
            BUILD_ARGS: ""
 | 
			
		||||
            BUILD_EXTENSION: true
 | 
			
		||||
          - build: modern
 | 
			
		||||
            BUILD_ARGS: "-- --modern"
 | 
			
		||||
            BUILD_EXTENSION: false
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v2
 | 
			
		||||
 | 
			
		||||
@ -59,8 +61,21 @@ jobs:
 | 
			
		||||
          npm run build ${{ matrix.BUILD_ARGS }}
 | 
			
		||||
          tar -czvf dist.tar.gz -C ./dist .
 | 
			
		||||
 | 
			
		||||
      - name: Build Extension
 | 
			
		||||
        if: ${{ matrix.BUILD_EXTENSION }}
 | 
			
		||||
        run: |
 | 
			
		||||
          npm run make-extension
 | 
			
		||||
          zip -rJ9 extension.zip ./dist
 | 
			
		||||
 | 
			
		||||
      - name: Publish artifact
 | 
			
		||||
        uses: actions/upload-artifact@v2
 | 
			
		||||
        with:
 | 
			
		||||
          name: unlock-music-${{ matrix.build }}.tar.gz
 | 
			
		||||
          path: ./dist.tar.gz
 | 
			
		||||
 | 
			
		||||
      - name: Publish artifact - Extension
 | 
			
		||||
        if: ${{ matrix.BUILD_EXTENSION }}
 | 
			
		||||
        uses: actions/upload-artifact@v2
 | 
			
		||||
        with:
 | 
			
		||||
          name: extension.zip
 | 
			
		||||
          path: ./extension.zip
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										12
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							@ -37,6 +37,8 @@ jobs:
 | 
			
		||||
          npm run build
 | 
			
		||||
          tar -czf legacy.tar.gz -C ./dist .
 | 
			
		||||
          zip -rJ9 legacy.zip ./dist
 | 
			
		||||
          npm run make-extension
 | 
			
		||||
          zip -rJ9 extension.zip ./dist
 | 
			
		||||
 | 
			
		||||
      - name: Build Modern
 | 
			
		||||
        env:
 | 
			
		||||
@ -109,6 +111,16 @@ jobs:
 | 
			
		||||
          asset_name: modern.zip
 | 
			
		||||
          asset_content_type: application/zip
 | 
			
		||||
 | 
			
		||||
      - name: Upload Release Assets - extension.zip
 | 
			
		||||
        uses: actions/upload-release-asset@v1.0.2
 | 
			
		||||
        env:
 | 
			
		||||
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
        with:
 | 
			
		||||
          upload_url: ${{ steps.create_release.outputs.upload_url }}
 | 
			
		||||
          asset_path: ./extension.zip
 | 
			
		||||
          asset_name: extension.zip
 | 
			
		||||
          asset_content_type: application/zip
 | 
			
		||||
 | 
			
		||||
      - name: Upload Release Assets - sha256sum.txt
 | 
			
		||||
        uses: actions/upload-release-asset@v1.0.2
 | 
			
		||||
        env:
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										16
									
								
								extension-manifest.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								extension-manifest.json
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,16 @@
 | 
			
		||||
{
 | 
			
		||||
  "manifest_version": 2,
 | 
			
		||||
  "name": "音乐解锁",
 | 
			
		||||
  "short_name": "音乐解锁",
 | 
			
		||||
  "icons": {
 | 
			
		||||
    "128": "./img/icons/msapplication-icon-144x144.png"
 | 
			
		||||
  },
 | 
			
		||||
  "description": "在任何设备上解锁已购的加密音乐!",
 | 
			
		||||
  "offline_enabled": true,
 | 
			
		||||
  "options_page": "./index.html",
 | 
			
		||||
  "homepage_url": "https://github.com/ix64/unlock-music",
 | 
			
		||||
  "browser_action": {
 | 
			
		||||
    "default_popup": "./popup.html"
 | 
			
		||||
  },
 | 
			
		||||
  "content_security_policy": "script-src 'self' https://stats.ixarea.com; object-src 'self'"
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										20
									
								
								make-extension.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								make-extension.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,20 @@
 | 
			
		||||
const fs = require('fs')
 | 
			
		||||
const path = require('path')
 | 
			
		||||
const src = "./src/extension/"
 | 
			
		||||
const dst = "./dist"
 | 
			
		||||
fs.readdirSync(src).forEach(file => {
 | 
			
		||||
    let srcPath = path.join(src, file)
 | 
			
		||||
    let dstPath = path.join(dst, file)
 | 
			
		||||
    fs.copyFileSync(srcPath, dstPath)
 | 
			
		||||
    console.log(`Copy: ${srcPath} => ${dstPath}`)
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
const manifestRaw = fs.readFileSync("./extension-manifest.json", "utf-8")
 | 
			
		||||
const manifest = JSON.parse(manifestRaw)
 | 
			
		||||
 | 
			
		||||
const pkgRaw = fs.readFileSync("./package.json", "utf-8")
 | 
			
		||||
const pkg = JSON.parse(pkgRaw)
 | 
			
		||||
 | 
			
		||||
manifest["version"] = pkg["version"]
 | 
			
		||||
fs.writeFileSync("./dist/manifest.json", JSON.stringify(manifest), "utf-8")
 | 
			
		||||
console.log("Write: manifest.json")
 | 
			
		||||
@ -12,7 +12,8 @@
 | 
			
		||||
  "scripts": {
 | 
			
		||||
    "serve": "vue-cli-service serve",
 | 
			
		||||
    "build": "vue-cli-service build",
 | 
			
		||||
    "fix-compatibility": "node ./src/fix-compatibility.js"
 | 
			
		||||
    "fix-compatibility": "node ./src/fix-compatibility.js",
 | 
			
		||||
    "make-extension": "node ./make-extension.js"
 | 
			
		||||
  },
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "base64-js": "^1.5.1",
 | 
			
		||||
 | 
			
		||||
@ -5,13 +5,10 @@
 | 
			
		||||
    <meta content="webkit" name="renderer">
 | 
			
		||||
    <meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible">
 | 
			
		||||
    <meta content="width=device-width,initial-scale=1.0" name="viewport">
 | 
			
		||||
    <!--@formatter:off-->
 | 
			
		||||
    <script>var _paq=window._paq||[];_paq.push(["setRequestMethod","POST"],["trackPageView"],["enableLinkTracking"],["setSiteId","2"],["setTrackerUrl","https://stats.ixarea.com/ixarea-stats/report"]);</script>
 | 
			
		||||
    <!--@formatter:on-->
 | 
			
		||||
    <script async src="https://stats.ixarea.com/ixarea-stats.js"></script>
 | 
			
		||||
    <title>音乐解锁</title>
 | 
			
		||||
    <meta content="音乐,解锁,ncm,qmc,mgg,mflac,qq音乐,网易云音乐,加密" name="keywords"/>
 | 
			
		||||
    <meta content="音乐解锁 - 在任何设备上解锁已购的加密音乐!" name="description"/>
 | 
			
		||||
    <script src="./ixarea-stats.js"></script>
 | 
			
		||||
    <!--@formatter:off-->
 | 
			
		||||
    <style>#loader{position:absolute;left:50%;top:50%;z-index:1010;margin:-75px 0 0 -75px;border:16px solid #f3f3f3;border-radius:50%;border-top:16px solid #1db1ff;width:120px;height:120px;animation:spin 2s linear infinite}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}#loader-mask{text-align:center;position:absolute;width:100%;height:100%;bottom:0;left:0;right:0;top:0;z-index:1009;background-color:rgba(242,246,252,.88)}@media (prefers-color-scheme:dark){#loader-mask{color:#fff;background-color:rgba(0,0,0,.85)}#loader-mask a{color:#ddd}#loader-mask a:hover{color:#1db1ff}}#loader-source{font-size:1.5rem}#loader-tips-timeout{font-size:1.2rem}</style>
 | 
			
		||||
    <!--@formatter:on-->
 | 
			
		||||
@ -27,12 +24,12 @@
 | 
			
		||||
             style="border:0"/>
 | 
			
		||||
    </noscript>
 | 
			
		||||
    <h3 id="loader-source"> 请勿直接运行源代码! </h3>
 | 
			
		||||
    <div hidden id="loader-tips-outdated">
 | 
			
		||||
    <div id="loader-tips-outdated" hidden>
 | 
			
		||||
        <h2>您可能在使用不受支持的<span style="color:#f00;">过时</span>浏览器,这可能导致此应用无法正常工作。</h2>
 | 
			
		||||
        <h3>如果您使用双核浏览器,您可以尝试切换到 <span style="color:#f00;">“极速模式”</span> 解决此问题。</h3>
 | 
			
		||||
        <h3>或者,您可以尝试更换下方的几个浏览器之一。</h3>
 | 
			
		||||
    </div>
 | 
			
		||||
    <h3 hidden id="loader-tips-timeout">
 | 
			
		||||
    <h3 id="loader-tips-timeout" hidden>
 | 
			
		||||
        音乐解锁采用了一些新特性!建议使用
 | 
			
		||||
        <a href="https://www.microsoft.com/zh-cn/edge" target="_blank">Microsoft Edge Chromium</a>
 | 
			
		||||
        <a href="https://www.google.cn/chrome/" target="_blank">Google Chrome</a>
 | 
			
		||||
@ -41,32 +38,6 @@
 | 
			
		||||
    </h3>
 | 
			
		||||
</div>
 | 
			
		||||
<div id="app"></div>
 | 
			
		||||
<script>
 | 
			
		||||
    (function () {
 | 
			
		||||
        setTimeout(function () {
 | 
			
		||||
            var ele = document.getElementById("loader-tips-timeout");
 | 
			
		||||
            if (ele != null) {
 | 
			
		||||
                ele.hidden = false;
 | 
			
		||||
            }
 | 
			
		||||
        }, 2000);
 | 
			
		||||
 | 
			
		||||
        var ua = navigator && navigator.userAgent;
 | 
			
		||||
        var detected = (function () {
 | 
			
		||||
            var m;
 | 
			
		||||
            if (!ua) return true;
 | 
			
		||||
            if (/MSIE |Trident\//.exec(ua)) return true; // no IE
 | 
			
		||||
            m = /Edge\/([\d.]+)/.exec(ua); // Edge >= 17
 | 
			
		||||
            if (m && Number(m[1]) < 17) return true;
 | 
			
		||||
            m = /Chrome\/([\d.]+)/.exec(ua); // Chrome >= 58
 | 
			
		||||
            if (m && Number(m[1]) < 58) return true;
 | 
			
		||||
            m = /Firefox\/([\d.]+)/.exec(ua); // Firefox >= 45
 | 
			
		||||
            return m && Number(m[1]) < 45;
 | 
			
		||||
        })();
 | 
			
		||||
        if (detected) {
 | 
			
		||||
            document.getElementById('loader-tips-outdated').hidden = false;
 | 
			
		||||
            document.getElementById("loader-tips-timeout").hidden = false;
 | 
			
		||||
        }
 | 
			
		||||
    })();
 | 
			
		||||
</script>
 | 
			
		||||
<script src="./loader.js"></script>
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										10
									
								
								public/ixarea-stats.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								public/ixarea-stats.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,10 @@
 | 
			
		||||
var _paq = window._paq || [];
 | 
			
		||||
_paq.push(["setRequestMethod", "POST"], ["trackPageView"], ["enableLinkTracking"],
 | 
			
		||||
    ["setSiteId", "2"], ["setTrackerUrl", "https://stats.ixarea.com/ixarea-stats/report"]);
 | 
			
		||||
 | 
			
		||||
var tag = document.createElement('script');
 | 
			
		||||
tag.type = 'text/javascript';
 | 
			
		||||
tag.async = true;
 | 
			
		||||
tag.src = 'https://stats.ixarea.com/ixarea-stats.js';
 | 
			
		||||
var s = document.getElementsByTagName('script')[0];
 | 
			
		||||
s.parentNode.insertBefore(tag, s);
 | 
			
		||||
							
								
								
									
										25
									
								
								public/loader.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								public/loader.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,25 @@
 | 
			
		||||
(function () {
 | 
			
		||||
    setTimeout(function () {
 | 
			
		||||
        var ele = document.getElementById("loader-tips-timeout");
 | 
			
		||||
        if (ele != null) {
 | 
			
		||||
            ele.hidden = false;
 | 
			
		||||
        }
 | 
			
		||||
    }, 2000);
 | 
			
		||||
 | 
			
		||||
    var ua = navigator && navigator.userAgent;
 | 
			
		||||
    var detected = (function () {
 | 
			
		||||
        var m;
 | 
			
		||||
        if (!ua) return true;
 | 
			
		||||
        if (/MSIE |Trident\//.exec(ua)) return true; // no IE
 | 
			
		||||
        m = /Edge\/([\d.]+)/.exec(ua); // Edge >= 17
 | 
			
		||||
        if (m && Number(m[1]) < 17) return true;
 | 
			
		||||
        m = /Chrome\/([\d.]+)/.exec(ua); // Chrome >= 58
 | 
			
		||||
        if (m && Number(m[1]) < 58) return true;
 | 
			
		||||
        m = /Firefox\/([\d.]+)/.exec(ua); // Firefox >= 45
 | 
			
		||||
        return m && Number(m[1]) < 45;
 | 
			
		||||
    })();
 | 
			
		||||
    if (detected) {
 | 
			
		||||
        document.getElementById('loader-tips-outdated').hidden = false;
 | 
			
		||||
        document.getElementById("loader-tips-timeout").hidden = false;
 | 
			
		||||
    }
 | 
			
		||||
})();
 | 
			
		||||
@ -1,21 +0,0 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "音乐解锁",
 | 
			
		||||
  "short_name": "音乐解锁",
 | 
			
		||||
  "description": "在任何设备上解锁已购的加密音乐!",
 | 
			
		||||
  "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",
 | 
			
		||||
  "theme_color": "#4DBA87"
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1
									
								
								src/extension/popup.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								src/extension/popup.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
<script src="./popup.js"></script>
 | 
			
		||||
							
								
								
									
										2
									
								
								src/extension/popup.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								src/extension/popup.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,2 @@
 | 
			
		||||
const bs = chrome || browser
 | 
			
		||||
window.open(bs.runtime.getURL('./index.html'))
 | 
			
		||||
@ -2,7 +2,8 @@
 | 
			
		||||
 | 
			
		||||
import {register} from 'register-service-worker'
 | 
			
		||||
 | 
			
		||||
if (process.env.NODE_ENV === 'production') {
 | 
			
		||||
if (process.env.NODE_ENV === 'production' && window.location.protocol === "https:") {
 | 
			
		||||
 | 
			
		||||
    register(`${process.env.BASE_URL}service-worker.js`, {
 | 
			
		||||
        ready() {
 | 
			
		||||
            console.log('App is being served from cache by a service worker.')
 | 
			
		||||
 | 
			
		||||
@ -2,6 +2,36 @@ module.exports = {
 | 
			
		||||
    publicPath: '',
 | 
			
		||||
    productionSourceMap: false,
 | 
			
		||||
    pwa: {
 | 
			
		||||
        manifestPath: "web-manifest.json",
 | 
			
		||||
        name: "音乐解锁",
 | 
			
		||||
        themeColor: "#4DBA87",
 | 
			
		||||
        msTileColor: "#000000",
 | 
			
		||||
        manifestOptions: {
 | 
			
		||||
            start_url: "./index.html",
 | 
			
		||||
            description: "在任何设备上解锁已购的加密音乐!",
 | 
			
		||||
            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'
 | 
			
		||||
                }
 | 
			
		||||
            ]
 | 
			
		||||
        },
 | 
			
		||||
        appleMobileWebAppCapable: 'yes',
 | 
			
		||||
        iconPaths: {
 | 
			
		||||
            faviconSVG: './img/icons/safari-pinned-tab.svg',
 | 
			
		||||
            favicon32: './img/icons/favicon-32x32.png',
 | 
			
		||||
            favicon16: './img/icons/favicon-16x16.png',
 | 
			
		||||
            appleTouchIcon: './img/icons/apple-touch-icon-152x152.png',
 | 
			
		||||
            maskIcon: './img/icons/safari-pinned-tab.svg',
 | 
			
		||||
            msTileImage: './img/icons/msapplication-icon-144x144.png'
 | 
			
		||||
        },
 | 
			
		||||
        workboxPluginMode: "GenerateSW",
 | 
			
		||||
        workboxOptions: {
 | 
			
		||||
            skipWaiting: true
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user