mirror of
https://github.com/Suxiaoqinx/Netease_url.git
synced 2025-09-14 03:26:46 +08:00
Add files via upload
This commit is contained in:
parent
93e19dbb78
commit
418aa544f4
@ -98,6 +98,7 @@
|
|||||||
<option value="parse">单曲解析</option>
|
<option value="parse">单曲解析</option>
|
||||||
<option value="playlist">歌单解析</option>
|
<option value="playlist">歌单解析</option>
|
||||||
<option value="album">专辑解析</option>
|
<option value="album">专辑解析</option>
|
||||||
|
<option value="download">音乐下载</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div id="search-area">
|
<div id="search-area">
|
||||||
@ -152,6 +153,35 @@
|
|||||||
<button type="button" id="album-btn" class="btn btn-info w-50">解析专辑</button>
|
<button type="button" id="album-btn" class="btn btn-info w-50">解析专辑</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div id="download-area" style="display:none;">
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="download_id" class="form-label">音乐ID或URL</label>
|
||||||
|
<input type="text" id="download_id" class="form-control" placeholder="输入音乐ID或网易云音乐链接">
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="download_quality" class="form-label">下载音质</label>
|
||||||
|
<select id="download_quality" class="form-select">
|
||||||
|
<option value="standard">标准音质</option>
|
||||||
|
<option value="exhigh">极高音质</option>
|
||||||
|
<option value="lossless" selected>无损音质</option>
|
||||||
|
<option value="hires">Hires音质</option>
|
||||||
|
<option value="sky">沉浸环绕声</option>
|
||||||
|
<option value="jyeffect">高清环绕声</option>
|
||||||
|
<option value="jymaster">超清母带</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="text-center">
|
||||||
|
<button type="button" id="download-btn" class="btn btn-success w-50">下载音乐</button>
|
||||||
|
</div>
|
||||||
|
<div id="download-progress" class="mt-3 d-none">
|
||||||
|
<div class="progress">
|
||||||
|
<div class="progress-bar progress-bar-striped progress-bar-animated" role="progressbar" style="width: 100%"></div>
|
||||||
|
</div>
|
||||||
|
<div class="text-center mt-2">
|
||||||
|
<small class="text-muted">正在下载并写入元信息...</small>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -334,6 +364,7 @@
|
|||||||
$('#parse-area').hide();
|
$('#parse-area').hide();
|
||||||
$('#playlist-area').hide();
|
$('#playlist-area').hide();
|
||||||
$('#album-area').hide();
|
$('#album-area').hide();
|
||||||
|
$('#download-area').hide();
|
||||||
$('#song-info').addClass('d-none');
|
$('#song-info').addClass('d-none');
|
||||||
$('#playlist-result').addClass('d-none');
|
$('#playlist-result').addClass('d-none');
|
||||||
$('#album-result').addClass('d-none');
|
$('#album-result').addClass('d-none');
|
||||||
@ -342,6 +373,7 @@
|
|||||||
$('#parse-area').show();
|
$('#parse-area').show();
|
||||||
$('#playlist-area').hide();
|
$('#playlist-area').hide();
|
||||||
$('#album-area').hide();
|
$('#album-area').hide();
|
||||||
|
$('#download-area').hide();
|
||||||
$('#search-result').addClass('d-none');
|
$('#search-result').addClass('d-none');
|
||||||
$('#playlist-result').addClass('d-none');
|
$('#playlist-result').addClass('d-none');
|
||||||
$('#album-result').addClass('d-none');
|
$('#album-result').addClass('d-none');
|
||||||
@ -350,6 +382,7 @@
|
|||||||
$('#parse-area').hide();
|
$('#parse-area').hide();
|
||||||
$('#playlist-area').show();
|
$('#playlist-area').show();
|
||||||
$('#album-area').hide();
|
$('#album-area').hide();
|
||||||
|
$('#download-area').hide();
|
||||||
$('#search-result').addClass('d-none');
|
$('#search-result').addClass('d-none');
|
||||||
$('#song-info').addClass('d-none');
|
$('#song-info').addClass('d-none');
|
||||||
$('#album-result').addClass('d-none');
|
$('#album-result').addClass('d-none');
|
||||||
@ -358,12 +391,24 @@
|
|||||||
$('#parse-area').hide();
|
$('#parse-area').hide();
|
||||||
$('#playlist-area').hide();
|
$('#playlist-area').hide();
|
||||||
$('#album-area').show();
|
$('#album-area').show();
|
||||||
|
$('#download-area').hide();
|
||||||
|
$('#search-result').addClass('d-none');
|
||||||
|
$('#song-info').addClass('d-none');
|
||||||
|
$('#playlist-result').addClass('d-none');
|
||||||
|
$('#album-result').addClass('d-none');
|
||||||
|
} else if ($(this).val() === 'download') {
|
||||||
|
$('#search-area').hide();
|
||||||
|
$('#parse-area').hide();
|
||||||
|
$('#playlist-area').hide();
|
||||||
|
$('#album-area').hide();
|
||||||
|
$('#download-area').show();
|
||||||
$('#search-result').addClass('d-none');
|
$('#search-result').addClass('d-none');
|
||||||
$('#song-info').addClass('d-none');
|
$('#song-info').addClass('d-none');
|
||||||
$('#playlist-result').addClass('d-none');
|
$('#playlist-result').addClass('d-none');
|
||||||
$('#album-result').addClass('d-none');
|
$('#album-result').addClass('d-none');
|
||||||
} else {
|
} else {
|
||||||
$('#album-area').hide();
|
$('#album-area').hide();
|
||||||
|
$('#download-area').hide();
|
||||||
$('#album-result').addClass('d-none');
|
$('#album-result').addClass('d-none');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -378,19 +423,22 @@
|
|||||||
}
|
}
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: '/Search',
|
url: '/Search',
|
||||||
method: 'GET',
|
method: 'POST',
|
||||||
data: { keywords: keywords, limit: limit },
|
data: { keyword: keywords, limit: limit },
|
||||||
dataType: 'json',
|
dataType: 'json',
|
||||||
success: function(data) {
|
success: function(data) {
|
||||||
if (data.status === 200 && data.result.length > 0) {
|
if (data.status === 200) {
|
||||||
$('#search-list').empty();
|
$('#search-list').empty();
|
||||||
data.result.forEach(function(song) {
|
data.data.forEach(function(song) {
|
||||||
const item = `<li class="list-group-item d-flex justify-content-between align-items-center">
|
const item = `<li class="list-group-item d-flex justify-content-between align-items-center">
|
||||||
<div>
|
<div>
|
||||||
<img src="${song.picUrl}" alt="cover" style="width:40px;height:40px;object-fit:cover;border-radius:4px;margin-right:10px;">
|
<img src="${song.picUrl}" alt="cover" style="width:40px;height:40px;object-fit:cover;border-radius:4px;margin-right:10px;">
|
||||||
<strong class='song-title'>${song.name}</strong> - <span>${song.artists}</span> <span class="text-muted">[${song.album}]</span>
|
<strong class='song-title'>${song.name}</strong> - <span>${song.artists}</span> <span class="text-muted">[${song.album}]</span>
|
||||||
</div>
|
</div>
|
||||||
<button class="btn btn-sm btn-outline-primary select-song" data-id="${song.id}" data-name="${song.name}">解析</button>
|
<div>
|
||||||
|
<button class="btn btn-sm btn-outline-primary select-song me-2" data-id="${song.id}" data-name="${song.name}">解析</button>
|
||||||
|
<button class="btn btn-sm btn-success download-song" data-id="${song.id}" data-name="${song.name}">下载</button>
|
||||||
|
</div>
|
||||||
</li>`;
|
</li>`;
|
||||||
$('#search-list').append(item);
|
$('#search-list').append(item);
|
||||||
});
|
});
|
||||||
@ -425,32 +473,32 @@
|
|||||||
}
|
}
|
||||||
$.post('/Song_V1', { url: songIds, level: level, type:'json' }, function(data) {
|
$.post('/Song_V1', { url: songIds, level: level, type:'json' }, function(data) {
|
||||||
if (data.status === 200) {
|
if (data.status === 200) {
|
||||||
$('#song_name').text(data.name);
|
$('#song_name').text(data.data.name);
|
||||||
$('#artist_names').text(data.ar_name);
|
$('#artist_names').text(data.data.ar_name);
|
||||||
$('#song_alname').text(data.al_name);
|
$('#song_alname').text(data.data.al_name);
|
||||||
$('#song_level').text(data.level);
|
$('#song_level').text(data.data.level);
|
||||||
$('#song_size').text(data.size);
|
$('#song_size').text(data.data.size);
|
||||||
let processedLyrics = data.lyric;
|
let processedLyrics = data.data.lyric;
|
||||||
if (data.tlyric) {
|
if (data.data.tlyric) {
|
||||||
processedLyrics = lrctran(data.lyric, data.tlyric);
|
processedLyrics = lrctran(data.data.lyric, data.data.tlyric);
|
||||||
}
|
}
|
||||||
$('#lyric').html(processedLyrics.replace(/\n/g, '<br>'));
|
$('#lyric').html(processedLyrics.replace(/\n/g, '<br>'));
|
||||||
$('#song_url').attr('href', data.url).text('点击下载');
|
$('#song_url').attr('href', data.data.url).text('点击下载');
|
||||||
$('#song-info').removeClass('d-none');
|
$('#song-info').removeClass('d-none');
|
||||||
$('#show-big-pic').data('pic', data.pic);
|
$('#show-big-pic').data('pic', data.data.pic);
|
||||||
new APlayer({
|
new APlayer({
|
||||||
container: document.getElementById('aplayer'),
|
container: document.getElementById('aplayer'),
|
||||||
lrcType: 1,
|
lrcType: 1,
|
||||||
audio: [{
|
audio: [{
|
||||||
name: data.name,
|
name: data.data.name,
|
||||||
artist: data.ar_name,
|
artist: data.data.ar_name,
|
||||||
url: data.url,
|
url: data.data.url,
|
||||||
cover: data.pic,
|
cover: data.data.pic,
|
||||||
lrc: processedLyrics
|
lrc: processedLyrics
|
||||||
}]
|
}]
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
alert(data.msg);
|
alert(data.data.msg);
|
||||||
}
|
}
|
||||||
}, 'json');
|
}, 'json');
|
||||||
});
|
});
|
||||||
@ -475,7 +523,7 @@
|
|||||||
if (idMatch) pid = idMatch[1];
|
if (idMatch) pid = idMatch[1];
|
||||||
$.get('/Playlist', { id: pid }, function(data) {
|
$.get('/Playlist', { id: pid }, function(data) {
|
||||||
if (data.status === 200) {
|
if (data.status === 200) {
|
||||||
const pl = data.playlist;
|
const pl = data.data.playlist;
|
||||||
$('#playlist-cover').attr('src', pl.coverImgUrl);
|
$('#playlist-cover').attr('src', pl.coverImgUrl);
|
||||||
$('#playlist-name').text(pl.name);
|
$('#playlist-name').text(pl.name);
|
||||||
$('#playlist-creator').text('by ' + pl.creator);
|
$('#playlist-creator').text('by ' + pl.creator);
|
||||||
@ -488,14 +536,17 @@
|
|||||||
<img src="${song.picUrl}" alt="cover" style="width:32px;height:32px;object-fit:cover;border-radius:4px;margin-right:8px;">
|
<img src="${song.picUrl}" alt="cover" style="width:32px;height:32px;object-fit:cover;border-radius:4px;margin-right:8px;">
|
||||||
<strong class="playlist-title">${idx+1}. ${song.name}</strong> - <span>${song.artists}</span> <span class="text-muted">[${song.album}]</span>
|
<strong class="playlist-title">${idx+1}. ${song.name}</strong> - <span>${song.artists}</span> <span class="text-muted">[${song.album}]</span>
|
||||||
</div>
|
</div>
|
||||||
<button class="btn btn-sm btn-outline-primary select-song" data-id="${song.id}" data-name="${song.name}">解析</button>
|
<div>
|
||||||
|
<button class="btn btn-sm btn-outline-primary select-song me-2" data-id="${song.id}" data-name="${song.name}">解析</button>
|
||||||
|
<button class="btn btn-sm btn-success download-song" data-id="${song.id}" data-name="${song.name}">下载</button>
|
||||||
|
</div>
|
||||||
</li>`;
|
</li>`;
|
||||||
$('#playlist-tracks').append(item);
|
$('#playlist-tracks').append(item);
|
||||||
});
|
});
|
||||||
$('#playlist-result').removeClass('d-none');
|
$('#playlist-result').removeClass('d-none');
|
||||||
} else {
|
} else {
|
||||||
$('#playlist-result').removeClass('d-none');
|
$('#playlist-result').removeClass('d-none');
|
||||||
$('#playlist-tracks').html('<li class="list-group-item">歌单解析失败:'+data.msg+'</li>');
|
$('#playlist-tracks').html('<li class="list-group-item">歌单解析失败:'+data.data.msg+'</li>');
|
||||||
}
|
}
|
||||||
}, 'json');
|
}, 'json');
|
||||||
});
|
});
|
||||||
@ -512,7 +563,7 @@
|
|||||||
if (idMatch) aid = idMatch[1];
|
if (idMatch) aid = idMatch[1];
|
||||||
$.get('/Album', { id: aid }, function(data) {
|
$.get('/Album', { id: aid }, function(data) {
|
||||||
if (data.status === 200) {
|
if (data.status === 200) {
|
||||||
const al = data.album;
|
const al = data.data.album;
|
||||||
$('#album-cover').attr('src', al.coverImgUrl);
|
$('#album-cover').attr('src', al.coverImgUrl);
|
||||||
$('#album-name').text(al.name);
|
$('#album-name').text(al.name);
|
||||||
$('#album-artist').text(al.artist);
|
$('#album-artist').text(al.artist);
|
||||||
@ -525,17 +576,108 @@
|
|||||||
<img src="${song.picUrl}" alt="cover" style="width:32px;height:32px;object-fit:cover;border-radius:4px;margin-right:8px;">
|
<img src="${song.picUrl}" alt="cover" style="width:32px;height:32px;object-fit:cover;border-radius:4px;margin-right:8px;">
|
||||||
<strong class="playlist-title">${idx+1}. ${song.name}</strong> - <span>${song.artists}</span> <span class="text-muted">[${song.album}]</span>
|
<strong class="playlist-title">${idx+1}. ${song.name}</strong> - <span>${song.artists}</span> <span class="text-muted">[${song.album}]</span>
|
||||||
</div>
|
</div>
|
||||||
<button class="btn btn-sm btn-outline-primary select-song" data-id="${song.id}" data-name="${song.name}">解析</button>
|
<div>
|
||||||
|
<button class="btn btn-sm btn-outline-primary select-song me-2" data-id="${song.id}" data-name="${song.name}">解析</button>
|
||||||
|
<button class="btn btn-sm btn-success download-song" data-id="${song.id}" data-name="${song.name}">下载</button>
|
||||||
|
</div>
|
||||||
</li>`;
|
</li>`;
|
||||||
$('#album-tracks').append(item);
|
$('#album-tracks').append(item);
|
||||||
});
|
});
|
||||||
$('#album-result').removeClass('d-none');
|
$('#album-result').removeClass('d-none');
|
||||||
} else {
|
} else {
|
||||||
$('#album-result').removeClass('d-none');
|
$('#album-result').removeClass('d-none');
|
||||||
$('#album-tracks').html('<li class="list-group-item">专辑解析失败:'+data.msg+'</li>');
|
$('#album-tracks').html('<li class="list-group-item">专辑解析失败:'+data.data.msg+'</li>');
|
||||||
}
|
}
|
||||||
}, 'json');
|
}, 'json');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 音乐下载功能
|
||||||
|
$('#download-btn').on('click', function() {
|
||||||
|
const musicId = $('#download_id').val().trim();
|
||||||
|
const quality = $('#download_quality').val();
|
||||||
|
|
||||||
|
if (!musicId) {
|
||||||
|
alert('请输入音乐ID或URL');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 提取ID(支持URL格式)
|
||||||
|
let processedId = musicId;
|
||||||
|
const idMatch = musicId.match(/song\?id=(\d+)/);
|
||||||
|
if (idMatch) {
|
||||||
|
processedId = idMatch[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
// 显示进度条
|
||||||
|
$('#download-progress').removeClass('d-none');
|
||||||
|
$('#download-btn').prop('disabled', true).text('下载中...');
|
||||||
|
|
||||||
|
// 使用XMLHttpRequest来处理下载并获取响应头
|
||||||
|
const xhr = new XMLHttpRequest();
|
||||||
|
xhr.open('POST', '/Download', true);
|
||||||
|
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
|
||||||
|
xhr.responseType = 'blob';
|
||||||
|
|
||||||
|
xhr.onload = function() {
|
||||||
|
if (xhr.status === 200) {
|
||||||
|
// 获取自定义响应头
|
||||||
|
const downloadMessage = xhr.getResponseHeader('X-Download-Message');
|
||||||
|
const encodedFilename = xhr.getResponseHeader('X-Download-Filename');
|
||||||
|
const filename = encodedFilename ? decodeURIComponent(encodedFilename) : 'music.flac';
|
||||||
|
|
||||||
|
// 创建下载链接
|
||||||
|
const blob = xhr.response;
|
||||||
|
const url = window.URL.createObjectURL(blob);
|
||||||
|
const a = document.createElement('a');
|
||||||
|
a.href = url;
|
||||||
|
a.download = filename || 'music.flac';
|
||||||
|
document.body.appendChild(a);
|
||||||
|
a.click();
|
||||||
|
document.body.removeChild(a);
|
||||||
|
window.URL.revokeObjectURL(url);
|
||||||
|
|
||||||
|
// 显示完成提示
|
||||||
|
alert('✅ 音乐文件下载完成!');
|
||||||
|
console.log(`下载完成: ${filename}`);
|
||||||
|
if (downloadMessage) {
|
||||||
|
console.log(`服务器消息: ${downloadMessage}`);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
alert('下载失败,请重试');
|
||||||
|
}
|
||||||
|
|
||||||
|
// 重置按钮状态
|
||||||
|
$('#download-progress').addClass('d-none');
|
||||||
|
$('#download-btn').prop('disabled', false).text('下载音乐');
|
||||||
|
};
|
||||||
|
|
||||||
|
xhr.onerror = function() {
|
||||||
|
alert('下载出错,请重试');
|
||||||
|
$('#download-progress').addClass('d-none');
|
||||||
|
$('#download-btn').prop('disabled', false).text('下载音乐');
|
||||||
|
};
|
||||||
|
|
||||||
|
// 发送请求
|
||||||
|
const formData = `id=${encodeURIComponent(processedId)}&quality=${encodeURIComponent(quality)}`;
|
||||||
|
xhr.send(formData);
|
||||||
|
});
|
||||||
|
|
||||||
|
// 列表中的下载按钮点击事件
|
||||||
|
// 下载按钮点击跳转到下载功能
|
||||||
|
$(document).on('click', '.download-song', function() {
|
||||||
|
const musicId = $(this).data('id');
|
||||||
|
const songName = $(this).data('name');
|
||||||
|
|
||||||
|
if (!musicId) {
|
||||||
|
alert('无法获取音乐ID');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 填充下载ID并跳转到下载功能区域
|
||||||
|
$('#download_id').val(musicId);
|
||||||
|
$('#mode-select').val('download').trigger('change');
|
||||||
|
$('html,body').animate({scrollTop: $('#main-form').offset().top}, 300);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
|
Loading…
Reference in New Issue
Block a user