Ejemplo n.º 1
0
    def _show_task(self, pid, task, follow=False):
        TaskManager.running = True  # 相当于每次执行 jobs -f 都初始化
        # TOTAL_TASKS 用于标记还没完成的任务数量
        global OUTPUT_LIST, TOTAL_TASKS

        def stop_show_task():
            """停止显示任务状态"""
            stop_signal = None
            while TaskManager.running or TOTAL_TASKS > 0:
                try:
                    stop_signal = input_with_timeout(2)
                except (TimeoutExpired, OSError):
                    sleep(0.5)
                else:
                    if stop_signal:
                        TaskManager.running = False
                        logger.debug(
                            f"Stop_show_task break by User! {stop_signal=}, {TOTAL_TASKS=}"
                        )
                        break
            logger.debug(
                f"Stop_show_task Exit! {TaskManager.running=}, {TOTAL_TASKS=}")

        if follow: Thread(target=stop_show_task).start()
        now_size, total_size, msg = task.get_process()
        done_files, total_files = task.get_count()
        while total_size == -1 or now_size < total_size or done_files <= total_files:
            if not TaskManager.running:
                break  # 用户中断
            if follow:
                now_size, total_size, msg = task.get_process()
                done_files, total_files = task.get_count()
                OUTPUT_LIST[pid] = self._size_to_msg(now_size, total_size, msg,
                                                     pid, task)
                # 文件秒传、出错 没有大小,需要跳过秒传检查 msg
                if ((msg and msg != 'check') or
                        now_size >= total_size) and done_files >= total_files:
                    TOTAL_TASKS -= 1
                    logger.debug(
                        f"{pid=} While Loop Break! {msg=}, {TOTAL_TASKS=}, {done_files=}, {total_files=}"
                    )
                    while True:
                        if not task.is_alive():
                            OUTPUT_LIST.append(f"[{pid}] finished")
                            for err_msg in task.get_err_msg():
                                OUTPUT_LIST.append(
                                    f"[{pid}] Error Messages: {err_msg}")
                            break
                        sleep(1)
                    # 只有还有一个没有完成, 就不能改 TaskManager.running
                    if TaskManager.running and TOTAL_TASKS < 1:
                        TaskManager.running = False  # 辅助控制 stop_show_task 线程的结束 🤣
                        logger.debug(
                            f"{pid=} TaskManager changed running value to False"
                        )
                    break
                sleep(1)
            else:
                print(self._size_to_msg(now_size, total_size, msg, pid, task))
                break  # 非实时显示模式,直接结束
Ejemplo n.º 2
0
 def append(self, item, repeat=True):
     """在末尾插入元素"""
     if (not repeat) and self.find_by_id(item.id):
         logger.debug(f"List: 不插入元素 {item.name}")
         return
     self._items.append(item)
     logger.debug(f"List: 插入元素  {item.name}")
Ejemplo n.º 3
0
 def rename(self, args):
     """重命名文件(夹)"""
     name = args[0].strip(' ')
     if not name:
         info('参数:原文件名 [新文件名]')
     elif file := self._file_list.find_by_name(name):
         new = args[1].strip(' ') if len(args) == 2 else input("请输入新文件名:")
         logger.debug(f"{new=}, {args=}")
         code = self._disk.rename(file.id, new)
         if code == Cloud189.SUCCESS:
             self.refresh()
         elif code == Cloud189.NETWORK_ERROR:
             error('网络错误,请重试!')
         else:
             error('失败,未知错误!')
Ejemplo n.º 4
0
 def _show_task_bar(self, pid=None, follow=False):
     """多行更新状态栏"""
     global OUTPUT_LIST, TOTAL_TASKS
     with output(output_type="list",
                 initial_len=len(self._tasks),
                 interval=0) as OUTPUT_LIST:
         pool = []
         TOTAL_TASKS = len(self._tasks)
         logger.debug(f"TaskManager: {TOTAL_TASKS=}")
         for _pid, task in enumerate(self._tasks):
             if pid is not None and _pid != pid:  # 如果指定了 pid 就只更新 pid 这个 task
                 continue
             t = Thread(target=self._show_task, args=(_pid, task, follow))
             t.start()
             pool.append(t)
         [t.join() for t in pool]
