mirror of
				https://git.unlock-music.dev/um/web.git
				synced 2025-11-04 21:03:30 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			171 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			171 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
<template>
 | 
						||
  <div>
 | 
						||
    <file-selector @error="showFail" @success="showSuccess" />
 | 
						||
 | 
						||
    <div id="app-control">
 | 
						||
      <el-row class="mb-3">
 | 
						||
        <span>歌曲命名格式:</span>
 | 
						||
        <el-radio v-for="k in FilenamePolicies" :key="k.key" v-model="filename_policy" :label="k.key">
 | 
						||
          {{ k.text }}
 | 
						||
        </el-radio>
 | 
						||
      </el-row>
 | 
						||
      <el-row>
 | 
						||
        <config-dialog :show="showConfigDialog" @done="showConfigDialog = false"></config-dialog>
 | 
						||
        <el-tooltip class="item" effect="dark" placement="top">
 | 
						||
          <div slot="content">
 | 
						||
            <span> 部分解密方案需要设定解密参数。 </span>
 | 
						||
          </div>
 | 
						||
          <el-button icon="el-icon-s-tools" plain @click="showConfigDialog = true">解密设定</el-button>
 | 
						||
        </el-tooltip>
 | 
						||
        <el-button icon="el-icon-download" plain @click="handleDownloadAll">下载全部</el-button>
 | 
						||
        <el-button icon="el-icon-delete" plain type="danger" @click="handleDeleteAll">清除全部</el-button>
 | 
						||
 | 
						||
        <el-tooltip class="item" effect="dark" placement="top-start">
 | 
						||
          <div slot="content">
 | 
						||
            <span v-if="instant_save">工作模式: {{ dir ? '写入本地文件系统' : '调用浏览器下载' }}</span>
 | 
						||
            <span v-else>
 | 
						||
              当您使用此工具进行大量文件解锁的时候,建议开启此选项。<br />
 | 
						||
              开启后,解锁结果将不会存留于浏览器中,防止内存不足。
 | 
						||
            </span>
 | 
						||
          </div>
 | 
						||
          <el-checkbox v-model="instant_save" border class="ml-2">立即保存</el-checkbox>
 | 
						||
        </el-tooltip>
 | 
						||
      </el-row>
 | 
						||
    </div>
 | 
						||
 | 
						||
    <audio :autoplay="playing_auto" :src="playing_url" controls />
 | 
						||
 | 
						||
    <PreviewTable :policy="filename_policy" :table-data="tableData" @download="saveFile" @play="changePlaying" />
 | 
						||
  </div>
 | 
						||
</template>
 | 
						||
 | 
						||
<script>
 | 
						||
import FileSelector from '@/component/FileSelector';
 | 
						||
import PreviewTable from '@/component/PreviewTable';
 | 
						||
import ConfigDialog from '@/component/ConfigDialog';
 | 
						||
 | 
						||
import { DownloadBlobMusic, FilenamePolicy, FilenamePolicies, RemoveBlobMusic, DirectlyWriteFile } from '@/utils/utils';
 | 
						||
 | 
						||
