예제 #1
0
파일: dmm2ssw.py 프로젝트: ume1632/sswtools
def _get_args(argv, p_args):
    """
    コマンドライン引数の解釈
    """
    global _VERBOSE
    global _AUTOMODIFY
    global _verbose

    argparser = _argparse.ArgumentParser(
        description='DMMのURLから素人系総合wiki用ウィキテキストを作成する')
    argparser.add_argument('url',
                           help='DMMの作品ページのURL',
                           nargs='?',
                           metavar='URL')

    argparser.add_argument('-a',
                           '--actress',
                           help='出演者 (DMMページ内のものに追加する)',
                           nargs='+',
                           default=())
    argparser.add_argument('-n',
                           '--number',
                           help='未知の出演者がいる場合の総出演者数 (… ほか計NUMBER名)',
                           type=int,
                           default=0)

    list_page = argparser.add_mutually_exclusive_group()
    list_page.add_argument('-s',
                           '--series',
                           help='シリーズ一覧へのリンクを追加(DMM上のものを置き換え)',
                           default=getattr(p_args, 'series', None))
    list_page.add_argument('-l',
                           '--label',
                           help='レーベル一覧へのリンクを追加(DMM上のものを置き換え)',
                           default=getattr(p_args, 'label', None))
    list_page.add_argument('--hide-list',
                           help='一覧ページへのリンクを追加しない',
                           action='store_true',
                           default=getattr(p_args, 'hide_list', False))

    argparser.add_argument('-t',
                           '--table',
                           help='一覧ページ用の表形式ウィキテキストを作成する, 2個以上指定すると両方作成する',
                           action='count',
                           default=getattr(p_args, 'table', 0))

    argparser.add_argument('--pid', help='作品の品番を直接指定(-t/-tt 指定時用)')

    argparser.add_argument('--subtitle', help='タイトルの副題を直接指定(-t/-tt 指定時用)')
    argparser.add_argument('--as-series',
                           help='タイトルではなく副題で作成(-t/-tt 指定時用)',
                           action='store_true')

    argparser.add_argument('--note',
                           help='備考(表形式ではNOTEカラム)として出力する文字列',
                           nargs='+',
                           metavar='DATA',
                           default=getattr(p_args, 'note', []))
    argparser.add_argument('-d',
                           '--add-dir-col',
                           help='DIRECTORカラムを出力する (-t/-tt 指定時用)',
                           dest='dir_col',
                           action='store_true',
                           default=getattr(p_args, 'dir_col', False))
    argparser.add_argument('--add-column',
                           help='表形式ヘッダに任意のカラムを追加する (-t/-tt 指定時のみ)',
                           nargs='+',
                           metavar='COLUMN:DATA',
                           default=getattr(p_args, 'add_column', []))

    # 外部からデータ補完
    argparser.add_argument('--join-tsv',
                           help='テキストファイル(TSV)でデータを補完する',
                           nargs='+',
                           metavar='FILE')
    argparser.add_argument('--join-wiki',
                           help='素人系総合Wikiのウィキテキスト(表形式)でデータを補完する',
                           nargs='+',
                           metavar='FILE')
    argparser.add_argument('--join-html',
                           help='素人系総合Wikiの一覧ページを読み込んで補完する',
                           nargs='+',
                           metavar='URL/HTML')

    argparser.add_argument('-f',
                           '--disable-follow-redirect',
                           help='ページのリダイレクト先をチェックしない',
                           dest='follow_rdr',
                           action='store_false',
                           default=getattr(p_args, 'follow_rdr', True))
    argparser.add_argument('--disable-check-rental',
                           help='レンタル先行レーベルでもレンタル版のリリースをチェックしない',
                           dest='check_rental',
                           action='store_false',
                           default=getattr(p_args, 'check_rental', True))
    argparser.add_argument('--disable-check-related',
                           help='他メディアやサービスの情報収集を行わない',
                           dest='check_rltd',
                           action='store_false',
                           default=getattr(p_args, 'check_rltd', True))
    argparser.add_argument('--disable-check-listpage',
                           help='Wiki上の実際の一覧ページを探さない',
                           dest='check_listpage',
                           action='store_false',
                           default=getattr(p_args, 'check_listpage', True))
    argparser.add_argument('--disable-longtitle',
                           help='アパッチ、SCOOPの長いタイトルを補足しない',
                           dest='longtitle',
                           action='store_false',
                           default=getattr(p_args, 'longtitle', True))
    argparser.add_argument('--fastest',
                           help='ウェブにアクセスするあらゆる補助処理を行わない',
                           action='store_true',
                           default=getattr(p_args, 'fastest', False))

    argparser.add_argument('--recheck',
                           help='キャッシュしているリダイレクト先を強制再チェック',
                           action='store_true',
                           default=getattr(p_args, 'recheck', False))

    argparser.add_argument('--disable-modify-title',
                           help='タイトルの自動調整を無効にする',
                           action='store_false',
                           default=True)
    argparser.add_argument('--disable-strip-oldname',
                           help='出演者の旧芸名の自動除去を無効にする',
                           action='store_false',
                           dest='autostrip',
                           default=True)

    argparser.add_argument('-c',
                           '--copy',
                           help='作成したウィキテキストをクリップボードへコピーする(pyperclipが必要)',
                           action='store_true')

    argparser.add_argument('-b',
                           '--browser',
                           help='生成後、wikiのページをウェブブラウザで開く',
                           action='store_true')

    argparser.add_argument('-C',
                           '--clear-cache',
                           help='プログラム終了時にキャッシュをクリアする',
                           action='store_true',
                           default=False)
    argparser.add_argument('--cache-info',
                           help='キャッシュのパスとファイルサイズの合計を出力して終了する',
                           action='store_true')

    argparser.add_argument('-v',
                           '--verbose',
                           help='デバッグ用情報を出力する',
                           action='count',
                           default=getattr(p_args, 'verbose', 0))
    argparser.add_argument('-V',
                           '--version',
                           help='バージョン情報を表示して終了する',
                           action='version',
                           version='%(prog)s {}'.format(__version__))

    args = argparser.parse_args(argv)

    if args.verbose and __name__ != '__main__':
        args.verbose -= 1
    _VERBOSE = args.verbose

    _verbose = _libssw.def_verbose(_VERBOSE, _libssw.ownname(__file__))
    _verbose('verbose mode on')  # verbose モードでなければ無視される

    if args.cache_info:
        _libssw.cache_info()

    # キャッシュディレクトリの削除
    if args.clear_cache:
        _libssw.clear_cache()

    if args.fastest:
        for a in ('follow_rdr', 'check_rental', 'check_listpage', 'check_rltd',
                  'longtitle'):
            setattr(args, a, False)

    _AUTOMODIFY = args.disable_modify_title
    _libssw.RECHECK = args.recheck

    _verbose('args: ', args)
    return args
