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
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()
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
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