import sys; sys.dont_write_bytecode = True import os from pathlib import Path import time import argparse import requests from common import * API_PART = ['snippet','contentDetails','status','statistics','player', 'topicDetails','recordingDetails','liveStreamingDetails', 'localizations'] MAX_RESULTS = 50 API_PARAMS = {'part': ','.join(API_PART)} ## Parse arguments def __parse_args(argv): parser = argparse.ArgumentParser( description='Write video metadata.', formatter_class=argparse.RawTextHelpFormatter) parser._action_groups.pop() required = parser.add_argument_group('required arguments') optional = parser.add_argument_group('optional arguments') required.add_argument( '-i','--input',required=True, help='List of videoIds (https://www.youtube.com/watch?v={videoId})', metavar='videos.txt') optional.add_argument( '-d','--api_dir', type=Path, default=Path(__file__).absolute().parent / 'videos', help='Output directory for API files. Default is ./videos.', metavar='./videos') args = parser.parse_args(argv) f_in = args.input api_dir = args.api_dir if not f_in.endswith('.txt'): raise ValueError('Input filename not a .txt file.') return {'input':f_in,'api_dir':api_dir} def main(args): ## Create error logger err_log = make_error_logger('error.log') ## Parse arguments args = __parse_args(args) f_in = args['input'] api_dir = args['api_dir'] ## Get Ids from input file ids_in = get_ids(f_in,'videoId') ## Create output directory if not os.path.exists(api_dir): os.makedirs(api_dir) ## Split videoIDs into groups of MAX_RESULTS id_lists = [ ids_in[i:i+MAX_RESULTS] for i in range(0,len(ids_in),MAX_RESULTS)] ## Iterate over Ids session = requests.Session() session.params = API_PARAMS total_ids = len(ids_in) for i,id_list in enumerate(id_lists): print('\n########################\n') lower = i*MAX_RESULTS upper = min((i+1)*MAX_RESULTS,total_ids) print('Processing {} Ids ({}/{})...'.format( upper-lower,upper,total_ids)) ## Get API info session.params['id'] = ','.join(id_list) ret = get_api_items('videos',session) (js,session,err_msg) = (ret['json'],ret['session'],ret['error']) if err_msg: err_log.error(f'Ids {lower}/{upper}: {err_msg}') time.sleep(1) continue ## Write API info to file print(f'Writing API info to {api_dir}...') for item in js: f_api = os.path.join(api_dir, '{}_info.json'.format(item['id'])) try: write_api(f_api, item) except Exception as e: err_log.error('{}: {}'.format(item['id'],e)) print('Write successful.') return if __name__ == '__main__': main(sys.argv[1:])