原创C#源码,抖音热门音乐播放器

笔者是音乐爱好者,喜欢抖音上的各种音乐。

于是制作了这个小软件,它功能很简单:

  1. 利用酷狗接口搜索关键字音乐

    勇哥2020/2/18号注: 程序里目前使用的接口已经做旧,不能在使用,需要读者自己去分析新接口。

  2. 在线播放音乐

  3. 显示歌词

  4. 可以下载音乐



这个小程序用到了Json解析,还有http下载网络资源等技术。请参考下面的源代码:


image.png
(第一次读取搜索列表取得的某一条歌曲的数据内容)


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 
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  

添加多首歌曲到播放列表

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,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864