示例#1
0
文件: services.py 项目: zeanzhou/BGmi
 def download_status(status=None):
     print_info('Print download status in database')
     DownloadService.download_status(status=status)
     print()
     print_info('Print download status in aria2c-rpc')
     server = PatchedServerProxy(ARIA2_RPC_URL)
     # self.server.aria2
     status_dict = {
         STATUS_DOWNLOADING: ['tellActive'],
         STATUS_NOT_DOWNLOAD: ['tellWaiting'],
         STATUS_DOWNLOADED: ['tellStopped'],
         None: ['tellStopped', 'tellWaiting', 'tellActive'],
     }
     for method in status_dict.get(status):
         if method not in ('tellActive', ):
             params = (0, 1000)
         else:
             params = ()
         data = server.aria2[method](*params)
         if data:
             print_warning('RPC {0}:'.format(method), indicator=False)
         for row in data:
             print_success('- {0}'.format(row['dir']), indicator=False)
             for file in row['files']:
                 print_info('    * {0}'.format(file['path']),
                            indicator=False)
示例#2
0
文件: main.py 项目: xxoxx/BGmi
def add(ret):
    # action add
    # add bangumi by a list of bangumi name
    if not Bangumi.get_all_bangumi():
        print_warning('No bangumi data in database, fetching...')
        update(ret)

    for bangumi in ret.action.add.name:
        bangumi_obj = Bangumi(name=bangumi)
        data = bangumi_obj.select(one=True, fields=['id', 'name', 'keyword'])
        if data:
            followed_obj = Followed(bangumi_name=data['name'],
                                    status=STATUS_FOLLOWED)
            followed_obj.select_obj()
            if not followed_obj or followed_obj.status == STATUS_NORMAL:
                if not followed_obj:
                    ret, _ = get_maximum_episode(bangumi_obj, subtitle=False)
                    followed_obj.episode = ret['episode']
                    followed_obj.save()
                else:
                    followed_obj.status = STATUS_FOLLOWED
                    followed_obj.save()
                print_success('{0} has followed'.format(bangumi_obj))
            else:
                print_warning('{0} already followed'.format(bangumi_obj))

        else:
            print_error('{0} not found, please check the name'.format(bangumi))
示例#3
0
def setup():
    if not os.path.exists(BGMI_PATH):
        print_warning('BGMI_PATH %s does not exist, installing' % BGMI_PATH)
        from bgmi.setup import create_dir, install_crontab
        create_dir()
        install_crontab()

    if not os.path.exists(DB_PATH):
        init_db(DB_PATH)
    main()
示例#4
0
 def check_aria2c_version():
     url = ARIA2_RPC_URL.split('/')
     url[2] = ARIA2_RPC_TOKEN + '@' + url[2]
     url = '/'.join(url)
     s = ServerProxy(url)
     r = s.aria2.getVersion(ARIA2_RPC_TOKEN, )
     version = r['version']
     if version:
         Aria2DownloadRPC.old_version = version < '1.18.4'
     else:
         print_warning('Get aria2c version failed')
示例#5
0
def setup():
    if not os.path.exists(BGMI_PATH):
        print_warning('BGMI_PATH %s does not exist, installing' % BGMI_PATH)
        from bgmi.setup import create_dir, install_crontab
        create_dir()
        if not platform.system() == 'Windows':
            # if not input('Do you want to install a crontab to auto-download bangumi?(Y/n): ') == 'n':
            install_crontab()

    # if not os.path.exists(DB_PATH):
    init_db(DB_PATH)
    main()
示例#6
0
def followed(ret):
    if ret.action.followed == FOLLOWED_ACTION_MARK:
        print_warning(
            'Warning: bgmi followed mark is deprecated, please use bgmi mark instead.'
        )
        ret.action.mark = ret.action.followed.mark
        mark(ret)
    else:
        print_warning(
            'Warning: bgmi followed list is deprecated, please use bgmi cal followed instead.'
        )
        bangumi_calendar(force_update=False, followed=True, save=False)
示例#7
0
文件: services.py 项目: zeanzhou/BGmi
    def download(self):
        overwrite = '--overwrite' if self.overwrite else ''

        command = [
            BGMI_LX_PATH, 'download', '--torrent', overwrite,
            '--output-dir={0}'.format(self.save_path), self.torrent,
            '--verification-code-path={0}'.format(
                os.path.join(BGMI_TMP_PATH, 'vcode.jpg'))
        ]

        print_info('Run command {0}'.format(' '.join(command)))
        print_warning('Verification code path: {0}'.format(
            os.path.join(BGMI_TMP_PATH, 'vcode.jpg')))
        self.call(command)
