笔者是音乐爱好者,喜欢抖音上的各种音乐。
于是制作了这个小软件,它功能很简单:
利用酷狗接口搜索关键字音乐
勇哥2020/2/18号注: 程序里目前使用的接口已经做旧,不能在使用,需要读者自己去分析新接口。
在线播放音乐
显示歌词
可以下载音乐
这个小程序用到了Json解析,还有http下载网络资源等技术。请参考下面的源代码:
(第一次读取搜索列表取得的某一条歌曲的数据内容)
using Cosmokey.Utility; using netMarketing; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using www.skcircle.com; using System.Speech.Synthesis; using System.IO; using System.Runtime.Serialization.Formatters.Binary; using System.Net; namespace music { public partial class Form1 : Form { [Serializable] public class musicStruc { public string SongName; public string FileHash; public string AlbumID; public string imgurl; public string lyrics; public string play_url; } [Serializable] public class configStruc { public string searchtxt; public string savePath; public Image img; public string songname; public string lyrics; public string musicUrl; } private List<musicStruc> musicList = new List<musicStruc>(); configStruc config=new configStruc(); httpClass http = new httpClass(); public Form1() { InitializeComponent(); } private int readMusicList(string keyword,int pageNums=1,int pagesize=1) { var url = string.Format( "http://songsearch.kugou.com/song_search_v2?keyword={0}&page={1}&pagesize={2}&platform=WebFilter", httpClass.UrlDecode("抖音"), pageNums, pagesize); string jsonData = http.sendWebRequet(url); JObject jo = (JObject)JsonConvert.DeserializeObject(jsonData); musicList.Clear(); for (int i = 1; i < pagesize; i++) { var t = jo["data"]["lists"][i]; musicStruc data = new musicStruc(); data.SongName = t["SongName"].ToString(); data.FileHash = t["FileHash"].ToString(); data.AlbumID = t["AlbumID"].ToString(); musicList.Add(data); } return musicList.Count; } private void playerMusicByid(string Hash) { string AlbumID = "", songName = ""; var list = musicList.Where(s => s.FileHash == Hash); if (list.Count() > 0) { AlbumID = list.FirstOrDefault().AlbumID; songName = list.FirstOrDefault().SongName; } else return; var url2 = string.Format( "http://www.kugou.com/yy/index.php?r=play/getdata&hash={0}&album_id={1}&=", Hash, AlbumID); string jsondata2 = http.sendWebRequet(url2); JObject jo = (JObject)JsonConvert.DeserializeObject(jsondata2); var t = jo["data"]; var imgurl = t["img"].ToString(); var lyrics = t["lyrics"].ToString(); var play_url = t["play_url"].ToString(); config.songname = songName; config.lyrics = lyrics; config.img = http.DowloadCheckImg(imgurl); config.musicUrl = play_url; var list1=musicList.Where(s => s.FileHash == Hash); list1.FirstOrDefault().imgurl = imgurl; list1.FirstOrDefault().lyrics = lyrics; list1.FirstOrDefault().play_url = play_url; setUIfromConfig(config); } private void setUIfromConfig(configStruc data) { label1.Text =data.songname; picMusicImg.Image =data.img; rtblyrics.Text =data.lyrics; axWindowsMediaPlayer1.URL =data.musicUrl; tbSearchtxt.Text = data.searchtxt; tbMusicDownPath.Text = data.savePath; } private List<string> getMusicItems() { var list = new List<string>(); foreach(var m in musicList) { list.Add(m.SongName + "," + m.FileHash); } return list; } private void btnGetMusicList_Click(object sender, EventArgs e) { var txt = tbSearchtxt.Text; if (txt.Length >= 2) { config.searchtxt = txt; readMusicList(txt, 1, 20); clbMusicList.Items.Clear(); clbMusicList.Items.AddRange(getMusicItems().ToArray()); } } private void clbMusicList_MouseClick(object sender, MouseEventArgs e) { var obj = (CheckedListBox)sender; var txt = obj.SelectedItem.ToString(); if (txt.Length > 0) { playerMusicByid(txt.Split(',')[1]); } } private void Form1_Load(object sender, EventArgs e) { loadLastUiData(); } private void loadLastUiData() { var list1 = (List<musicStruc>)Serialize.FileDeSerialize(AppDomain.CurrentDomain.BaseDirectory + "data"); if (list1 != null) { musicList = list1; clbMusicList.Items.Clear(); clbMusicList.Items.AddRange(getMusicItems().ToArray()); } object list2 =Serialize.FileDeSerialize(AppDomain.CurrentDomain.BaseDirectory + "config"); if (list2 != null) { config = (configStruc)list2; setUIfromConfig(config); } } private void saveLastUidata() { if (musicList != null) { Serialize.FileSerialize(AppDomain.CurrentDomain.BaseDirectory + "data", musicList); config.savePath = tbMusicDownPath.Text; config.searchtxt = tbSearchtxt.Text; Serialize.FileSerialize(AppDomain.CurrentDomain.BaseDirectory + "config", config); } } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { saveLastUidata(); } private void btnDownSelectMusic_Click(object sender, EventArgs e) { var txt=tbMusicDownPath.Text; var selmusic = clbMusicList.SelectedItem.ToString(); var f1 = false; foreach(var m in clbMusicList.CheckedItems) { f1 = true; break; } if(!Directory.Exists(txt)) { Directory.CreateDirectory(txt); } if(Directory.Exists(txt) && selmusic.Length>0 && f1) { config.savePath = txt; var hashid = selmusic.Split(',')[1]; foreach(var m in musicList) { if(m.FileHash==hashid) { var f2=http.Download(m.play_url,config.savePath+"\\"+config.songname+".mp3"); if (f2) MessageBox.Show(m.SongName + " 下载完成!"); else MessageBox.Show(m.SongName + " 下载失败!"); break; } } } } } }
执行档下载(www.skcircle.com 少有人走的路)
附件:AxWindowsMediaPlayer的详细用法
属性/方法名: 说明:
[基本属性]
URL:String; 指定媒体位置,本机或网络地址
uiMode:String; 播放器界面模式,可为Full, Mini, None, Invisible
playState:integer; 播放状态,1=停止,2=暂停,3=播放,6=正在缓冲,9=正在连接,10=准备就绪
enableContextMenu:Boolean; 启用/禁用右键菜单
fullScreen:boolean; 是否全屏显示
[controls] wmp.controls //播放器基本控制
controls.play; 播放
controls.pause; 暂停
controls.stop; 停止
controls.currentPosition:double; 当前进度
controls.currentPositionString:string; 当前进度,字符串格式。如“00:23”
controls.fastForward; 快进
controls.fastReverse; 快退
controls.next; 下一曲
controls.previous; 上一曲
[settings] wmp.settings //播放器基本设置
settings.volume:integer; 音量,0-100
settings.autoStart:Boolean; 是否自动播放
settings.mute:Boolean; 是否静音
settings.playCount:integer; 播放次数
[currentMedia] wmp.currentMedia //当前媒体属性
currentMedia.duration:double; 媒体总长度
currentMedia.durationString:string; 媒体总长度,字符串格式。如“03:24”
currentMedia.getItemInfo(const string); 获取当前媒体信息"Title"=媒体标题,"Author"=艺术家,"Copyright"=版权信息,"Description"=媒体内容描述,"Duration"=持续时间(秒),"FileSize"=文件大小,"FileType"=文件类型,"sourceURL"=原始地址
currentMedia.setItemInfo(const string); 通过属性名设置媒体信息
currentMedia.name:string; 同 currentMedia.getItemInfo("Title")
[currentPlaylist] wmp.currentPlaylist //当前播放列表属性
currentPlaylist.count:integer; 当前播放列表所包含媒体数
currentPlaylist.Item[integer]; 获取或设置指定项目媒体信息,其子属性同wmp.currentMedia
[基本属性]
URL:String; 指定媒体位置,本机或网络地址
uiMode:String; 播放器界面模式,可为Full, Mini, None, Invisible
playState:integer; 播放状态,1=停止,2=暂停,3=播放,6=正在缓冲,9=正在连接,10=准备就绪
enableContextMenu:Boolean; 启用/禁用右键菜单
fullScreen:boolean; 是否全屏显示
[controls] wmp.controls //播放器基本控制
controls.play; 播放
controls.pause; 暂停
controls.stop; 停止
controls.currentPosition:double; 当前进度
controls.currentPositionString:string; 当前进度,字符串格式。如“00:23”
controls.fastForward; 快进
controls.fastReverse; 快退
controls.next; 下一曲
controls.previous; 上一曲
[settings] wmp.settings //播放器基本设置
settings.volume:integer; 音量,0-100
settings.autoStart:Boolean; 是否自动播放
settings.mute:Boolean; 是否静音
settings.playCount:integer; 播放次数
[currentMedia] wmp.currentMedia //当前媒体属性
currentMedia.duration:double; 媒体总长度
currentMedia.durationString:string; 媒体总长度,字符串格式。如“03:24”
currentMedia.getItemInfo(const string); 获取当前媒体信息"Title"=媒体标题,"Author"=艺术家,"Copyright"=版权信息,"Description"=媒体内容描述,"Duration"=持续时间(秒),"FileSize"=文件大小,"FileType"=文件类型,"sourceURL"=原始地址
currentMedia.setItemInfo(const string); 通过属性名设置媒体信息
currentMedia.name:string; 同 currentMedia.getItemInfo("Title")
[currentPlaylist] wmp.currentPlaylist //当前播放列表属性
currentPlaylist.count:integer; 当前播放列表所包含媒体数
currentPlaylist.Item[integer]; 获取或设置指定项目媒体信息,其子属性同wmp.currentMedia
AxWindowsMediaPlayer控件的属性收藏
MediaPlayer1.Play 播放
MediaPlayer1.Stop 停止
MediaPlayer1.Pause 暂停
MediaPlayer1.PlayCount 文件播放次数
MediaPlayer1.AutoRewind 是否循环播放
MediaPlayer1.Balance 声道
MediaPlayer1.Volume 音量
MediaPlayer1.Mute 静音
MediaPlayer1.EnableContextMenu 是否允许在控件上点击鼠标右键时弹出快捷菜单
MediaPlayer1.AnimationAtStart 是否在播放前先播放动画
MediaPlayer1.ShowControls 是否显示控件工具栏
MediaPlayer1.ShowAudioControls 是否显示声音控制按钮
MediaPlayer1.ShowDisplay 是否显示数据文件的相关信息
MediaPlayer1.ShowGotoBar 是否显示Goto栏
MediaPlayer1.ShowPositionControls 是否显示位置调节按钮
MediaPlayer1.ShowStatusBar 是否显示状态栏
MediaPlayer1.ShowTracker 是否显示进度条
MediaPlayer1.FastForward 快进
MediaPlayer1.FastReverse 快退
MediaPlayer1.Rate 快进/快退速率
MediaPlayer1.AllowChangeDisplaySize 是否允许自由设置播放图象大小
MediaPlayer1.DisplaySize 设置播放图象大小
1-MpDefaultSize 原始大小
2-MpHalfSize 原始大小的一半
3-MpDoubleSize 原始大小的两倍
4-MpFullScreen 全屏
5-MpOneSixteenthScreen 屏幕大小的1/16
6-MpOneFourthScreen 屏幕大小的1/4
7-MpOneHalfScreen 屏幕大小的1/2
MediaPlayer1.ClickToPlay 是否允许单击播放窗口启动Media Player
MediaPlayer1.Stop 停止
MediaPlayer1.Pause 暂停
MediaPlayer1.PlayCount 文件播放次数
MediaPlayer1.AutoRewind 是否循环播放
MediaPlayer1.Balance 声道
MediaPlayer1.Volume 音量
MediaPlayer1.Mute 静音
MediaPlayer1.EnableContextMenu 是否允许在控件上点击鼠标右键时弹出快捷菜单
MediaPlayer1.AnimationAtStart 是否在播放前先播放动画
MediaPlayer1.ShowControls 是否显示控件工具栏
MediaPlayer1.ShowAudioControls 是否显示声音控制按钮
MediaPlayer1.ShowDisplay 是否显示数据文件的相关信息
MediaPlayer1.ShowGotoBar 是否显示Goto栏
MediaPlayer1.ShowPositionControls 是否显示位置调节按钮
MediaPlayer1.ShowStatusBar 是否显示状态栏
MediaPlayer1.ShowTracker 是否显示进度条
MediaPlayer1.FastForward 快进
MediaPlayer1.FastReverse 快退
MediaPlayer1.Rate 快进/快退速率
MediaPlayer1.AllowChangeDisplaySize 是否允许自由设置播放图象大小
MediaPlayer1.DisplaySize 设置播放图象大小
1-MpDefaultSize 原始大小
2-MpHalfSize 原始大小的一半
3-MpDoubleSize 原始大小的两倍
4-MpFullScreen 全屏
5-MpOneSixteenthScreen 屏幕大小的1/16
6-MpOneFourthScreen 屏幕大小的1/4
7-MpOneHalfScreen 屏幕大小的1/2
MediaPlayer1.ClickToPlay 是否允许单击播放窗口启动Media Player
添加多首歌曲到播放列表
IWMPPlaylist playList = player.playlistCollection.newPlaylist("MyPlayList"); //新建列表 IWMPMedia media; foreach (DataRow drItem in MusicSettings.DtMusic.Rows) { media = player.newMedia(drItem["路径"].ToString()); //参数为歌曲路径 playList.appendItem(media); } player.currentPlaylist = playList; player.Ctlcontrols.play(); //开始播放 //也可以直接在当前列表上添加 player.currentPlaylist.clear(); IWMPMedia media; foreach (DataRow drItem in MusicSettings.DtMusic.Rows) { media = player.newMedia(drItem["路径"].ToString()); //参数为歌曲路径 player.currentPlaylist.appendItem(media); }
本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群: