Exemplo n.º 1
0
    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
Exemplo n.º 2
0
    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
Exemplo n.º 3
0
    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
Exemplo n.º 4
0
    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
Exemplo n.º 5
0
    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