using System;
|
using System.Collections.Generic;
|
using System.Net;
|
using System.Text;
|
using Shared;
|
namespace HDL_ON.UI.Music
|
{
|
public class A31LoveRadioList : FrameLayout
|
{
|
public A31LoveRadioList()
|
{
|
Tag = "Music";
|
}
|
|
VerticalRefreshLayout middViewLayout;
|
/// <summary>
|
/// 先加载界面出来
|
/// </summary>
|
public void Show()
|
{
|
#region 界面布局------
|
|
this.BackgroundColor = Color.ViewColor;
|
var topView = new TopView();
|
this.AddChidren(topView.TopFLayoutView());
|
topView.topNameBtn.TextID = StringId.radioLove;
|
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(Language.StringByID(StringId.radioLove));
|
}
|
/// <summary>
|
/// 加载数据的方法
|
/// </summary>
|
public void MusicView(string listName)
|
{
|
middViewLayout.RemoveAll();
|
for (int i = 0; i < A31MusicModel.Current.LoveRadioInfoList.Count; i++)
|
{
|
var radioInfo = A31MusicModel.Current.LoveRadioInfoList[i];
|
if (string.IsNullOrEmpty(radioInfo.Title))
|
{
|
//防止歌曲名字为空抛异常
|
radioInfo.Title = " ";
|
}
|
FrameLayout radioViewFl = new FrameLayout
|
{
|
Width = Application.GetRealWidth(375),
|
Height = Application.GetRealHeight(67),
|
};
|
middViewLayout.AddChidren(radioViewFl);
|
//默认电台图标
|
Button radioIconBtn = new Button
|
{
|
X = Application.GetRealWidth(16),
|
Y = Application.GetRealHeight(18),
|
Width = Application.GetMinRealAverage(32),
|
Height = Application.GetMinRealAverage(32),
|
UnSelectedImagePath = "MusicIcon/radioIcon.png",
|
};
|
radioViewFl.AddChidren(radioIconBtn);
|
//电台名称
|
Button radioNameBtn = new Button
|
{
|
X = Application.GetRealWidth(60),
|
Y = Application.GetRealHeight(23),
|
Width = Application.GetRealWidth(250),
|
Height = Application.GetRealHeight(22),
|
TextColor = Color.MusicTxet14Color,
|
TextSize = TextSize.Text16,
|
TextAlignment = TextAlignment.CenterLeft,
|
Tag = radioInfo.URL,
|
Text = radioInfo.Title.Trim()
|
};
|
radioViewFl.AddChidren(radioNameBtn);
|
//添加喜爱电台
|
Button loveIcon = new Button
|
{
|
X = Application.GetRealWidth(335),
|
Y = Application.GetRealHeight(20),
|
Width = Application.GetMinRealAverage(28),
|
Height = Application.GetMinRealAverage(28),
|
UnSelectedImagePath = "MusicIcon/loveSelected.png",
|
};
|
radioViewFl.AddChidren(loveIcon);
|
loveIcon.MouseUpEventHandler += (sender, e) =>
|
{
|
var radioselected = A31MusicModel.Current.LoveRadioInfoList.Find((m) => m.URL == radioInfo.URL);
|
if (radioselected != null)
|
{
|
///存在就删除
|
A31MusicModel.Current.LoveRadioInfoList.Remove(radioInfo);
|
}
|
A31MusicModel.Save();
|
radioViewFl.RemoveFromParent();
|
};
|
|
//点击控件
|
Button clickBtn = new Button
|
{
|
Width = Application.GetRealWidth(280),
|
Height = Application.GetRealHeight(44),
|
Tag = radioInfo,//标记播放哪一首歌曲
|
};
|
radioViewFl.AddChidren(clickBtn);
|
///点击播放事件
|
clickBtn.MouseUpEventHandler += (sender, e) =>
|
{
|
|
System.Threading.Tasks.Task.Run(() =>
|
{
|
System.Threading.Thread.Sleep(50);
|
Application.RunOnMainThread(() =>
|
{
|
//移除界面
|
A31MusicModel.Current.A31PlayStatus.Title = radioNameBtn.Text;
|
MainPage.BasePageView.RemoveViewByTag("Music");
|
System.Threading.Tasks.Task.Run(() =>
|
{
|
CnpushList(clickBtn.Tag as MusicInfo, listName);
|
});
|
});
|
});
|
|
};
|
|
}
|
}
|
/// <summary>
|
/// 定时更新当前播放音乐
|
/// </summary>
|
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 songNameBtn = (Button)view.GetChildren(1);//直接FrameLayout父控件找到该控件Button
|
if (A31MusicModel.Current.A31PlayStatus.Title == songNameBtn.Text.ToString())
|
{
|
songNameBtn.TextColor = Color.SelectedColor;
|
}
|
else
|
{
|
songNameBtn.TextColor = Color.MusicTxet14Color;
|
}
|
|
|
}
|
}
|
catch { }
|
|
});
|
}
|
});
|
updateSelectedMusicThread.Start();
|
}
|
|
/// <summary>
|
///收藏列表电台播放
|
/// </summary>
|
/// <param name="listName"></param>
|
public void CnpushList(MusicInfo musicInfo, string listName)
|
{
|
|
StringBuilder sb = new StringBuilder();
|
sb.AppendLine("<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>");
|
sb.AppendLine("<s:Envelope s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">");
|
sb.AppendLine("<s:Body>");
|
sb.AppendLine("<u:CreateQueue xmlns:u=\"urn:schemas-wiimu-com:service:PlayQueue:1\">");
|
sb.AppendLine("<QueueContext>");
|
sb.AppendLine("<?xml version="1.0" ?>");
|
sb.AppendLine("<PlayList>");
|
sb.AppendLine("<ListName>" + listName + "</ListName>");
|
sb.AppendLine("<ListInfo>");
|
sb.AppendLine("<Radio>1</Radio>");
|
sb.AppendLine("<SourceName>TuneIn</SourceName>");
|
sb.AppendLine("<TrackNumber>1</TrackNumber>");
|
sb.AppendLine("<SearchUrl>http://opml.radiotime.com/Tune.ashx?id=s112201&amp;partnerId=yvcOjvJP</SearchUrl>");
|
sb.AppendLine("<Quality>3</Quality>");
|
sb.AppendLine("<RealIndex>0</RealIndex>");
|
sb.AppendLine("<SrcParent></SrcParent>");
|
sb.AppendLine("<PicUrl></PicUrl>");
|
sb.AppendLine("</ListInfo>");
|
sb.AppendLine("<Tracks>");
|
|
var url = musicInfo.URL;
|
|
if (url != null)
|
{
|
url = url.TrimEnd('\n').Replace("&", "&amp;");
|
}
|
else
|
{
|
return;
|
}
|
sb.AppendLine("<Track" + 1 + ">");
|
sb.AppendLine("<Source>TuneIn</Source>");
|
sb.AppendLine("<URL>" + url + "</URL>");
|
sb.AppendLine("<Source>TuneIn</Source>");
|
sb.AppendLine("<Id>0</Id>");
|
sb.AppendLine("<Key>http://so.ard.iyyin.com/s/song_with_out?q=%E8%8A%B1%E9%83%BD%E7%94%B5%E5%8F%B0+100.5+%28%E6%B5%81%E8%A1%8C%E9%9F%B3%E4%B9%90%E5%89%8D40%29%20TuneIn&amp;size=50&amp;page=1</Key>");
|
sb.AppendLine("<Metadata>");
|
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&gt;");
|
sb.AppendLine("&lt;song:bitrate&gt;0&lt;/song:bitrate&gt;");
|
sb.AppendLine("&lt;song:id&gt;0&lt;/song:id&gt;");
|
sb.AppendLine("&lt;song:singerid&gt;0&lt;/song:singerid&gt;");
|
sb.AppendLine("&lt;song:albumid&gt;0&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;1000&quot;&gt;" + url + "&lt;/res&gt;");
|
sb.AppendLine("&lt;dc:title&gt;" + musicInfo.Title + "&lt;/dc:title&gt;");
|
sb.AppendLine("&lt;upnp:artist&gt;TuneIn&lt;/upnp:artist&gt;");
|
sb.AppendLine("&lt;upnp:album&gt;&lt;/upnp:album&gt;");
|
sb.AppendLine("&lt;upnp:albumArtURI&gt;" + musicInfo.Image + "&lt;/upnp:albumArtURI&gt;");
|
sb.AppendLine("&lt;/item&gt;");
|
sb.AppendLine("&lt;/DIDL-Lite&gt;");
|
sb.AppendLine("</Metadata>");
|
sb.AppendLine("</Track" + 1 + ">");
|
|
sb.AppendLine("</Tracks>");
|
sb.AppendLine("</PlayList>");
|
sb.AppendLine("</QueueContext>");
|
sb.AppendLine("</u:CreateQueue>");
|
sb.AppendLine("</s:Body>");
|
sb.AppendLine("</s:Envelope>");
|
//sendMusicLists(a31.IPAddress, a31.Port, "CreateQueue", sb.ToString());
|
sendMusicLists(A31MusicModel.Current.IPAddress, A31MusicModel.Current.Port, "CreateQueue", sb.ToString());
|
|
StringBuilder playString = new StringBuilder();
|
playString.AppendLine("<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>");
|
playString.AppendLine("<s:Envelope s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">");
|
playString.AppendLine("<s:Body>");
|
playString.AppendLine("<u:PlayQueueWithIndex xmlns:u=\"urn:schemas-wiimu-com:service:PlayQueue:1\">");
|
playString.AppendLine("<QueueName>" + listName + "</QueueName>");
|
playString.AppendLine("<Index>" + 1 + "</Index>");
|
playString.AppendLine("</u:PlayQueueWithIndex>");
|
playString.AppendLine("</s:Body>");
|
playString.AppendLine("</s:Envelope>");
|
|
play(A31MusicModel.Current.IPAddress, A31MusicModel.Current.Port, playString.ToString());
|
|
}
|
|
void sendMusicLists(string ip, int port, string soapAction, string listInfo)
|
{
|
WebClient webClient = new 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)
|
{
|
WebClient webClient = new 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
|
{
|
|
}
|
}
|
}
|
}
|