示例#8
0
def create_dir():
    if not os.environ.get('HOME', ''):
        print_warning('$HOME not set, use \'/tmp/\'')

    tools_path = os.path.join(BGMI_PATH, 'tools')
    # bgmi home dir
    path_to_create = (BGMI_PATH, BGMI_SAVE_PATH, BGMI_TMP_PATH, tools_path)

    try:
        for path in path_to_create:
            if not os.path.exists(path):
                print_success('%s created successfully' % path)
                os.mkdir(path)
            else:
                print_warning('%s already exists' % path)
    except OSError as e:
        print_error('Error: {0}'.format(str(e)))
示例#9
0
文件: main.py 项目: xxoxx/BGmi
def delete(ret):
    # action delete
    # just delete subscribed bangumi or clear all the subscribed bangumi
    if ret.action.delete.clear_all:
        if Followed.delete_followed(batch=ret.action.delete.batch):
            print_success('all subscriptions have been deleted')
        else:
            print_error('user canceled')
    elif ret.action.delete.name:
        for name in ret.action.delete.name:
            followed = Followed(bangumi_name=name)
            if followed.select():
                followed.delete()
                print_warning('Bangumi %s has been deleted' % name)
            else:
                print_error('Bangumi %s does not exist' % name, exit_=False)
    else:
        print_warning('Nothing has been done.')
示例#10
0
文件: services.py 项目: zeanzhou/BGmi
    def install():
        # install xunlei-lixian
        import tarfile
        import requests
        print_info(
            'Downloading xunlei-lixian from https://github.com/iambus/xunlei-lixian/'
        )
        r = requests.get(
            'https://github.com/iambus/xunlei-lixian/tarball/master',
            stream=True,
            headers={'Accept-Encoding': ''})
        f = NamedTemporaryFile(delete=False)

        with f:
            for chunk in r.iter_content(chunk_size=1024):
                if chunk:
                    f.write(chunk)
        f.close()
        print_success('Download successfully, save at %s, extracting ...' %
                      f.name)
        zip_file = tarfile.open(f.name, 'r:gz')
        zip_file.extractall(os.path.join(BGMI_PATH, 'tools/xunlei-lixian'))
        dir_name = zip_file.getnames()[0]

        print_info('Create link file ...')

        if not os.path.exists(BGMI_LX_PATH):
            os.symlink(
                os.path.join(
                    BGMI_PATH,
                    'tools/xunlei-lixian/{0}/lixian_cli.py'.format(dir_name)),
                BGMI_LX_PATH)
        else:
            print_warning('{0} already exists'.format(BGMI_LX_PATH))

        print_success('All done')
        print_info(
            'Please run command \'{0} config\' to configure your lixian-xunlei '
            '(Notice: only for Thunder VIP)'.format(BGMI_LX_PATH))
示例#11
0
def fetch_(ret):
    bangumi_obj = Bangumi(name=ret.name)
    bangumi_obj.select_obj()

    followed_obj = Followed(bangumi_name=bangumi_obj.name)
    followed_obj.select_obj()

    followed_filter_obj = Filter(bangumi_name=ret.name)
    followed_filter_obj.select_obj()
    print_filter(followed_filter_obj)

    if bangumi_obj:
        print_info('Fetch bangumi {0} ...'.format(bangumi_obj.name))
        _, data = get_maximum_episode(
            bangumi_obj, ignore_old_row=False if ret.not_ignore else True)
        if not data:
            print_warning('Nothing.')
        for i in data:
            print_success(i['title'])

    else:
        print_error('Bangumi {0} not exist'.format(ret.name))
