PageRenderTime 77ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/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
  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.SelectedIndex = 4; // setup
  1182. if (ServerSettings.AniDB_Username.Equals("jonbaby", StringComparison.InvariantCultureIgnoreCase) ||
  1183. ServerSettings.AniDB_Username.Equals("jmediamanager", StringComparison.InvariantCultureIgnoreCase))
  1184. {
  1185. btnUploadAzureCache.Visibility = System.Windows.Visibility.Visible;
  1186. }
  1187. Utils.ClearAutoUpdateCache();
  1188. ShowDatabaseSetup();
  1189. workerSetupDB.RunWorkerAsync();
  1190. System.Reflection.Assembly a = System.Reflection.Assembly.GetExecutingAssembly();
  1191. if (a != null)
  1192. {
  1193. ServerState.Instance.ApplicationVersion = Utils.GetApplicationVersion(a);
  1194. }
  1195. automaticUpdater.ForceCheckForUpdate(true);
  1196. }
  1197. #region UI events and methods
  1198. private void CommandBinding_ScanFolder(object sender, ExecutedRoutedEventArgs e)
  1199. {
  1200. object obj = e.Parameter;
  1201. if (obj == null) return;
  1202. try
  1203. {
  1204. if (obj.GetType() == typeof(ImportFolder))
  1205. {
  1206. ImportFolder fldr = (ImportFolder)obj;
  1207. ScanFolder(fldr.ImportFolderID);
  1208. MessageBox.Show("Process is Running", "Success", MessageBoxButton.OK, MessageBoxImage.Information);
  1209. }
  1210. }
  1211. catch (Exception ex)
  1212. {
  1213. Utils.ShowErrorMessage(ex);
  1214. }
  1215. }
  1216. void btnUpdateAniDBInfo_Click(object sender, RoutedEventArgs e)
  1217. {
  1218. try
  1219. {
  1220. this.Cursor = Cursors.Wait;
  1221. Importer.RunImport_UpdateAllAniDB();
  1222. this.Cursor = Cursors.Arrow;
  1223. MessageBox.Show("Updates are queued", "Success", MessageBoxButton.OK, MessageBoxImage.Information);
  1224. }
  1225. catch (Exception ex)
  1226. {
  1227. logger.ErrorException(ex.Message, ex);
  1228. }
  1229. }
  1230. void btnUpdateTvDBInfo_Click(object sender, RoutedEventArgs e)
  1231. {
  1232. try
  1233. {
  1234. this.Cursor = Cursors.Wait;
  1235. Importer.RunImport_UpdateTvDB(false);
  1236. this.Cursor = Cursors.Arrow;
  1237. MessageBox.Show("Updates are queued", "Success", MessageBoxButton.OK, MessageBoxImage.Information);
  1238. }
  1239. catch (Exception ex)
  1240. {
  1241. logger.ErrorException(ex.Message, ex);
  1242. }
  1243. }
  1244. void btnUpdateAllStats_Click(object sender, RoutedEventArgs e)
  1245. {
  1246. this.Cursor = Cursors.Wait;
  1247. Importer.UpdateAllStats();
  1248. this.Cursor = Cursors.Arrow;
  1249. MessageBox.Show("Stats have been updated", "Success", MessageBoxButton.OK, MessageBoxImage.Information);
  1250. }
  1251. void btnSyncVotes_Click(object sender, RoutedEventArgs e)
  1252. {
  1253. CommandRequest_SyncMyVotes cmdVotes = new CommandRequest_SyncMyVotes();
  1254. cmdVotes.Save();
  1255. MessageBox.Show("Command added to queue", "Success", MessageBoxButton.OK, MessageBoxImage.Information);
  1256. //JMMService.AnidbProcessor.IsBanned = true;
  1257. }
  1258. void btnSyncMyList_Click(object sender, RoutedEventArgs e)
  1259. {
  1260. SyncMyList();
  1261. MessageBox.Show("Sync is Running", "Success", MessageBoxButton.OK, MessageBoxImage.Information);
  1262. }
  1263. void btnSyncTrakt_Click(object sender, RoutedEventArgs e)
  1264. {
  1265. this.Cursor = Cursors.Wait;
  1266. TraktTVHelper.SyncCollectionToTrakt();
  1267. this.Cursor = Cursors.Arrow;
  1268. MessageBox.Show("Sync is Queued", "Success", MessageBoxButton.OK, MessageBoxImage.Information);
  1269. }
  1270. void btnUploadAniFileCache_Click(object sender, RoutedEventArgs e)
  1271. {
  1272. this.Cursor = Cursors.Wait;
  1273. AniDB_FileRepository rep = new AniDB_FileRepository();
  1274. foreach (AniDB_File aniFile in rep.GetAll())
  1275. {
  1276. CommandRequest_WebCacheSendAniDB_File cmd = new CommandRequest_WebCacheSendAniDB_File(aniFile.AniDB_FileID);
  1277. cmd.Save();
  1278. }
  1279. this.Cursor = Cursors.Arrow;
  1280. MessageBox.Show("Commands are queued", "Success", MessageBoxButton.OK, MessageBoxImage.Information);
  1281. }
  1282. void btnRunImport_Click(object sender, RoutedEventArgs e)
  1283. {
  1284. RunImport();
  1285. MessageBox.Show("Import is Running", "Success", MessageBoxButton.OK, MessageBoxImage.Information);
  1286. }
  1287. void btnRemoveMissingFiles_Click(object sender, RoutedEventArgs e)
  1288. {
  1289. RemoveMissingFiles();
  1290. MessageBox.Show("Process is Running", "Success", MessageBoxButton.OK, MessageBoxImage.Information);
  1291. }
  1292. void btnGeneralResume_Click(object sender, RoutedEventArgs e)
  1293. {
  1294. JMMService.CmdProcessorGeneral.Paused = false;
  1295. }
  1296. void btnGeneralPause_Click(object sender, RoutedEventArgs e)
  1297. {
  1298. JMMService.CmdProcessorGeneral.Paused = true;
  1299. }
  1300. void btnHasherResume_Click(object sender, RoutedEventArgs e)
  1301. {
  1302. JMMService.CmdProcessorHasher.Paused = false;
  1303. }
  1304. void btnHasherPause_Click(object sender, RoutedEventArgs e)
  1305. {
  1306. JMMService.CmdProcessorHasher.Paused = true;
  1307. }
  1308. void btnImagesResume_Click(object sender, RoutedEventArgs e)
  1309. {
  1310. JMMService.CmdProcessorImages.Paused = false;
  1311. }
  1312. void btnImagesPause_Click(object sender, RoutedEventArgs e)
  1313. {
  1314. JMMService.CmdProcessorImages.Paused = true;
  1315. }
  1316. void btnToolbarShutdown_Click(object sender, RoutedEventArgs e)
  1317. {
  1318. isAppExiting = true;
  1319. this.Close();
  1320. TippuTrayNotify.Visible = false;
  1321. TippuTrayNotify.Dispose();
  1322. }
  1323. #endregion
  1324. private void StartUp()
  1325. {
  1326. }
  1327. void workerTraktFriends_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  1328. {
  1329. //StatsCache.Instance.TraktFriendRequests.Clear();
  1330. //StatsCache.Instance.TraktFriendActivityInfo.Clear();
  1331. List<object> allInfo = e.Result as List<object>;
  1332. if (allInfo != null && allInfo.Count > 0)
  1333. {
  1334. foreach (object obj in allInfo)
  1335. {
  1336. if (obj.GetType() == typeof(TraktTVFriendRequest))
  1337. {
  1338. TraktTVFriendRequest req = obj as TraktTVFriendRequest;
  1339. StatsCache.Instance.TraktFriendRequests.Add(req);
  1340. }
  1341. if (obj.GetType() == typeof(TraktTV_Activity))
  1342. {
  1343. TraktTV_Activity act = obj as TraktTV_Activity;
  1344. StatsCache.Instance.TraktFriendActivityInfo.Add(act);
  1345. }
  1346. }
  1347. }
  1348. }
  1349. void workerTraktFriends_DoWork(object sender, DoWorkEventArgs e)
  1350. {
  1351. List<object> allInfo = new List<object>();
  1352. List<TraktActivityContainer> allInfoTemp = new List<TraktActivityContainer>();
  1353. if (string.IsNullOrEmpty(ServerSettings.Trakt_Username) || string.IsNullOrEmpty(ServerSettings.Trakt_Password))
  1354. {
  1355. e.Result = allInfo;
  1356. return;
  1357. }
  1358. TraktTV_ActivitySummary summAll = TraktTVHelper.GetActivityFriends(false);
  1359. if (summAll != null)
  1360. {
  1361. foreach (TraktTV_Activity act in summAll.activity)
  1362. allInfoTemp.Add(new TraktActivityContainer { ActivityDate = Utils.GetAniDBDateAsDate(act.timestamp).Value, Activity = act });
  1363. }
  1364. TraktTV_ActivitySummary summShouts = TraktTVHelper.GetActivityFriends(true);
  1365. if (summShouts != null)
  1366. {
  1367. foreach (TraktTV_Activity act in summShouts.activity)
  1368. allInfoTemp.Add(new TraktActivityContainer { ActivityDate = Utils.GetAniDBDateAsDate(act.timestamp).Value, Activity = act });
  1369. }
  1370. // sort by episode type and number to find the next episode
  1371. List<SortPropOrFieldAndDirection> sortCriteria = new List<SortPropOrFieldAndDirection>();
  1372. sortCriteria.Add(new SortPropOrFieldAndDirection("ActivityDate", true, SortType.eDateTime));
  1373. allInfoTemp = Sorting.MultiSort<TraktActivityContainer>(allInfoTemp, sortCriteria);
  1374. foreach (TraktActivityContainer act in allInfoTemp)
  1375. allInfo.Add(act.Activity);
  1376. List<TraktTVFriendRequest> requests = TraktTVHelper.GetFriendsRequests();
  1377. if (requests != null)
  1378. {
  1379. foreach (TraktTVFriendRequest req in requests)
  1380. allInfo.Insert(0, req);
  1381. }
  1382. e.Result = allInfo;
  1383. }
  1384. public static void UpdateTraktFriendInfo(bool forced)
  1385. {
  1386. if (workerTraktFriends.IsBusy) return;
  1387. if (string.IsNullOrEmpty(ServerSettings.Trakt_Username) || string.IsNullOrEmpty(ServerSettings.Trakt_Password)) return;
  1388. bool performUpdate = false;
  1389. if (!doneFirstTrakTinfo || forced)
  1390. performUpdate = true;
  1391. else
  1392. {
  1393. TimeSpan ts = DateTime.Now - lastTraktInfoUpdate;
  1394. if (ts.TotalMinutes > 20) performUpdate = true;
  1395. }
  1396. if (performUpdate)
  1397. {
  1398. StatsCache.Instance.TraktFriendRequests.Clear();
  1399. StatsCache.Instance.TraktFriendActivityInfo.Clear();
  1400. lastTraktInfoUpdate = DateTime.Now;
  1401. doneFirstTrakTinfo = true;
  1402. workerTraktFriends.RunWorkerAsync();
  1403. }
  1404. }
  1405. void autoUpdateTimerShort_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
  1406. {
  1407. autoUpdateTimerShort.Enabled = false;
  1408. JMMService.CmdProcessorImages.NotifyOfNewCommand();
  1409. UpdateTraktFriendInfo(false);
  1410. //CheckVersion();
  1411. autoUpdateTimerShort.Enabled = true;
  1412. }
  1413. /*private void UpdateVersion2()
  1414. {
  1415. ShutDown();
  1416. UpdateManager updManager = UpdateManager.Instance;
  1417. //update configuration
  1418. updManager.UpdateFeedReader = new NAppUpdate.Framework.FeedReaders.AppcastReader();
  1419. updManager.UpdateSource = new NAppUpdate.Framework.Sources.SimpleWebSource();
  1420. string xml = "";
  1421. try
  1422. {
  1423. xml = Utils.DownloadWebPage("http://omm.hobbydb.net.leaf.arvixe.com/jmmserver_updatefeed.xml");
  1424. updManager.CheckForUpdateAsync(new NAppUpdate.Framework.Sources.MemorySource(xml), updatesCount =>
  1425. {
  1426. //Action showUpdateAction = () => new UpdateWindow(UpdateManager.Instance).Show();
  1427. if (updatesCount > 0)
  1428. {
  1429. updManager.PrepareUpdatesAsync(finished =>
  1430. {
  1431. if (finished)
  1432. updManager.ApplyUpdates();
  1433. else
  1434. updManager.CleanUp();
  1435. });
  1436. }
  1437. });
  1438. }
  1439. catch (Exception ex)
  1440. {
  1441. logger.ErrorException(ex.ToString(), ex);
  1442. }
  1443. //
  1444. }
  1445. private void UpdateVersion()
  1446. {
  1447. string xml = Utils.DownloadWebPage("http://omm.hobbydb.net.leaf.arvixe.com/jmmserver_updatefeed.xml");
  1448. IUpdateSource feedSource = new MemorySource(xml);
  1449. // Get a local pointer to the UpdateManager instance
  1450. UpdateManager updManager = UpdateManager.Instance;
  1451. updManager.UpdateFeedReader = new NAppUpdate.Framework.FeedReaders.AppcastReader();
  1452. // Only check for updates if we haven't done so already
  1453. if (updManager.State != UpdateManager.UpdateProcessState.NotChecked)
  1454. {
  1455. //MessageBox.Show("Update process has already initialized; current state: " + updManager.State.ToString());
  1456. return;
  1457. }
  1458. try
  1459. {
  1460. // Check for updates - returns true if relevant updates are found (after processing all the tasks and
  1461. // conditions)
  1462. // Throws exceptions in case of bad arguments or unexpected results
  1463. if (updManager.CheckForUpdates(feedSource))
  1464. {
  1465. updManager.PrepareUpdatesAsync(OnPrepareUpdatesCompleted);
  1466. }
  1467. else
  1468. {
  1469. MessageBox.Show("Your software is up to date");
  1470. }
  1471. }
  1472. catch (Exception ex)
  1473. {
  1474. if (ex is NAppUpdateException)
  1475. {
  1476. // This indicates a feed or network error; ex will contain all the info necessary
  1477. // to deal with that
  1478. }
  1479. else MessageBox.Show(ex.ToString());
  1480. }
  1481. }
  1482. private void OnPrepareUpdatesCompleted(bool succeeded)
  1483. {
  1484. if (!succeeded)
  1485. {
  1486. MessageBox.Show("Updates preperation failed. Check the feed and try again.");
  1487. }
  1488. else
  1489. {
  1490. // Get a local pointer to the UpdateManager instance
  1491. UpdateManager updManager = UpdateManager.Instance;
  1492. // This is a synchronous method by design, make sure to save all user work before calling
  1493. // it as it might restart your application
  1494. if (!updManager.ApplyUpdates())
  1495. MessageBox.Show("Error while trying to install software updates");
  1496. }
  1497. }*/
  1498. private void CheckVersion()
  1499. {
  1500. try
  1501. {
  1502. TimeSpan ts = DateTime.Now - lastVersionCheck;
  1503. if (ts.TotalMinutes < 180) return;
  1504. lastVersionCheck = DateTime.Now;
  1505. ServerState.Instance.NewVersionAvailable = false;
  1506. ServerState.Instance.NewVersionDownloadLink = "";
  1507. ServerState.Instance.NewVersionNumber = "";
  1508. // check for new version
  1509. AppVersionsResult appv = XMLService.GetAppVersions();
  1510. if (appv != null)
  1511. {
  1512. string curVersion = Utils.GetApplicationVersion(System.Reflection.Assembly.GetExecutingAssembly());
  1513. string[] latestNumbers = appv.JMMServerVersion.Split('.');
  1514. string[] curNumbers = curVersion.Split('.');
  1515. string latestMajor = string.Format("{0}.{1}", latestNumbers[0], latestNumbers[1]);
  1516. string curMajor = string.Format("{0}.{1}", curNumbers[0], curNumbers[1]);
  1517. decimal lmajor = decimal.Parse(latestMajor);
  1518. decimal cmajor = decimal.Parse(curMajor);
  1519. if (lmajor > cmajor)
  1520. {
  1521. ServerState.Instance.NewVersionAvailable = true;
  1522. ServerState.Instance.NewVersionDownloadLink = appv.JMMServerDownload;
  1523. ServerState.Instance.NewVersionNumber = appv.JMMServerVersion;
  1524. }
  1525. else if (lmajor == cmajor)
  1526. {
  1527. if (int.Parse(latestNumbers[2]) > int.Parse(curNumbers[2]))
  1528. {
  1529. ServerState.Instance.NewVersionAvailable = true;
  1530. ServerState.Instance.NewVersionDownloadLink = appv.JMMServerDownload;
  1531. ServerState.Instance.NewVersionNumber = appv.JMMServerVersion;
  1532. }
  1533. }
  1534. }
  1535. }
  1536. catch { }
  1537. }
  1538. #region Tray Minimize
  1539. void MainWindow_StateChanged(object sender, EventArgs e)
  1540. {
  1541. if (this.WindowState == System.Windows.WindowState.Minimized) this.Hide();
  1542. }
  1543. void TippuTrayNotify_MouseDoubleClick(object sender, System.Windows.Forms.MouseEventArgs e)
  1544. {
  1545. this.Show();
  1546. }
  1547. private void CreateMenus()
  1548. {
  1549. //Create a object for the context menu
  1550. ctxTrayMenu = new System.Windows.Forms.ContextMenuStrip();
  1551. //Add the Menu Item to the context menu
  1552. System.Windows.Forms.ToolStripMenuItem mnuShow = new System.Windows.Forms.ToolStripMenuItem();
  1553. mnuShow.Text = "Show";
  1554. mnuShow.Click += new EventHandler(mnuShow_Click);
  1555. ctxTrayMenu.Items.Add(mnuShow);
  1556. //Add the Menu Item to the context menu
  1557. System.Windows.Forms.ToolStripMenuItem mnuExit = new System.Windows.Forms.ToolStripMenuItem();
  1558. mnuExit.Text = "Shut Down";
  1559. mnuExit.Click += new EventHandler(mnuExit_Click);
  1560. ctxTrayMenu.Items.Add(mnuExit);
  1561. //Add the Context menu to the Notify Icon Object
  1562. TippuTrayNotify.ContextMenuStrip = ctxTrayMenu;
  1563. }
  1564. void mnuShow_Click(object sender, EventArgs e)
  1565. {
  1566. this.Show();
  1567. }
  1568. private void ShutDown()
  1569. {
  1570. StopWatchingFiles();
  1571. AniDBDispose();
  1572. StopHost();
  1573. }
  1574. private void MinimizeToTray()
  1575. {
  1576. this.Hide();
  1577. TippuTrayNotify.BalloonTipIcon = System.Windows.Forms.ToolTipIcon.Info;
  1578. TippuTrayNotify.BalloonTipTitle = "JMM Server";
  1579. TippuTrayNotify.BalloonTipText = "JMM Server has been minimized to the system tray. To open the application, double-click the icon in the system tray.";
  1580. //TippuTrayNotify.ShowBalloonTip(400);
  1581. }
  1582. void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
  1583. {
  1584. //When the application is closed, check wether the application is
  1585. //exiting from menu or forms close button
  1586. if (!isAppExiting)
  1587. {
  1588. //if the forms close button is triggered, cancel the event and hide the form
  1589. //then show the notification ballon tip
  1590. e.Cancel = true;
  1591. MinimizeToTray();
  1592. }
  1593. else
  1594. {
  1595. ShutDown();
  1596. }
  1597. }
  1598. void mnuExit_Click(object sender, EventArgs e)
  1599. {
  1600. isAppExiting = true;
  1601. this.Close();
  1602. TippuTrayNotify.Visible = false;
  1603. TippuTrayNotify.Dispose();
  1604. }
  1605. #endregion
  1606. static void autoUpdateTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
  1607. {
  1608. Importer.CheckForCalendarUpdate(false);
  1609. Importer.CheckForAnimeUpdate(false);
  1610. Importer.CheckForTvDBUpdates(false);
  1611. Importer.CheckForMyListSyncUpdate(false);
  1612. Importer.CheckForTraktAllSeriesUpdate(false);
  1613. Importer.CheckForTraktSyncUpdate(false);
  1614. Importer.CheckForMALUpdate(false);
  1615. Importer.CheckForMyListStatsUpdate(false);
  1616. Importer.CheckForAniDBFileUpdate(false);
  1617. Importer.CheckForLogClean();
  1618. Importer.UpdateAniDBTitles();
  1619. }
  1620. public static void StartWatchingFiles()
  1621. {
  1622. StopWatchingFiles();
  1623. watcherVids = new List<FileSystemWatcher>();
  1624. ImportFolderRepository repNetShares = new ImportFolderRepository();
  1625. foreach (ImportFolder share in repNetShares.GetAll())
  1626. {
  1627. try
  1628. {
  1629. if (Directory.Exists(share.ImportFolderLocation) && share.FolderIsWatched)
  1630. {
  1631. logger.Info("Watching ImportFolder: {0} || {1}", share.ImportFolderName, share.ImportFolderLocation);
  1632. FileSystemWatcher fsw = new FileSystemWatcher(share.ImportFolderLocation);
  1633. fsw.IncludeSubdirectories = true;
  1634. fsw.Created += new FileSystemEventHandler(fsw_Created);
  1635. fsw.EnableRaisingEvents = true;
  1636. watcherVids.Add(fsw);
  1637. }
  1638. else
  1639. {
  1640. logger.Error("ImportFolder not found for watching: {0} || {1}", share.ImportFolderName, share.ImportFolderLocation);
  1641. }
  1642. }
  1643. catch (Exception ex)
  1644. {
  1645. logger.ErrorException(ex.ToString(), ex);
  1646. }
  1647. }
  1648. }
  1649. public static void StopWatchingFiles()
  1650. {
  1651. if (watcherVids == null) return;
  1652. foreach (FileSystemWatcher fsw in watcherVids)
  1653. {
  1654. fsw.EnableRaisingEvents = false;
  1655. }
  1656. }
  1657. static void fsw_Created(object sender, FileSystemEventArgs e)
  1658. {
  1659. try
  1660. {
  1661. queueFileEvents.Add(e);
  1662. }
  1663. catch (Exception ex)
  1664. {
  1665. logger.ErrorException(ex.ToString(), ex);
  1666. }
  1667. }
  1668. public static void ScanDropFolders()
  1669. {
  1670. if (!workerScanDropFolders.IsBusy)
  1671. workerScanDropFolders.RunWorkerAsync();
  1672. }
  1673. public static void ScanFolder(int importFolderID)
  1674. {
  1675. if (!workerScanFolder.IsBusy)
  1676. workerScanFolder.RunWorkerAsync(importFolderID);
  1677. }
  1678. public static void RunImport()
  1679. {
  1680. if (!workerImport.IsBusy)
  1681. workerImport.RunWorkerAsync();
  1682. }
  1683. public static void RemoveMissingFiles()
  1684. {
  1685. if (!workerRemoveMissing.IsBusy)
  1686. workerRemoveMissing.RunWorkerAsync();
  1687. }
  1688. public static void SyncMyList()
  1689. {
  1690. Importer.CheckForMyListSyncUpdate(true);
  1691. }
  1692. public static void DeleteImportFolder(int importFolderID)
  1693. {
  1694. if (!workerDeleteImportFolder.IsBusy)
  1695. workerDeleteImportFolder.RunWorkerAsync(importFolderID);
  1696. }
  1697. static void workerRemoveMissing_DoWork(object sender, DoWorkEventArgs e)
  1698. {
  1699. try
  1700. {
  1701. Importer.RemoveRecordsWithoutPhysicalFiles();
  1702. }
  1703. catch (Exception ex)
  1704. {
  1705. logger.ErrorException(ex.Message, ex);
  1706. }
  1707. }
  1708. void workerDeleteImportFolder_DoWork(object sender, DoWorkEventArgs e)
  1709. {
  1710. try
  1711. {
  1712. int importFolderID = int.Parse(e.Argument.ToString());
  1713. Importer.DeleteImportFolder(importFolderID);
  1714. }
  1715. catch (Exception ex)
  1716. {
  1717. logger.ErrorException(ex.Message, ex);
  1718. }
  1719. }
  1720. static void workerScanFolder_DoWork(object sender, DoWorkEventArgs e)
  1721. {
  1722. try
  1723. {
  1724. Importer.RunImport_ScanFolder(int.Parse(e.Argument.ToString()));
  1725. }
  1726. catch (Exception ex)
  1727. {
  1728. logger.ErrorException(ex.Message, ex);
  1729. }
  1730. }
  1731. void workerScanDropFolders_DoWork(object sender, DoWorkEventArgs e)
  1732. {
  1733. try
  1734. {
  1735. Importer.RunImport_DropFolders();
  1736. }
  1737. catch (Exception ex)
  1738. {
  1739. logger.ErrorException(ex.Message, ex);
  1740. }
  1741. }
  1742. static void workerImport_DoWork(object sender, DoWorkEventArgs e)
  1743. {
  1744. try
  1745. {
  1746. Importer.RunImport_NewFiles();
  1747. Importer.RunImport_IntegrityCheck();
  1748. // TODO drop folder
  1749. // TvDB association checks
  1750. Importer.RunImport_ScanTvDB();
  1751. // Trakt association checks
  1752. Importer.RunImport_ScanTrakt();
  1753. // MovieDB association checks
  1754. Importer.RunImport_ScanMovieDB();
  1755. // Check for missing images
  1756. Importer.RunImport_GetImages();
  1757. // MAL association checks
  1758. Importer.RunImport_ScanMAL();
  1759. }
  1760. catch (Exception ex)
  1761. {
  1762. logger.ErrorException(ex.ToString(), ex);
  1763. }
  1764. }
  1765. private static void StartBinaryHost()
  1766. {
  1767. BinaryMessageEncodingBindingElement encoding = new BinaryMessageEncodingBindingElement();
  1768. HttpTransportBindingElement transport = new HttpTransportBindingElement();
  1769. Binding binding = new CustomBinding(encoding, transport);
  1770. binding.Name = "BinaryBinding";
  1771. binding.Namespace = "";
  1772. //binding.MessageEncoding = WSMessageEncoding.Mtom;
  1773. //binding.MaxReceivedMessageSize = 2147483647;
  1774. // Create the ServiceHost.
  1775. hostBinary = new ServiceHost(typeof(JMMServiceImplementation), baseAddressBinary);
  1776. // Enable metadata publishing.
  1777. ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
  1778. smb.HttpGetEnabled = true;
  1779. smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
  1780. hostBinary.Description.Behaviors.Add(smb);
  1781. hostBinary.AddServiceEndpoint(typeof(IJMMServer), binding, baseAddressBinary);
  1782. // ** DISCOVERY ** //
  1783. // make the service discoverable by adding the discovery behavior
  1784. //hostBinary.Description.Behaviors.Add(new ServiceDiscoveryBehavior());
  1785. // ** DISCOVERY ** //
  1786. // add the discovery endpoint that specifies where to publish the services
  1787. //hostBinary.AddServiceEndpoint(new UdpDiscoveryEndpoint());
  1788. // Open the ServiceHost to start listening for messages. Since
  1789. // no endpoints are explicitly configured, the runtime will create
  1790. // one endpoint per base address for each service contract implemented
  1791. // by the service.
  1792. hostBinary.Open();
  1793. logger.Trace("Now Accepting client connections for test host...");
  1794. }
  1795. private static void StartImageHost()
  1796. {
  1797. BasicHttpBinding binding = new BasicHttpBinding();
  1798. binding.MessageEncoding = WSMessageEncoding.Mtom;
  1799. binding.MaxReceivedMessageSize = 2147483647;
  1800. binding.Name = "httpLargeMessageStream";
  1801. // Create the ServiceHost.
  1802. hostImage = new ServiceHost(typeof(JMMServiceImplementationImage), baseAddressImage);
  1803. // Enable metadata publishing.
  1804. ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
  1805. smb.HttpGetEnabled = true;
  1806. smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
  1807. hostImage.Description.Behaviors.Add(smb);
  1808. hostImage.AddServiceEndpoint(typeof(IJMMServerImage), binding, baseAddressImage);
  1809. hostImage.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName, MetadataExchangeBindings.CreateMexHttpBinding(), "mex");
  1810. // Open the ServiceHost to start listening for messages. Since
  1811. // no endpoints are explicitly configured, the runtime will create
  1812. // one endpoint per base address for each service contract implemented
  1813. // by the service.
  1814. hostImage.Open();
  1815. logger.Trace("Now Accepting client connections for images...");
  1816. }
  1817. private static void StartStreamingHost_HTTP()
  1818. {
  1819. BasicHttpBinding binding = new BasicHttpBinding();
  1820. binding.TransferMode = TransferMode.Streamed;
  1821. binding.ReceiveTimeout = TimeSpan.MaxValue;
  1822. binding.SendTimeout = TimeSpan.MaxValue;
  1823. //binding.MessageEncoding = WSMessageEncoding.Mtom;
  1824. binding.MaxReceivedMessageSize = Int32.MaxValue;
  1825. binding.CloseTimeout = TimeSpan.MaxValue;
  1826. binding.Name = "FileStreaming";
  1827. binding.Security.Mode = BasicHttpSecurityMode.None;
  1828. // Create the ServiceHost.
  1829. hostStreaming = new ServiceHost(typeof(JMMServiceImplementationStreaming), baseAddressStreaming);
  1830. // Enable metadata publishing.
  1831. ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
  1832. smb.HttpGetEnabled = true;
  1833. smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
  1834. hostStreaming.Description.Behaviors.Add(smb);
  1835. hostStreaming.AddServiceEndpoint(typeof(IJMMServerStreaming), binding, baseAddressStreaming);
  1836. hostStreaming.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName, MetadataExchangeBindings.CreateMexHttpBinding(), "mex");
  1837. // Open the ServiceHost to start listening for messages. Since
  1838. // no endpoints are explicitly configured, the runtime will create
  1839. // one endpoint per base address for each service contract implemented
  1840. // by the service.
  1841. hostStreaming.Open();
  1842. logger.Trace("Now Accepting client connections for images...");
  1843. }
  1844. private static void StartStreamingHost()
  1845. {
  1846. BinaryOverHTTPBinding binding = new BinaryOverHTTPBinding();
  1847. // Create the ServiceHost.
  1848. hostStreaming = new ServiceHost(typeof(JMMServiceImplementationStreaming), baseAddressStreaming);
  1849. // Enable metadata publishing.
  1850. ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
  1851. smb.HttpGetEnabled = true;
  1852. smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
  1853. hostStreaming.Description.Behaviors.Add(smb);
  1854. hostStreaming.AddServiceEndpoint(typeof(IJMMServerStreaming), binding, baseAddressStreaming);
  1855. hostStreaming.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName, MetadataExchangeBindings.CreateMexHttpBinding(), "mex");
  1856. // Open the ServiceHost to start listening for messages. Since
  1857. // no endpoints are explicitly configured, the runtime will create
  1858. // one endpoint per base address for each service contract implemented
  1859. // by the service.
  1860. hostStreaming.Open();
  1861. logger.Trace("Now Accepting client connections for images...");
  1862. }
  1863. private static void StartStreamingHost_TCP()
  1864. {
  1865. NetTcpBinding netTCPbinding = new NetTcpBinding();
  1866. netTCPbinding.TransferMode = TransferMode.Streamed;
  1867. netTCPbinding.ReceiveTimeout = TimeSpan.MaxValue;
  1868. netTCPbinding.SendTimeout = TimeSpan.MaxValue;
  1869. netTCPbinding.MaxReceivedMessageSize = Int32.MaxValue;
  1870. netTCPbinding.CloseTimeout = TimeSpan.MaxValue;
  1871. netTCPbinding.Security.Mode = SecurityMode.Transport;
  1872. netTCPbinding.Security.Transport.ClientCredentialType = TcpClientCredentialType.None;
  1873. //netTCPbinding.Security.Transport.ClientCredentialType = TcpClientCredentialType.None;
  1874. //netTCPbinding.Security.Transport.ProtectionLevel = System.Net.Security.ProtectionLevel.None;
  1875. //netTCPbinding.Security.Message.ClientCredentialType = MessageCredentialType.None;
  1876. hostStreaming = new ServiceHost(typeof(JMMServiceImplementationStreaming));
  1877. hostStreaming.AddServiceEndpoint(typeof(IJMMServerStreaming), netTCPbinding, baseAddressStreaming);
  1878. hostStreaming.Description.Behaviors.Add(new ServiceMetadataBehavior());
  1879. Binding mexBinding = MetadataExchangeBindings.CreateMexTcpBinding();
  1880. hostStreaming.AddServiceEndpoint(typeof(IMetadataExchange), mexBinding, baseAddressStreamingMex);
  1881. hostStreaming.Open();
  1882. logger.Trace("Now Accepting client connections for streaming...");
  1883. }
  1884. private static void StartImageHostMetro()
  1885. {
  1886. BasicHttpBinding binding = new BasicHttpBinding();
  1887. binding.MessageEncoding = WSMessageEncoding.Text;
  1888. binding.MaxReceivedMessageSize = 2147483647;
  1889. binding.Name = "httpLargeMessageStream";
  1890. // Create the ServiceHost.
  1891. hostMetroImage = new ServiceHost(typeof(JMMServiceImplementationImage), baseAddressMetroImage);
  1892. // Enable metadata publishing.
  1893. ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
  1894. smb.HttpGetEnabled = true;
  1895. smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
  1896. hostMetroImage.Description.Behaviors.Add(smb);
  1897. hostMetroImage.AddServiceEndpoint(typeof(IJMMServerImage), binding, baseAddressMetroImage);
  1898. hostMetroImage.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName, MetadataExchangeBindings.CreateMexHttpBinding(), "mex");
  1899. // Open the ServiceHost to start listening for messages. Since
  1900. // no endpoints are explicitly configured, the runtime will create
  1901. // one endpoint per base address for each service contract implemented
  1902. // by the service.
  1903. hostMetroImage.Open();
  1904. logger.Trace("Now Accepting client connections for images (metro)...");
  1905. }
  1906. private static void StartMetroHost()
  1907. {
  1908. BasicHttpBinding binding = new BasicHttpBinding();
  1909. binding.MaxReceivedMessageSize = 2147483647;
  1910. binding.Name = "metroTest";
  1911. // Create the ServiceHost.
  1912. hostMetro = new ServiceHost(typeof(JMMServiceImplementationMetro), baseAddressMetro);
  1913. // Enable metadata publishing.
  1914. ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
  1915. smb.HttpGetEnabled = true;
  1916. smb.HttpGetUrl = baseAddressMetro;
  1917. smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
  1918. hostMetro.Description.Behaviors.Add(smb);
  1919. hostMetro.AddServiceEndpoint(typeof(IJMMServerMetro), binding, baseAddressMetro);
  1920. hostMetro.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName, MetadataExchangeBindings.CreateMexHttpBinding(), "mex");
  1921. // Open the ServiceHost to start listening for messages. Since
  1922. // no endpoints are explicitly configured, the runtime will create
  1923. // one endpoint per base address for each service contract implemented
  1924. // by the service.
  1925. hostMetro.Open();
  1926. logger.Trace("Now Accepting client connections for metro apps...");
  1927. }
  1928. private static void StartRESTHost()
  1929. {
  1930. hostREST = new WebServiceHost(typeof(JMMServiceImplementationREST), baseAddressREST);
  1931. ServiceEndpoint ep = hostREST.AddServiceEndpoint(typeof(IJMMServerREST), new WebHttpBinding(), "");
  1932. ServiceDebugBehavior stp = hostREST.Description.Behaviors.Find<ServiceDebugBehavior>();
  1933. stp.HttpHelpPageEnabled = false;
  1934. hostREST.Open();
  1935. }
  1936. private static void ReadFiles()
  1937. {
  1938. // Steps for processing a file
  1939. // 1. Check if it is a video file
  1940. // 2. Check if we have a VideoLocal record for that file
  1941. // .........
  1942. // get a complete list of files
  1943. List<string> fileList = new List<string>();
  1944. ImportFolderRepository repNetShares = new ImportFolderRepository();
  1945. foreach (ImportFolder share in repNetShares.GetAll())
  1946. {
  1947. logger.Debug("Import Folder: {0} || {1}", share.ImportFolderName, share.ImportFolderLocation);
  1948. Utils.GetFilesForImportFolder(share.ImportFolderLocation, ref fileList);
  1949. }
  1950. // get a list of all the shares we are looking at
  1951. int filesFound = 0, videosFound = 0;
  1952. int i = 0;
  1953. // get a list of all files in the share
  1954. foreach (string fileName in fileList)
  1955. {
  1956. i++;
  1957. filesFound++;
  1958. if (fileName.Contains("Sennou"))
  1959. {
  1960. logger.Info("Processing File {0}/{1} --- {2}", i, fileList.Count, fileName);
  1961. }
  1962. if (!FileHashHelper.IsVideo(fileName)) continue;
  1963. videosFound++;
  1964. }
  1965. logger.Debug("Found {0} files", filesFound);
  1966. logger.Debug("Found {0} videos", videosFound);
  1967. }
  1968. private static void StopHost()
  1969. {
  1970. // Close the ServiceHost.
  1971. //host.Close();
  1972. if (hostImage != null)
  1973. hostImage.Close();
  1974. if (hostBinary != null)
  1975. hostBinary.Close();
  1976. if (hostMetro != null)
  1977. hostMetro.Close();
  1978. if (hostMetroImage != null)
  1979. hostMetroImage.Close();
  1980. if (hostREST != null)
  1981. hostREST.Close();
  1982. if (hostStreaming != null)
  1983. hostStreaming.Close();
  1984. }
  1985. private static void SetupAniDBProcessor()
  1986. {
  1987. JMMService.AnidbProcessor.Init(ServerSettings.AniDB_Username, ServerSettings.AniDB_Password, ServerSettings.AniDB_ServerAddress,
  1988. ServerSettings.AniDB_ServerPort, ServerSettings.AniDB_ClientPort);
  1989. }
  1990. private static void AniDBDispose()
  1991. {
  1992. logger.Info("Disposing...");
  1993. if (JMMService.AnidbProcessor != null)
  1994. {
  1995. JMMService.AnidbProcessor.ForceLogout();
  1996. JMMService.AnidbProcessor.Dispose();
  1997. Thread.Sleep(1000);
  1998. }
  1999. }
  2000. public static int OnHashProgress(string fileName, int percentComplete)
  2001. {
  2002. //string msg = Path.GetFileName(fileName);
  2003. //if (msg.Length > 35) msg = msg.Substring(0, 35);
  2004. //logger.Info("{0}% Hashing ({1})", percentComplete, Path.GetFileName(fileName));
  2005. return 1; //continue hashing (return 0 to abort)
  2006. }
  2007. #region Tests
  2008. private static void ReviewsTest()
  2009. {
  2010. CommandRequest_GetReviews cmd = new CommandRequest_GetReviews(7525, true);
  2011. cmd.Save();
  2012. //CommandRequest_GetAnimeHTTP cmd = new CommandRequest_GetAnimeHTTP(7727, false);
  2013. //cmd.Save();
  2014. }
  2015. private static void WebCacheTest()
  2016. {
  2017. string hash = "";
  2018. hash = XMLService.Get_FileHash("Full Metal Panic! The Second Raid - S2 [AonE-AnY] (XviD) (704x396).avi", 181274624);
  2019. hash = XMLService.Get_FileHash("Code_Geass_R2_Ep14_Geass_Hunt_[720p,BluRay,x264]_-_THORA.mkv", 601722047);
  2020. hash = XMLService.Get_FileHash("[Ayako]_Infinite_Stratos_-_IS_-_02_[H264][720p][05C376A9].mkv", 368502091);
  2021. }
  2022. private static void HashTest()
  2023. {
  2024. string fileName = @"C:\Code_Geass_R2_Ep14_Geass_Hunt_[720p,BluRay,x264]_-_THORA.mkv";
  2025. //string fileName = @"M:\[ Anime Test ]\Code_Geass_R2_Ep14_Geass_Hunt_[720p,BluRay,x264]_-_THORA.mkv";
  2026. DateTime start = DateTime.Now;
  2027. Hashes hashes = Hasher.CalculateHashes(fileName, OnHashProgress, true, false, false, false);
  2028. TimeSpan ts = DateTime.Now - start;
  2029. double doubleED2k = ts.TotalMilliseconds;
  2030. start = DateTime.Now;
  2031. Hashes hashes2 = Hasher.CalculateHashes(fileName, OnHashProgress, true, true, false, false);
  2032. ts = DateTime.Now - start;
  2033. double doubleCRC32 = ts.TotalMilliseconds;
  2034. start = DateTime.Now;
  2035. Hashes hashes3 = Hasher.CalculateHashes(fileName, OnHashProgress, true, false, true, false);
  2036. ts = DateTime.Now - start;
  2037. double doubleMD5 = ts.TotalMilliseconds;
  2038. start = DateTime.Now;
  2039. Hashes hashes4 = Hasher.CalculateHashes(fileName, OnHashProgress, true, false, false, true);
  2040. ts = DateTime.Now - start;
  2041. double doubleSHA1 = ts.TotalMilliseconds;
  2042. start = DateTime.Now;
  2043. Hashes hashes5 = Hasher.CalculateHashes(fileName, OnHashProgress, true, true, true, true);
  2044. ts = DateTime.Now - start;
  2045. double doubleAll = ts.TotalMilliseconds;
  2046. logger.Info("ED2K only took {0} ms --- {1}/{2}/{3}/{4}", doubleED2k, hashes.ed2k, hashes.crc32, hashes.md5, hashes.sha1);
  2047. logger.Info("ED2K + CRCR32 took {0} ms --- {1}/{2}/{3}/{4}", doubleCRC32, hashes2.ed2k, hashes2.crc32, hashes2.md5, hashes2.sha1);
  2048. logger.Info("ED2K + MD5 took {0} ms --- {1}/{2}/{3}/{4}", doubleMD5, hashes3.ed2k, hashes3.crc32, hashes3.md5, hashes3.sha1);
  2049. logger.Info("ED2K + SHA1 took {0} ms --- {1}/{2}/{3}/{4}", doubleSHA1, hashes4.ed2k, hashes4.crc32, hashes4.md5, hashes4.sha1);
  2050. logger.Info("Everything took {0} ms --- {1}/{2}/{3}/{4}", doubleAll, hashes5.ed2k, hashes5.crc32, hashes5.md5, hashes5.sha1);
  2051. }
  2052. private static void HashTest2()
  2053. {
  2054. string fileName = @"C:\Anime\Code_Geass_R2_Ep14_Geass_Hunt_[720p,BluRay,x264]_-_THORA.mkv";
  2055. FileInfo fi = new FileInfo(fileName);
  2056. string fileSize1 = Utils.FormatByteSize(fi.Length);
  2057. DateTime start = DateTime.Now;
  2058. Hashes hashes = Hasher.CalculateHashes(fileName, OnHashProgress, true, false, false, false);
  2059. TimeSpan ts = DateTime.Now - start;
  2060. double doubleFile1 = ts.TotalMilliseconds;
  2061. fileName = @"C:\Anime\[Coalgirls]_Bakemonogatari_01_(1280x720_Blu-Ray_FLAC)_[CA425D15].mkv";
  2062. fi = new FileInfo(fileName);
  2063. string fileSize2 = Utils.FormatByteSize(fi.Length);
  2064. start = DateTime.Now;
  2065. Hashes hashes2 = Hasher.CalculateHashes(fileName, OnHashProgress, true, false, false, false);
  2066. ts = DateTime.Now - start;
  2067. double doubleFile2 = ts.TotalMilliseconds;
  2068. fileName = @"C:\Anime\Highschool_of_the_Dead_Ep01_Spring_of_the_Dead_[1080p,BluRay,x264]_-_gg-THORA.mkv";
  2069. fi = new FileInfo(fileName);
  2070. string fileSize3 = Utils.FormatByteSize(fi.Length);
  2071. start = DateTime.Now;
  2072. Hashes hashes3 = Hasher.CalculateHashes(fileName, OnHashProgress, true, false, false, false);
  2073. ts = DateTime.Now - start;
  2074. double doubleFile3 = ts.TotalMilliseconds;
  2075. logger.Info("Hashed {0} in {1} ms --- {2}", fileSize1, doubleFile1, hashes.ed2k);
  2076. logger.Info("Hashed {0} in {1} ms --- {2}", fileSize2, doubleFile2, hashes2.ed2k);
  2077. logger.Info("Hashed {0} in {1} ms --- {2}", fileSize3, doubleFile3, hashes3.ed2k);
  2078. }
  2079. private static void UpdateStatsTest()
  2080. {
  2081. AnimeGroupRepository repGroups = new AnimeGroupRepository();
  2082. foreach (AnimeGroup grp in repGroups.GetAllTopLevelGroups())
  2083. {
  2084. grp.UpdateStatsFromTopLevel(true, true);
  2085. }
  2086. }
  2087. private static void CreateImportFolders_Test()
  2088. {
  2089. logger.Debug("Creating import folders...");
  2090. ImportFolderRepository repImportFolders = new ImportFolderRepository();
  2091. ImportFolder sn = repImportFolders.GetByImportLocation(@"M:\[ Anime Test ]");
  2092. if (sn == null)
  2093. {
  2094. sn = new ImportFolder();
  2095. sn.ImportFolderName = "Anime";
  2096. sn.ImportFolderType = (int)ImportFolderType.HDD;
  2097. sn.ImportFolderLocation = @"M:\[ Anime Test ]";
  2098. repImportFolders.Save(sn);
  2099. }
  2100. logger.Debug("Complete!");
  2101. }
  2102. private static void ProcessFileTest()
  2103. {
  2104. //CommandRequest_HashFile cr_hashfile = new CommandRequest_HashFile(@"M:\[ Anime Test ]\[HorribleSubs] Dragon Crisis! - 02 [720p].mkv", false);
  2105. //CommandRequest_ProcessFile cr_procfile = new CommandRequest_ProcessFile(@"M:\[ Anime Test ]\[Doki] Saki - 01 (720x480 h264 DVD AAC) [DC73ACB9].mkv");
  2106. //cr_hashfile.Save();
  2107. CommandRequest_ProcessFile cr_procfile = new CommandRequest_ProcessFile(15350, false);
  2108. cr_procfile.Save();
  2109. }
  2110. private static void CreateImportFolders()
  2111. {
  2112. logger.Debug("Creating shares...");
  2113. ImportFolderRepository repNetShares = new ImportFolderRepository();
  2114. ImportFolder sn = repNetShares.GetByImportLocation(@"M:\[ Anime 2011 ]");
  2115. if (sn == null)
  2116. {
  2117. sn = new ImportFolder();
  2118. sn.ImportFolderType = (int)ImportFolderType.HDD;
  2119. sn.ImportFolderName = "Anime 2011";
  2120. sn.ImportFolderLocation = @"M:\[ Anime 2011 ]";
  2121. repNetShares.Save(sn);
  2122. }
  2123. sn = repNetShares.GetByImportLocation(@"M:\[ Anime - DVD and Bluray IN PROGRESS ]");
  2124. if (sn == null)
  2125. {
  2126. sn = new ImportFolder();
  2127. sn.ImportFolderType = (int)ImportFolderType.HDD;
  2128. sn.ImportFolderName = "Anime - DVD and Bluray IN PROGRESS";
  2129. sn.ImportFolderLocation = @"M:\[ Anime - DVD and Bluray IN PROGRESS ]";
  2130. repNetShares.Save(sn);
  2131. }
  2132. sn = repNetShares.GetByImportLocation(@"M:\[ Anime - DVD and Bluray COMPLETE ]");
  2133. if (sn == null)
  2134. {
  2135. sn = new ImportFolder();
  2136. sn.ImportFolderType = (int)ImportFolderType.HDD;
  2137. sn.ImportFolderName = "Anime - DVD and Bluray COMPLETE";
  2138. sn.ImportFolderLocation = @"M:\[ Anime - DVD and Bluray COMPLETE ]";
  2139. repNetShares.Save(sn);
  2140. }
  2141. sn = repNetShares.GetByImportLocation(@"M:\[ Anime ]");
  2142. if (sn == null)
  2143. {
  2144. sn = new ImportFolder();
  2145. sn.ImportFolderType = (int)ImportFolderType.HDD;
  2146. sn.ImportFolderName = "Anime";
  2147. sn.ImportFolderLocation = @"M:\[ Anime ]";
  2148. repNetShares.Save(sn);
  2149. }
  2150. logger.Debug("Creating shares complete!");
  2151. }
  2152. private static void CreateImportFolders2()
  2153. {
  2154. logger.Debug("Creating shares...");
  2155. ImportFolderRepository repNetShares = new ImportFolderRepository();
  2156. ImportFolder sn = repNetShares.GetByImportLocation(@"F:\Anime1");
  2157. if (sn == null)
  2158. {
  2159. sn = new ImportFolder();
  2160. sn.ImportFolderType = (int)ImportFolderType.HDD;
  2161. sn.ImportFolderName = "Anime1";
  2162. sn.ImportFolderLocation = @"F:\Anime1";
  2163. repNetShares.Save(sn);
  2164. }
  2165. sn = repNetShares.GetByImportLocation(@"H:\Anime2");
  2166. if (sn == null)
  2167. {
  2168. sn = new ImportFolder();
  2169. sn.ImportFolderType = (int)ImportFolderType.HDD;
  2170. sn.ImportFolderName = "Anime2";
  2171. sn.ImportFolderLocation = @"H:\Anime2";
  2172. repNetShares.Save(sn);
  2173. }
  2174. sn = repNetShares.GetByImportLocation(@"G:\Anime3");
  2175. if (sn == null)
  2176. {
  2177. sn = new ImportFolder();
  2178. sn.ImportFolderType = (int)ImportFolderType.HDD;
  2179. sn.ImportFolderName = "Anime3";
  2180. sn.ImportFolderLocation = @"G:\Anime3";
  2181. repNetShares.Save(sn);
  2182. }
  2183. logger.Debug("Creating shares complete!");
  2184. }
  2185. private static void CreateTestCommandRequests()
  2186. {
  2187. CommandRequest_GetAnimeHTTP cr_anime = new CommandRequest_GetAnimeHTTP(5415, false, true);
  2188. cr_anime.Save();
  2189. /*
  2190. cr_anime = new CommandRequest_GetAnimeHTTP(7382); cr_anime.Save();
  2191. cr_anime = new CommandRequest_GetAnimeHTTP(6239); cr_anime.Save();
  2192. cr_anime = new CommandRequest_GetAnimeHTTP(69); cr_anime.Save();
  2193. cr_anime = new CommandRequest_GetAnimeHTTP(6751); cr_anime.Save();
  2194. cr_anime = new CommandRequest_GetAnimeHTTP(3168); cr_anime.Save();
  2195. cr_anime = new CommandRequest_GetAnimeHTTP(4196); cr_anime.Save();
  2196. cr_anime = new CommandRequest_GetAnimeHTTP(634); cr_anime.Save();
  2197. cr_anime = new CommandRequest_GetAnimeHTTP(2002); cr_anime.Save();
  2198. cr_anime = new CommandRequest_GetAnimeHTTP(1); cr_anime.Save();
  2199. cr_anime = new CommandRequest_GetAnimeHTTP(2); cr_anime.Save();
  2200. cr_anime = new CommandRequest_GetAnimeHTTP(3); cr_anime.Save();
  2201. cr_anime = new CommandRequest_GetAnimeHTTP(4); cr_anime.Save();
  2202. cr_anime = new CommandRequest_GetAnimeHTTP(5); cr_anime.Save();
  2203. cr_anime = new CommandRequest_GetAnimeHTTP(6); cr_anime.Save();
  2204. cr_anime = new CommandRequest_GetAnimeHTTP(7); cr_anime.Save();
  2205. cr_anime = new CommandRequest_GetAnimeHTTP(8); cr_anime.Save();
  2206. cr_anime = new CommandRequest_GetAnimeHTTP(9); cr_anime.Save();
  2207. cr_anime = new CommandRequest_GetAnimeHTTP(10); cr_anime.Save();
  2208. cr_anime = new CommandRequest_GetAnimeHTTP(11); cr_anime.Save();
  2209. cr_anime = new CommandRequest_GetAnimeHTTP(12); cr_anime.Save();
  2210. cr_anime = new CommandRequest_GetAnimeHTTP(13); cr_anime.Save();
  2211. cr_anime = new CommandRequest_GetAnimeHTTP(14); cr_anime.Save();
  2212. cr_anime = new CommandRequest_GetAnimeHTTP(15); cr_anime.Save();
  2213. cr_anime = new CommandRequest_GetAnimeHTTP(16); cr_anime.Save();
  2214. cr_anime = new CommandRequest_GetAnimeHTTP(17); cr_anime.Save();
  2215. cr_anime = new CommandRequest_GetAnimeHTTP(18); cr_anime.Save();
  2216. cr_anime = new CommandRequest_GetAnimeHTTP(19); cr_anime.Save();*/
  2217. }
  2218. #endregion
  2219. }
  2220. }