From 90a4de8a871d5504ebca36ca7afd4b0aa27b1268 Mon Sep 17 00:00:00 2001 From: MaysWind Date: Fri, 24 Jun 2016 00:39:18 +0800 Subject: [PATCH] support add bt/metalink task via file --- src/index.html | 1 + src/langs/zh_CN.json | 3 + src/scripts/config/defaultLanguage.js | 3 + src/scripts/controllers/new.js | 36 ++++++++- src/scripts/services/aria2RpcService.js | 26 +++++-- src/scripts/services/aria2TaskService.js | 16 ++++ src/scripts/services/ariaNgFileService.js | 92 +++++++++++++++++++++++ src/views/new.html | 6 +- 8 files changed, 173 insertions(+), 10 deletions(-) create mode 100644 src/scripts/services/ariaNgFileService.js diff --git a/src/index.html b/src/index.html index 9c17d09..1feb030 100644 --- a/src/index.html +++ b/src/index.html @@ -301,6 +301,7 @@ + diff --git a/src/langs/zh_CN.json b/src/langs/zh_CN.json index 33f297c..e7ca732 100644 --- a/src/langs/zh_CN.json +++ b/src/langs/zh_CN.json @@ -82,6 +82,9 @@ "Open Torrent File": "打开种子文件", "Open Metalink File": "打开 Metalink 文件", "Support multiple URLs, one URL per line.": "支持多个 URL 地址, 每个地址占一行.", + "Your browser does not support loading file!": "您的浏览器不支持加载文件!", + "The selected file type is invalid!": "选择的文件类型无效!", + "Failed to load file!": "加载文件失败!", "More Options": "更多选项", "Language": "语言", "Aria2 RPC Host": "Aria2 RPC 主机", diff --git a/src/scripts/config/defaultLanguage.js b/src/scripts/config/defaultLanguage.js index be1e744..668e4a0 100644 --- a/src/scripts/config/defaultLanguage.js +++ b/src/scripts/config/defaultLanguage.js @@ -86,6 +86,9 @@ 'Start Download': 'Start Download', 'Manual Download': 'Manual Download', 'Support multiple URLs, one URL per line.': 'Support multiple URLs, one URL per line.', + 'Your browser does not support loading file!': 'Your browser does not support loading file!', + 'The selected file type is invalid': 'The selected file type is invalid', + 'Failed to load file!': 'Failed to load file!', 'More Options': 'More Options', 'Language': 'Language', 'Aria2 RPC Host': 'Aria2 RPC Host', diff --git a/src/scripts/controllers/new.js b/src/scripts/controllers/new.js index 08bacac..6101ab6 100644 --- a/src/scripts/controllers/new.js +++ b/src/scripts/controllers/new.js @@ -1,7 +1,7 @@ (function () { 'use strict'; - angular.module('ariaNg').controller('NewTaskController', ['$rootScope', '$scope', '$location', '$timeout', 'aria2SettingService', 'aria2TaskService', function ($rootScope, $scope, $location, $timeout, aria2SettingService, aria2TaskService) { + angular.module('ariaNg').controller('NewTaskController', ['$rootScope', '$scope', '$location', '$timeout', 'aria2SettingService', 'aria2TaskService', 'ariaNgFileService', function ($rootScope, $scope, $location, $timeout, aria2SettingService, aria2TaskService, ariaNgFileService) { var tabOrders = ['links', 'options']; $scope.context = { @@ -58,6 +58,40 @@ }); }; + $scope.openTorrent = function () { + ariaNgFileService.openFileContent('.torrent', function (result) { + var task = { + content: result.base64Content, + options: angular.copy($scope.context.options) + }; + + $rootScope.loadPromise = aria2TaskService.newTorrentTask(task, true, function (response) { + if (!response.success) { + return; + } + + $location.path('/task/detail/' + response.data); + }); + }); + }; + + $scope.openMetalink = function () { + ariaNgFileService.openFileContent('.meta4,.metalink', function (result) { + var task = { + content: result.base64Content, + options: angular.copy($scope.context.options) + }; + + $rootScope.loadPromise = aria2TaskService.newMetalinkTask(task, true, function (response) { + if (!response.success) { + return; + } + + $location.path('/task/detail/' + response.data); + }); + }); + }; + $scope.startDownload = function (pauseOnAdded) { var urls = $scope.context.urls.split('\n'); var options = angular.copy($scope.context.options); diff --git a/src/scripts/services/aria2RpcService.js b/src/scripts/services/aria2RpcService.js index 561c26f..a3d4ba5 100644 --- a/src/scripts/services/aria2RpcService.js +++ b/src/scripts/services/aria2RpcService.js @@ -186,12 +186,26 @@ return invokeMulti(this.addUri, contexts, context.callback); }, - // addTorrent: function (context) { - // return invoke('addTorrent', context); - // }, - // addMetalink: function (context) { - // return invoke('addMetalink', context); - // }, + addTorrent: function (context) { + var content = context.task.content; + var options = angular.copy(context.task.options); + + if (context.pauseOnAdded) { + options.pause = 'true'; + } + + return invoke(buildRequestContext('addTorrent', context, content, [], options)); + }, + addMetalink: function (context) { + var content = context.task.content; + var options = angular.copy(context.task.options); + + if (context.pauseOnAdded) { + options.pause = 'true'; + } + + return invoke(buildRequestContext('addMetalink', context, content, [], options)); + }, remove: function (context) { return invoke(buildRequestContext('remove', context, context.gid)); }, diff --git a/src/scripts/services/aria2TaskService.js b/src/scripts/services/aria2TaskService.js index 01f5a2b..4b39778 100644 --- a/src/scripts/services/aria2TaskService.js +++ b/src/scripts/services/aria2TaskService.js @@ -266,6 +266,22 @@ callback: callback }); }, + newTorrentTask: function (task, pauseOnAdded, callback, silent) { + return aria2RpcService.addTorrent({ + task: task, + pauseOnAdded: !!pauseOnAdded, + silent: !!silent, + callback: callback + }); + }, + newMetalinkTask: function (task, pauseOnAdded, callback, silent) { + return aria2RpcService.addMetalink({ + task: task, + pauseOnAdded: !!pauseOnAdded, + silent: !!silent, + callback: callback + }); + }, startTasks: function (gids, callback, silent) { return aria2RpcService.unpauseMulti({ gids: gids, diff --git a/src/scripts/services/ariaNgFileService.js b/src/scripts/services/ariaNgFileService.js new file mode 100644 index 0000000..773fed5 --- /dev/null +++ b/src/scripts/services/ariaNgFileService.js @@ -0,0 +1,92 @@ +(function () { + 'use strict'; + + angular.module('ariaNg').factory('ariaNgFileService', ['ariaNgCommonService', function (ariaNgCommonService) { + var isSupportFileReader = !!FileReader; + + var getAllowedExtensions = function (fileFilter) { + var extensions = []; + + if (!fileFilter || fileFilter.length < 1) { + extensions.push(/.+$/); + return extensions; + } + + var fileFilters = fileFilter.split(','); + + for (var i = 0; i < fileFilters.length; i++) { + var extension = fileFilters[i]; + + if (extension == '*.*') { + extensions.push(/.+$/); + continue; + } + + extension = extension.replace('.', '\\.'); + extension = extension + '$'; + + extensions.push(new RegExp(extension)); + } + + return extensions; + }; + + var checkFileExtension = function (fileName, extensions) { + if (!extensions || extensions.length < 1) { + return true; + } + + for (var i = 0; i < extensions.length; i++) { + if (extensions[i].test(fileName)) { + return true; + } + } + + return false; + }; + + return { + openFileContent: function (fileFilter, callback) { + if (!isSupportFileReader) { + ariaNgCommonService.showError('Your browser does not support loading file!'); + return; + } + + var allowedExtensions = getAllowedExtensions(fileFilter); + + angular.element('').change(function () { + if (!this.files || this.files.length < 1) { + return; + } + + var file = this.files[0]; + var fileName = file.name; + + if (!checkFileExtension(fileName, allowedExtensions)) { + ariaNgCommonService.showError('The selected file type is invalid!'); + return; + } + + var reader = new FileReader(); + + reader.onload = function () { + var result = { + fileName: fileName, + base64Content: this.result.replace(/.*?base64,/, '') + }; + + if (callback) { + callback(result); + } + }; + + reader.onerror = function () { + ariaNgCommonService.showError('Failed to load file!'); + }; + + reader.readAsDataURL(file); + }).trigger('click'); + } + } + }]); +})(); diff --git a/src/views/new.html b/src/views/new.html index 702b2ea..a4d569d 100644 --- a/src/views/new.html +++ b/src/views/new.html @@ -28,9 +28,9 @@