示例#12
0
文件: services.py 项目: zeanzhou/BGmi
    def download_status(status=None):
        last_status = -1
        for download_data in Download.get_all_downloads(status=status):
            latest_status = download_data['status']
            name = '  {0}. <{1}: {2}>'.format(download_data['id'],
                                              download_data['name'],
                                              download_data['episode'])
            if latest_status != last_status:
                if latest_status == STATUS_DOWNLOADING:
                    print('Downloading items:')
                elif latest_status == STATUS_NOT_DOWNLOAD:
                    print('Not downloaded items:')
                elif latest_status == STATUS_DOWNLOADED:
                    print('Downloaded items:')

            if download_data['status'] == STATUS_NOT_DOWNLOAD:
                print_info(name, indicator=False)
            elif download_data['status'] == STATUS_DOWNLOADING:
                print_warning(name, indicator=False)
            elif download_data['status'] == STATUS_DOWNLOADED:
                print_success(name, indicator=False)
            last_status = download_data['status']
示例#13
0
    def download_status(status=None):
        Aria2DownloadRPC.check_aria2c_version()

        print_info('Print download status in database')
        DownloadService.download_status(status=status)
        print()
        print_info('Print download status in aria2c-rpc')
        try:
            server = PatchedServerProxy(ARIA2_RPC_URL)
            # self.server.aria2
            status_dict = {
                STATUS_DOWNLOADING: ['tellActive'],
                STATUS_NOT_DOWNLOAD: ['tellWaiting'],
                STATUS_DOWNLOADED: ['tellStopped'],
                None: ['tellStopped', 'tellWaiting', 'tellActive'],
            }
            for method in status_dict.get(status):
                if method not in ('tellActive', ):
                    params = (0, 1000)
                else:
                    params = ()
                if Aria2DownloadRPC.old_version:
                    data = server.aria2[method](*params)
                else:
                    data = server.aria2[method](ARIA2_RPC_TOKEN, *params)

                if data:
                    print_warning('RPC {0}:'.format(method), indicator=False)

                for row in data:
                    print_success('- {0}'.format(row['dir']), indicator=False)
                    for file_ in row['files']:
                        print_info('    * {0}'.format(file_['path']),
                                   indicator=False)

        except Exception as e:
            print_error('Cannot connect to aria2-rpc server')
示例#14
0
 def install():
     print_warning('Please run `pip install transmissionrpc`')
示例#15
0
def update(ret):
    ignore = False if ret.not_ignore else True
    print_info('marking bangumi status ...')
    now = int(time.time())
    for i in Followed.get_all_followed():
        if i['updated_time'] and int(i['updated_time'] + 86400) < now:
            followed_obj = Followed(bangumi_name=i['bangumi_name'])
            followed_obj.status = STATUS_FOLLOWED
            followed_obj.save()

    print_info('updating bangumi data ...')
    fetch(save=True, group_by_weekday=False)
    print_info('updating subscriptions ...')
    download_queue = []

    if ret.download:
        if not ret.name:
            print_warning('No specified bangumi, ignore `--download` option')
        if len(ret.name) > 1:
            print_warning(
                'Multiple specified bangumi, ignore `--download` option')

    if not ret.name:
        updated_bangumi_obj = Followed.get_all_followed()
    else:
        updated_bangumi_obj = []
        for i in ret.name:
            f = Followed(bangumi_name=i)
            f.select_obj()
            updated_bangumi_obj.append(f)

    for subscribe in updated_bangumi_obj:
        print_info('fetching %s ...' % subscribe['bangumi_name'])
        bangumi_obj = Bangumi(name=subscribe['bangumi_name'])
        bangumi_obj.select_obj()

        followed_obj = Followed(bangumi_name=subscribe['bangumi_name'])
        followed_obj.select_obj()

        # filter by subtitle group
        if not bangumi_obj or not followed_obj:
            print_error(
                'Bangumi<{0}> does not exist or not been followed.'.format(
                    subscribe['bangumi_name']),
                exit_=False)
            continue

        episode, all_episode_data = get_maximum_episode(bangumi=bangumi_obj,
                                                        ignore_old_row=ignore,
                                                        max_page=1)

        if (episode.get('episode') > subscribe['episode']) or (len(
                ret.name) == 1 and ret.download):
            if len(ret.name) == 1 and ret.download:
                episode_range = ret.download
            else:
                episode_range = range(subscribe['episode'] + 1,
                                      episode.get('episode', 0) + 1)
                print_success('%s updated, episode: %d' %
                              (subscribe['bangumi_name'], episode['episode']))
                followed_obj.episode = episode['episode']
                followed_obj.status = STATUS_UPDATED
                followed_obj.updated_time = int(time.time())
                followed_obj.save()

            for i in episode_range:
                for epi in all_episode_data:
                    if epi['episode'] == i:
                        download_queue.append(epi)
                        break

    if ret.download is not None:
        download_prepare(download_queue)
        print_info('Re-downloading ...')
        download_prepare(
            Download.get_all_downloads(status=STATUS_NOT_DOWNLOAD))
