def add_cloud_bt_task(self, source_url, save_path=None):
def check_vcode(info, error=None):<EOL><INDENT>if error or not info:<EOL><INDENT>logger.error('<STR_LIT>' % (info, error))<EOL>return<EOL><DEDENT>if info.get('<STR_LIT>', -<NUM_LIT:1>) != <NUM_LIT:0>:<EOL><INDENT>logger.error('<STR_LIT>' % (info, error))<EOL><DEDENT>if '<STR_LIT>' in info or info['<STR_LIT>'] == <NUM_LIT:0>:<EOL><INDENT>self.reload()<EOL><DEDENT>elif info['<STR_LIT>'] == -<NUM_LIT>:<EOL><INDENT>vcode_dialog = VCodeDialog(self, self.app, info)<EOL>response = vcode_dialog.run()<EOL>vcode_input = vcode_dialog.get_vcode()<EOL>vcode_dialog.destroy()<EOL>if response != Gtk.ResponseType.OK:<EOL><INDENT>return<EOL><DEDENT>gutil.async_call(pcs.cloud_add_bt_task, self.app.cookie,<EOL>self.app.tokens, source_url, save_path,<EOL>selected_idx, file_sha1, info['<STR_LIT>'],<EOL>vcode_input, callback=check_vcode)<EOL><DEDENT>else:<EOL><INDENT>self.app.toast(_('<STR_LIT>').format(info['<STR_LIT>']))<EOL><DEDENT><DEDENT>self.check_first()<EOL>if not save_path:<EOL><INDENT>folder_browser = FolderBrowserDialog(self, self.app, _('<STR_LIT>'))<EOL>response = folder_browser.run()<EOL>save_path = folder_browser.get_path()<EOL>folder_browser.destroy()<EOL>if response != Gtk.ResponseType.OK:<EOL><INDENT>return<EOL><DEDENT><DEDENT>if not save_path:<EOL><INDENT>return<EOL><DEDENT>bt_browser = BTBrowserDialog(self, self.app, _('<STR_LIT>'),<EOL>source_url, save_path)<EOL>response = bt_browser.run()<EOL>selected_idx, file_sha1 = bt_browser.get_selected()<EOL>bt_browser.destroy()<EOL>if response != Gtk.ResponseType.OK or not selected_idx:<EOL><INDENT>return<EOL><DEDENT>gutil.async_call(pcs.cloud_add_bt_task, self.app.cookie,<EOL>self.app.tokens, source_url, save_path, selected_idx,<EOL>file_sha1, callback=check_vcode)<EOL>self.app.blink_page(self.app.cloud_page)<EOL>
从服务器上获取种子, 并建立离线下载任务

        source_url - BT 种子在服务器上的绝对路径, 或者是磁链的地址.
        save_path  - 要保存到的路径, 如果为None, 就会弹出目录选择的对话框