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><?xml version="1.0" encoding="UTF-8"?>");
sb.AppendLine("<DIDL-Lite xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/" xmlns:song="www.wiimu.com/song/" xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/">");
sb.AppendLine("<upnp:class>object.item.audioItem.musicTrack</upnp:class>");
sb.AppendLine("<item id="0">");
sb.AppendLine("<song:subid></song:subid>");
sb.AppendLine("<song:description>unknown</song:description>");
sb.AppendLine("<song:skiplimit>6</song:skiplimit>");
sb.AppendLine("<song:id>" + tempMusicInfo.ID + "</song:id>");
sb.AppendLine("<song:like>0</song:like>");
sb.AppendLine("<song:singerid>0</song:singerid>");
sb.AppendLine("<song:albumid>" + tempMusicInfo.AlbumId + "</song:albumid>");
sb.AppendLine("<res protocolInfo="http-get:*:audio/mpeg:DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;" duration="" + "0:0:0.0" + "">" + tempMusicInfo.URL + "</res>");
sb.AppendLine("<dc:title>" + tempMusicInfo.Title + "</dc:title>");
sb.AppendLine("<dc:creator>DJ Sanny J</dc:creator>");
sb.AppendLine("<upnp:artist>" + tempMusicInfo.Artist + "</upnp:artist>");
sb.AppendLine("<upnp:album>" + tempMusicInfo.Album + "</upnp:album>");
sb.AppendLine("<upnp:albumArtURI>unknown</upnp:albumArtURI>");
sb.AppendLine("</item>");
sb.AppendLine("</DIDL-Lite>");
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
{
}
}
}
}