示例#16
0
文件: services.py 项目: zeanzhou/BGmi
 def install():
     print_warning('Please install aria2 by yourself')
示例#17
0
文件: fetch.py 项目: xxoxx/BGmi
def bangumi_calendar(force_update=False,
                     today=False,
                     followed=False,
                     save=True):
    env_columns = get_terminal_col()

    if env_columns < 36:
        print_error('terminal window is too small.')
    row = int(env_columns / 36 if env_columns / 36 <= 3 else 3)

    if force_update and not test_connection():
        force_update = False
        print_warning('network is unreachable')

    if force_update:
        print_info('fetching bangumi info ...')
        Bangumi.delete_all()
        weekly_list = fetch(save=save, status=True)
    else:
        if followed:
            weekly_list_followed = Bangumi.get_all_bangumi(
                status=STATUS_FOLLOWED)
            weekly_list_updated = Bangumi.get_all_bangumi(
                status=STATUS_UPDATED)
            weekly_list = defaultdict(list)
            for k, v in chain(weekly_list_followed.items(),
                              weekly_list_updated.items()):
                weekly_list[k].extend(v)
        else:
            weekly_list = Bangumi.get_all_bangumi()

    if not weekly_list:
        if not followed:
            print_warning('warning: no bangumi schedule, fetching ...')
            weekly_list = fetch(save=save)
        else:
            print_warning('you have not subscribed any bangumi')

    def shift(seq, n):
        n = n % len(seq)
        return seq[n:] + seq[:n]

    def print_line():
        num = 33
        # print('+', '-' * num, '+', '-' * num, '+', '-' * num, '+')
        split = '-' * num + '   '
        print(split * row)

    if today:
        weekday_order = (Bangumi.week[datetime.datetime.today().weekday()], )
    else:
        weekday_order = shift(Bangumi.week,
                              datetime.datetime.today().weekday())

    spacial_append_chars = ['Ⅱ', 'Ⅲ', '♪', 'Δ', '×', '☆']
    spacial_remove_chars = []
    for index, weekday in enumerate(weekday_order):
        if weekly_list[weekday.lower()]:
            print(
                '\033[1;32m%s. \033[0m' %
                (weekday if not today else 'Bangumi Schedule for Today (%s)' %
                 weekday),
                end='')
            if not followed:
                print()
                print_line()

            for i, bangumi in enumerate(weekly_list[weekday.lower()]):
                if isinstance(bangumi['name'], _unicode):
                    # bangumi['name'] = bangumi['name']
                    pass

                if bangumi['status'] in (STATUS_UPDATED, STATUS_FOLLOWED
                                         ) and 'episode' in bangumi:
                    bangumi['name'] = '%s(%d)' % (bangumi['name'],
                                                  bangumi['episode'])

                half = len(
                    re.findall('[%s]' % string.printable, bangumi['name']))
                full = (len(bangumi['name']) - half)
                space_count = 34 - (full * 2 + half)

                for s in spacial_append_chars:
                    if s in bangumi['name']:
                        space_count += 1

                for s in spacial_remove_chars:
                    if s in bangumi['name']:
                        space_count -= 1

                if bangumi['status'] == STATUS_FOLLOWED:
                    bangumi['name'] = '\033[1;33m%s\033[0m' % bangumi['name']

                if bangumi['status'] == STATUS_UPDATED:
                    bangumi['name'] = '\033[1;32m%s\033[0m' % bangumi['name']

                if followed:
                    if i > 0:
                        print(' ' * 5, end='')
                    print(bangumi['name'], bangumi['subtitle_group'])
                else:
                    print(' ' + bangumi['name'], ' ' * space_count, end='')
                    if (i + 1) % row == 0 or i + 1 == len(
                            weekly_list[weekday.lower()]):
                        print()

            if not followed:
                print()
示例#18
0
文件: services.py 项目: zeanzhou/BGmi
 def check_path(self):
     if not os.path.exists(self.save_path):
         print_warning('Create dir {0}'.format(self.save_path))
         os.makedirs(self.save_path)