예제 #2
0
파일: dmmlasl.py 프로젝트: miz999/sswtools
def main():
    global ROOTID
    global PREFIXES

    existings = OrderedDict()
    newcomers = OrderedDict()

    mk_prefix = Counter()

    mk_ophans = []
    mk_ophans_prods = dict()
    mk_ophans_prefix = Counter()
    mk_ophans_latest = ''

    lb_newcomers = dict()

    lb_name = dict()
    lb_url = dict()
    lb_prods = dict()
    lb_prefix = Counter()
    lb_latest = dict()
    lb_series = dict()

    lb_ophans = dict()
    lb_ophans_prods = dict()
    lb_ophans_prefix = Counter()
    lb_ophans_latest = dict()

    sr_name = dict()
    sr_url = dict()
    sr_prods = dict()
    sr_prefix = Counter()
    sr_latest = dict()

    args = get_args()
    PREFIXES = args.prefixes

    if args.root.startswith('http://'):
        # IDがURL渡しだったときの対処
        ROOTID = libssw.get_id(args.root)[0]
        target = libssw.get_article(args.root)
        service = libssw.resolve_service(args.root)
    else:
        ROOTID = args.root
        target = args.target
        service = args.service
    verbose('root id: {}'.format(ROOTID))
    verbose('target: {}'.format(target))
    verbose('service: {}'.format(service))

    listparser = libssw.DMMTitleListParser(no_omits=('イメージビデオ', '総集編'),
                                           show_info=False)
    ret_members = RetrieveMembers(listparser, service)

    flprefix = '{}.{}'.format(target, ROOTID)
    pkfile = tuple(
        Path(args.pickle_path or '.').glob('{}.*.pickle'.format(flprefix)))
    pkfile = pkfile[0] if pkfile else None
    if pkfile:
        with pkfile.open('rb') as f:
            (existings, lb_name, lb_url, lb_prods, lb_latest, sr_name, sr_url,
             sr_prods, sr_latest, lb_series, lb_ophans, lb_ophans_prods,
             lb_ophans_latest, mk_ophans, mk_ophans_prods,
             mk_ophans_latest) = pickle.load(f)

    exist_set = set(existings)

    # 新規追加分を取得
    priurls = libssw.join_priurls(target, ROOTID, service=service)

    try:
        last_pid = next(reversed(existings.values()))['pid']
    except StopIteration:
        last_pid = None

    # メーカーの新規作品情報の取得
    for nurl, nprops in libssw.from_dmm(listparser,
                                        priurls,
                                        key_id=last_pid,
                                        key_type='last',
                                        idattr='pid',
                                        ignore=True):
        if nurl not in exist_set:
            newcomers[nurl] = dict(nprops)

    nc_num = len(newcomers)
    total = nc_num + len(existings)
    if not total:
        emsg('E', '検索結果は0件でした。')

    article_name = listparser.article[0][0]

    # メーカー名がわかったところで出力ファイルのチェック
    outstem = '{}.{}'.format(flprefix, libssw.trans_filename(article_name))

    outfile = args.outfile or '{}.wiki'.format(outstem)
    if args.replace:
        writemode = 'w'
    else:
        libssw.files_exists('w', outfile)
        writemode = 'x'

    emsg('I', '{} [id={}, 新規{}/全{}作品]'.format(article_name, ROOTID, nc_num,
                                              total))

    # まずレーベル別にまとめ
    lb_set = set(lb_name)
    lb_set_add = lb_set.add
    for lid, lname, lurl, lprods in ret_members('label', newcomers, exist_set,
                                                last_pid):
        if lid not in lb_set:
            # 新規レーベル
            lb_name[lid] = lname
            lb_url[lid] = lurl
            lb_prods[lid] = lprods
            lb_series[lid] = []
            lb_set_add(lid)
        else:
            # 既知レーベルの新規作品
            for u in reversed(lprods):
                lb_prods[lid][u] = lprods[u]

        lb_newcomers[lid] = lprods
        lb_latest[lid] = get_latest(lprods)

        emsg('I', 'レーベル: {} [id={}, 新規{}作品]'.format(lname, lid, len(lprods)))

    #
    # メーカーその他作品まとめ
    #
    ncmk_ophans = ret_members.ophans.copy()
    ncmk_ophans_prods = ret_members.ophans_prods.copy()
    emsg('I', '{}その他: {}作品'.format(article_name, len(ncmk_ophans_prods)))

    # メーカーその他作品の追加
    mk_ophans.extend(ncmk_ophans)
    for u in reversed(ncmk_ophans_prods):
        mk_ophans_prods[u] = ncmk_ophans_prods[u]
    verbose('mk_ophans_prods: {}'.format(len(mk_ophans_prods)))

    # メーカーその他作品の品番およびプレフィクス
    if args.regen_pid:
        for p in mk_ophans_prods:
            mk_ophans_prods[p]['pid'] = libssw.gen_pid(
                mk_ophans_prods[p]['url'])[0]
    mk_ophans_prefix = count_prefixes(mk_ophans_prods)

    # メーカーその他作品の最新リリース日
    ncmk_ophans_latest = ret_members.ophans_latest
    if ncmk_ophans_latest > mk_ophans_latest:
        mk_ophans_latest = ncmk_ophans_latest

    #
    # レーベル別まとめ
    #
    # 新作情報を追加してレーベル全体のプレフィクス情報の再作成
    for lid in lb_prods:
        if args.regen_pid:
            for p in lb_prods[lid]:
                lb_prods[lid][p]['pid'] = libssw.gen_pid(
                    lb_prods[lid][p]['url'])[0]
        lb_prefix[lid] = count_prefixes(lb_prods[lid])

    # レーベルごとにシリーズまとめ
    for lid in lb_prods:
        lprods = lb_prods[lid]

        if lb_name[lid].startswith(IGNORE_LABELS) and args.suppress:
            lb_series[lid] = ()
            lb_ophans_prefix[lid] = ()
            continue

        emsg('I', '')
        emsg('I', 'レーベル「{}」のシリーズ'.format(lb_name[lid]))

        verbose('exising ophans: {}'.format(len(lb_ophans.get(lid, ()))))
        sr_set = set(sr_name)
        sr_set_add = sr_set.add
        for sid, sname, surl, sprods in ret_members('series', lprods,
                                                    exist_set, last_pid):
            if sid not in sr_set:
                sr_name[sid] = sname
                sr_url[sid] = surl
                sr_prods[sid] = sprods
                sr_set_add(sid)
            else:
                for u in reversed(sprods):
                    sr_prods[sid][u] = sprods[u]
            emsg('I',
                 'シリーズ: {} [id={}, 新規{}作品]'.format(sname, sid, len(sprods)))

            sr_latest[sid] = get_latest(sprods)
            try:
                lb_series[lid].append(sid)
            except KeyError:
                lb_series[lid] = [sid]

        # レーベルその他作品まとめ
        nclb_ophans = ret_members.ophans.copy()
        nclb_ophans_prods = ret_members.ophans_prods.copy()
        emsg('I', '{}その他: {}作品'.format(lb_name[lid], len(nclb_ophans_prods)))
        nclb_ophans_latest = ret_members.ophans_latest

        if lid not in lb_ophans:
            lb_ophans[lid] = []
            lb_ophans_prods[lid] = OrderedDict()
            lb_ophans_latest[lid] = '0000/00/00'

        lb_ophans[lid].extend(nclb_ophans)
        for u in reversed(nclb_ophans_prods):
            lb_ophans_prods[lid][u] = nclb_ophans_prods[u]
        verbose('lb_ophans_prods[{}]: {}'.format(lid, len(lb_ophans_prods)))
        nclb_ophans_latest = ret_members.ophans_latest
        if nclb_ophans_latest > lb_ophans_latest[lid]:
            lb_ophans_latest[lid] = nclb_ophans_latest

    verbose('lb_ophans_prods: {}'.format(lid, len(lb_ophans_prods)))
    for lid in lb_ophans_prods:
        verbose('lb_ophans_prods[{}]: {}'.format(lid,
                                                 len(lb_ophans_prods[lid])))
        if args.regen_pid:
            for p in lb_ophans_prods[lid]:
                lb_ophans_prods[lid][p]['pid'] = libssw.gen_pid(
                    lb_ophans_prods[lid][p]['url'])[0]
        lb_ophans_prefix[lid] = count_prefixes(lb_ophans_prods[lid])
        verbose('lb_ophans_prefix[{}]: {}'.format(lid,
                                                  len(lb_ophans_prefix[lid])))

    for sid in sr_prods:
        if args.regen_pid:
            for p in sr_prods[sid]:
                sr_prods[sid][p]['pid'] = libssw.gen_pid(
                    sr_prods[sid][p]['url'])[0]
        sr_prefix[sid] = count_prefixes(sr_prods[sid])

    for url in reversed(newcomers):
        existings[url] = newcomers[url]
    mk_prefix = count_prefixes(existings)

    print('\n')

    fd = open(outfile, writemode)

    if target == 'maker':
        print('*[[{}(メーカー)]]'.format(article_name), file=fd)
        # print('全{}作品'.format(total), file=fd)
        summ_prefixes(mk_prefix, fd)
    print(time.strftime('(%Y年%m月%d日現在)'), file=fd)

    if args.sort_key == 'release':
        keyiter = lb_latest.items()
        reverse = True
    elif args.sort_key == 'name':
        keyiter = lb_name.items()
        reverse = False
    elif args.sort_key == 'number':
        keyiter = tuple((lid, len(lb_prods[lid])) for lid in lb_prods)
        reverse = True

    if not args.only_series:
        for n, item in enumerate(sorted(keyiter,
                                        key=itemgetter(1),
                                        reverse=reverse),
                                 start=1):
            lid = item[0]
            print('**{}.[[{}]]'.format(n, lb_name[lid]), file=fd)
            summ_prefixes(lb_prefix[lid], fd)

            if args.latest:
                print('-最新リリース: {}'.format(lb_latest[lid]), file=fd)

            if args.dmm:
                print('-[[DMMの一覧>{}]]'.format(lb_url[lid]), file=fd)

            if not args.only_label:
                # シリーズ別出力
                numofseries = len(lb_series.get(lid, ()))
                numofoph = len(lb_ophans_prefix.get(lid, ()))
                is_exist = numofseries or numofoph
                if is_exist:
                    print('[+]', file=fd)
                    print('シリーズ数:', numofseries, file=fd)

                try:
                    print_serises(lb_series[lid], sr_name, sr_prefix, sr_prods,
                                  sr_url, sr_latest, args.dmm, args.latest,
                                  args.sort_key, fd)
                except KeyError:
                    pass

                if numofoph:
                    print('***{}その他'.format(lb_name[lid]), file=fd)
                    summ_prefixes(lb_ophans_prefix[lid], fd)
                    if args.latest:
                        print('-最新リリース: {}'.format(lb_ophans_latest[lid]),
                              file=fd)

                if is_exist:
                    print('[END]', file=fd)

            print(file=fd)

        if mk_ophans:
            print('**{}その他'.format(article_name), file=fd)
            summ_prefixes(mk_ophans_prefix, fd)

            if args.latest:
                print('-最新リリース: {}'.format(mk_ophans_latest), file=fd)

    elif not args.only_label:
        """only-series"""
        print_serises(sr_name, sr_name, sr_prefix, sr_prods, sr_url, sr_latest,
                      args.dmm, args.latest, args.sort_key, fd)

    fd.close()

    print('出力ファイル:', outfile)

    if newcomers or args.regen_pid:
        pkpath = Path(args.pickle_path or '.') / '{}.pickle'.format(outstem)
        try:
            pkpath.rename(pkpath.with_suffix(pkpath.suffix + '.bak'))
        except FileNotFoundError:
            pass

        verbose('save file: {}'.format(pkpath))
        with pkpath.open('wb') as f:
            pickle.dump((existings, lb_name, lb_url, lb_prods, lb_latest,
                         sr_name, sr_url, sr_prods, sr_latest, lb_series,
                         lb_ophans, lb_ophans_prods, lb_ophans_latest,
                         mk_ophans, mk_ophans_prods, mk_ophans_latest), f)

    # キャッシュディレクトリの削除
    if args.clear_cache:
        libssw.clear_cache()
