def purge_mylist(self, list_id, confident=False): """ 指定したマイリストを削除する。 :param int | str list_id: マイリストの名前またはID :param bool confident: :rtype: bool """ utils.check_arg(locals()) if utils.ALL_ITEM == list_id: raise utils.MylistError(Err.cant_perform_all) list_id, list_name = self._get_list_id(list_id) if list_id == utils.DEFAULT_ID: raise utils.MylistError(Err.deflist_to_create_or_purge) if not confident and not self._confirmation("purge", list_name): print(Msg.ml_answer_no) return False res = self.get_response("purge", list_id=list_id) if res["status"] != "ok": self.logger.error(Err.failed_to_purge, list_name, res["status"]) return False else: self.logger.info(Msg.ml_done_purge, list_name) del self.mylists[list_id] return True
def create_mylist(self, mylist_name, is_public=False, description=""): """ mylist_name を名前に持つマイリストを作る。 :param str mylist_name: マイリストの名前 :param bool is_public: True なら公開マイリストになる :param str description: マイリストの説明文 :rtype: bool """ utils.check_arg(locals()) if utils.ALL_ITEM == mylist_name: raise utils.MylistError(Err.cant_perform_all) if mylist_name == "" or mylist_name == utils.DEFAULT_NAME: raise utils.MylistError(Err.cant_create) res = self.get_response("create", is_public=is_public, mylist_name=mylist_name, description=description) if res["status"] != "ok": self.logger.error(Err.failed_to_create, mylist_name, res) return False else: self.mylists = self.get_mylists_info() item = self.mylists[res[MKey.ID]] self.logger.info(Msg.ml_done_create, res[MKey.ID], item[MKey.NAME], item[MKey.PUBLICITY], item[MKey.DESCRIPTION]) if mylist_name != item[MKey.NAME]: self.logger.info(Err.name_replaced, mylist_name, item[MKey.NAME]) return True
def add(self, list_id, *videoids): """ そのマイリストに、 指定した動画を追加する。 :param int | str list_id: マイリストの名前またはID :param str videoids: 追加する動画ID :rtype: bool """ utils.check_arg(locals()) if utils.ALL_ITEM == list_id or utils.ALL_ITEM in videoids: raise utils.MylistError(Err.cant_perform_all) list_id, list_name = self._get_list_id(list_id) to_def = (list_id == utils.DEFAULT_ID) self.logger.info(Msg.ml_will_add, list_name, list(videoids)) _done = [] for _counter, vd_id in enumerate(videoids): _counter += 1 res = self.get_response("add", to_def=to_def, list_id_to=list_id, video_id=vd_id) try: self._should_continue(res, video_id=vd_id, list_name=list_name, count_now=_counter, count_whole=len(videoids)) self.logger.info(Msg.ml_done_add, _counter, len(videoids), vd_id) _done.append(vd_id) time.sleep(0.5) except MylistAPIError as error: if error.ok: return True else: # エラーが起きた場合 self.logger.error(Err.remaining, [ i for i in videoids if i not in _done and i != utils.ALL_ITEM ]) raise return True
def delete(self, list_id, *videoids, confident=False): """ そのマイリストから、指定した動画を削除する。 :param int | str list_id: 移動元のIDまたは名前 :param str videoids: 動画ID :param bool confident: :rtype: bool """ utils.check_arg(locals()) if len(videoids) > 1 and utils.ALL_ITEM in videoids: raise utils.MylistError(Err.videoids_contain_all) list_id, list_name = self._get_list_id(list_id) from_def = (list_id == utils.DEFAULT_ID) item_ids = self.get_item_ids(list_id, *videoids) if len(item_ids) == 0: self.logger.error(Err.no_items) return False if len(videoids) == 1 and utils.ALL_ITEM in videoids: # 全体モード if not confident and not self._confirmation( "delete", list_name, sorted(item_ids.keys())): print(Msg.ml_answer_no) return False self.logger.info(Msg.ml_will_delete, list_name, sorted(item_ids.keys())) else: # 個別モード self.logger.info(Msg.ml_will_delete, list_name, list(videoids)) item_ids = { vd_id: item_ids[vd_id] for vd_id in videoids if vd_id in item_ids } # 指定したIDが含まれているかの確認 excluded = [vd_id for vd_id in videoids if vd_id not in item_ids] if len(excluded) > 0: self.logger.error(Err.item_not_contained, list_name, excluded) _done = [] for _counter, vd_id in enumerate(item_ids): _counter += 1 res = self.get_response("delete", from_def=from_def, list_id_from=list_id, item_id=item_ids[vd_id]) try: self._should_continue(res, video_id=vd_id, list_name=list_name, count_now=_counter, count_whole=len(item_ids)) self.logger.info(Msg.ml_done_delete, _counter, len(item_ids), vd_id) _done.append(vd_id) except MylistAPIError as error: if error.ok: return True else: # エラーが起きた場合 self.logger.error(Err.remaining, [ i for i in videoids if i not in _done and i != utils.ALL_ITEM ]) raise return True
def move(self, list_id_from, list_id_to, *videoids): """ そのマイリストに、 指定した動画を移動する。 :param int | str list_id_from: 移動元のIDまたは名前 :param int | str list_id_to: 移動先のIDまたは名前 :param str videoids: 動画ID :rtype: bool """ utils.check_arg(locals()) if len(videoids) > 1 and utils.ALL_ITEM in videoids: raise utils.MylistError(Err.videoids_contain_all) list_id_from, list_name_from = self._get_list_id(list_id_from) list_id_to, list_name_to = self._get_list_id(list_id_to) to_def = (list_id_to == utils.DEFAULT_ID) from_def = (list_id_from == utils.DEFAULT_ID) item_ids = self.get_item_ids(list_id_from, *videoids) if len(item_ids) == 0: self.logger.error(Err.no_items) return False if utils.ALL_ITEM not in videoids: item_ids = { vd_id: item_ids[vd_id] for vd_id in videoids if vd_id in item_ids } # 指定したものが含まれているかの確認 excluded = [vd_id for vd_id in videoids if vd_id not in item_ids] if len(excluded) > 0: self.logger.error(Err.item_not_contained, list_name_from, excluded) self.logger.info(Msg.ml_will_move, list_name_from, list_name_to, sorted(item_ids.keys())) _done = [] for _counter, vd_id in enumerate(item_ids): _counter += 1 if to_def: # とりあえずマイリストには直接移動できないので、追加と削除を別でやる。 res = self.get_response("add", to_def=True, video_id=vd_id, item_id=item_ids[vd_id]) try: self._should_continue(res, video_id=vd_id, list_name=list_name_to, count_now=_counter, count_whole=len(item_ids)) except MylistAPIError as error: if error.ok: return True else: # エラーが起きた場合 self.logger.error(Err.remaining, [ i for i in videoids if i not in _done and i != utils.ALL_ITEM ]) raise res = self.get_response("delete", from_def=True, video_id=vd_id, item_id=item_ids[vd_id]) else: res = self.get_response("move", item_id=item_ids[vd_id], from_def=from_def, list_id_to=list_id_to, list_id_from=list_id_from) try: self._should_continue(res, video_id=vd_id, list_name=list_name_to, count_now=_counter, count_whole=len(item_ids)) self.logger.info(Msg.ml_done_move, _counter, len(item_ids), vd_id) _done.append(vd_id) except MylistAPIError as error: if error.ok: return True else: # エラーが起きた場合 self.logger.error(Err.remaining, [ i for i in videoids if i not in _done and i != utils.ALL_ITEM ]) raise return True