export default {
 | 
						||
  name: 'Home',
 | 
						||
  components: {
 | 
						||
    FileSelector,
 | 
						||
    PreviewTable,
 | 
						||
    ConfigDialog,
 | 
						||
  },
 | 
						||
  data() {
 | 
						||
    return {
 | 
						||
      showConfigDialog: false,
 | 
						||
      tableData: [],
 | 
						||
      playing_url: '',
 | 
						||
      playing_auto: false,
 | 
						||
      filename_policy: FilenamePolicy.ArtistAndTitle,
 | 
						||
      instant_save: false,
 | 
						||
      FilenamePolicies,
 | 
						||
      dir: null,
 | 
						||
    };
 | 
						||
  },
 | 
						||
  watch: {
 | 
						||
    instant_save(val) {
 | 
						||
      if (val) this.showDirectlySave();
 | 
						||
    },
 | 
						||
  },
 | 
						||
  methods: {
 | 
						||
    async showSuccess(data) {
 | 
						||
      if (this.instant_save) {
 | 
						||
        await this.saveFile(data);
 | 
						||
        RemoveBlobMusic(data);
 | 
						||
      } else {
 | 
						||
        this.tableData.push(data);
 | 
						||
        this.$notify.success({
 | 
						||
          title: '解锁成功',
 | 
						||
          message: '成功解锁 ' + data.title,
 | 
						||
          duration: 3000,
 | 
						||
        });
 | 
						||
      }
 | 
						||
      if (process.env.NODE_ENV === 'production') {
 | 
						||
        let _rp_data = [data.title, data.artist, data.album];
 | 
						||
        window._paq.push(['trackEvent', 'Unlock', data.rawExt + ',' + data.mime, JSON.stringify(_rp_data)]);
 | 
						||
      }
 | 
						||
    },
 | 
						||
    showFail(errInfo, filename) {
 | 
						||
      console.error(errInfo, filename);
 | 
						||
      this.$notify.error({
 | 
						||
        title: '出现问题',
 | 
						||
        message:
 | 
						||
          errInfo +
 | 
						||
          ',' +
 | 
						||
          filename +
 | 
						||
          ',参考<a target="_blank" href="https://github.com/ix64/unlock-music/wiki/使用提示">使用提示</a>',
 | 
						||
        dangerouslyUseHTMLString: true,
 | 
						||
        duration: 6000,
 | 
						||
      });
 | 
						||
      if (process.env.NODE_ENV === 'production') {
 | 
						||
        window._paq.push(['trackEvent', 'Error', String(errInfo), filename]);
 | 
						||
      }
 | 
						||
    },
 | 
						||
    changePlaying(url) {
 | 
						||
      this.playing_url = url;
 | 
						||
      this.playing_auto = true;
 | 
						||
    },
 | 
						||
    handleDeleteAll() {
 | 
						||
      this.tableData.forEach((value) => {
 | 
						||
        RemoveBlobMusic(value);
 | 
						||
      });
 | 
						||
      this.tableData = [];
 | 
						||
    },
 | 
						||
    handleDecryptionConfig() {
 | 
						||
      this.showConfigDialog = true;
 | 
						||
    },
 | 
						||
    handleDownloadAll() {
 | 
						||
      let index = 0;
 | 
						||
      let c = setInterval(() => {
 | 
						||
        if (index < this.tableData.length) {
 | 
						||
          this.saveFile(this.tableData[index]);
 | 
						||
          index++;
 | 
						||
        } else {
 | 
						||
          clearInterval(c);
 | 
						||
        }
 | 
						||
      }, 300);
 | 
						||
    },
 | 
						||
 | 
						||
    async saveFile(data) {
 | 
						||
      if (this.dir) {
 | 
						||
        await DirectlyWriteFile(data, this.filename_policy, this.dir);
 | 
						||
        this.$notify({
 | 
						||
          title: '保存成功',
 | 
						||
          message: data.title,
 | 
						||
          position: 'top-left',
 | 
						||
          type: 'success',
 | 
						||
          duration: 3000,
 | 
						||
        });
 | 
						||
      } else {
 | 
						||
        DownloadBlobMusic(data, this.filename_policy);
 | 
						||
      }
 | 
						||
    },
 | 
						||
    async showDirectlySave() {
 | 
						||
      if (!window.showDirectoryPicker) return;
 | 
						||
      try {
 | 
						||
        await this.$confirm('您的浏览器支持文件直接保存到磁盘,是否使用?', '新特性提示', {
 | 
						||
          confirmButtonText: '使用',
 | 
						||
          cancelButtonText: '不使用',
 | 
						||
          type: 'warning',
 | 
						||
          center: true,
 | 
						||
        });
 | 
						||
      } catch (e) {
 | 
						||
        console.log(e);
 | 
						||
        return;
 | 
						||
      }
 | 
						||
      try {
 | 
						||
        this.dir = await window.showDirectoryPicker();
 | 
						||
        const test_filename = '__unlock_music_write_test.txt';
 | 
						||
        await this.dir.getFileHandle(test_filename, { create: true });
 | 
						||
        await this.dir.removeEntry(test_filename);
 | 
						||
      } catch (e) {
 | 
						||
        console.error(e);
 | 
						||
      }
 | 
						||
    },
 | 
						||
  },
 | 
						||
};
 | 
						||
</script>
 |