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)
示例#2
0
 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())