PageRenderTime 128ms CodeModel.GetById 27ms RepoModel.GetById 1ms app.codeStats 2ms

/JMMServer/JMMServer/MainWindow.xaml.cs

https://bitbucket.org/gibwar/jmm-test
C# | 2751 lines | 1861 code | 502 blank | 388 comment | 189 complexity | 24b39fe976af87f47037b3de7c6d2f94 MD5 | raw file

Large files files are truncated, but you can click here to view the full file

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using JMMServer.Databases;
  6. using NHibernate;
  7. using JMMServer.Commands;
  8. using JMMServer.Repositories;
  9. using JMMServer.Entities;
  10. using NLog;
  11. using System.Threading;
  12. using System.IO;
  13. using JMMFileHelper;
  14. using System.ServiceModel;
  15. using System.ServiceModel.Description;
  16. using JMMContracts;
  17. using JMMServer.WebCache;
  18. using System.ComponentModel;
  19. using System.ServiceModel.Channels;
  20. using System.Runtime.Serialization;
  21. using System.Xml;
  22. using JMMServer.AniDB_API.Commands;
  23. using System.Windows;
  24. using NLog.Config;
  25. using System.Collections.ObjectModel;
  26. using System.Windows.Input;
  27. using JMMServer.Providers.TvDB;
  28. using JMMServer.Providers.MovieDB;
  29. using JMMServer.Providers.TraktTV;
  30. using System.Data.SQLite;
  31. using System.Data.SqlClient;
  32. using System.Data;
  33. using JMMServer.MyAnime2Helper;
  34. using JMMServer.ImageDownload;
  35. using Microsoft.SqlServer.Management.Smo;
  36. using JMMServer.Providers.MyAnimeList;
  37. using JMMServer.Commands.MAL;
  38. using JMMServer.Commands.WebCache;
  39. using System.Diagnostics;
  40. using JMMServer.UI;
  41. using System.ServiceModel.Dispatcher;
  42. using BinaryNorthwest;
  43. using System.Collections;
  44. using System.ServiceModel.Web;
  45. using JMMServer.Providers.Azure;
  46. using JMMServer.Commands.Azure;
  47. namespace JMMServer
  48. {
  49. /// <summary>
  50. /// Interaction logic for MainWindow.xaml
  51. /// </summary>
  52. public partial class MainWindow : Window
  53. {
  54. private System.Windows.Forms.NotifyIcon TippuTrayNotify;
  55. private System.Windows.Forms.ContextMenuStrip ctxTrayMenu;
  56. private bool isAppExiting = false;
  57. private static bool doneFirstTrakTinfo = false;
  58. private static Logger logger = LogManager.GetCurrentClassLogger();
  59. private static DateTime lastTraktInfoUpdate = DateTime.Now;
  60. private static DateTime lastVersionCheck = DateTime.Now.AddDays(-5);
  61. private static BlockingList<FileSystemEventArgs> queueFileEvents = new BlockingList<FileSystemEventArgs>();
  62. private static BackgroundWorker workerFileEvents = new BackgroundWorker();
  63. //private static Uri baseAddress = new Uri("http://localhost:8111/JMMServer");
  64. private static string baseAddressImageString = @"http://localhost:{0}/JMMServerImage";
  65. private static string baseAddressStreamingString = @"http://localhost:{0}/JMMServerStreaming";
  66. private static string baseAddressStreamingStringMex = @"net.tcp://localhost:{0}/JMMServerStreaming/mex";
  67. private static string baseAddressBinaryString = @"http://localhost:{0}/JMMServerBinary";
  68. private static string baseAddressMetroString = @"http://localhost:{0}/JMMServerMetro";
  69. private static string baseAddressMetroImageString = @"http://localhost:{0}/JMMServerMetroImage";
  70. private static string baseAddressRESTString = @"http://localhost:{0}/JMMServerREST";
  71. //private static Uri baseAddressTCP = new Uri("net.tcp://localhost:8112/JMMServerTCP");
  72. //private static ServiceHost host = null;
  73. //private static ServiceHost hostTCP = null;
  74. private static ServiceHost hostImage = null;
  75. private static ServiceHost hostStreaming = null;
  76. private static ServiceHost hostBinary = null;
  77. private static ServiceHost hostMetro = null;
  78. private static ServiceHost hostMetroImage = null;
  79. private static WebServiceHost hostREST = null;
  80. private static BackgroundWorker workerImport = new BackgroundWorker();
  81. private static BackgroundWorker workerScanFolder = new BackgroundWorker();
  82. private static BackgroundWorker workerScanDropFolders = new BackgroundWorker();
  83. private static BackgroundWorker workerRemoveMissing = new BackgroundWorker();
  84. private static BackgroundWorker workerDeleteImportFolder = new BackgroundWorker();
  85. private static BackgroundWorker workerTraktFriends = new BackgroundWorker();
  86. private static BackgroundWorker workerMyAnime2 = new BackgroundWorker();
  87. private static BackgroundWorker workerMediaInfo = new BackgroundWorker();
  88. private static BackgroundWorker workerSetupDB = new BackgroundWorker();
  89. private static System.Timers.Timer autoUpdateTimer = null;
  90. private static System.Timers.Timer autoUpdateTimerShort = null;
  91. private static List<FileSystemWatcher> watcherVids = null;
  92. BackgroundWorker downloadImagesWorker = new BackgroundWorker();
  93. public static Uri baseAddressBinary
  94. {
  95. get
  96. {
  97. return new Uri(string.Format(baseAddressBinaryString, ServerSettings.JMMServerPort));
  98. }
  99. }
  100. public static Uri baseAddressImage
  101. {
  102. get
  103. {
  104. return new Uri(string.Format(baseAddressImageString, ServerSettings.JMMServerPort));
  105. }
  106. }
  107. public static Uri baseAddressStreaming
  108. {
  109. get
  110. {
  111. return new Uri(string.Format(baseAddressStreamingString, ServerSettings.JMMServerPort));
  112. }
  113. }
  114. public static Uri baseAddressStreamingMex
  115. {
  116. get
  117. {
  118. return new Uri(string.Format(baseAddressStreamingStringMex, ServerSettings.JMMServerFilePort));
  119. }
  120. }
  121. public static Uri baseAddressMetro
  122. {
  123. get
  124. {
  125. return new Uri(string.Format(baseAddressMetroString, ServerSettings.JMMServerPort));
  126. }
  127. }
  128. public static Uri baseAddressMetroImage
  129. {
  130. get
  131. {
  132. return new Uri(string.Format(baseAddressMetroImageString, ServerSettings.JMMServerPort));
  133. }
  134. }
  135. public static Uri baseAddressREST
  136. {
  137. get
  138. {
  139. return new Uri(string.Format(baseAddressRESTString, ServerSettings.JMMServerPort));
  140. }
  141. }
  142. private Mutex mutex;
  143. private readonly string mutexName = "JmmServer3.0Mutex";
  144. public MainWindow()
  145. {
  146. InitializeComponent();
  147. //HibernatingRhinos.Profiler.Appender.NHibernate.NHibernateProfiler.Initialize();
  148. try
  149. {
  150. UnhandledExceptionManager.AddHandler();
  151. }
  152. catch {}
  153. if (!ServerSettings.AllowMultipleInstances)
  154. {
  155. try
  156. {
  157. mutex = Mutex.OpenExisting(mutexName);
  158. //since it hasn't thrown an exception, then we already have one copy of the app open.
  159. MessageBox.Show("JMM Server is already running. Please check your system tray (notification area).",
  160. "JMM Server", MessageBoxButton.OK, MessageBoxImage.Error);
  161. Environment.Exit(0);
  162. }
  163. catch (Exception Ex)
  164. {
  165. //since we didn't find a mutex with that name, create one
  166. Debug.WriteLine("Exception thrown:" + Ex.Message + " Creating a new mutex...");
  167. mutex = new Mutex(true, mutexName);
  168. }
  169. }
  170. ServerSettings.DebugSettingsToLog();
  171. workerFileEvents.WorkerReportsProgress = false;
  172. workerFileEvents.WorkerSupportsCancellation = false;
  173. workerFileEvents.DoWork += new DoWorkEventHandler(workerFileEvents_DoWork);
  174. workerFileEvents.RunWorkerCompleted += new RunWorkerCompletedEventHandler(workerFileEvents_RunWorkerCompleted);
  175. //Create an instance of the NotifyIcon Class
  176. TippuTrayNotify = new System.Windows.Forms.NotifyIcon();
  177. // This icon file needs to be in the bin folder of the application
  178. TippuTrayNotify = new System.Windows.Forms.NotifyIcon();
  179. Stream iconStream = Application.GetResourceStream(new Uri("pack://application:,,,/JMMServer;component/db.ico")).Stream;
  180. TippuTrayNotify.Icon = new System.Drawing.Icon(iconStream);
  181. iconStream.Dispose();
  182. //show the Tray Notify Icon
  183. TippuTrayNotify.Visible = true;
  184. CreateMenus();
  185. ServerState.Instance.DatabaseAvailable = false;
  186. ServerState.Instance.ServerOnline = false;
  187. ServerState.Instance.BaseImagePath = ImageUtils.GetBaseImagesPath();
  188. this.Closing += new System.ComponentModel.CancelEventHandler(MainWindow_Closing);
  189. this.StateChanged += new EventHandler(MainWindow_StateChanged);
  190. TippuTrayNotify.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(TippuTrayNotify_MouseDoubleClick);
  191. btnToolbarShutdown.Click += new RoutedEventHandler(btnToolbarShutdown_Click);
  192. btnHasherPause.Click += new RoutedEventHandler(btnHasherPause_Click);
  193. btnHasherResume.Click += new RoutedEventHandler(btnHasherResume_Click);
  194. btnGeneralPause.Click += new RoutedEventHandler(btnGeneralPause_Click);
  195. btnGeneralResume.Click += new RoutedEventHandler(btnGeneralResume_Click);
  196. btnImagesPause.Click += new RoutedEventHandler(btnImagesPause_Click);
  197. btnImagesResume.Click += new RoutedEventHandler(btnImagesResume_Click);
  198. btnRemoveMissingFiles.Click += new RoutedEventHandler(btnRemoveMissingFiles_Click);
  199. btnRunImport.Click += new RoutedEventHandler(btnRunImport_Click);
  200. btnSyncMyList.Click += new RoutedEventHandler(btnSyncMyList_Click);
  201. btnSyncVotes.Click += new RoutedEventHandler(btnSyncVotes_Click);
  202. btnUpdateTvDBInfo.Click += new RoutedEventHandler(btnUpdateTvDBInfo_Click);
  203. btnUpdateAllStats.Click += new RoutedEventHandler(btnUpdateAllStats_Click);
  204. btnSyncTrakt.Click += new RoutedEventHandler(btnSyncTrakt_Click);
  205. btnImportManualLinks.Click += new RoutedEventHandler(btnImportManualLinks_Click);
  206. btnUpdateAniDBInfo.Click += new RoutedEventHandler(btnUpdateAniDBInfo_Click);
  207. btnUploadAniFileCache.Click += new RoutedEventHandler(btnUploadAniFileCache_Click);
  208. btnUploadAzureCache.Click += new RoutedEventHandler(btnUploadAzureCache_Click);
  209. this.Loaded += new RoutedEventHandler(MainWindow_Loaded);
  210. downloadImagesWorker.DoWork += new DoWorkEventHandler(downloadImagesWorker_DoWork);
  211. downloadImagesWorker.WorkerSupportsCancellation = true;
  212. txtServerPort.Text = ServerSettings.JMMServerPort;
  213. btnToolbarHelp.Click += new RoutedEventHandler(btnToolbarHelp_Click);
  214. btnApplyServerPort.Click += new RoutedEventHandler(btnApplyServerPort_Click);
  215. btnUpdateMediaInfo.Click += new RoutedEventHandler(btnUpdateMediaInfo_Click);
  216. workerMyAnime2.DoWork += new DoWorkEventHandler(workerMyAnime2_DoWork);
  217. workerMyAnime2.RunWorkerCompleted += new RunWorkerCompletedEventHandler(workerMyAnime2_RunWorkerCompleted);
  218. workerMyAnime2.ProgressChanged += new ProgressChangedEventHandler(workerMyAnime2_ProgressChanged);
  219. workerMyAnime2.WorkerReportsProgress = true;
  220. workerMediaInfo.DoWork += new DoWorkEventHandler(workerMediaInfo_DoWork);
  221. workerImport.WorkerReportsProgress = true;
  222. workerImport.WorkerSupportsCancellation = true;
  223. workerImport.DoWork += new DoWorkEventHandler(workerImport_DoWork);
  224. workerScanFolder.WorkerReportsProgress = true;
  225. workerScanFolder.WorkerSupportsCancellation = true;
  226. workerScanFolder.DoWork += new DoWorkEventHandler(workerScanFolder_DoWork);
  227. workerScanDropFolders.WorkerReportsProgress = true;
  228. workerScanDropFolders.WorkerSupportsCancellation = true;
  229. workerScanDropFolders.DoWork += new DoWorkEventHandler(workerScanDropFolders_DoWork);
  230. workerRemoveMissing.WorkerReportsProgress = true;
  231. workerRemoveMissing.WorkerSupportsCancellation = true;
  232. workerRemoveMissing.DoWork += new DoWorkEventHandler(workerRemoveMissing_DoWork);
  233. workerDeleteImportFolder.WorkerReportsProgress = false;
  234. workerDeleteImportFolder.WorkerSupportsCancellation = true;
  235. workerDeleteImportFolder.DoWork += new DoWorkEventHandler(workerDeleteImportFolder_DoWork);
  236. workerTraktFriends.DoWork += new DoWorkEventHandler(workerTraktFriends_DoWork);
  237. workerTraktFriends.RunWorkerCompleted += new RunWorkerCompletedEventHandler(workerTraktFriends_RunWorkerCompleted);
  238. workerSetupDB.DoWork += new DoWorkEventHandler(workerSetupDB_DoWork);
  239. workerSetupDB.RunWorkerCompleted += new RunWorkerCompletedEventHandler(workerSetupDB_RunWorkerCompleted);
  240. //StartUp();
  241. cboDatabaseType.Items.Clear();
  242. cboDatabaseType.Items.Add("SQLite");
  243. cboDatabaseType.Items.Add("Microsoft SQL Server 2008");
  244. cboDatabaseType.Items.Add("MySQL");
  245. cboDatabaseType.SelectionChanged += new System.Windows.Controls.SelectionChangedEventHandler(cboDatabaseType_SelectionChanged);
  246. cboImagesPath.Items.Clear();
  247. cboImagesPath.Items.Add("Default");
  248. cboImagesPath.Items.Add("Custom");
  249. cboImagesPath.SelectionChanged += new System.Windows.Controls.SelectionChangedEventHandler(cboImagesPath_SelectionChanged);
  250. btnChooseImagesFolder.Click += new RoutedEventHandler(btnChooseImagesFolder_Click);
  251. if (ServerSettings.BaseImagesPathIsDefault)
  252. cboImagesPath.SelectedIndex = 0;
  253. else
  254. cboImagesPath.SelectedIndex = 1;
  255. btnSaveDatabaseSettings.Click += new RoutedEventHandler(btnSaveDatabaseSettings_Click);
  256. btnRefreshMSSQLServerList.Click += new RoutedEventHandler(btnRefreshMSSQLServerList_Click);
  257. btnInstallMSSQLServer.Click += new RoutedEventHandler(btnInstallMSSQLServer_Click);
  258. btnMaxOnStartup.Click += new RoutedEventHandler(toggleMinimizeOnStartup);
  259. btnMinOnStartup.Click += new RoutedEventHandler(toggleMinimizeOnStartup);
  260. btnLogs.Click += new RoutedEventHandler(btnLogs_Click);
  261. btnChooseVLCLocation.Click += new RoutedEventHandler(btnChooseVLCLocation_Click);
  262. btnAllowMultipleInstances.Click += new RoutedEventHandler(toggleAllowMultipleInstances);
  263. btnDisallowMultipleInstances.Click += new RoutedEventHandler(toggleAllowMultipleInstances);
  264. btnHasherClear.Click += new RoutedEventHandler(btnHasherClear_Click);
  265. btnGeneralClear.Click += new RoutedEventHandler(btnGeneralClear_Click);
  266. btnImagesClear.Click += new RoutedEventHandler(btnImagesClear_Click);
  267. //automaticUpdater.MenuItem = mnuCheckForUpdates;
  268. ServerState.Instance.LoadSettings();
  269. workerFileEvents.RunWorkerAsync();
  270. }
  271. void workerFileEvents_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  272. {
  273. logger.Info("Stopped thread for processing file creation events");
  274. }
  275. void workerFileEvents_DoWork(object sender, DoWorkEventArgs e)
  276. {
  277. logger.Info("Started thread for processing file creation events");
  278. foreach (FileSystemEventArgs evt in queueFileEvents)
  279. {
  280. try
  281. {
  282. // this is a message to stop processing
  283. if (evt == null) return;
  284. logger.Info("New file created: {0}: {1}", evt.FullPath, evt.ChangeType);
  285. if (evt.ChangeType == WatcherChangeTypes.Created)
  286. {
  287. if (Directory.Exists(evt.FullPath))
  288. { // When the path that was created represents a directory we need to manually get the contained files to add.
  289. // The reason for this is that when a directory is moved into a source directory (from the same drive) we will only recieve
  290. // an event for the directory and not the contained files. However, if the folder is copied from a different drive then
  291. // a create event will fire for the directory and each file contained within it (As they are all treated as separate operations)
  292. string[] files = Directory.GetFiles(evt.FullPath, "*.*", SearchOption.AllDirectories);
  293. foreach (string file in files)
  294. {
  295. if (FileHashHelper.IsVideo(file))
  296. {
  297. logger.Info("Found file {0} under folder {1}", file, evt.FullPath);
  298. CommandRequest_HashFile cmd = new CommandRequest_HashFile(file, false);
  299. cmd.Save();
  300. }
  301. }
  302. }
  303. else if (FileHashHelper.IsVideo(evt.FullPath))
  304. {
  305. CommandRequest_HashFile cmd = new CommandRequest_HashFile(evt.FullPath, false);
  306. cmd.Save();
  307. }
  308. }
  309. queueFileEvents.Remove(evt);
  310. }
  311. catch (Exception ex)
  312. {
  313. logger.ErrorException(ex.Message, ex);
  314. queueFileEvents.Remove(evt);
  315. Thread.Sleep(1000);
  316. }
  317. }
  318. }
  319. void btnUploadAzureCache_Click(object sender, RoutedEventArgs e)
  320. {
  321. AniDB_AnimeRepository repAnime = new AniDB_AnimeRepository();
  322. List<AniDB_Anime> allAnime = repAnime.GetAll();
  323. int cnt = 0;
  324. foreach (AniDB_Anime anime in allAnime)
  325. {
  326. cnt++;
  327. logger.Info(string.Format("Uploading anime {0} of {1} - {2}", cnt, allAnime.Count, anime.MainTitle));
  328. try
  329. {
  330. CommandRequest_Azure_SendAnimeFull cmdAzure = new CommandRequest_Azure_SendAnimeFull(anime.AnimeID);
  331. cmdAzure.Save();
  332. }
  333. catch { }
  334. }
  335. }
  336. void btnImagesClear_Click(object sender, RoutedEventArgs e)
  337. {
  338. try
  339. {
  340. this.Cursor = Cursors.Wait;
  341. JMMService.CmdProcessorImages.Stop();
  342. // wait until the queue stops
  343. while (JMMService.CmdProcessorImages.ProcessingCommands)
  344. {
  345. Thread.Sleep(200);
  346. }
  347. Thread.Sleep(200);
  348. CommandRequestRepository repCR = new CommandRequestRepository();
  349. foreach (CommandRequest cr in repCR.GetAllCommandRequestImages())
  350. repCR.Delete(cr.CommandRequestID);
  351. JMMService.CmdProcessorImages.Init();
  352. }
  353. catch (Exception ex)
  354. {
  355. Utils.ShowErrorMessage(ex.Message);
  356. }
  357. this.Cursor = Cursors.Arrow;
  358. }
  359. void btnGeneralClear_Click(object sender, RoutedEventArgs e)
  360. {
  361. try
  362. {
  363. this.Cursor = Cursors.Wait;
  364. JMMService.CmdProcessorGeneral.Stop();
  365. // wait until the queue stops
  366. while (JMMService.CmdProcessorGeneral.ProcessingCommands)
  367. {
  368. Thread.Sleep(200);
  369. }
  370. Thread.Sleep(200);
  371. CommandRequestRepository repCR = new CommandRequestRepository();
  372. foreach (CommandRequest cr in repCR.GetAllCommandRequestGeneral())
  373. repCR.Delete(cr.CommandRequestID);
  374. JMMService.CmdProcessorGeneral.Init();
  375. }
  376. catch (Exception ex)
  377. {
  378. Utils.ShowErrorMessage(ex.Message);
  379. }
  380. this.Cursor = Cursors.Arrow;
  381. }
  382. void btnHasherClear_Click(object sender, RoutedEventArgs e)
  383. {
  384. try
  385. {
  386. this.Cursor = Cursors.Wait;
  387. JMMService.CmdProcessorHasher.Stop();
  388. // wait until the queue stops
  389. while (JMMService.CmdProcessorHasher.ProcessingCommands)
  390. {
  391. Thread.Sleep(200);
  392. }
  393. Thread.Sleep(200);
  394. CommandRequestRepository repCR = new CommandRequestRepository();
  395. foreach (CommandRequest cr in repCR.GetAllCommandRequestHasher())
  396. repCR.Delete(cr.CommandRequestID);
  397. JMMService.CmdProcessorHasher.Init();
  398. }
  399. catch (Exception ex)
  400. {
  401. Utils.ShowErrorMessage(ex.Message);
  402. }
  403. this.Cursor = Cursors.Arrow;
  404. }
  405. void toggleAllowMultipleInstances(object sender, RoutedEventArgs e)
  406. {
  407. ServerSettings.AllowMultipleInstances = !ServerSettings.AllowMultipleInstances;
  408. ServerState.Instance.AllowMultipleInstances = !ServerState.Instance.AllowMultipleInstances;
  409. ServerState.Instance.DisallowMultipleInstances = !ServerState.Instance.DisallowMultipleInstances;
  410. }
  411. void btnLogs_Click(object sender, RoutedEventArgs e)
  412. {
  413. try
  414. {
  415. string appPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
  416. string logPath = Path.Combine(appPath, "logs");
  417. Process.Start(new ProcessStartInfo(logPath));
  418. }
  419. catch (Exception ex)
  420. {
  421. Utils.ShowErrorMessage(ex);
  422. }
  423. }
  424. void toggleMinimizeOnStartup(object sender, RoutedEventArgs e)
  425. {
  426. ServerSettings.MinimizeOnStartup = !ServerSettings.MinimizeOnStartup;
  427. ServerState.Instance.MinOnStartup = !ServerState.Instance.MinOnStartup;
  428. ServerState.Instance.MaxOnStartup = !ServerState.Instance.MaxOnStartup;
  429. }
  430. void btnInstallMSSQLServer_Click(object sender, RoutedEventArgs e)
  431. {
  432. System.Diagnostics.Process.Start("http://www.microsoft.com/web/gallery/install.aspx?appsxml=&appid=SQLExpressTools");
  433. }
  434. void btnChooseVLCLocation_Click(object sender, RoutedEventArgs e)
  435. {
  436. string errorMsg = "";
  437. string streamingAddress = "";
  438. Utils.StartStreamingVideo("localhost", @"e:\test\[Frostii]_K-On!_-_S5_(1280x720_Blu-ray_H264)_[8B9E0A76].mkv", "12000", "30", "1280",
  439. "128", "44100", "8088", ref errorMsg, ref streamingAddress);
  440. return;
  441. System.Windows.Forms.OpenFileDialog dialog = new System.Windows.Forms.OpenFileDialog();
  442. if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  443. {
  444. ServerSettings.VLCLocation = dialog.FileName;
  445. }
  446. }
  447. void btnChooseImagesFolder_Click(object sender, RoutedEventArgs e)
  448. {
  449. System.Windows.Forms.FolderBrowserDialog dialog = new System.Windows.Forms.FolderBrowserDialog();
  450. if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  451. {
  452. ServerSettings.BaseImagesPath = dialog.SelectedPath;
  453. }
  454. }
  455. void cboImagesPath_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
  456. {
  457. if (cboImagesPath.SelectedIndex == 0)
  458. {
  459. ServerSettings.BaseImagesPathIsDefault = true;
  460. btnChooseImagesFolder.Visibility = System.Windows.Visibility.Hidden;
  461. }
  462. else
  463. {
  464. ServerSettings.BaseImagesPathIsDefault = false;
  465. btnChooseImagesFolder.Visibility = System.Windows.Visibility.Visible;
  466. }
  467. }
  468. #region Database settings and initial start up
  469. void btnSaveDatabaseSettings_Click(object sender, RoutedEventArgs e)
  470. {
  471. try
  472. {
  473. btnSaveDatabaseSettings.IsEnabled = false;
  474. cboDatabaseType.IsEnabled = false;
  475. btnRefreshMSSQLServerList.IsEnabled = false;
  476. if (ServerState.Instance.DatabaseIsSQLite)
  477. {
  478. ServerSettings.DatabaseType = "SQLite";
  479. }
  480. else if (ServerState.Instance.DatabaseIsSQLServer)
  481. {
  482. if (string.IsNullOrEmpty(txtMSSQL_DatabaseName.Text) || string.IsNullOrEmpty(txtMSSQL_Password.Password)
  483. || string.IsNullOrEmpty(cboMSSQLServerList.Text) || string.IsNullOrEmpty(txtMSSQL_Username.Text))
  484. {
  485. MessageBox.Show("Please fill out all the settings", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
  486. txtMSSQL_DatabaseName.Focus();
  487. return;
  488. }
  489. ServerSettings.DatabaseType = "SQLServer";
  490. ServerSettings.DatabaseName = txtMSSQL_DatabaseName.Text;
  491. ServerSettings.DatabasePassword = txtMSSQL_Password.Password;
  492. ServerSettings.DatabaseServer = cboMSSQLServerList.Text;
  493. ServerSettings.DatabaseUsername = txtMSSQL_Username.Text;
  494. }
  495. else if (ServerState.Instance.DatabaseIsMySQL)
  496. {
  497. if (string.IsNullOrEmpty(txtMySQL_DatabaseName.Text) || string.IsNullOrEmpty(txtMySQL_Password.Password)
  498. || string.IsNullOrEmpty(txtMySQL_ServerAddress.Text) || string.IsNullOrEmpty(txtMySQL_Username.Text))
  499. {
  500. MessageBox.Show("Please fill out all the settings", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
  501. txtMySQL_DatabaseName.Focus();
  502. return;
  503. }
  504. ServerSettings.DatabaseType = "MySQL";
  505. ServerSettings.MySQL_SchemaName = txtMySQL_DatabaseName.Text;
  506. ServerSettings.MySQL_Password = txtMySQL_Password.Password;
  507. ServerSettings.MySQL_Hostname = txtMySQL_ServerAddress.Text;
  508. ServerSettings.MySQL_Username = txtMySQL_Username.Text;
  509. }
  510. workerSetupDB.RunWorkerAsync();
  511. }
  512. catch (Exception ex)
  513. {
  514. logger.ErrorException(ex.Message, ex);
  515. MessageBox.Show("Failed to set start: " + ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
  516. }
  517. }
  518. void cboDatabaseType_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
  519. {
  520. ServerState.Instance.DatabaseIsSQLite = false;
  521. ServerState.Instance.DatabaseIsSQLServer = false;
  522. ServerState.Instance.DatabaseIsMySQL = false;
  523. switch (cboDatabaseType.SelectedIndex)
  524. {
  525. case 0:
  526. ServerState.Instance.DatabaseIsSQLite = true;
  527. break;
  528. case 1:
  529. bool anySettingsMSSQL = !string.IsNullOrEmpty(ServerSettings.DatabaseName) || !string.IsNullOrEmpty(ServerSettings.DatabasePassword)
  530. || !string.IsNullOrEmpty(ServerSettings.DatabaseServer) || !string.IsNullOrEmpty(ServerSettings.DatabaseUsername);
  531. if (anySettingsMSSQL)
  532. {
  533. txtMSSQL_DatabaseName.Text = ServerSettings.DatabaseName;
  534. txtMSSQL_Password.Password = ServerSettings.DatabasePassword;
  535. cboMSSQLServerList.Text = ServerSettings.DatabaseServer;
  536. txtMSSQL_Username.Text = ServerSettings.DatabaseUsername;
  537. }
  538. else
  539. {
  540. txtMSSQL_DatabaseName.Text = "JMMServer";
  541. txtMSSQL_Password.Password = "";
  542. cboMSSQLServerList.Text = "localhost";
  543. txtMSSQL_Username.Text = "sa";
  544. }
  545. ServerState.Instance.DatabaseIsSQLServer = true;
  546. break;
  547. case 2:
  548. bool anySettingsMySQL = !string.IsNullOrEmpty(ServerSettings.MySQL_SchemaName) || !string.IsNullOrEmpty(ServerSettings.MySQL_Password)
  549. || !string.IsNullOrEmpty(ServerSettings.MySQL_Hostname) || !string.IsNullOrEmpty(ServerSettings.MySQL_Username);
  550. if (anySettingsMySQL)
  551. {
  552. txtMySQL_DatabaseName.Text = ServerSettings.MySQL_SchemaName;
  553. txtMySQL_Password.Password = ServerSettings.MySQL_Password;
  554. txtMySQL_ServerAddress.Text = ServerSettings.MySQL_Hostname;
  555. txtMySQL_Username.Text = ServerSettings.MySQL_Username;
  556. }
  557. else
  558. {
  559. txtMySQL_DatabaseName.Text = "JMMServer";
  560. txtMySQL_Password.Password = "";
  561. txtMySQL_ServerAddress.Text = "localhost";
  562. txtMySQL_Username.Text = "root";
  563. }
  564. ServerState.Instance.DatabaseIsMySQL = true;
  565. break;
  566. }
  567. }
  568. void workerSetupDB_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  569. {
  570. bool setupComplete = bool.Parse(e.Result.ToString());
  571. if (setupComplete)
  572. {
  573. ServerInfo.Instance.RefreshImportFolders();
  574. ServerState.Instance.CurrentSetupStatus = "Complete!";
  575. ServerState.Instance.ServerOnline = true;
  576. tabControl1.SelectedIndex = 0;
  577. }
  578. else
  579. {
  580. ServerState.Instance.ServerOnline = false;
  581. if (string.IsNullOrEmpty(ServerSettings.DatabaseType))
  582. {
  583. ServerSettings.DatabaseType = "SQLite";
  584. ShowDatabaseSetup();
  585. }
  586. }
  587. btnSaveDatabaseSettings.IsEnabled = true;
  588. cboDatabaseType.IsEnabled = true;
  589. btnRefreshMSSQLServerList.IsEnabled = true;
  590. if (setupComplete)
  591. {
  592. if (string.IsNullOrEmpty(ServerSettings.AniDB_Username) || string.IsNullOrEmpty(ServerSettings.AniDB_Password))
  593. {
  594. InitialSetupForm frm = new InitialSetupForm();
  595. frm.Owner = this;
  596. frm.ShowDialog();
  597. }
  598. ImportFolderRepository repFolders = new ImportFolderRepository();
  599. List<ImportFolder> folders = repFolders.GetAll();
  600. if (folders.Count == 0)
  601. {
  602. tabControl1.SelectedIndex = 1;
  603. }
  604. }
  605. }
  606. void btnRefreshMSSQLServerList_Click(object sender, RoutedEventArgs e)
  607. {
  608. btnSaveDatabaseSettings.IsEnabled = false;
  609. cboDatabaseType.IsEnabled = false;
  610. btnRefreshMSSQLServerList.IsEnabled = false;
  611. try
  612. {
  613. this.Cursor = Cursors.Wait;
  614. cboMSSQLServerList.Items.Clear();
  615. DataTable dt = SmoApplication.EnumAvailableSqlServers();
  616. foreach (DataRow dr in dt.Rows)
  617. {
  618. cboMSSQLServerList.Items.Add(dr[0]);
  619. }
  620. }
  621. catch (Exception ex)
  622. {
  623. logger.ErrorException(ex.ToString(), ex);
  624. MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
  625. }
  626. this.Cursor = Cursors.Arrow;
  627. btnSaveDatabaseSettings.IsEnabled = true;
  628. cboDatabaseType.IsEnabled = true;
  629. btnRefreshMSSQLServerList.IsEnabled = true;
  630. }
  631. private void ShowDatabaseSetup()
  632. {
  633. if (ServerSettings.DatabaseType.Trim().ToUpper() == "SQLITE") cboDatabaseType.SelectedIndex = 0;
  634. if (ServerSettings.DatabaseType.Trim().ToUpper() == "SQLSERVER") cboDatabaseType.SelectedIndex = 1;
  635. if (ServerSettings.DatabaseType.Trim().ToUpper() == "MYSQL") cboDatabaseType.SelectedIndex = 2;
  636. }
  637. void workerSetupDB_DoWork(object sender, DoWorkEventArgs e)
  638. {
  639. try
  640. {
  641. ServerState.Instance.ServerOnline = false;
  642. ServerState.Instance.CurrentSetupStatus = "Cleaning up...";
  643. StopWatchingFiles();
  644. AniDBDispose();
  645. StopHost();
  646. JMMService.CmdProcessorGeneral.Stop();
  647. JMMService.CmdProcessorHasher.Stop();
  648. JMMService.CmdProcessorImages.Stop();
  649. // wait until the queue count is 0
  650. // ie the cancel has actuall worked
  651. while (true)
  652. {
  653. if (JMMService.CmdProcessorGeneral.QueueCount == 0 && JMMService.CmdProcessorHasher.QueueCount == 0 && JMMService.CmdProcessorImages.QueueCount == 0) break;
  654. Thread.Sleep(250);
  655. }
  656. if (autoUpdateTimer != null) autoUpdateTimer.Enabled = false;
  657. if (autoUpdateTimerShort != null) autoUpdateTimerShort.Enabled = false;
  658. JMMService.CloseSessionFactory();
  659. ServerState.Instance.CurrentSetupStatus = "Initializing...";
  660. Thread.Sleep(1000);
  661. ServerState.Instance.CurrentSetupStatus = "Setting up database...";
  662. if (!DatabaseHelper.InitDB())
  663. {
  664. ServerState.Instance.DatabaseAvailable = false;
  665. if (string.IsNullOrEmpty(ServerSettings.DatabaseType))
  666. ServerState.Instance.CurrentSetupStatus = "Please select and configure your database.";
  667. else
  668. ServerState.Instance.CurrentSetupStatus = "Failed to start. Please review database settings.";
  669. e.Result = false;
  670. return;
  671. }
  672. else
  673. ServerState.Instance.DatabaseAvailable = true;
  674. //init session factory
  675. ServerState.Instance.CurrentSetupStatus = "Initializing Session Factory...";
  676. ISessionFactory temp = JMMService.SessionFactory;
  677. ServerState.Instance.CurrentSetupStatus = "Initializing Hosts...";
  678. SetupAniDBProcessor();
  679. StartImageHost();
  680. StartBinaryHost();
  681. StartMetroHost();
  682. StartImageHostMetro();
  683. StartRESTHost();
  684. StartStreamingHost();
  685. // Load all stats
  686. ServerState.Instance.CurrentSetupStatus = "Initializing Stats...";
  687. StatsCache.Instance.InitStats();
  688. ServerState.Instance.CurrentSetupStatus = "Initializing Queue Processors...";
  689. JMMService.CmdProcessorGeneral.Init();
  690. JMMService.CmdProcessorHasher.Init();
  691. JMMService.CmdProcessorImages.Init();
  692. // timer for automatic updates
  693. autoUpdateTimer = new System.Timers.Timer();
  694. autoUpdateTimer.AutoReset = true;
  695. autoUpdateTimer.Interval = 5 * 60 * 1000; // 5 minutes * 60 seconds
  696. autoUpdateTimer.Elapsed += new System.Timers.ElapsedEventHandler(autoUpdateTimer_Elapsed);
  697. autoUpdateTimer.Start();
  698. // timer for automatic updates
  699. autoUpdateTimerShort = new System.Timers.Timer();
  700. autoUpdateTimerShort.AutoReset = true;
  701. autoUpdateTimerShort.Interval = 15 * 1000; // 15 seconds
  702. autoUpdateTimerShort.Elapsed += new System.Timers.ElapsedEventHandler(autoUpdateTimerShort_Elapsed);
  703. autoUpdateTimerShort.Start();
  704. ServerState.Instance.CurrentSetupStatus = "Initializing File Watchers...";
  705. StartWatchingFiles();
  706. DownloadAllImages();
  707. ImportFolderRepository repFolders = new ImportFolderRepository();
  708. List<ImportFolder> folders = repFolders.GetAll();
  709. if (ServerSettings.ScanDropFoldersOnStart) ScanDropFolders();
  710. if (ServerSettings.RunImportOnStart && folders.Count > 0) RunImport();
  711. ServerState.Instance.ServerOnline = true;
  712. e.Result = true;
  713. }
  714. catch (Exception ex)
  715. {
  716. logger.ErrorException(ex.ToString(), ex);
  717. ServerState.Instance.CurrentSetupStatus = ex.Message;
  718. e.Result = false;
  719. }
  720. }
  721. #endregion
  722. #region Update all media info
  723. void btnUpdateMediaInfo_Click(object sender, RoutedEventArgs e)
  724. {
  725. RefreshAllMediaInfo();
  726. MessageBox.Show("Actions have been queued", "Done", MessageBoxButton.OK, MessageBoxImage.Information);
  727. }
  728. void workerMediaInfo_DoWork(object sender, DoWorkEventArgs e)
  729. {
  730. VideoLocalRepository repVidLocals = new VideoLocalRepository();
  731. // first build a list of files that we already know about, as we don't want to process them again
  732. List<VideoLocal> filesAll = repVidLocals.GetAll();
  733. Dictionary<string, VideoLocal> dictFilesExisting = new Dictionary<string, VideoLocal>();
  734. foreach (VideoLocal vl in filesAll)
  735. {
  736. CommandRequest_ReadMediaInfo cr = new CommandRequest_ReadMediaInfo(vl.VideoLocalID);
  737. cr.Save();
  738. }
  739. }
  740. public static void RefreshAllMediaInfo()
  741. {
  742. if (workerMediaInfo.IsBusy) return;
  743. workerMediaInfo.RunWorkerAsync();
  744. }
  745. #endregion
  746. #region MyAnime2 Migration
  747. void workerMyAnime2_ProgressChanged(object sender, ProgressChangedEventArgs e)
  748. {
  749. MA2Progress ma2Progress = e.UserState as MA2Progress;
  750. if (!string.IsNullOrEmpty(ma2Progress.ErrorMessage))
  751. {
  752. txtMA2Progress.Text = ma2Progress.ErrorMessage;
  753. txtMA2Success.Visibility = System.Windows.Visibility.Hidden;
  754. return;
  755. }
  756. if (ma2Progress.CurrentFile <= ma2Progress.TotalFiles)
  757. txtMA2Progress.Text = string.Format("Processing unlinked file {0} of {1}", ma2Progress.CurrentFile, ma2Progress.TotalFiles);
  758. else
  759. txtMA2Progress.Text = string.Format("Processed all unlinked files ({0})", ma2Progress.TotalFiles);
  760. txtMA2Success.Text = string.Format("{0} files sucessfully migrated", ma2Progress.MigratedFiles);
  761. }
  762. void workerMyAnime2_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  763. {
  764. }
  765. void workerMyAnime2_DoWork(object sender, DoWorkEventArgs e)
  766. {
  767. MA2Progress ma2Progress = new MA2Progress();
  768. ma2Progress.CurrentFile = 0;
  769. ma2Progress.ErrorMessage = "";
  770. ma2Progress.MigratedFiles = 0;
  771. ma2Progress.TotalFiles = 0;
  772. try
  773. {
  774. string databasePath = e.Argument as string;
  775. string connString = string.Format(@"data source={0};useutf16encoding=True", databasePath);
  776. SQLiteConnection myConn = new SQLiteConnection(connString);
  777. myConn.Open();
  778. // get a list of unlinked files
  779. VideoLocalRepository repVids = new VideoLocalRepository();
  780. AniDB_EpisodeRepository repAniEps = new AniDB_EpisodeRepository();
  781. AniDB_AnimeRepository repAniAnime = new AniDB_AnimeRepository();
  782. AnimeSeriesRepository repSeries = new AnimeSeriesRepository();
  783. AnimeEpisodeRepository repEps = new AnimeEpisodeRepository();
  784. List<VideoLocal> vids = repVids.GetVideosWithoutEpisode();
  785. ma2Progress.TotalFiles = vids.Count;
  786. foreach (VideoLocal vid in vids)
  787. {
  788. ma2Progress.CurrentFile = ma2Progress.CurrentFile + 1;
  789. workerMyAnime2.ReportProgress(0, ma2Progress);
  790. // search for this file in the XrossRef table in MA2
  791. string sql = string.Format("SELECT AniDB_EpisodeID from CrossRef_Episode_FileHash WHERE Hash = '{0}' AND FileSize = {1}", vid.ED2KHash, vid.FileSize);
  792. SQLiteCommand sqCommand = new SQLiteCommand(sql);
  793. sqCommand.Connection = myConn;
  794. SQLiteDataReader myReader = sqCommand.ExecuteReader();
  795. while (myReader.Read())
  796. {
  797. int episodeID = 0;
  798. if (!int.TryParse(myReader.GetValue(0).ToString(), out episodeID)) continue;
  799. if (episodeID <= 0) continue;
  800. sql = string.Format("SELECT AnimeID from AniDB_Episode WHERE EpisodeID = {0}", episodeID);
  801. sqCommand = new SQLiteCommand(sql);
  802. sqCommand.Connection = myConn;
  803. SQLiteDataReader myReader2 = sqCommand.ExecuteReader();
  804. while (myReader2.Read())
  805. {
  806. int animeID = myReader2.GetInt32(0);
  807. // so now we have all the needed details we can link the file to the episode
  808. // as long as wehave the details in JMM
  809. AniDB_Anime anime = null;
  810. AniDB_Episode ep = repAniEps.GetByEpisodeID(episodeID);
  811. if (ep == null)
  812. {
  813. logger.Debug("Getting Anime record from AniDB....");
  814. anime = JMMService.AnidbProcessor.GetAnimeInfoHTTP(animeID, true, ServerSettings.AutoGroupSeries);
  815. }
  816. else
  817. anime = repAniAnime.GetByAnimeID(animeID);
  818. // create the group/series/episode records if needed
  819. AnimeSeries ser = null;
  820. if (anime == null) continue;
  821. logger.Debug("Creating groups, series and episodes....");
  822. // check if there is an AnimeSeries Record associated with this AnimeID
  823. ser = repSeries.GetByAnimeID(animeID);
  824. if (ser == null)
  825. {
  826. // create a new AnimeSeries record
  827. ser = anime.CreateAnimeSeriesAndGroup();
  828. }
  829. ser.CreateAnimeEpisodes();
  830. // check if we have any group status data for this associated anime
  831. // if not we will download it now
  832. AniDB_GroupStatusRepository repStatus = new AniDB_GroupStatusRepository();
  833. if (repStatus.GetByAnimeID(anime.AnimeID).Count == 0)
  834. {
  835. CommandRequest_GetReleaseGroupStatus cmdStatus = new CommandRequest_GetReleaseGroupStatus(anime.AnimeID, false);
  836. cmdStatus.Save();
  837. }
  838. // update stats
  839. ser.EpisodeAddedDate = DateTime.Now;
  840. repSeries.Save(ser);
  841. AnimeGroupRepository repGroups = new AnimeGroupRepository();
  842. foreach (AnimeGroup grp in ser.AllGroupsAbove)
  843. {
  844. grp.EpisodeAddedDate = DateTime.Now;
  845. repGroups.Save(grp);
  846. }
  847. AnimeEpisode epAnime = repEps.GetByAniDBEpisodeID(episodeID);
  848. if (epAnime == null)
  849. continue;
  850. CrossRef_File_EpisodeRepository repXRefs = new CrossRef_File_EpisodeRepository();
  851. CrossRef_File_Episode xref = new CrossRef_File_Episode();
  852. try
  853. {
  854. xref.PopulateManually(vid, epAnime);
  855. }
  856. catch (Exception ex)
  857. {
  858. string msg = string.Format("Error populating XREF: {0} - {1}", vid.ToStringDetailed(), ex.ToString());
  859. throw;
  860. }
  861. repXRefs.Save(xref);
  862. vid.RenameIfRequired();
  863. vid.MoveFileIfRequired();
  864. // update stats for groups and series
  865. if (ser != null)
  866. {
  867. // update all the groups above this series in the heirarchy
  868. ser.UpdateStats(true, true, true);
  869. StatsCache.Instance.UpdateUsingSeries(ser.AnimeSeriesID);
  870. }
  871. // Add this file to the users list
  872. if (ServerSettings.AniDB_MyList_AddFiles)
  873. {
  874. CommandRequest_AddFileToMyList cmd = new CommandRequest_AddFileToMyList(vid.ED2KHash);
  875. cmd.Save();
  876. }
  877. ma2Progress.MigratedFiles = ma2Progress.MigratedFiles + 1;
  878. workerMyAnime2.ReportProgress(0, ma2Progress);
  879. }
  880. myReader2.Close();
  881. //Console.WriteLine(myReader.GetString(0));
  882. }
  883. myReader.Close();
  884. }
  885. myConn.Close();
  886. ma2Progress.CurrentFile = ma2Progress.CurrentFile + 1;
  887. workerMyAnime2.ReportProgress(0, ma2Progress);
  888. }
  889. catch (Exception ex)
  890. {
  891. logger.ErrorException(ex.ToString(), ex);
  892. ma2Progress.ErrorMessage = ex.Message;
  893. workerMyAnime2.ReportProgress(0, ma2Progress);
  894. }
  895. }
  896. void btnImportManualLinks_Click(object sender, RoutedEventArgs e)
  897. {
  898. if (workerMyAnime2.IsBusy)
  899. {
  900. MessageBox.Show("Importer is already running", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
  901. return;
  902. }
  903. txtMA2Progress.Visibility = System.Windows.Visibility.Visible;
  904. txtMA2Success.Visibility = System.Windows.Visibility.Visible;
  905. Microsoft.Win32.OpenFileDialog ofd = new Microsoft.Win32.OpenFileDialog();
  906. ofd.Filter = "Sqlite Files (*.DB3)|*.db3";
  907. ofd.ShowDialog();
  908. if (!string.IsNullOrEmpty(ofd.FileName))
  909. {
  910. workerMyAnime2.RunWorkerAsync(ofd.FileName);
  911. }
  912. }
  913. private void ImportLinksFromMA2(string databasePath)
  914. {
  915. }
  916. #endregion
  917. void btnApplyServerPort_Click(object sender, RoutedEventArgs e)
  918. {
  919. if (string.IsNullOrEmpty(txtServerPort.Text))
  920. {
  921. MessageBox.Show("Please enter a value", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
  922. txtServerPort.Focus();
  923. return;
  924. }
  925. int port = 0;
  926. int.TryParse(txtServerPort.Text, out port);
  927. if (port <= 0 || port > 65535)
  928. {
  929. MessageBox.Show("Please enter a value between 1 and 65535", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
  930. txtServerPort.Focus();
  931. return;
  932. }
  933. try
  934. {
  935. ServerSettings.JMMServerPort = port.ToString();
  936. this.Cursor = Cursors.Wait;
  937. JMMService.CmdProcessorGeneral.Paused = true;
  938. JMMService.CmdProcessorHasher.Paused = true;
  939. JMMService.CmdProcessorImages.Paused = true;
  940. StopHost();
  941. StartBinaryHost();
  942. StartImageHost();
  943. StartImageHostMetro();
  944. StartStreamingHost();
  945. StartRESTHost();
  946. JMMService.CmdProcessorGeneral.Paused = false;
  947. JMMService.CmdProcessorHasher.Paused = false;
  948. JMMService.CmdProcessorImages.Paused = false;
  949. this.Cursor = Cursors.Arrow;
  950. }
  951. catch (Exception ex)
  952. {
  953. logger.ErrorException(ex.ToString(), ex);
  954. MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
  955. }
  956. }
  957. void btnToolbarHelp_Click(object sender, RoutedEventArgs e)
  958. {
  959. //AnimeSeriesRepository repSeries = new AnimeSeriesRepository();
  960. //AnimeSeries ser = repSeries.GetByID(222);
  961. //ser.UpdateStats(true, true, true);
  962. //TraktTVHelper.GetFriendsRequests();
  963. //FileHashHelper.GetMediaInfo(@"C:\[Hiryuu] Maken-Ki! 09 [Hi10P 1280x720 H264] [EE47C947].mkv", true);
  964. //CommandRequest_ReadMediaInfo cr1 = new CommandRequest_ReadMediaInfo(2038);
  965. //cr1.Save();
  966. //CommandRequest_ReadMediaInfo cr2 = new CommandRequest_ReadMediaInfo(2037);
  967. //cr2.Save();
  968. /*AniDB_AnimeRepository repAnime = new AniDB_AnimeRepository();
  969. foreach (AniDB_Anime anime in repAnime.GetAll())
  970. {
  971. List<TraktTV_ShoutGet> shouts = TraktTVHelper.GetShowShouts(anime.AnimeID);
  972. if (shouts == null || shouts.Count == 0)
  973. {
  974. //logger.Info("{0} ({1}) = 0 Shouts", anime.MainTitle, anime.AnimeID);
  975. }
  976. else
  977. {
  978. if (shouts.Count <= 5)
  979. logger.Info("{0} ({1}) = {2} MINOR Shouts", anime.MainTitle, anime.AnimeID, shouts.Count);
  980. else
  981. logger.Info("{0} ({1}) = {2} *** MAJOR *** Shouts", anime.MainTitle, anime.AnimeID, shouts.Count);
  982. }
  983. }*/
  984. //anime temp = MALHelper.SearchAnimesByTitle("Naruto");
  985. //MALHelper.VerifyCredentials();
  986. //JMMService.DebugFlag = !JMMService.DebugFlag;
  987. //AnimeEpisodeRepository repEp = new AnimeEpisodeRepository();
  988. //AnimeEpisode ep = repEp.GetByID(2430);
  989. //MALHelper.UpdateMAL(ep);
  990. //CommandRequest_MALUpdatedWatchedStatus cmdMAL = new CommandRequest_MALUpdatedWatchedStatus(8107);
  991. //cmdMAL.ProcessCommand();
  992. //CommandRequest_MALDownloadStatusFromMAL cmd = new CommandRequest_MALDownloadStatusFromMAL();
  993. //cmd.Save();
  994. //AppVersionsResult appv = XMLService.GetAppVersions();
  995. //JMMServiceImplementation imp = new JMMServiceImplementation();
  996. //imp.GetMissingEpisodes(1, true, true);
  997. //VideoLocalRepository repVidLocal = new VideoLocalRepository();
  998. /*VideoLocal vlocal = new VideoLocal();
  999. vlocal.DateTimeUpdated = DateTime.Now;
  1000. vlocal.DateTimeCreated = vlocal.DateTimeUpdated;
  1001. vlocal.FilePath = "";
  1002. vlocal.FileSize = 656181746;
  1003. vlocal.ImportFolderID = 1;
  1004. vlocal.Hash = "453063B2993D4AC4BA51F4A64170260A";
  1005. vlocal.CRC32 = "";
  1006. vlocal.MD5 = "";
  1007. vlocal.SHA1 = "";
  1008. vlocal.IsIgnored = 0;
  1009. vlocal.HashSource = (int)HashSource.DirectHash;
  1010. repVidLocal.Save(vlocal);*/
  1011. //JMMService.AnidbProcessor.UpdateMyListStats();
  1012. //UpdateVersion();
  1013. /*VideoLocalRepository repVidLocal = new VideoLocalRepository();
  1014. VideoLocal vid = repVidLocal.GetByID(194); RenameFileHelper.Test(vid);
  1015. vid = repVidLocal.GetByID(295); RenameFileHelper.Test(vid);
  1016. vid = repVidLocal.GetByID(396); RenameFileHelper.Test(vid);
  1017. vid = repVidLocal.GetByID(497); RenameFileHelper.Test(vid);
  1018. vid = repVidLocal.GetByID(598); RenameFileHelper.Test(vid);
  1019. return;
  1020. JMMService.AnidbProcessor.GetFileInfo(vid);
  1021. return;*/
  1022. //Importer.UpdateAniDBFileData(true, true);
  1023. //JMMServiceImplementationMetro imp = new JMMServiceImplementationMetro();
  1024. //imp.GetAnimeDetail(4880);
  1025. /*CrossRef_AniDB_MALRepository rep = new CrossRef_AniDB_MALRepository();
  1026. foreach (JMMServer.Entities.CrossRef_AniDB_MAL xref in rep.GetAll())
  1027. {
  1028. //AzureWebAPI.Send_CrossRef_AniDB_MAL(xref);
  1029. break;
  1030. }
  1031. AniDB_Anime anime2 = JMMService.AnidbProcessor.GetAnimeInfoHTTP(9127, true, false);
  1032. AniDB_AnimeRepository repAnime = new AniDB_AnimeRepository();
  1033. List<AniDB_Anime> allAnime = repAnime.GetAll();
  1034. int cnt = 0;
  1035. foreach (AniDB_Anime anime in allAnime)
  1036. {
  1037. cnt++;
  1038. logger.Info(string.Format("Uploading anime {0} of {1} - {2}", cnt, allAnime.Count, anime.MainTitle));
  1039. try
  1040. {
  1041. //CommandRequest_Azure_SendAnimeFull cmdAzure = new CommandRequest_Azure_SendAnimeFull(anime.AnimeID);
  1042. //cmdAzure.Save();
  1043. }
  1044. catch { }
  1045. }
  1046. */
  1047. /*try
  1048. {
  1049. using (var session = JMMService.SessionFactory.OpenSession())
  1050. {
  1051. AniDB_Anime anime = JMMService.AnidbProcessor.GetAnimeInfoHTTPFromCache(session, 5842, false);
  1052. }
  1053. }
  1054. catch (Exception ex)
  1055. {
  1056. Utils.ShowErrorMessage(ex);
  1057. }*/
  1058. //CommandRequest_GetAnimeHTTP cmd = new CommandRequest_GetAnimeHTTP(3482, false, false);
  1059. //cmd.Save();
  1060. //string xml = AzureWebAPI.Get_AnimeXML(3483);
  1061. //XmlDocument docAnime = new XmlDocument();
  1062. //docAnime.LoadXml(xml);
  1063. //JMMService.AnidbProcessor.IsBanned = true;
  1064. //JMMService.AnidbProcessor.BanOrigin = "HTTP";
  1065. //JMMService.AnidbProcessor.BanTime = DateTime.Now;
  1066. //GenerateAzureList();
  1067. //SendToAzure();
  1068. //SendToAzureXML();
  1069. //CommandRequest_GetAniDBTitles cmd = new CommandRequest_GetAniDBTitles();
  1070. //cmd.Save();
  1071. AboutForm frm = new AboutForm();
  1072. frm.Owner = this;
  1073. frm.ShowDialog();
  1074. }
  1075. private void GenerateAzureList()
  1076. {
  1077. // get a lst of anime's that we already have
  1078. AniDB_AnimeRepository repAnime = new AniDB_AnimeRepository();
  1079. List<AniDB_Anime> allAnime = repAnime.GetAll();
  1080. Dictionary<int, int> localAnimeIDs = new Dictionary<int, int>();
  1081. foreach (AniDB_Anime anime in allAnime)
  1082. {
  1083. localAnimeIDs[anime.AnimeID] = anime.AnimeID;
  1084. }
  1085. // loop through the list of valid anime id's and add the ones we don't have yet
  1086. Dictionary<int, int> validAnimeIDs = new Dictionary<int, int>();
  1087. string line;
  1088. System.IO.StreamReader file =
  1089. new System.IO.StreamReader(@"e:\animetitles.txt");
  1090. while ((line = file.ReadLine()) != null)
  1091. {
  1092. string[] titlesArray = line.Split('|');
  1093. try
  1094. {
  1095. int aid = int.Parse(titlesArray[0]);
  1096. if (!localAnimeIDs.ContainsKey(aid))
  1097. validAnimeIDs[aid] = aid;
  1098. }
  1099. catch { }
  1100. }
  1101. file.Close();
  1102. string aids = "";
  1103. var shuffledList = validAnimeIDs.Values.OrderBy(a => Guid.NewGuid());
  1104. int i = 0;
  1105. foreach (int animeID in shuffledList)
  1106. {
  1107. i++;
  1108. if (!string.IsNullOrEmpty(aids)) aids += ",";
  1109. aids += animeID;
  1110. if (i == 250)
  1111. {
  1112. logger.Info(aids);
  1113. aids = "";
  1114. i = 0;
  1115. }
  1116. }
  1117. logger.Info(aids);
  1118. }
  1119. private void SendToAzureXML()
  1120. {
  1121. DateTime dt = DateTime.Now.AddYears(-2);
  1122. AniDB_AnimeRepository rep = new AniDB_AnimeRepository();
  1123. List<AniDB_Anime> allAnime = rep.GetAll();
  1124. int sentAnime = 0;
  1125. foreach (AniDB_Anime anime in rep.GetAll())
  1126. {
  1127. if (!anime.EndDate.HasValue) continue;
  1128. if (anime.EndDate.Value > dt) continue;
  1129. sentAnime++;
  1130. CommandRequest_Azure_SendAnimeXML cmd = new CommandRequest_Azure_SendAnimeXML(anime.AnimeID);
  1131. cmd.Save();
  1132. }
  1133. logger.Info(string.Format("Sent Anime XML to Cache: {0} out of {1}", sentAnime, allAnime.Count));
  1134. }
  1135. private void SendToAzure()
  1136. {
  1137. Dictionary<int, int> validAnimeIDs = new Dictionary<int, int>();
  1138. string line;
  1139. // Read the file and display it line by line.
  1140. System.IO.StreamReader file =
  1141. new System.IO.StreamReader(@"e:\animetitles.txt");
  1142. while ((line = file.ReadLine()) != null)
  1143. {
  1144. string[] titlesArray = line.Split('|');
  1145. try
  1146. {
  1147. int aid = int.Parse(titlesArray[0]);
  1148. validAnimeIDs[aid] = aid;
  1149. }
  1150. catch { }
  1151. }
  1152. file.Close();
  1153. string aids = "6287,6970,6577,7800,8982,9537,7339,9454,9263,6492,6664,6474,8956,6779,9351,8772,7929,6029,4991,5197,9205,8983,8464,8329,8273,7844,8915,7148,8449,7906,6384,7294,6867,8377,7753,6391,7712,8040,6126,7214,2495,8242,9285,7799,7087,9433,7748,6851,9546,6762,9553,9585,6740,6684,9461,6320,7042,6213,6435,8493,7842,6296,6769,9061,8735,7777,8209,8175,6283,6020,8723,6941,6282,6831,7105,9620,8222,8988,8757,9391,7759,8178,6021,7837,7739,6569,8393,7448,7732,6063,7532,8344,9170,6249,6348,7615,7580,7310,7632,9572,9357,7501,7036,8047,6147,6781,6724,7200,7133,8284,7519,8068,7059,7785,6640,6285,8119,6078,6723,8578,5522,8201,6657,7071,6554,7110,7145,8049,6725,9582,9600,7227,9250,7840,7813,7363,8495,9302,9430,7529,7150,7401,7781,6993,9525,8226,6580,7866,7081,6859,9159,9338,6054,6383,7152,6598,7518,8359,8141,9467,7019,6212,6960,6926,7980,9065,7587,6306,7165,6095,8146,9264,6127,9063,8664,8605,6682,7358,6693,7673,429,6536,6901,8682,6470,8544,6748,6561,6491,6974,7767,9613,6444,6592,6806,7259,7746,6075,7561,6623,7720,7192,6072,6595,8599,9243,8251,8145,8733,4124,7849,6172,7976,8755,9535,8582,591,6801,7575,6848,6981,9507,7620,7783,8685,8436,6568,6397,8290,8764,7261,8332,9570,6647,6538,6856,9436,7547,6570,7688,6311,7763,7221,9372,8718,6881,9363,9175,7309,6677";
  1154. string[] aidArray = aids.Split(',');
  1155. logger.Info(string.Format("Queueing {0} anime updates", aidArray.Length));
  1156. int cnt = 0;
  1157. foreach (string animeid in aidArray)
  1158. {
  1159. if (validAnimeIDs.ContainsKey(int.Parse(animeid)))
  1160. {
  1161. CommandRequest_GetAnimeHTTP cmd = new CommandRequest_GetAnimeHTTP(int.Parse(animeid), true, false);
  1162. cmd.Save();
  1163. cnt++;
  1164. }
  1165. }
  1166. logger.Info(string.Format("Queued {0} anime updates", cnt));
  1167. }
  1168. private void DownloadAllImages()
  1169. {
  1170. if (!downloadImagesWorker.IsBusy)
  1171. downloadImagesWorker.RunWorkerAsync();
  1172. }
  1173. void downloadImagesWorker_DoWork(object sender, DoWorkEventArgs e)
  1174. {
  1175. Importer.RunImport_GetImages();
  1176. }
  1177. void MainWindow_Loaded(object sender, RoutedEventArgs e)
  1178. {
  1179. //ServerInfo.Instance.RefreshImportFolders();
  1180. if (ServerSettings.MinimizeOnStartup) MinimizeToTray();
  1181. tabControl1

Large files files are truncated, but you can click here to view the full file