BililiveRecorder/BililiveRecorder.WPF/MainWindow.xaml.cs

276 lines
7.8 KiB
C#
Raw Normal View History

2018-10-25 19:20:23 +08:00
using Autofac;
using BililiveRecorder.Core;
using BililiveRecorder.FlvProcessor;
2018-03-21 20:56:56 +08:00
using NLog;
using System;
using System.Collections.ObjectModel;
using System.IO;
2018-03-12 18:57:20 +08:00
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Threading;
2018-03-24 09:48:06 +08:00
2018-03-12 18:57:20 +08:00
namespace BililiveRecorder.WPF
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
2018-03-21 20:56:56 +08:00
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
private const int MAX_LOG_ROW = 25;
private const string LAST_WORK_DIR_FILE = "lastworkdir";
2018-03-21 20:56:56 +08:00
2018-10-25 19:20:23 +08:00
private IContainer Container { get; set; }
private ILifetimeScope RootScope { get; set; }
2018-11-28 22:29:35 +08:00
public IRecorder Recorder { get; set; }
2018-03-21 20:56:56 +08:00
public ObservableCollection<string> Logs { get; set; } =
new ObservableCollection<string>()
{
2018-03-28 18:55:22 +08:00
"当前版本:" + BuildInfo.Version,
2018-03-21 20:56:56 +08:00
"网站: https://rec.danmuji.org",
"QQ群 689636812",
2018-03-21 20:56:56 +08:00
};
public static void AddLog(string message) => _AddLog?.Invoke(message);
private static Action<string> _AddLog;
2018-03-12 18:57:20 +08:00
public MainWindow()
{
_AddLog = (message) =>
Log.Dispatcher.BeginInvoke(
DispatcherPriority.DataBind,
new Action(() => { Logs.Add(message); while (Logs.Count > MAX_LOG_ROW) { Logs.RemoveAt(0); } })
);
2018-11-01 23:40:50 +08:00
2018-10-25 19:20:23 +08:00
var builder = new ContainerBuilder();
builder.RegisterModule<FlvProcessorModule>();
builder.RegisterModule<CoreModule>();
Container = builder.Build();
RootScope = Container.BeginLifetimeScope("recorder_root");
2018-11-28 22:29:35 +08:00
Recorder = RootScope.Resolve<IRecorder>();
2018-03-21 20:56:56 +08:00
2018-03-12 18:57:20 +08:00
InitializeComponent();
2018-03-21 20:56:56 +08:00
DataContext = this;
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
2018-11-07 15:42:30 +08:00
Title += " 版本号: " + BuildInfo.Version + " " + BuildInfo.HeadShaShort;
string workdir = string.Empty;
try
{
workdir = File.ReadAllText(LAST_WORK_DIR_FILE);
}
catch (Exception) { }
2018-11-01 23:40:50 +08:00
var wdw = new WorkDirectoryWindow()
{
Owner = this,
WorkPath = workdir,
2018-11-01 23:40:50 +08:00
};
if (wdw.ShowDialog() == true)
{
workdir = wdw.WorkPath;
}
else
{
Environment.Exit(-1);
return;
}
2018-11-01 23:40:50 +08:00
if (!Recorder.Initialize(workdir))
{
2018-11-01 23:40:50 +08:00
MessageBox.Show("初始化错误", "录播姬", MessageBoxButton.OK, MessageBoxImage.Error);
Environment.Exit(-2);
return;
}
2018-03-21 20:56:56 +08:00
}
2018-03-24 09:48:06 +08:00
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
_AddLog = null;
Recorder.Shutdown();
try
{
File.WriteAllText(LAST_WORK_DIR_FILE, Recorder.Config.WorkDirectory);
}
catch (Exception) { }
2018-03-24 09:48:06 +08:00
}
2018-03-21 20:56:56 +08:00
private void TextBlock_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
{
2018-03-24 02:27:58 +08:00
if (sender is TextBlock textBlock)
{
Clipboard.SetText(textBlock.Text);
}
2018-03-21 20:56:56 +08:00
}
2018-03-24 02:27:58 +08:00
/// <summary>
/// 触发回放剪辑
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
2018-03-21 22:41:34 +08:00
private void Clip_Click(object sender, RoutedEventArgs e)
{
2018-03-24 02:27:58 +08:00
var rr = _GetSenderAsRecordedRoom(sender);
2018-10-25 19:20:23 +08:00
if (rr == null)
{
return;
}
2018-03-21 22:41:34 +08:00
Task.Run(() => rr.Clip());
}
2018-03-24 02:27:58 +08:00
/// <summary>
/// 启用自动录制
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void EnableAutoRec(object sender, RoutedEventArgs e)
{
var rr = _GetSenderAsRecordedRoom(sender);
2018-10-25 19:20:23 +08:00
if (rr == null)
{
return;
}
2018-03-24 02:27:58 +08:00
Task.Run(() => rr.Start());
}
/// <summary>
/// 禁用自动录制
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DisableAutoRec(object sender, RoutedEventArgs e)
{
var rr = _GetSenderAsRecordedRoom(sender);
2018-10-25 19:20:23 +08:00
if (rr == null)
{
return;
}
2018-03-24 02:27:58 +08:00
Task.Run(() => rr.Stop());
}
/// <summary>
/// 手动触发尝试录制
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void TriggerRec(object sender, RoutedEventArgs e)
{
var rr = _GetSenderAsRecordedRoom(sender);
2018-10-25 19:20:23 +08:00
if (rr == null)
{
return;
}
2018-03-24 02:27:58 +08:00
Task.Run(() => rr.StartRecord());
}
/// <summary>
/// 切断当前录制
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void CutRec(object sender, RoutedEventArgs e)
{
var rr = _GetSenderAsRecordedRoom(sender);
2018-10-25 19:20:23 +08:00
if (rr == null)
{
return;
}
2018-03-24 02:27:58 +08:00
Task.Run(() => rr.StopRecord());
}
/// <summary>
/// 删除当前房间
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void RemoveRecRoom(object sender, RoutedEventArgs e)
{
var rr = _GetSenderAsRecordedRoom(sender);
2018-10-25 19:20:23 +08:00
if (rr == null)
{
return;
}
2018-03-24 08:58:46 +08:00
Recorder.RemoveRoom(rr);
2018-03-24 02:27:58 +08:00
}
/// <summary>
/// 全部直播间启用自动录制
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void EnableAllAutoRec(object sender, RoutedEventArgs e)
{
2018-11-28 22:29:35 +08:00
Recorder.ToList().ForEach(rr => Task.Run(() => rr.Start()));
2018-03-24 02:27:58 +08:00
}
/// <summary>
/// 全部直播间禁用自动录制
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DisableAllAutoRec(object sender, RoutedEventArgs e)
{
2018-11-28 22:29:35 +08:00
Recorder.ToList().ForEach(rr => Task.Run(() => rr.Stop()));
2018-03-24 02:27:58 +08:00
}
/// <summary>
/// 添加直播间
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void AddRoomidButton_Click(object sender, RoutedEventArgs e)
{
if (int.TryParse(AddRoomidTextBox.Text, out int roomid))
{
if (roomid > 0)
{
Recorder.AddRoom(roomid);
}
else
{
logger.Info("房间号是大于0的数字");
}
}
else
{
logger.Info("房间号是数字!");
}
AddRoomidTextBox.Text = string.Empty;
}
private void SettingsButton_Click(object sender, RoutedEventArgs e)
{
ShowSettingsWindow();
}
private void ShowSettingsWindow()
2018-03-24 02:27:58 +08:00
{
2018-11-01 23:40:50 +08:00
var sw = new SettingsWindow(this, Recorder.Config);
2018-03-24 11:07:43 +08:00
if (sw.ShowDialog() == true)
{
2018-11-01 23:40:50 +08:00
sw.Config.CopyPropertiesTo(Recorder.Config);
2018-03-24 11:07:43 +08:00
}
2018-03-24 02:27:58 +08:00
}
2018-10-24 14:33:05 +08:00
private IRecordedRoom _GetSenderAsRecordedRoom(object sender) => (sender as Button)?.DataContext as IRecordedRoom;
2018-03-24 09:48:06 +08:00
2018-03-12 18:57:20 +08:00
}
}