예제 #3
0
def get_args(argv):
    """コマンドライン引数の解釈"""
    global VERBOSE
    global verbose

    argparser = argparse.ArgumentParser(description='DMMから検索して作品一覧を作成する')

    # 処理タイプ
    retrieval = argparser.add_mutually_exclusive_group()
    retrieval.add_argument('-A',
                           '--actress',
                           help='女優IDで一覧取得',
                           action='store_const',
                           dest='retrieval',
                           const='actress')
    retrieval.add_argument('-S',
                           '--series',
                           help='シリーズIDで一覧取得',
                           action='store_const',
                           dest='retrieval',
                           const='series')
    retrieval.add_argument('-L',
                           '--label',
                           help='レーベルIDで一覧取得',
                           action='store_const',
                           dest='retrieval',
                           const='label')
    retrieval.add_argument('-K',
                           '--maker',
                           help='メーカーIDで一覧取得',
                           action='store_const',
                           dest='retrieval',
                           const='maker')
    retrieval.add_argument('-U',
                           '--url',
                           help='していたURLページからそのまま取得',
                           action='store_const',
                           dest='retrieval',
                           const='url')

    # ファイル入力
    from_file = argparser.add_mutually_exclusive_group()
    from_file.add_argument('-i',
                           '--from-tsv',
                           help='TSVファイルから入力',
                           action='store_true')
    from_file.add_argument('-w',
                           '--from-wiki',
                           help='素人総合wikiのウィキテキスト(表形式)から入力',
                           action='store_true')
    from_file.add_argument('--cid',
                           help='DMM上の品番(cid)指定で取得(ページが見つからなくてもリンクは作成する)',
                           action='store_true')
    from_file.add_argument('--cid-l',
                           help='DMM上の品番(cid)指定で取得(ページが見つからなければリンクは作成しない)',
                           action='store_true')

    argparser.add_argument('keyword',
                           help='検索キーワード、ID、品番、URL、またはファイル名',
                           metavar='KEYWORD',
                           nargs='*')

    # ファイル出力
    argparser.add_argument('-o',
                           '--out',
                           help='ファイルに出力 (未指定時は標準出力へ出力)',
                           metavar='FILE')
    argparser.add_argument('-r',
                           '--replace',
                           help='出力ファイルと同名のファイルがあった場合上書きする',
                           action='store_true')

    # 出力形式
    table = argparser.add_mutually_exclusive_group()
    table.add_argument('-t',
                       '--table',
                       help='一覧ページ用の表形式でウィキテキストを作成する, '
                       '2個以上指定すると両方作成する',
                       action='count',
                       default=0)
    table.add_argument('--tsv',
                       help='ウィキテキストを生成せず、タブ区切りの一覧を出力する',
                       action='store_false',
                       dest='wikitext',
                       default=True)

    # データ取得先
    argparser.add_argument('--service',
                           help='一覧を取得するサービスを指定する (デフォルト: '
                           'KEYWORD にURLが与えられればそれから自動判定、'
                           'それ以外なら dvd)',
                           choices=('dvd', 'rental', 'video', 'ama', 'all'))

    # 作品データの除外基準
    argparser.add_argument('-m',
                           '--disable-omit',
                           help='IVを除外しない、2個指定すると総集編も、'
                           '3個指定するとアウトレット版も、'
                           '4個指定すると限定盤も除外しない',
                           dest='no_omit',
                           action='count',
                           default=0)

    # データ作成範囲基準
    id_type = argparser.add_mutually_exclusive_group()
    id_type.add_argument('--start-pid',
                         help='データ作成開始品番(例:JMD-112)',
                         metavar='PID',
                         default='')
    id_type.add_argument('--start-pid-s',
                         help='データ作成開始品番(厳密にチェック)',
                         metavar='PID',
                         default='')
    id_type.add_argument('--start-cid',
                         help='データ作成開始品番(DMM上の品番, 例:15jmd112so)',
                         metavar='CID',
                         default='')
    id_type.add_argument('-e',
                         '--last-pid',
                         help='作成済み作品情報の最後の品番',
                         metavar='PID',
                         default='')
    id_type.add_argument('--last-cid',
                         help='作成済み作品情報の最後の品番(DMM上の品番)',
                         metavar='CID',
                         default='')

    argparser.add_argument('--start-date',
                           help='データ作成対象開始リリース日',
                           metavar='YYYYMMDD')
    argparser.add_argument('--existings-html',
                           help='Wikiの一覧ページに既にある作品の情報は作成しない',
                           nargs='+',
                           metavar='URL/HTML')

    filters = argparser.add_mutually_exclusive_group()
    filters.add_argument('--filter-pid',
                         help='品番(pid)がパターン(正規表現)とマッチしたものだけ作成',
                         metavar='PATTERN')
    filters.add_argument('--filter-pid-s',
                         help='品番(pid)がパターン(正規表現)とマッチしたものだけ作成(厳密にチェク)',
                         metavar='PATTERN')
    filters.add_argument('--filter-cid',
                         help='DMM上の品番(cid)がパターン(正規表現)とマッチしたものだけ作成',
                         metavar='PATTERN')
    filters.add_argument('--filter-title',
                         help='作品名がパターン(正規表現)とマッチしたものだけ作成',
                         metavar='PATTERN')

    argparser.add_argument('--not-in-series',
                           '--n-i-s',
                           help='シリーズに所属していないもののみ作成(-K/-L/-U 指定時)',
                           action='store_true',
                           dest='n_i_s')

    argparser.add_argument('--row',
                           help='先頭行のみなし行開始位置 (-t/-tt 指定時のみ)',
                           type=int,
                           default=0)  # --row のデフォルトは後で決定

    argparser.add_argument('--pages-last',
                           help='データ収集ページ数(最新からPAGEページ分を収集)',
                           type=int,
                           default=0,
                           metavar='PAGE')

    # 外部からデータ補完
    argparser.add_argument('--join-tsv',
                           help='テキストファイル(TSV)でデータを補完する',
                           nargs='+',
                           metavar='FILE')
    argparser.add_argument('--join-wiki',
                           help='素人系総合Wikiのウィキテキスト(表形式)でデータを補完する',
                           nargs='+',
                           metavar='FILE')
    argparser.add_argument('--join-html',
                           help='素人系総合Wikiの一覧ページを読み込んで補完する',
                           nargs='+',
                           metavar='URL/HTML')

    argparser.add_argument('--hunter',
                           help='--join-*オプションを指定したときに作品タイトルは補完ファイルの'
                           'ものを採用する(Hunter系用)',
                           action='store_true')

    # ソート基準
    argparser.add_argument('--sort-key',
                           help='並び替えキー項目',
                           choices=('release', 'pid', 'title'))

    argparser.add_argument('--note',
                           help='エントリの最後かNOTEカラムにデータを追加する',
                           nargs='+',
                           metavar='DATA',
                           default=[])
    # 表形式出力装飾
    argparser.add_argument('-d',
                           '--add-dir-col',
                           help='DIRECTORカラムを追加する (-t/-tt 指定時のみ)',
                           dest='dir_col',
                           action='store_true')
    argparser.add_argument('--add-column',
                           help='表に任意のカラムとデータを追加する (-t/-tt 指定時のみ)',
                           nargs='+',
                           metavar='COLUMN:DATA',
                           default=[])

    # 一覧ページへのリンク追加
    list_page = argparser.add_mutually_exclusive_group()
    list_page.add_argument('-s',
                           '--series-link',
                           help='女優ページ形式でシリーズ一覧へのリンクを置き換え',
                           dest='series')
    list_page.add_argument('-l',
                           '--label-link',
                           help='女優ページ形式でレーベル一覧へのリンクを置き換え',
                           dest='label')
    list_page.add_argument('--hide-list',
                           help='女優ページ形式で一覧ページへのリンクを追加しない',
                           action='store_true',
                           default=False)

    argparser.add_argument('--linklabel', help='一覧ページへのリンクの表示名を置き換える')

    # 品番・副題など自動調整設定
    argparser.add_argument('--pid-regex',
                           help='品番自動生成のカスタム正規表現 (-t/-tt/-w 指定時のみ)',
                           nargs=2,
                           metavar=('PATTERN', 'REPL'))
    argparser.add_argument('--subtitle-regex',
                           help='副題自動生成のカスタム正規表現 (-t/-tt 指定時のみ)',
                           nargs=2,
                           metavar=('PATTERN', 'REPL'))
    argparser.add_argument('--disable-series-guide',
                           help='レーベル一覧ページからシリーズ一覧ページへのガイドを'
                           '追加しない (-t/-tt 指定時のみ)',
                           dest='series_guide',
                           action='store_false',
                           default=True)

    # 出力装飾
    argparser.add_argument('--without-header',
                           help='ヘッダ情報を出力しない',
                           dest='header',
                           action='store_false',
                           default=True)
    argparser.add_argument(
        '--split',
        help='1ページあたりのタイトル数 (デフォルト {})'.format(SPLIT_DEFAULT),
        type=int,
        default=SPLIT_DEFAULT)

    # 補助チェック
    argparser.add_argument('-f',
                           '--disable-follow-redirect',
                           help='ページのリダイレクト先をチェックしない',
                           dest='follow_rdr',
                           action='store_false',
                           default=True)
    argparser.add_argument('--check-rental',
                           help='レンタル先行メーカーでレンタル版じゃなかったのとき'
                           'レンタル版のリリースをチェックする',
                           action='store_true',
                           default=False)
    argparser.add_argument('--disable-check-bd',
                           help='Blu-ray版のときDVD版があってもパスしない',
                           action='store_false',
                           dest='pass_bd',
                           default=True)
    argparser.add_argument('--disable-check-listpage',
                           help='Wiki上の実際の一覧ページを探さない',
                           dest='check_listpage',
                           action='store_false',
                           default=True)
    argparser.add_argument('--disable-check-related',
                           help='他メディアやサービスの情報収集を行わない',
                           dest='check_rltd',
                           action='store_false',
                           default=True)
    argparser.add_argument('--disable-longtitle',
                           help='アパッチ、SCOOPの長いタイトルを補完しない',
                           dest='longtitle',
                           action='store_false',
                           default=True)
    argparser.add_argument('--fastest',
                           help='ウェブにアクセスするあらゆる補助処理を行わない',
                           action='store_true')

    argparser.add_argument('--recheck',
                           help='キャッシュしているリダイレクト先を強制再チェック',
                           action='store_true')

    argparser.add_argument('-c',
                           '--copy',
                           help='作成したウィキテキストをクリップボードへコピーする(pyperclipが必要)',
                           action='store_true')

    # ブラウザ制御
    argparser.add_argument('-b',
                           '--browser',
                           help='生成後、wikiのページをウェブブラウザで開く',
                           action='store_true')

    # その他
    argparser.add_argument('-C',
                           '--clear-cache',
                           help='プログラム終了時にキャッシュをクリアする',
                           action='store_true')
    argparser.add_argument('-v',
                           '--verbose',
                           help='デバッグ用情報を出力する',
                           action='count',
                           default=0)
    argparser.add_argument('-V',
                           '--version',
                           help='バージョン情報を表示して終了する',
                           action='version',
                           version='%(prog)s {}'.format(__version__))

    args = argparser.parse_args(argv)

    VERBOSE = args.verbose
    verbose = libssw.def_verbose(VERBOSE, libssw.ownname(__file__))
    verbose('Verbose mode on')

    libssw.RECHECK = args.recheck

    if args.retrieval == 'url' and (args.cid or args.cid_l):
        emsg('E', '-U 指定時に --cid/--cid-l は指定できません。')

    # サービス未指定の決定
    # 引数にURLが与えられていればそれから判定
    # TSVやウィキテキスト入力でなければそれ以外ならセル版
    # TSVやウィキテキスト入力ならあとで作品情報から判定
    if args.keyword:
        if not args.service:
            if re.match('https?://.+', args.keyword[0]):
                args.service = libssw.resolve_service(args.keyword[0])
            elif not (args.from_tsv or args.from_wiki):
                args.service = 'dvd'

        if (args.cid or args.cid_l) and '{}' in args.keyword[0]:
            verbose('args.cid check')
            # --row 未指定で --cid(-l) で連番指定の場合の自動決定
            # --start-{p,c}id だけでは連番と確定できないので何もしない
            if not args.row:
                args.row = int(args.keyword[1])
                verbose('row is set by cid: ', args.row)

    # ここで row 未指定時のデフォルト設定
    if not args.row:
        args.row = 1

    # start-pidは大文字、start-cidは小文字固定
    args.start_pid = args.start_pid.upper()
    args.start_pid_s = args.start_pid_s.upper()
    args.start_cid = args.start_cid.lower()

    args.last_pid = args.last_pid.upper()
    args.last_cid = args.last_cid.lower()

    # ヘッダを抑止するときはページ分割もしない
    if not args.header:
        args.split = 0

    if args.fastest:
        for a in ('follow_rdr', 'check_rental', 'pass_bd', 'check_listpage',
                  'longtitle'):
            setattr(args, a, False)

    # キャッシュディレクトリの削除
    if args.clear_cache:
        libssw.clear_cache()

    verbose('args: ', args)
    return args
