using System; using System.Collections.Generic; using System.Text; using Shared; namespace HDL_ON.UI.Music { public class A31LocalMusicList : FrameLayout { public A31LocalMusicList() { Tag = "Music"; } VerticalRefreshLayout middViewLayout; /// /// 先加载界面出来 /// public void Show() { #region 界面布局------ this.BackgroundColor = Color.ViewColor; var topView = new TopView(); this.AddChidren(topView.TopFLayoutView()); topView.topNameBtn.TextID = StringId.localMusic; topView.clickBackBtn.MouseUpEventHandler += (sender, e) => { if (updateSelectedMusicThread != null) { try { if (updateSelectedMusicThread.IsAlive) { updateSelectedMusicThread.Abort(); ///关闭线程 } } catch { } } this.RemoveFromParent(); }; middViewLayout = new VerticalRefreshLayout { BackgroundColor = Color.WhiteColor, Y = topView.fLayout.Bottom, Height = Application.GetRealHeight(H_W.H - H_W.T_Height), }; this.AddChidren(middViewLayout); middViewLayout.BeginHeaderRefreshingAction += () => { middViewLayout.EndHeaderRefreshing(); }; #endregion MusicView(); } /// /// 加载数据的方法 /// public void MusicView() { middViewLayout.RemoveAll(); for (int i = 0; i < MusicInfo.MusicInfoList.Count; i++) { var songs = MusicInfo.MusicInfoList[i]; if (songs == null) { continue; } songs.URL = "http://" + new Shared.Net.NetWiFi().IpAddress + ":" + com.hdl.on.Server.Port + "/" + songs.ID; if (string.IsNullOrEmpty(songs.Title)) { //防止歌曲名字为空抛异常 songs.Title = " "; } if (string.IsNullOrEmpty(songs.Artist)) { //防止歌手名字为空抛异常 songs.Artist = " "; } FrameLayout musicViewFl = new FrameLayout { Width = Application.GetRealWidth(375), Height = Application.GetRealHeight(44), }; middViewLayout.AddChidren(musicViewFl); //列表当前播放音乐图标 Button playIconBtn = new Button { X = Application.GetRealWidth(16), Y = Application.GetRealHeight(10), Width = Application.GetMinRealAverage(24), Height = Application.GetMinRealAverage(24), UnSelectedImagePath = "MusicIcon/playStatus.png", Visible = false, Name = "playStatus", Tag = songs.URL, }; musicViewFl.AddChidren(playIconBtn); //歌曲控件 Button songBtn = new Button { X = Application.GetRealWidth(16), Y = Application.GetRealHeight(11), Width = Application.GetRealWidth(100), Height = Application.GetRealHeight(22), TextColor = Color.MusicTxet14Color, TextSize = TextSize.Text16, TextAlignment = TextAlignment.CenterLeft, Name = "song", Tag = songs.URL, Text = songs.Title.Trim() }; musicViewFl.AddChidren(songBtn); var wText = songBtn.GetTextWidth();//获取文本宽度 ///(歌曲+歌手)宽度最大值时280 if (wText > 280) { songBtn.Width = Application.GetRealWidth(280); } else { songBtn.Width = wText + 5; } //歌手控件 Button singerBtn = new Button { X = songBtn.Right, Y = Application.GetRealHeight(11), Width = Application.GetRealWidth(280 - songBtn.Width), Height = Application.GetRealHeight(22), TextColor = Color.MusicNoTxetColor, TextSize = TextSize.Text12, TextAlignment = TextAlignment.CenterLeft, //Text =("-" +songs.Artist).Trim(), Name = "singer", Tag = songs.URL, Text = "-" + songs.Artist.Trim() }; musicViewFl.AddChidren(singerBtn); if (wText > 280) { ///歌名长度小于250才可以显示歌手出来 singerBtn.Width = Application.GetRealWidth(0); } //添加喜爱音乐控件 Button loveIcon = new Button { X = Application.GetRealWidth(291), Y = Application.GetRealHeight(8), Width = Application.GetMinRealAverage(28), Height = Application.GetMinRealAverage(28), UnSelectedImagePath = "MusicIcon/love.png", SelectedImagePath = "MusicIcon/loveSelected.png", }; musicViewFl.AddChidren(loveIcon); loveIcon.MouseUpEventHandler += (sender, e) => { loveIcon.IsSelected = !loveIcon.IsSelected; if (loveIcon.IsSelected) { ///查找音乐是否存在在列表 var music1 = A31MusicModel.Current.LoveMusicInfoList.Find((m) => m.URL == songs.URL); if (music1 == null) { ///没有存在就添加 A31MusicModel.Current.LoveMusicInfoList.Add(songs); } } else { ///查找音乐是否存在在列表 var music1 = A31MusicModel.Current.LoveMusicInfoList.Find((m) => m.URL == songs.URL); if (music1 != null) { ///存在就删除 A31MusicModel.Current.LoveMusicInfoList.Remove(songs); } } A31MusicModel.Save(); }; var music = A31MusicModel.Current.LoveMusicInfoList.Find((m) => m.URL == songs.URL); if (music != null) { loveIcon.IsSelected = true; } else { loveIcon.IsSelected = false; } //添加到我的列表 Button addIcon = new Button { X = Application.GetRealWidth(335), Y = Application.GetRealHeight(8), Width = Application.GetMinRealAverage(28), Height = Application.GetMinRealAverage(28), UnSelectedImagePath = "MusicIcon/addMusic1.png", }; musicViewFl.AddChidren(addIcon); addIcon.MouseUpEventHandler = (sender, e) => { new View.DialogView { }.FieListView(songs); }; //点击控件 Button clickBtn = new Button { Width = Application.GetRealWidth(280), Height = Application.GetRealHeight(44), Tag = songs,//标记播放哪一首歌曲 }; musicViewFl.AddChidren(clickBtn); ///点击播放事件 clickBtn.MouseUpEventHandler += (sender, e) => { System.Threading.Tasks.Task.Run(() => { System.Threading.Thread.Sleep(50); Application.RunOnMainThread(() => { //移除界面 A31MusicModel.Current.A31PlayStatus.Title = songBtn.Text; MainPage.BasePageView.RemoveViewByTag("Music"); System.Threading.Tasks.Task.Run(() => { PushList(songs, Language.StringByID(StringId.localMusic), MusicInfo.MusicInfoList); }); }); }); }; } } /// /// 定时更新当前播放音乐 /// System.Threading.Thread updateSelectedMusicThread; public void UpdateSelectedMusic() { updateSelectedMusicThread = new System.Threading.Thread(() => { while (this.Parent != null) { System.Threading.Thread.Sleep(1000); Application.RunOnMainThread(() => { try { for (int i = 0; i < middViewLayout.ChildrenCount; i++) { FrameLayout view = (FrameLayout)middViewLayout.GetChildren(i); var volIconBtn = (Button)view.GetChildren(0);//直接FrameLayout父控件找到该控件Button var songNameBtn = (Button)view.GetChildren(1);//直接FrameLayout父控件找到该控件Button var artistNameBtn = (Button)view.GetChildren(2);//直接FrameLayout父控件找到该控件Button if (A31MusicModel.Current.A31PlayStatus.TrackURL == songNameBtn.Tag.ToString()) { volIconBtn.Visible = true; songNameBtn.TextColor = Color.SelectedColor; songNameBtn.X = Application.GetRealWidth(48); artistNameBtn.X = songNameBtn.Right; artistNameBtn.TextColor = Color.SelectedColor; } else { volIconBtn.Visible = false; songNameBtn.TextColor = Color.MusicTxet14Color; songNameBtn.X = Application.GetRealWidth(16); artistNameBtn.X = songNameBtn.Right; artistNameBtn.TextColor = Color.MusicNoTxetColor; } } } catch { } }); } }); updateSelectedMusicThread.Start(); } /// /// 推送播放命令 /// /// 播放音乐 /// 列表名称 /// 推送列表(默认推50首) public void PushList(MusicInfo musicInfo, string listName, List musicList) { //最大发送的条数 int maxCount = 50; //找出当前点击音乐的索引 int statIndex = musicList.FindIndex((obj) => { return obj == musicInfo; }); //点击后面还有多少条音乐 int count = musicList.Count - statIndex; int endIndex = 0; if (maxCount < count) { //如果后面的音乐大于最大数,设置后面数据的最大索引 endIndex = statIndex + maxCount - 1; } else { //如果后面数据不多,就用总数减去最大条数,得到开始索引 statIndex = musicList.Count - maxCount - 1; endIndex = musicList.Count - 1; } //如果开始索引小于0,那就设置为第一条音乐 if (statIndex < 0) { statIndex = 0; } StringBuilder sb = new StringBuilder(); sb.AppendLine(""); sb.AppendLine(""); sb.AppendLine(""); sb.AppendLine(""); sb.AppendLine("<?xml version=\"1.0\"?>"); sb.AppendLine("<PlayList>"); sb.AppendLine("<ListName>DLNA" + listName + "</ListName>"); sb.AppendLine("<ListInfo>"); sb.AppendLine("<Radio>0</Radio>");// sb.AppendLine("<SourceName>UPnPServer</SourceName>");// sb.AppendLine("<MarkSearch>0</MarkSearch>"); sb.AppendLine("<TrackNumber>" + (endIndex - statIndex + 1) + "</TrackNumber>"); sb.AppendLine("<Quality>0</Quality>"); sb.AppendLine("<UpdateTime>5367</UpdateTime>"); sb.AppendLine("<LastPlayIndex>2</LastPlayIndex>"); sb.AppendLine("<SwitchPageMode>0</SwitchPageMode>"); sb.AppendLine("<CurrentPage>0</CurrentPage>"); sb.AppendLine("<TotalPages>0</TotalPages>"); sb.AppendLine("</ListInfo>"); sb.AppendLine("<Tracks>"); int number = 1; for (int i = statIndex, Tracknumber = 1; i <= endIndex; i++, Tracknumber++) { var tempMusicInfo = musicList[i]; if (musicInfo == tempMusicInfo) { number = Tracknumber; } if (tempMusicInfo.SourceType == "Local") { tempMusicInfo.URL = "http://" + new Shared.Net.NetWiFi().IpAddress + ":" + com.hdl.on.Server.Port + "/" + tempMusicInfo.ID; } sb.AppendLine("<Track" + Tracknumber + ">"); sb.AppendLine("<URL>" + tempMusicInfo.URL + "</URL>"); sb.AppendLine("<Metadata>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;"); sb.AppendLine("&lt;DIDL-Lite xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:upnp=&quot;urn:schemas-upnp-org:metadata-1-0/upnp/&quot; xmlns:song=&quot;www.wiimu.com/song/&quot; xmlns=&quot;urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/&quot;&gt;"); sb.AppendLine("&lt;upnp:class&gt;object.item.audioItem.musicTrack&lt;/upnp:class&gt;"); sb.AppendLine("&lt;item id=&quot;0&quot;&gt;"); sb.AppendLine("&lt;song:subid&gt;&lt;/song:subid&gt;"); sb.AppendLine("&lt;song:description&gt;unknown&lt;/song:description&gt;"); sb.AppendLine("&lt;song:skiplimit&gt;6&lt;/song:skiplimit&gt;"); sb.AppendLine("&lt;song:id&gt;" + tempMusicInfo.ID + "&lt;/song:id&gt;"); sb.AppendLine("&lt;song:like&gt;0&lt;/song:like&gt;"); sb.AppendLine("&lt;song:singerid&gt;0&lt;/song:singerid&gt;"); sb.AppendLine("&lt;song:albumid&gt;" + tempMusicInfo.AlbumId + "&lt;/song:albumid&gt;"); sb.AppendLine("&lt;res protocolInfo=&quot;http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;&quot; duration=&quot;" + "0:0:0.0" + "&quot;&gt;" + tempMusicInfo.URL + "&lt;/res&gt;"); sb.AppendLine("&lt;dc:title&gt;" + tempMusicInfo.Title + "&lt;/dc:title&gt;"); sb.AppendLine("&lt;dc:creator&gt;DJ Sanny J&lt;/dc:creator&gt;"); sb.AppendLine("&lt;upnp:artist&gt;" + tempMusicInfo.Artist + "&lt;/upnp:artist&gt;"); sb.AppendLine("&lt;upnp:album&gt;" + tempMusicInfo.Album + "&lt;/upnp:album&gt;"); sb.AppendLine("&lt;upnp:albumArtURI&gt;unknown&lt;/upnp:albumArtURI&gt;"); sb.AppendLine("&lt;/item&gt;"); sb.AppendLine("&lt;/DIDL-Lite&gt;"); sb.AppendLine("</Metadata>"); sb.AppendLine("<Id>" + tempMusicInfo.ID + "</Id>"); sb.AppendLine("<Source>STATION-NETWORK</Source>");//UPnPServer sb.AppendLine("<Key>" + tempMusicInfo.URL + "</Key>"); sb.AppendLine("</Track" + Tracknumber + ">"); } sb.AppendLine("</Tracks>"); sb.AppendLine("</PlayList>"); sb.AppendLine(""); sb.AppendLine(""); sb.AppendLine(""); sb.AppendLine(""); SendMusicLists(A31MusicModel.Current.IPAddress, A31MusicModel.Current.Port, "CreateQueue", sb.ToString()); StringBuilder playString = new StringBuilder(); playString.AppendLine(""); playString.AppendLine(""); playString.AppendLine(""); playString.AppendLine(""); playString.AppendLine("DLNA" + listName + ""); playString.AppendLine("" + number + ""); playString.AppendLine(""); playString.AppendLine(""); playString.AppendLine(""); Play(A31MusicModel.Current.IPAddress, A31MusicModel.Current.Port, playString.ToString()); } void SendMusicLists(string ip, int port, string soapAction, string listInfo) { System.Net.WebClient webClient = new System.Net.WebClient(); webClient.Headers.Add("SOAPACTION", "\"urn:schemas-wiimu-com:service:PlayQueue:1#" + soapAction + "\""); webClient.Headers.Add("CONTENT-TYPE", "text/xml; charset=\"utf-8\""); try { byte[] recevieBytes = webClient.UploadData(new Uri("http://" + ip + ":" + port + "/upnp/control/PlayQueue1"), "POST", System.Text.Encoding.UTF8.GetBytes(listInfo)); var s = System.Text.Encoding.UTF8.GetString(recevieBytes, 0, recevieBytes.Length); } catch { } } void Play(string ip, int port, string info) { System.Net.WebClient webClient = new System.Net.WebClient(); webClient.Headers.Add("SOAPACTION", "\"urn:schemas-wiimu-com:service:PlayQueue:1#PlayQueueWithIndex\""); webClient.Headers.Add("CONTENT-TYPE", "text/xml; charset=\"utf-8\""); try { byte[] recevieBytes = webClient.UploadData(new Uri("http://" + ip + ":" + port + "/upnp/control/PlayQueue1"), "POST", System.Text.Encoding.UTF8.GetBytes(info)); var s = System.Text.Encoding.UTF8.GetString(recevieBytes, 0, recevieBytes.Length); } catch { } } } }