<audio ref="audio"></audio>
import CryptoJS from "crypto-js";
import Hls from 'hls.js';
methods:{
getHls (url) {
if (Hls.isSupported()) {
var hls = new Hls();
var _gthis = this;
hls.attachMedia(this.$refs.audio);
hls.on(Hls.Events.MEDIA_ATTACHED, function () {
// console.log('audio and hls.js are now bound together !');
hls.loadSource(url);
hls.on(Hls.Events.KEY_LOADED, function (event, data) {
const { frag } = data
// console.log(frag);
// debugger
var _ts = ["ts列表数据1",
"ts列表数据2",
"ts列表数据3",
"ts列表数据4",
"ts列表数据5"];
var query = frag._decryptdata._uri;
var ts = _gthis.getQueryVariable(query, 'ts');
// console.log(ts, frag._decryptdata.key)
// debugger
if (ts) {
var _ = _gthis.getQueryVariable(query, '_');
// console.log(_gthis.decrypt(_, _ts[ts]))
frag._decryptdata.key = _gthis.stringToUint8Array(_gthis.decrypt(_, _ts[ts]))
// console.log(frag._decryptdata.key)
_gthis.$refs.audio.play();
}
})
});
} else if (this.$refs.audio.canPlayType('application/vnd.apple.mpegurl')) {
this.$refs.audio.src = url
let that = this
this.$refs.audio.addEventListener('loadedmetadata', function () {
that.$refs.audio.play();
});
}
},
stringToUint8Array (str) {
var arr = [];
for (var i = 0, j = str.length; i < j; ++i) {
arr.push(str.charCodeAt(i));
}
var tmpUint8Array = new Uint8Array(arr);
return tmpUint8Array
},
getQueryVariable (query, variable) {
return decodeURIComponent((new RegExp('[?|&]' + variable + '=' + '([^&;]+?)(&|#|;|$)').exec(query) || [, ""])[1]) || null
},
decrypt (word, keyStr) {
var key = CryptoJS.enc.Utf8.parse(keyStr);
var decrypt = CryptoJS.AES.decrypt(word, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 });
return CryptoJS.enc.Utf8.stringify(decrypt).toString();
}
},
mounted(){
this.getHls('https://s.music.com/m/90b416a4faff0e6/000_00000.m3u8')
}