예제 #4
0
def get_args():
    global VERBOSE
    global verbose

    argparser = argparse.ArgumentParser(
        description='素人系総合wiki女優ページにない作品情報をDMMから補完する')
    argparser.add_argument('wikifiles',
                           help='Wiki女優ページ(ウィキテキスト)を格納したファイル(未指定で標準入力から入力)',
                           nargs='*',
                           metavar='WIKIFILES')
    argparser.add_argument('-a',
                           '--actress-id',
                           help='DMM上での女優のID(または女優の作品一覧のURL)',
                           nargs='+',
                           default=[],
                           metavar='ID')

    # ファイル出力
    argparser.add_argument('-o',
                           '--out',
                           help='ファイルに出力 (未指定時は標準出力へ出力)',
                           metavar='FILE')
    argparser.add_argument('-r',
                           '--replace',
                           help='出力ファイルと同名のファイルがあった場合上書きする',
                           action='store_true')

    argparser.add_argument(
        '--split',
        help='指定作品数ごとに「// {0}」のようにコメント行を入れる (デフォルト {0})'.format(SPLIT_DEFAULT),
        type=int,
        default=SPLIT_DEFAULT)

    # 作品データの除外基準
    argparser.add_argument('-m',
                           '--disable-omit',
                           help='IVを除外しない, 2個指定すると総集編作品も、'
                           '3個指定するとアウトレット版も、'
                           '4個指定すると限定盤も除外しない',
                           dest='no_omit',
                           action='count',
                           default=0)

    argparser.add_argument('-f',
                           '--disable-follow-redirect',
                           help='ページのリダイレクト先をチェックしない',
                           dest='follow_rdr',
                           action='store_false',
                           default=True)
    argparser.add_argument('--disable-check-rental',
                           help='レンタル先行メーカーでセル版のときレンタル版の'
                           'リリースをチェックしない',
                           action='store_false',
                           dest='check_rental',
                           default=True)
    argparser.add_argument('--disable-check-bd',
                           help='Blu-ray版のときDVD版があってもパスしない',
                           action='store_false',
                           dest='pass_bd',
                           default=True)
    argparser.add_argument('--disable-check-listpage',
                           help='Wiki上の実際の一覧ページを探さない',
                           dest='check_listpage',
                           action='store_false',
                           default=True)
    argparser.add_argument('--fastest',
                           help='処理時間に影響するあらゆる補助処理を行わない',
                           action='store_true')

    argparser.add_argument('-d',
                           '--diff',
                           help='データ追加前と後の差分をウェブブラウザで表示する',
                           action='store_true')

    argparser.add_argument('-C',
                           '--clear-cache',
                           help='プログラム終了時にHTTPキャッシュをクリアする',
                           action='store_true')
    argparser.add_argument('-v',
                           '--verbose',
                           help='デバッグ用情報を出力する',
                           action='count',
                           default=0)
    argparser.add_argument('-V',
                           '--version',
                           help='バージョン情報を表示して終了する',
                           action='version',
                           version='%(prog)s {}'.format(__version__))

    args = argparser.parse_args()

    # dmmsar.py 側からVERBOSEが変更される場合があるため
    verbose.verbose = VERBOSE = VERBOSE or args.verbose

    VERBOSE = args.verbose
    verbose = libssw.def_verbose(VERBOSE, libssw.ownname(__file__))
    verbose('verbose mode on')

    # キャッシュディレクトリの削除
    if args.clear_cache:
        libssw.clear_cache()

    if args.fastest:
        for a in ('follow_rdr', 'check_rental', 'pass_bd', 'check_listpage'):
            setattr(args, a, False)

    verbose('args: ', args)
    return args