main.js 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476
  1. (function () {
  2. 'use strict';
  3. angular.module('ariaNg').controller('MainController', ['$rootScope', '$scope', '$route', '$window', '$location', '$document', '$interval', 'clipboard', 'aria2RpcErrors', 'ariaNgCommonService', 'ariaNgNotificationService', 'ariaNgLocalizationService', 'ariaNgSettingService', 'ariaNgMonitorService', 'ariaNgTitleService', 'aria2TaskService', 'aria2SettingService', 'ariaNgNativeElectronService', function ($rootScope, $scope, $route, $window, $location, $document, $interval, clipboard, aria2RpcErrors, ariaNgCommonService, ariaNgNotificationService, ariaNgLocalizationService, ariaNgSettingService, ariaNgMonitorService, ariaNgTitleService, aria2TaskService, aria2SettingService, ariaNgNativeElectronService) {
  4. var pageTitleRefreshPromise = null;
  5. var globalStatRefreshPromise = null;
  6. var refreshPageTitle = function () {
  7. var title = ariaNgTitleService.getFinalTitleByGlobalStat({
  8. globalStat: $scope.globalStat,
  9. currentRpcProfile: getCurrentRPCProfile()
  10. });
  11. $document[0].title = title;
  12. ariaNgNativeElectronService.setTrayToolTip(title);
  13. };
  14. var refreshGlobalStat = function (silent, callback) {
  15. return aria2SettingService.getGlobalStat(function (response) {
  16. if (!response.success && response.data.message === aria2RpcErrors.Unauthorized.message) {
  17. $interval.cancel(globalStatRefreshPromise);
  18. return;
  19. }
  20. if (response.success) {
  21. $scope.globalStat = response.data;
  22. ariaNgMonitorService.recordGlobalStat(response.data);
  23. }
  24. if (callback) {
  25. callback(response);
  26. }
  27. }, silent);
  28. };
  29. var getCurrentRPCProfile = function () {
  30. if (!$scope.rpcSettings || $scope.rpcSettings.length < 1) {
  31. return null;
  32. }
  33. for (var i = 0; i < $scope.rpcSettings.length; i++) {
  34. var rpcSetting = $scope.rpcSettings[i];
  35. if (rpcSetting.isDefault) {
  36. return rpcSetting;
  37. }
  38. }
  39. return null;
  40. };
  41. if (ariaNgSettingService.getBrowserNotification()) {
  42. ariaNgNotificationService.requestBrowserPermission();
  43. }
  44. $scope.ariaNgVersion = ariaNgNativeElectronService.getVersion();
  45. $scope.globalStatusContext = {
  46. isEnabled: ariaNgSettingService.getGlobalStatRefreshInterval() > 0,
  47. data: ariaNgMonitorService.getGlobalStatsData()
  48. };
  49. $scope.enableDebugMode = function () {
  50. return ariaNgSettingService.isEnableDebugMode();
  51. };
  52. $scope.quickSettingContext = null;
  53. $scope.rpcSettings = ariaNgSettingService.getAllRpcSettings();
  54. $scope.currentRpcProfile = getCurrentRPCProfile();
  55. $scope.isCurrentRpcUseWebSocket = ariaNgSettingService.isCurrentRpcUseWebSocket();
  56. $scope.isTaskSelected = function () {
  57. return $rootScope.taskContext.getSelectedTaskIds().length > 0;
  58. };
  59. $scope.isSelectedTasksAllHaveUrl = function () {
  60. var selectedTasks = $rootScope.taskContext.getSelectedTasks();
  61. if (selectedTasks.length < 1) {
  62. return false;
  63. }
  64. for (var i = 0; i < selectedTasks.length; i++) {
  65. if (!selectedTasks[i].singleUrl) {
  66. return false;
  67. }
  68. }
  69. return true;
  70. };
  71. $scope.isSelectedTasksAllHaveInfoHash = function () {
  72. var selectedTasks = $rootScope.taskContext.getSelectedTasks();
  73. if (selectedTasks.length < 1) {
  74. return false;
  75. }
  76. for (var i = 0; i < selectedTasks.length; i++) {
  77. if (!selectedTasks[i].bittorrent || !selectedTasks[i].infoHash) {
  78. return false;
  79. }
  80. }
  81. return true;
  82. };
  83. $scope.isSpecifiedTaskSelected = function () {
  84. var selectedTasks = $rootScope.taskContext.getSelectedTasks();
  85. if (selectedTasks.length < 1) {
  86. return false;
  87. }
  88. for (var i = 0; i < selectedTasks.length; i++) {
  89. for (var j = 0; j < arguments.length; j++) {
  90. if (selectedTasks[i].status === arguments[j]) {
  91. return true;
  92. }
  93. }
  94. }
  95. return false;
  96. };
  97. $scope.isSpecifiedTaskShowing = function () {
  98. var tasks = $rootScope.taskContext.list;
  99. if (tasks.length < 1) {
  100. return false;
  101. }
  102. for (var i = 0; i < tasks.length; i++) {
  103. for (var j = 0; j < arguments.length; j++) {
  104. if (tasks[i].status === arguments[j]) {
  105. return true;
  106. }
  107. }
  108. }
  109. return false;
  110. };
  111. $scope.changeTasksState = function (state) {
  112. var gids = $rootScope.taskContext.getSelectedTaskIds();
  113. if (!gids || gids.length < 1) {
  114. return;
  115. }
  116. var invoke = null;
  117. if (state === 'start') {
  118. invoke = aria2TaskService.startTasks;
  119. } else if (state === 'pause') {
  120. invoke = aria2TaskService.pauseTasks;
  121. } else {
  122. return;
  123. }
  124. $rootScope.loadPromise = invoke(gids, function (response) {
  125. if (response.hasError && gids.length > 1) {
  126. ariaNgLocalizationService.showError('Failed to change some tasks state.');
  127. }
  128. if (!response.hasSuccess) {
  129. return;
  130. }
  131. refreshGlobalStat(true);
  132. if (!response.hasError && state === 'start') {
  133. if ($location.path() === '/waiting') {
  134. $location.path('/downloading');
  135. } else {
  136. $route.reload();
  137. }
  138. } else if (!response.hasError && state === 'pause') {
  139. if ($location.path() === '/downloading') {
  140. $location.path('/waiting');
  141. } else {
  142. $route.reload();
  143. }
  144. }
  145. }, (gids.length > 1));
  146. };
  147. $scope.retryTask = function (task) {
  148. ariaNgLocalizationService.confirm('Confirm Retry', 'Are you sure you want to retry the selected task? AriaNg will create same task after clicking OK.', 'info', function () {
  149. $rootScope.loadPromise = aria2TaskService.retryTask(task.gid, function (response) {
  150. if (!response.success) {
  151. ariaNgLocalizationService.showError('Failed to retry this task.');
  152. return;
  153. }
  154. refreshGlobalStat(true);
  155. var actionAfterRetryingTask = ariaNgSettingService.getAfterRetryingTask();
  156. if (response.success && response.data) {
  157. if (actionAfterRetryingTask === 'task-list-downloading') {
  158. if ($location.path() !== '/downloading') {
  159. $location.path('/downloading');
  160. } else {
  161. $route.reload();
  162. }
  163. } else if (actionAfterRetryingTask === 'task-detail') {
  164. $location.path('/task/detail/' + response.data);
  165. } else {
  166. $route.reload();
  167. }
  168. }
  169. }, false);
  170. });
  171. };
  172. $scope.hasRetryableTask = function () {
  173. return $rootScope.taskContext.hasRetryableTask();
  174. };
  175. $scope.hasCompletedTask = function () {
  176. return $rootScope.taskContext.hasCompletedTask();
  177. };
  178. $scope.isSelectedTaskRetryable = function () {
  179. var selectedTasks = $rootScope.taskContext.getSelectedTasks();
  180. if (selectedTasks.length < 1) {
  181. return false;
  182. }
  183. for (var i = 0; i < selectedTasks.length; i++) {
  184. if (!$rootScope.isTaskRetryable(selectedTasks[i])) {
  185. return false;
  186. }
  187. }
  188. return true;
  189. };
  190. $scope.retryTasks = function () {
  191. var tasks = $rootScope.taskContext.getSelectedTasks();
  192. if (!tasks || tasks.length < 1) {
  193. return;
  194. } else if (tasks.length === 1) {
  195. return $scope.retryTask(tasks[0]);
  196. }
  197. var retryableTasks = [];
  198. var skipCount = 0;
  199. for (var i = 0; i < tasks.length; i++) {
  200. if ($rootScope.isTaskRetryable(tasks[i])) {
  201. retryableTasks.push(tasks[i]);
  202. } else {
  203. skipCount++;
  204. }
  205. }
  206. ariaNgLocalizationService.confirm('Confirm Retry', 'Are you sure you want to retry the selected task? AriaNg will create same task after clicking OK.', 'info', function () {
  207. $rootScope.loadPromise = aria2TaskService.retryTasks(retryableTasks, function (response) {
  208. refreshGlobalStat(true);
  209. ariaNgLocalizationService.showInfo('Operation Result', '{successCount} tasks have been retried and {failedCount} tasks are failed.', function () {
  210. var actionAfterRetryingTask = ariaNgSettingService.getAfterRetryingTask();
  211. if (response.hasSuccess) {
  212. if (actionAfterRetryingTask === 'task-list-downloading') {
  213. if ($location.path() !== '/downloading') {
  214. $location.path('/downloading');
  215. } else {
  216. $route.reload();
  217. }
  218. } else {
  219. $route.reload();
  220. }
  221. }
  222. }, {
  223. textParams: {
  224. successCount: response.successCount,
  225. failedCount: response.failedCount,
  226. skipCount: skipCount
  227. }
  228. });
  229. }, false);
  230. }, true);
  231. };
  232. $scope.removeTasks = function () {
  233. var tasks = $rootScope.taskContext.getSelectedTasks();
  234. if (!tasks || tasks.length < 1) {
  235. return;
  236. }
  237. var removeTasks = function () {
  238. $rootScope.loadPromise = aria2TaskService.removeTasks(tasks, function (response) {
  239. if (response.hasError && tasks.length > 1) {
  240. ariaNgLocalizationService.showError('Failed to remove some task(s).');
  241. }
  242. if (!response.hasSuccess) {
  243. return;
  244. }
  245. refreshGlobalStat(true);
  246. if (!response.hasError) {
  247. if ($location.path() !== '/stopped') {
  248. $location.path('/stopped');
  249. } else {
  250. $route.reload();
  251. }
  252. }
  253. }, (tasks.length > 1));
  254. };
  255. if (ariaNgSettingService.getConfirmTaskRemoval()) {
  256. ariaNgLocalizationService.confirm('Confirm Remove', 'Are you sure you want to remove the selected task?', 'warning', removeTasks);
  257. } else {
  258. removeTasks();
  259. };
  260. };
  261. $scope.clearStoppedTasks = function () {
  262. ariaNgLocalizationService.confirm('Confirm Clear', 'Are you sure you want to clear stopped tasks?', 'warning', function () {
  263. $rootScope.loadPromise = aria2TaskService.clearStoppedTasks(function (response) {
  264. if (!response.success) {
  265. return;
  266. }
  267. refreshGlobalStat(true);
  268. if ($location.path() !== '/stopped') {
  269. $location.path('/stopped');
  270. } else {
  271. $route.reload();
  272. }
  273. });
  274. });
  275. };
  276. $scope.isAllTasksSelected = function () {
  277. return $rootScope.taskContext.isAllSelected();
  278. };
  279. $scope.selectAllTasks = function () {
  280. $rootScope.taskContext.selectAll();
  281. };
  282. $scope.selectAllFailedTasks = function () {
  283. $rootScope.taskContext.selectAllFailed();
  284. };
  285. $scope.selectAllCompletedTasks = function () {
  286. $rootScope.taskContext.selectAllCompleted();
  287. };
  288. $scope.copySelectedTasksDownloadLink = function () {
  289. var selectedTasks = $rootScope.taskContext.getSelectedTasks();
  290. var result = '';
  291. for (var i = 0; i < selectedTasks.length; i++) {
  292. if (i > 0) {
  293. result += '\n';
  294. }
  295. result += selectedTasks[i].singleUrl;
  296. }
  297. if (result.length > 0) {
  298. clipboard.copyText(result);
  299. }
  300. };
  301. $scope.copySelectedTasksMagnetLink = function () {
  302. var selectedTasks = $rootScope.taskContext.getSelectedTasks();
  303. var result = '';
  304. for (var i = 0; i < selectedTasks.length; i++) {
  305. if (i > 0) {
  306. result += '\n';
  307. }
  308. result += 'magnet:?xt=urn:btih:' + selectedTasks[i].infoHash;
  309. }
  310. if (result.length > 0) {
  311. clipboard.copyText(result);
  312. }
  313. };
  314. $scope.changeDisplayOrder = function (type, autoSetReverse) {
  315. var oldType = ariaNgCommonService.parseOrderType(ariaNgSettingService.getDisplayOrder());
  316. var newType = ariaNgCommonService.parseOrderType(type);
  317. if (autoSetReverse && newType.type === oldType.type) {
  318. newType.reverse = !oldType.reverse;
  319. }
  320. ariaNgSettingService.setDisplayOrder(newType.getValue());
  321. };
  322. $scope.isSetDisplayOrder = function (type) {
  323. var orderType = ariaNgCommonService.parseOrderType(ariaNgSettingService.getDisplayOrder());
  324. var targetType = ariaNgCommonService.parseOrderType(type);
  325. return orderType.equals(targetType);
  326. };
  327. $scope.showQuickSettingDialog = function (type, title) {
  328. $scope.quickSettingContext = {
  329. type: type,
  330. title: title
  331. };
  332. };
  333. $scope.switchRpcSetting = function (setting) {
  334. if (setting.isDefault) {
  335. return;
  336. }
  337. ariaNgSettingService.setDefaultRpcSetting(setting);
  338. if ($location.path().indexOf('/task/detail/') === 0) {
  339. $rootScope.setAutoRefreshAfterPageLoad();
  340. $location.path('/downloading');
  341. } else {
  342. $window.location.reload();
  343. }
  344. };
  345. $scope.minimizeWindow = function () {
  346. ariaNgNativeElectronService.minimizeWindow();
  347. };
  348. $scope.maximizeOrRestoreWindow = function () {
  349. ariaNgNativeElectronService.maximizeOrRestoreWindow();
  350. };
  351. $scope.exitApp = function () {
  352. ariaNgNativeElectronService.exitApp();
  353. };
  354. $scope.openProjectLink = function () {
  355. ariaNgNativeElectronService.openProjectLink();
  356. };
  357. if (ariaNgSettingService.getTitleRefreshInterval() > 0) {
  358. pageTitleRefreshPromise = $interval(function () {
  359. refreshPageTitle();
  360. }, ariaNgSettingService.getTitleRefreshInterval());
  361. }
  362. if (ariaNgSettingService.getGlobalStatRefreshInterval() > 0) {
  363. globalStatRefreshPromise = $interval(function () {
  364. refreshGlobalStat(true);
  365. }, ariaNgSettingService.getGlobalStatRefreshInterval());
  366. }
  367. $scope.$on('$destroy', function () {
  368. if (pageTitleRefreshPromise) {
  369. $interval.cancel(pageTitleRefreshPromise);
  370. }
  371. if (globalStatRefreshPromise) {
  372. $interval.cancel(globalStatRefreshPromise);
  373. }
  374. });
  375. refreshGlobalStat(true, function () {
  376. refreshPageTitle();
  377. });
  378. }]);
  379. }());