using IOTContainer.Common;
using IOTContainer.Model;
using IOTContainer.MvvmBase;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Media;
namespace IOTContainer.ViewModel
{
public class TouchMeViewModel: ViewModelBase
{
///
/// 顶部字幕
///
private string _topText;
public string TopText
{
get { return _topText; }
set { base.SetProperty(ref _topText, value, "TopText"); }
}
///
/// 顶部字幕颜色
///
private SolidColorBrush _topColor;
public SolidColorBrush TopColor
{
get { return _topColor; }
set { base.SetProperty(ref _topColor, value, "TopColor"); }
}
///
/// 顶部字幕大小
///
private int _topSize;
public int TopSize
{
get { return _topSize; }
set { base.SetProperty(ref _topSize, value, "TopSize"); }
}
///
/// 底部字幕
///
private string _bottomText;
public string BottomText
{
get { return _bottomText; }
set { base.SetProperty(ref _bottomText, value, "BottomText"); }
}
///
/// 底部字幕颜色
///
private SolidColorBrush _bottomColor;
public SolidColorBrush BottomColor
{
get { return _bottomColor; }
set { base.SetProperty(ref _bottomColor, value, "BottomColor"); }
}
///
/// 底部字幕大小
///
private int _bottomSize;
public int BottomSize
{
get { return _bottomSize; }
set { base.SetProperty(ref _bottomSize, value, "BottomSize"); }
}
private bool _topIsEmpty;
private bool _bottomIsEmpty;
public TouchMeViewModel()
{
try
{
#region 字幕相关
TopText = "";
TopColor = new SolidColorBrush(Colors.White);
TopSize = 16;
BottomText = "";
BottomColor = new SolidColorBrush(Colors.White);
BottomSize = 16;
Task.Run(() => { PlayTopSubtitle(); });
Task.Run(() => { PlayBottomSubtitle(); });
#endregion
}
catch (Exception e)
{
Log.MyLog.WriteLogFile("字幕播放出错:" + e.Message);
}
}
///
/// 播放顶部字幕
///
public void PlayTopSubtitle()
{
while (ComParameters.Parameters.IsPlay)
{
try
{
if (ComParameters.Parameters.PlaySubtitleToken == null || !ComParameters.Parameters.PlaySubtitleToken.Token.IsCancellationRequested)
{
Task.Run(() => HttpComm.Http.GetSubtitle());
}
var basePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Programme");
var filePath = Path.Combine(basePath, "SubtitleList.txt");
ComParameters.srwl.EnterReadLock();
var subcontent = FileManage.ReadJsonFile(filePath);
ComParameters.srwl.ExitReadLock();
if (!string.IsNullOrEmpty(subcontent) && subcontent != "[]")//列表不为空
{
var subList = JsonConvert.DeserializeObject>(subcontent);
var now = DateTime.Now;
subList = subList.Where(p => p.startTime <= now && p.endTime >= now && p.newsLoca == 1).ToList();
if (!subList.Any())//列表为空
{
_topIsEmpty = true;
if (_bottomIsEmpty)
{
ComParameters.Parameters.SubListIsEmpty = true;
}
Task.Delay(ComParameters.Parameters.waitMilliseconds).Wait();
}
else
{
if (ComParameters.Parameters.PlaySubtitleToken != null)
{
ComParameters.Parameters.PlaySubtitleToken.Dispose();
}
ComParameters.Parameters.PlaySubtitleToken = new CancellationTokenSource();
foreach (var item in subList)
{
try
{
//设置顶部字幕
if (null != ComParameters.Parameters.ScreenWindow)
{
ComParameters.Parameters.ScreenWindow.Dispatcher.Invoke(() =>
{
TopText = item.newsText;
TopColor = new SolidColorBrush((Color)ColorConverter.ConvertFromString(item.fontColor));
TopSize = item.fontSize;
});
}
if (!ComParameters.Parameters.PlaySubtitleToken.Token.IsCancellationRequested)
{
try
{
Task.Delay(200).Wait();
//通过可取消标记 通知是否取消当前方法
Task.Delay(TimeSpan.FromSeconds(ComParameters.Parameters.TopTotalWidth / (double)ComParameters.Parameters.subtitleSpeed), ComParameters.Parameters.PlaySubtitleToken.Token).Wait();
TopText = "";
}
catch (Exception)//收到取消信号
{
var task = Task.Run(() =>
{
HttpComm.Http.GetSubtitle();
});
task.Wait();
TopText = "";
break;
}
}
else//收到取消信号
{
var task = Task.Run(() =>
{
HttpComm.Http.GetSubtitle();
});
task.Wait();
TopText = "";
break;
}
}
catch (Exception suex)
{
Log.MyLog.WriteLogFile("顶部字幕播放失败:" + suex);
}
}
}
}
else
{
_topIsEmpty = true;
_bottomIsEmpty = true;
ComParameters.Parameters.SubListIsEmpty = true;
Task.Delay(ComParameters.Parameters.waitMilliseconds).Wait();
}
}
catch (Exception ex)
{
Log.MyLog.WriteLogFile("顶部字幕播放失败:" + ex);
}
}
}
///
/// 播放底部字幕
///
public void PlayBottomSubtitle()
{
while (ComParameters.Parameters.IsPlay)
{
try
{
var basePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Programme");
var filePath = Path.Combine(basePath, "SubtitleList.txt");
ComParameters.srwl.EnterReadLock();
var subcontent = FileManage.ReadJsonFile(filePath);
ComParameters.srwl.ExitReadLock();
if (!string.IsNullOrEmpty(subcontent) && subcontent != "[]")//列表为空
{
var subList = JsonConvert.DeserializeObject>(subcontent);
var now = DateTime.Now;
subList = subList.Where(p => p.startTime <= now && p.endTime >= now && p.newsLoca == 2).ToList();
if (!subList.Any())//列表为空
{
_bottomIsEmpty = true;
if (_topIsEmpty)
{
ComParameters.Parameters.SubListIsEmpty = true;
}
Task.Delay(ComParameters.Parameters.waitMilliseconds).Wait();
}
else
{
if (ComParameters.Parameters.PlaySubtitleToken != null)
{
ComParameters.Parameters.PlaySubtitleToken.Dispose();
}
ComParameters.Parameters.PlaySubtitleToken = new CancellationTokenSource();
foreach (var item in subList)
{
try
{
if (null != ComParameters.Parameters.ScreenWindow)
{
ComParameters.Parameters.ScreenWindow.Dispatcher.Invoke(() =>
{
BottomText = item.newsText;
BottomColor = new SolidColorBrush((Color)ColorConverter.ConvertFromString(item.fontColor));
BottomSize = item.fontSize;
});
}
if (!ComParameters.Parameters.PlaySubtitleToken.Token.IsCancellationRequested)
{
try
{
Task.Delay(200).Wait();
//通过可取消标记 通知是否取消当前方法
Task.Delay(TimeSpan.FromSeconds(ComParameters.Parameters.BottomTotalWidth / (double)ComParameters.Parameters.subtitleSpeed), ComParameters.Parameters.PlaySubtitleToken.Token).Wait();
BottomText = "";
}
catch (Exception)//收到取消信号
{
var task = Task.Run(() =>
{
HttpComm.Http.GetSubtitle();
});
task.Wait();
BottomText = "";
break;
}
}
else//收到取消信号
{
var task = Task.Run(() =>
{
HttpComm.Http.GetSubtitle();
});
task.Wait();
BottomText = "";
break;
}
}
catch (Exception suex)
{
Log.MyLog.WriteLogFile("底部字幕播放失败:" + suex);
}
}
}
}
else
{
_topIsEmpty = true;
_bottomIsEmpty = true;
ComParameters.Parameters.SubListIsEmpty = true;
Task.Delay(ComParameters.Parameters.waitMilliseconds).Wait();
}
}
catch (Exception ex)
{
Log.MyLog.WriteLogFile("底部字幕播放失败:" + ex);
}
}
}
}
}