Ejemplo n.º 5
0
 def stop_show_task():
     """停止显示任务状态"""
     stop_signal = None
     while TaskManager.running or TOTAL_TASKS > 0:
         try:
             stop_signal = input_with_timeout(2)
         except (TimeoutExpired, OSError):
             sleep(0.5)
         else:
             if stop_signal:
                 TaskManager.running = False
                 logger.debug(
                     f"Stop_show_task break by User! {stop_signal=}, {TOTAL_TASKS=}"
                 )
                 break
     logger.debug(
         f"Stop_show_task Exit! {TaskManager.running=}, {TOTAL_TASKS=}")
Ejemplo n.º 6
0
def get_token(username, password):
    """获取token"""
    code, result = get_token_pre_params()
    if code != Cloud189.SUCCESS:
        return code, None

    param_id, req_id, return_url, captcha_token, j_rsakey, lt = result

    username = rsa_encode(j_rsakey, username)
    password = rsa_encode(j_rsakey, password)
    url = "https://open.e.189.cn/api/logbox/oauth2/loginSubmit.do"
    headers = {
        "User-Agent": UA,
        "Referer":
        "https://open.e.189.cn/api/logbox/oauth2/unifyAccountLogin.do",
        "Cookie": f"LT={lt}",
        "X-Requested-With": "XMLHttpRequest",
        "REQID": req_id,
        "lt": lt
    }
    data = {
        "appKey": "8025431004",
        "accountType": "02",
        "userName": f"{{RSA}}{username}",
        "password": f"{{RSA}}{password}",
        "validateCode": "",
        "captchaToken": captcha_token,
        "returnUrl": return_url,
        "mailSuffix": "@189.cn",
        "dynamicCheck": "FALSE",
        "clientType": 10020,
        "cb_SaveName": 1,
        "isOauth2": 'false',
        "state": "",
        "paramId": param_id
    }
    resp = requests.post(url, data=data, headers=headers, timeout=10)
    if not resp:
        return Cloud189.NETWORK_ERROR, None
    resp = resp.json()
    if 'toUrl' in resp:
        redirect_url = resp['toUrl']
    else:
        redirect_url = ''
    logger.debug(f"Token: {resp['msg']=}")
    url = API + '/getSessionForPC.action'
    headers = {"User-Agent": UA, "Accept": "application/json;charset=UTF-8"}
    params = {
        'clientType': 'TELEMAC',
        'version': '1.0.0',
        'channelId': 'web_cloud.189.cn',
        'redirectURL': redirect_url
    }
    resp = requests.get(url, params=params, headers=headers, timeout=10)
    if not resp:
        return Cloud189.NETWORK_ERROR, None

    sessionKey = resp.json()['sessionKey']
    sessionSecret = resp.json()['sessionSecret']
    accessToken = resp.json()['accessToken']  # 需要再验证一次?

    url = API + '/open/oauth2/getAccessTokenBySsKey.action'
    timestamp = get_time(stamp=True)
    params = f'AppKey=601102120&Timestamp={timestamp}&sessionKey={sessionKey}'
    headers = {
        "AppKey": '601102120',
        'Signature': calculate_md5_sign(params),
        "Sign-Type": "1",
        "Accept": "application/json",
        'Timestamp': timestamp,
    }
    resp = requests.get(url,
                        params={'sessionKey': sessionKey},
                        headers=headers,
                        timeout=10)
    if not resp:
        return Cloud189.NETWORK_ERROR
    accessToken = resp.json()['accessToken']

    return Cloud189.SUCCESS, (sessionKey, sessionSecret, accessToken)