main.js 17 KB

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