def handle(self, *args, **options): uid = int(os.getenv('BILI_UID', '')) if not uid: logger.error('uid is required') sys.exit(1) access_key_id = os.getenv('ACCESS_KEY_ID', '') secret_access_key = os.getenv('SECRET_ACCESS_KEY', '') endpoint = os.getenv('OBS_ENDPOINT', '') bucketName = os.getenv('OBS_BUCKETNAME', '') if not access_key_id or not secret_access_key or not endpoint or not bucketName: logger.error('losing required arguments for ObsClient') sys.exit(1) # 获取OBS openeuler/meetup/下的MP4列表 obs_client = ObsClient(access_key_id=access_key_id, secret_access_key=secret_access_key, server='https://{}'.format(endpoint)) objs = obs_client.listObjects(bucketName=bucketName)['body']['contents'] meetup_videos = [] for obj in objs: if obj['key'].startswith('openeuler/meetup/') and obj['key'].endswith('.mp4'): meetup_videos.append(obj['key']) if len(meetup_videos) == 0: logger.info('no meetup videos in OBS') return logger.info('meetup_videos: {}'.format(meetup_videos)) videos = get_videos_g(uid) bvs = [x['bvid'] for x in videos] 遍历meetup_videos,若obj的metadata无bvid,则下载上传B站 for video in meetup_videos: metadata = obs_client.getObjectMetadata(bucketName, video) metadata_dict = {x: y for x, y in metadata['header']} topic = os.path.basename(video)[:-4] activity_id = int(video.split('/')[2]) replay_url = 'https://{}.{}/{}'.format(bucketName, endpoint, video) Activity.objects.filter(id=activity_id).update(replay_url=replay_url) logger.info('meetup回放视频同步小程序,回放链接: {}'.format(replay_url)) if 'bvid' not in metadata_dict.keys(): # 下载视频 logger.info('开始下载视频') videoFile = download_video(obs_client, bucketName, video) logger.info('视频已下载: {}'.format(videoFile)) # 生成封面 logger.info('开始生成封面') logger.info('topic: {}'.format(topic)) imageFile = generate_cover(topic) logger.info('封面已生成: {}'.format(imageFile)) # 上传B站 logger.info('开始上传B站') bvid = upload_to_bilibili(videoFile, imageFile, topic) logger.info('B站上传成功,bvid: {}'.format(bvid)) # 更新metadata metadata = { 'bvid': bvid } r = obs_client.setObjectMetadata(bucketName, video, metadata) if r.status < 300: logger.info('更新metadata') else: logger.error(r.errorCode, r.errorMessage)
def handle(self, *args, **options): # 从OBS查询对象 access_key_id = os.getenv('ACCESS_KEY_ID', '') secret_access_key = os.getenv('SECRET_ACCESS_KEY', '') endpoint = os.getenv('OBS_ENDPOINT', '') bucketName = os.getenv('OBS_BUCKETNAME', '') if not access_key_id or not secret_access_key or not endpoint or not bucketName: logger.error('losing required arguments for ObsClient') sys.exit(1) obs_client = ObsClient(access_key_id=access_key_id, secret_access_key=secret_access_key, server='https://{}'.format(endpoint)) objs = obs_client.listObjects( bucketName=bucketName)['body']['contents'] # 遍历 if len(objs) == 0: logger.info('OBS中无对象') return for obj in objs: # 获取对象的地址 object_key = obj['key'] if not object_key.endswith('.mp4'): continue # 获取对象的metadata metadata = obs_client.getObjectMetadata(bucketName, object_key) metadata_dict = {x: y for x, y in metadata['header']} # 如果bvid不在metadata_dict中,则下载视频并上传视频至B站 if 'bvid' in metadata_dict: logger.info('{}已在B站上传,跳过'.format(object_key)) else: logger.info('{}尚未上传至B站,开始下载'.format(object_key)) # 从OBS下载视频到本地临时目录 videoFile = os.path.join('/tmp', os.path.basename(object_key)) imageFile = videoFile.replace('.mp4', '.png') if os.path.exists(videoFile): os.remove(videoFile) if os.path.exists(imageFile): os.remove(imageFile) taskNum = 5 partSize = 10 * 1024 * 1024 enableCheckpoint = True try: # 下载视频 resp = obs_client.downloadFile(bucketName, object_key, videoFile, partSize, taskNum, enableCheckpoint) if resp.status < 300: try: # 下载封面 img_object_key = object_key.replace('.mp4', '.png') try: resp2 = obs_client.downloadFile( bucketName, img_object_key, imageFile, partSize, taskNum, enableCheckpoint) if resp2.status < 300: # 将下载的视频上传至B站 topic = metadata_dict['meeting_topic'] mid = metadata_dict['meeting_id'] community = metadata_dict['community'] record_start = metadata_dict[ 'record_start'] sig = metadata_dict['sig'] date = (datetime.datetime.strptime( record_start.replace('T', ' ').replace( 'Z', ''), "%Y-%m-%d %H:%M:%S") + datetime.timedelta(hours=8) ).strftime('%Y-%m-%d') res = upload(topic, date, videoFile, imageFile, mid, sig, community) try: if not Record.objects.filter( mid=mid, platform='bilibili'): Record.objects.create( mid=mid, platform='bilibili') except Exception as e: logger.error(e) # 修改metadata bvid = res['bvid'] agenda = metadata_dict[ 'agenda'] if 'agenda' in metadata_dict else '' record_end = metadata_dict['record_end'] download_url = metadata_dict[ 'download_url'] total_size = metadata_dict['total_size'] attenders = metadata_dict['attenders'] metadata = { "meeting_id": mid, "meeting_topic": topic, "community": community, "sig": sig, "agenda": agenda, "record_start": record_start, "record_end": record_end, "download_url": download_url, "total_size": total_size, "attenders": attenders, "bvid": bvid } try: resp3 = obs_client.setObjectMetadata( bucketName, object_key, metadata) if resp3.status < 300: logger.info( '{}: metadata修改成功'.format( object_key)) else: logger.error( 'errorCode', resp3.errorCode) logger.error( 'errorMessage', resp3.errorMessage) except: logger.error(traceback.format_exc()) # 休眠30s避免上传间隔过短 time.sleep(30) else: logger.error('errorCode', resp2.errorCode) logger.error('errorMessage', resp2.errorMessage) except Exception as e2: logger.error(e2) except: logger.error(traceback.format_exc()) else: logger.error('errorCode', resp.errorCode) logger.error('errorMessage', resp.errorMessage) except: logger.error(traceback.format_exc())