Ejemplo n.º 1
0
    def start(self):
        VideoHelper.handle_meida_db_exists()
        exist_media_dirs = VideoHelper.gen_dir()
        if Globals.TEST_MEIDA_DIR_TAGS:
            self.test_tags(exist_media_dirs)

        for src in VideoHelper.src_dbs():
            media_src_root = Path(VideoHelper.media_root(src.path))
            files = media_src_root.rglob('*.*')
            files = self.sort_files(files)
            for file in files:
                if not file.is_file() or not yutils.is_movie(file):
                    continue
                media_db = VideoHelper.get_media_mpath_db(src.query, str(file.as_posix()), exist_media_dirs)
                if media_db == None:
                    continue
                VideoHelper.check_media_db_state(media_db)
                if MediaHelp.is_err(media_db.state):
                    media_db.save()
                    continue
                VideoHelper.analysis_audio_info(media_db, src.query)
                VideoHelper.compress_media(media_db)
                # VideoHelper.create_ts(media_db)
                VideoHelper.create_thum(media_db)
                VideoHelper.modify_state(media_db, MediaHelp.STATE_VIDOE_COMPRESS_FINISH)

        logger.info('VideoService--------------同步结束!')
Ejemplo n.º 2
0
def get_media_mpath_db(src_db, file_path: str, mdirs):
    # ypath.convert_path(src.replace(self.src_root, '')),
    # str(file.as_posix()), exist_media_dirs, self.desc_root
    if os.path.isdir(file_path):
        return None
    if not yutils.is_movie(file_path):
        return None
    file_path = ypath.convert_path(file_path)
    media_db_query = Media.objects.filter(abs_path=file_path)
    cur_media_db = None
    if len(media_db_query) > 0:
        cur_media_db = media_db_query[0]
        return cur_media_db
    else:
        # target = ypath.decompose_path(
        #     file, str(src_root), str(convert_root), exten='.mp4')
        media_db = Media()
        if (os.path.dirname(file_path) in mdirs):
            media_db.src_dir = mdirs[os.path.dirname(
                file_path)]  # media_db.src_mpath.dir_id
        else:
            logger.info('该文件没有父文件夹:' + file_path)
            return None
        media_db.abs_path = file_path
        media_db.state = MediaHelp.STATE_INIT
        media_db.file_name = os.path.basename(file_path)
        media_db.src_mpath = src_db
        media_db.desc_path = ypath.del_exten(
            file_path.replace(media_root(src_db.path), '')) + '.mp4'

        # media_db.nginx_path = target.replace(str(convert_root.as_posix()), '')
        # create_db_list.append(media_db)
        # media_db.folder_key = dm_dict[os.path.dirname(file_path)]
        return media_db
Ejemplo n.º 3
0
def delete_not_exist():
    if not os.path.exists(middle):
        logger.info('middle not exist!')
        return

    print('[delete_not_exist] begin')
    right_map = {}
    for root, dirs, files in os.walk(src):
        for file in files:

            if not yutils.is_gif(file) and not yutils.is_photo(file):
                continue
            source_file = ypath.join(root, file)
            rename_file = middle_out_file(source_file)
            if os.path.exists(rename_file):
                right_map[rename_file] = source_file

    for root, dirs, files in os.walk(middle):
        for file in files:
            if not yutils.is_gif(file) and not yutils.is_photo(file):
                continue
            middle_path = ypath.join(root, file)
            if middle_path in right_map:
                pass  # print('' + source_path + "  src:" + right_map[source_path])
            else:
                thum_path = thum + middle_path[len(middle):]
                if os.path.exists(middle_path):
                    os.remove(middle_path)
                if os.path.exists(thum_path):
                    os.remove(thum_path)
                print('删除文件:', middle_path, thum_path)
    ypath.del_none_dir(middle)
    ypath.del_none_dir(thum)
    print('[delete_not_exist] end')
Ejemplo n.º 4
0
    def file_call(file_list):
        for file in file_list:
            if not yutils.is_gif(file.ext) and not yutils.is_photo(file.ext):
                logger.info('这张不是图片:' + file.path)
                continue

            if file.path not in exist_in_db_list:
                new_file_dict.append(file)
Ejemplo n.º 5
0
def sync_on_back():
    if eve.isSet():
        logger.info('正在同步,不会做任何操作')
        # 正在同步了. 不需要修改.
        return {'res': 2, 'res_str': '正在同步,不会做任何操作'}

    logger.info('当前状态是没有在同步,即将唤起线程')
    eve.set()
    return {'res': 1, 'res_str': '发起同步操作成功!'}
Ejemplo n.º 6
0
 def tag_now(self, intro='', print_it=True, tag_time=True, tag_mem=True):
     now_t = self._nowTime()
     now_mem = memory_profiler.memory_usage()[0]
     if print_it:
         logger.info(
             self._pre + intro + str(now_t - self._last_tag_time) + '毫秒,占用内存:' + str(now_mem) + 'Mb,比较之前上升了:' + str(
                 now_mem - self.cur_mem) + 'Mb')
     self._last_tag_time = now_t
     self.cur_mem = now_mem
Ejemplo n.º 7
0
def sync_on_back():
    if PhotoService.in_sync():
        return {'res': 3, 'res_str': '图片库正在同步,暂时无法同步照片墙!'}

    if eve.isSet():
        logger.info('正在同步,不会做任何操作')
        # 正在同步了. 不需要修改.
        return {'res': 2, 'res_str': '正在同步,不会做任何操作'}

    logger.info('当前状态是没有在同步,即将唤起线程')
    eve.set()
    return {'res': 1, 'res_str': '发起同步操作成功!'}
Ejemplo n.º 8
0
def loop():
    global sync_control
    cur_file_info.clear()
    if len(src_dbs) == 0:
        sync_control = False
        return False
    logger.info("MediaService一个流程:" + str(len(src_dbs)) + '   ' + src_dbs[0].abs_path)
    compress(src_dbs[0])
    del src_dbs[0]
    if len(src_dbs) == 0:
        sync_control = False
        return False
    return True
Ejemplo n.º 9
0
    def begin_convert(self):
        fragment_list\
            = PhotoHelper.convert_fragment_list(self.src_dirs, self.MULIT_THREAD_COUNT)
        tpool = ThreadingPool.ThreadingPool()
        create_db_list = []
        error_list = []
        for k in fragment_list:
            tpool.append(self.begin_threads, create_db_list, fragment_list[k],
                         error_list)
        tpool.start()
        if len(create_db_list) > 0:
            Photo.objects.bulk_create(create_db_list)
        self.watch.tag_now('图片同步结束:')

        logger.info('错误图片列表:' + str(error_list))
Ejemplo n.º 10
0
def compress_media(media_db: Media):
    if MediaHelp.is_err(media_db.state):
        return
    if media_db.desc_mpath == None:
        with lock:
            media_db.desc_mpath = MediaPath.pdc().search_by_abs_path(
                MediaPath.desc(), is_src=False)
        pass
    d_abs_path = desc_path(
        media_db)  # ypath.join(media_db.desc_mpath.path, media_db.desc_path)
    # 如果开关开着. 则不管desc是否已有.,根据数据库去覆盖.
    if media_db.state < MediaHelp.STATE_COMPRESS_HLS:
        # 标记为 未转码完毕
        if os.path.exists(d_abs_path):
            if Globals.MEDIA_SERVICE_COVER_DESC:
                os.remove(d_abs_path)
            else:
                logger.info('MediaService.target exists   所以直接修改数据')
                modify_state(media_db, MediaHelp.STATE_COMPRESS_HLS)
    else:
        if not os.path.exists(d_abs_path):  # 状态是转码完毕后. 但是desc文件不存在. 则需要重新转码
            modify_state(media_db, MediaHelp.STATE_AUDIO_FINISH)
    if media_db.state >= MediaHelp.STATE_COMPRESS_HLS:
        logger.info('该文件已经转码过了:' + media_db.abs_path)
        return
    if os.path.exists(d_abs_path):
        os.remove(d_abs_path)
    ypath.create_dirs(d_abs_path)
    # media_db.nginx_path = target
    if media_db.codec_type == 'h264':
        logger.info('这个视频是 h264流视频, 可以直接复制' + media_db.abs_path)
        can_audio_copy = (media_db.audio_name == 'aac'
                          or media_db.audio_name == 'mp3')
        if not can_audio_copy:
            EmailUtil.send('该文件需要检查audio:' + media_db.abs_path +
                           ' \nmedia_db.audio_name:' + media_db.audio_name)
            # input('该文件需要检查audio:' + media_db.abs_path)
        if media_db.abs_path.endswith('.mp4') and can_audio_copy:
            os.symlink(media_db.abs_path, d_abs_path)
        else:
            # 这里进行复制内容
            audio_cmd = '-acodec copy' if can_audio_copy else '-acodec mp3'
            # audio_cmd = '-acodec copy'
            yutils.process_cmd(ffmpeg_tools + ' -i \"' + media_db.abs_path +
                               '\" -vcodec copy ' + audio_cmd + ' \"' +
                               d_abs_path + '\"')

    else:
        # '\"%s\" -i \"%s\"  \"%s\"' % (ffmpeg_tools, src_path, target)
        logger.info('这个视频不是:' + media_db.abs_path)
        yutils.process_cmd('\"%s\" -i \"%s\"  \"%s\"' %
                           (ffmpeg_tools, media_db.abs_path, d_abs_path))
    if not os.path.exists(d_abs_path):
        logger.error('源文件错误:%s' % d_abs_path)
        modify_state(media_db, MediaHelp.STATE_SRC_ERROR)
    else:
        modify_state(media_db, MediaHelp.STATE_COMPRESS_HLS)
Ejemplo n.º 11
0
 def start(self):
     self.src_dirs = PhotoHelper.src_list(self.src_root)
     self.desc_dirs = PhotoHelper.desc_list(self.desc_root)
     logger.info('PhotoService.开始执行同步!!!!')
     self.err_pic.clear()
     self.watch.print_now_time('开始图片转换服务. 开启时间:')
     self.watch.tag_now(print_it=False)
     logger.info("开始去重...")
     ypath.delrepeat_file_list(self.src_dirs,
                               PngImagePlugin.MAX_TEXT_MEMORY)
     self.watch.tag_now('去重操作占用时长:')
     PhotoHelper.del_not_exist(self.desc_middle_root)
     logger.info('PhotoConvert.create_dirs begin!')
     PhotoHelper.create_dirs(self.src_dirs, self.src_root,
                             self.webp_cache_root)
     logger.info('[create_dirs] end')
     logger.info('PhotoService.begin_convert begin!')
     self.begin_convert()
Ejemplo n.º 12
0
 def __send(self, content, tag, title='01-pc的通知'):
     try:
         smtpObj = smtplib.SMTP_SSL(host='smtp.qq.com')
         smtpObj.connect(host='smtp.qq.com', port=465)
         smtpObj.login(self.sender, 'qjmrhlkopaoicige')
         message = MIMEText(tag + "\n" + content, 'plain', 'utf-8')
         message['From'] = self.sender  # Header("教程", 'utf-8')
         message['To'] = self.receivers[0]  # Header("接收者", 'utf-8')
         message['Subject'] = title
         # message['X-Mailer'] = Header('Microsoft Outlook Express 6.00.2900.2869', 'utf-8')
         smtpObj.sendmail(self.sender, self.receivers, message.as_string())
         print('发送成功')
         smtpObj.quit()
         smtpObj.close()
         return True
     except smtplib.SMTPException as e:
         logger.info(e)
         return False
Ejemplo n.º 13
0
def gen_dir():
    str_media_src = str(media_src_root.as_posix())
    dir_db_paths = {}
    for dir in os.listdir(str_media_src):
        m_file_list = ypath.path_res(ypath.join(str_media_src, dir), parse_file=False)
        all_media_dirs = Dir.objects.filter(tags=dir)
        for dir_db in all_media_dirs:
            if dir_db.abs_path not in m_file_list:
                logger.info('被删除的路径:' + dir_db.abs_path)
                dir_db.delete()
            else:
                dir_db_paths[dir_db.abs_path] = dir_db

        for local_dir in m_file_list:
            if local_dir.path not in dir_db_paths:
                dir_db_paths[local_dir.path] = ServiceHelper.create_dir(dir_db_paths, local_dir, yutils.M_FTYPE_MOIVE,
                                                                        dir)  # create_dir(dir_db_paths, local_dir, dir)
                logger.info('创建该文件夹:' + str(local_dir))
    return dir_db_paths
Ejemplo n.º 14
0
def create_dir(cur_dir_dbs, info, type, tags='', save_it=True):
    name = info.name
    parent_path = info.parent  # info[ypath.KEYS.PARENT]
    rel_path = info.relative
    d_model = Dir()
    d_model.name = name
    d_model.isdir = True
    d_model.abs_path = ypath.convert_path(info.path)
    d_model.rel_path = rel_path
    d_model.type = type
    # d_model.tags = tags  # if info[ypath.KEYS.LEVEL] == 0 else ''
    try:
        parent = cur_dir_dbs[parent_path]  # Dir.objects.get(abs_path=parent_path)
        d_model.parent_dir = parent
    except Exception as e:
        logger.info('错误,这货没有爸爸的,忽视这个问题:%s:is not found :%s' % (parent_path, e))
        pass
    if save_it:
        d_model.save()
    return d_model
Ejemplo n.º 15
0
def src2pc(delete_exist):
    if not os.path.exists(src):
        logger.info('src2pc:src not exist!')
        return
    ImageFile.LOAD_TRUNCATED_IMAGES = True
    # cmd = 'for i in ' + src + '/*.jpg;do jpegoptim -m50 -d ' + desc + ' -p "$i";done'
    # os.system(cmd)
    from frames import ThreadingPool
    tpool = ThreadingPool.ThreadingPool()
    img_link_dic = {}
    for root, dirs, files in os.walk(src):
        for dir in dirs:
            src_dir = ypath.join(root, dir)
            out_dir, single_dir = middle_out_dir(src_dir)
            img_link_dic[single_dir] = src_dir
            tpool.append(begin_s2middle_by_threads, src_dir, out_dir,
                         delete_exist)
    tpool.start()
    print('end mulite thread!!!!!!!!!!!!!!')
    return img_link_dic
Ejemplo n.º 16
0
def create_thum(media_db: Media):
    if MediaHelp.is_err(media_db.state):
        return
    desc_root = media_db.desc_mpath.path
    media_tum_root = ypath.join(
        desc_root, movie_config.img_info.img_root
    )  # TmpUtil.desc() / movie_config.img_info.img_root
    # convert_root
    # if media_db.state >= MediaHelp.STATE_VIDEO_THUM:
    #     logger.info('该文件已经转缩略图过了:' + media_db.abs_path)
    #     return
    target_img_dir = ypath.join(media_tum_root, media_db.desc_path)
    ypath.create_dirs(target_img_dir)
    desc = ypath.join(target_img_dir, movie_config.img_info.img)
    desc_thum = ypath.join(target_img_dir, movie_config.img_info.thum)
    if os.path.exists(desc) and os.path.exists(desc_thum):
        logger.info('该视频不需要做缩略图裁切,因为已有:%s' % desc)
        return
    # 裁切缩略图的比例
    thum_percent = int(movie_config.base_info.thum_w) / int(
        movie_config.base_info.thum_h)

    max_thum_time = int(movie_config.base_info.max_thum_time)
    min_thum_time = int(movie_config.base_info.min_thum_time)

    ypath.create_dirs(desc)

    r_time = random.randint(
        min_thum_time if media_db.duration > min_thum_time else 0,
        max_thum_time
        if media_db.duration > max_thum_time else media_db.duration)
    d_abs_path = ypath.join(media_root(desc_root), media_db.desc_path)
    cmd = ffmpeg_tools + ' -i \"' + d_abs_path + '\" -y  -vframes 1 -ss  00:00:' + str(
        r_time) + ' -f image2  \"' + desc + '\"'
    yutils.process_cmd(cmd)
    if not os.path.exists(desc):
        return
    img = Image.open(desc)
    w, h = img.size
    crop_img = img.crop(yutils.crop_size(w, h, thum_percent))
    crop_img.save(desc_thum)
Ejemplo n.º 17
0
def start():
    watch.tag_now('开始启动服务器')
    tctime = socket(AF_INET, SOCK_STREAM)
    tctime.bind(ADDR)
    tctime.listen(3)

    while True:
        logger.info('Wait for connection ...')
        tctimeClient, addr = tctime.accept()
        logger.info("Connection from :", str(addr))

        # while True:
        try:
            data = tctimeClient.recv(buffsize).decode()
        except Exception:
            pass
        # if not data:
        #     print('break!!!!!')
        #     break
        res = parse_path(find_path(data))
        tctimeClient.send(res.encode('gbk'))
        tctimeClient.close()
Ejemplo n.º 18
0
def create_ts(media_db: Media):
    # d_abs_path = ypath.join(media_root(media_db), media_db.desc_path)
    desc_root = media_db.desc_mpath.path
    media_ts_dir = ypath.join(desc_root, movie_config.ts_info.ts_dir,
                              media_db.desc_path)
    if media_db.state >= MediaHelp.STATE_VIDEO_TS and os.path.isdir(
            media_ts_dir):
        logger.info('该视频已经切片过了:' + media_db.abs_path)
        return
    if os.path.exists(media_ts_dir):
        shutil.rmtree(media_ts_dir)
    ypath.create_dirs(media_ts_dir, True)
    media_desc_path = desc_path(
        media_db)  # ypath.join(desc_path(media_db), media_db.desc_path)
    m3u8_file = ypath.join(media_ts_dir, movie_config.ts_info.u8name)
    cmd = '\"' + ffmpeg_tools + '\" -i \"' + media_desc_path + \
          '\" -codec copy -vbsf h264_mp4toannexb -map 0 -f segment -segment_list \"' + \
          m3u8_file + '\" -segment_time 30 \"' + media_ts_dir + '/%05d.ts\"'
    yutils.process_cmd(cmd)
    modify_state(media_db, MediaHelp.STATE_VIDEO_TS)
    # m3u8_path = ypath.join(media_ts_dir, movie_config.ts_info.u8name)

    # media_db.m3u8_path = ypath.join(media_db.desc_path, movie_config.ts_info.u8name)
    print(desc_root)
Ejemplo n.º 19
0
def m_second_gallery(request, dir_id):
    if request.method == "POST":
        try:
            page = request.POST.get('page')
            c_id = int(dir_id)
            json = yquery.pic_level2_2json(c_id, page)
            print('[m_second_gallery]:', dir_id, page)
            # return HttpResponse(json)
            return HttpResponse(
                json, 'content-type=application/x-www-form-urlencoded')
            # render(request, 'gallery/secondLevel/index.html', {'json': json, 'pre_path': '/pic/middle'})
        except:
            logger.error('非法参数:', dir_id)
    else:
        logger.info('[m_second_gallery]:', dir_id)
        try:
            c_id = int(dir_id)
            json = yquery.pic_level2_2json(c_id, 1)
            return render(request, 'gallery/secondLevel/index.html', {
                'json': json,
                'pre_path': '/pic/middle'
            })
        except:
            logger.error('[m_second_gallery]没有该id的照片:', dir_id)
Ejemplo n.º 20
0
def list_finish(res, _):
    logger.info(
        'list os files suc! do next:save different list to file! out/upload_list.txt & out/delete_list.txt'
    )
    os_list = org_os_list(res)
    local_files = local_list(local_path)
    upload_list, delete_list = diff_path(os_list, local_files)
    upload_path = []
    for upload_item in upload_list:
        upload_path.append(local_path + upload_item.split('|')[0])

    delete_px_list = []
    for delete_item in delete_list:
        if delete_item.split('|')[0] not in upload_path:
            delete_px_list.append(bucket_dir + delete_item.split('|')[0])

    ypath.create_dirs(upload_list_path)
    with open(upload_list_path, 'w', encoding='utf-8') as f:
        f.write('\n'.join(upload_path))

    ypath.create_dirs(delete_list_path)
    with open(delete_list_path, 'w', encoding='utf-8') as f:
        f.write('\n'.join(delete_px_list))
    print(upload_list, delete_px_list)
Ejemplo n.º 21
0
def compress_media(media_db):
    if MediaHelp.is_err(media_db.state):
        return
    # 如果开关开着. 则不管desc是否已有.,根据数据库去覆盖.

    if media_db.state < MediaHelp.STATE_VIDOE_COMPRESS_FINISH:
        # 标记为 未转码完毕
        if os.path.exists(media_db.desc_path):
            if Globals.MEDIA_SERVICE_COVER_DESC:
                os.remove(media_db.desc_path)
            else:
                logger.info('MediaService.target exists   所以直接修改数据')
                modify_state(media_db, MediaHelp.STATE_VIDOE_COMPRESS_FINISH)
    else:
        if not os.path.exists(media_db.desc_path):  # 状态是转码完毕后. 但是desc文件不存在. 则需要重新转码
            modify_state(media_db, MediaHelp.STATE_AUDIO_FINISH)
    if media_db.state >= MediaHelp.STATE_VIDOE_COMPRESS_FINISH:
        logger.info('该文件已经转码过了:' + media_db.abs_path)
        return
    if os.path.exists(media_db.desc_path):
        os.remove(media_db.desc_path)
    ypath.create_dirs(media_db.desc_path)
    # media_db.nginx_path = target
    if media_db.codec_type == 'h264':
        logger.info('这个视频是 h264流视频, 可以直接复制' + media_db.abs_path)
        if media_db.abs_path.endswith('.mp4'):
            os.symlink(media_db.abs_path, media_db.desc_path)
        else:
            # 这里进行复制内容
            yutils.process_cmd(
                ffmpeg_tools + ' -i \"' + media_db.abs_path + '\" -vcodec copy -acodec copy \"' + media_db.desc_path + '\"')

    else:
        # '\"%s\" -i \"%s\"  \"%s\"' % (ffmpeg_tools, src_path, target)
        logger.info('这个视频不是:' + media_db.abs_path)
        yutils.process_cmd('\"%s\" -i \"%s\"  \"%s\"' % (ffmpeg_tools, media_db.abs_path, media_db.desc_path))
    if not os.path.exists(media_db.desc_path):
        logger.error('源文件错误:%s' % media_db.desc_path)
        modify_state(media_db, MediaHelp.STATE_SRC_ERROR)
    else:
        modify_state(media_db, MediaHelp.STATE_VIDOE_COMPRESS_FINISH)
Ejemplo n.º 22
0
def print_diff_list(res, param):
    logger.info('bucket suc! do next:list os files')
    yutils.process_cmd('coscmd list -ar ' + bucket_dir, done_call=list_finish)
Ejemplo n.º 23
0
def analysis_audio_info(media_db):
    def movie_info_res(cmdlist, _):
        if len(cmdlist) <= 0:
            modify_state(media_db, MediaHelp.STATE_AUDIO_FINISH)
            return
        jsonbean = json.loads(''.join(cmdlist))
        if 'streams' not in jsonbean.keys():
            modify_state(media_db, MediaHelp.STATE_SRC_ERROR)
            return
        streamlist = jsonbean['streams']
        format = jsonbean['format']
        media_db.md5 = yutils.get_md5(media_db.abs_path)
        media_db.duration = int(float(format['duration']))
        # cur_file_info['duration'] =
        media_db.size = int(format['size'])
        if len(streamlist) <= 0:
            modify_state(media_db, MediaHelp.STATE_AUDIO_FINISH)
            return
        audio_streams = []
        decode_map = ''
        for stream_item in streamlist:
            if stream_item['codec_type'] == 'audio':
                logger.info(str(stream_item))
                audio_streams.append(stream_item)
            else:
                if stream_item['codec_type'] == 'video':
                    # 如果是视频.保存视频信息
                    media_db.codec_type = stream_item['codec_name']
                    media_db.codec_long_name = stream_item['codec_long_name']
                    media_db.width = int(stream_item['width'])
                    media_db.height = int(stream_item['height'])
                    try:
                        media_db.r_frame_rate = round(eval(stream_item['r_frame_rate']))
                        media_db.avg_frame_rate = round(eval(stream_item['avg_frame_rate']))
                    except ZeroDivisionError:
                        media_db.r_frame_rate = 0
                        media_db.avg_frame_rate = 0

                decode_map += ' -map 0:' + str(stream_item['index'])

        # 有多个语种
        digout = False
        if len(audio_streams) > 1:
            for audio_stream in audio_streams:
                if 'tags' in audio_stream and 'title' in audio_stream['tags'] \
                        and ('国语' == audio_stream['tags']['title'] or '中语' == audio_stream['tags']['title']):
                    decode_map += ' -map 0:' + str(audio_stream['index'])
                    digout = True
                    break
        else:
            logger.info('该视频音轨只有一个,不需要转换:' + media_db.abs_path)
            modify_state(media_db, MediaHelp.STATE_AUDIO_FINISH)
            return

        if not digout:
            for audio_stream in audio_streams:
                decode_map += ' -map 0:' + str(audio_stream['index'])
            #     out_content += str(index) + ':' + str(audio_stream) + '\n'
            #     index += 1
            # select_audio = len(audio_streams)
            # while len(audio_streams) <= select_audio or select_audio < 0:
            #     select_audio = int(input(out_content + '选择音轨:'))

        # desc_file = file +
        mulit_audio_path = TmpUtil.src() / movie_config.base_info.mulit_audio_dir
        desc_mulit_path = ypath.decompose_path(media_db.abs_path, str(media_src_root), str(mulit_audio_path))
        out_file = desc_mulit_path + '.chi' + ypath.file_exten(media_db.abs_path)
        ypath.create_dirs(desc_mulit_path)
        if os.path.exists(out_file):
            os.remove(out_file)
        logger.info(out_file)

        copy_cmd = ffmpeg_tools + ' -i \"' + media_db.abs_path + '\"' + decode_map + '  -vcodec copy -acodec copy \"' + out_file + '\"'
        yutils.process_cmd(copy_cmd, done_call=rm_on_audio_copy, param=(media_db.abs_path, out_file, desc_mulit_path))

    if MediaHelp.is_err(media_db.state):
        return

    # 音轨结束后,保存源文件到movie_otherformat目录,替换原有文件名.
    def rm_on_audio_copy(_, files):
        shutil.move(files[0], files[2])
        shutil.move(files[1], files[0])
        modify_state(media_db, MediaHelp.STATE_AUDIO_FINISH)

    if media_db.state >= MediaHelp.STATE_AUDIO_FINISH:
        logger.info('该文件的音轨已经转换过了:' + media_db.abs_path)
        return
    logger.info('开始转换:' + media_db.abs_path)
    yutils.process_cmd(
        ffprobe_tools + ' \"' + media_db.abs_path + '\" -print_format  json -show_format -show_streams',
        done_call=movie_info_res)
Ejemplo n.º 24
0
 def print_now_time(self, intro):
     logger.info(self._pre + intro + datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') + '  占用内存:' + str(
         self.cur_mem) + 'Mb')
Ejemplo n.º 25
0
def _sync():
    logger.info('MediaService.开始同步')
    # gen_dir()
    dbs = gen_media_dbs()
    src_dbs.extend(dbs)
    logger.info('同步成功,正在执行转换程式')
Ejemplo n.º 26
0
    def movie_info_res(cmdlist, _):
        if len(cmdlist) <= 0:
            modify_state(media_db, MediaHelp.STATE_AUDIO_FINISH)
            return
        jsonbean = json.loads(''.join(cmdlist))
        if 'streams' not in jsonbean.keys():
            modify_state(media_db, MediaHelp.STATE_SRC_ERROR)
            return
        streamlist = jsonbean['streams']
        format = jsonbean['format']
        media_db.md5 = yutils.get_md5(media_db.abs_path)
        media_db.duration = int(float(format['duration']))
        # cur_file_info['duration'] =
        media_db.size = int(format['size'])
        if len(streamlist) <= 0:
            modify_state(media_db, MediaHelp.STATE_AUDIO_FINISH)
            return
        audio_streams = []
        decode_map = ''
        for stream_item in streamlist:
            if stream_item['codec_type'] == 'audio':
                logger.info(str(stream_item))
                audio_streams.append(stream_item)
            else:
                if stream_item['codec_type'] == 'video':
                    # 如果是视频.保存视频信息
                    media_db.codec_type = stream_item['codec_name']
                    media_db.codec_long_name = stream_item['codec_long_name']
                    media_db.width = int(stream_item['width'])
                    media_db.height = int(stream_item['height'])
                    try:
                        media_db.r_frame_rate = round(
                            eval(stream_item['r_frame_rate']))
                        media_db.avg_frame_rate = round(
                            eval(stream_item['avg_frame_rate']))
                    except ZeroDivisionError:
                        media_db.r_frame_rate = 0
                        media_db.avg_frame_rate = 0

                decode_map += ' -map 0:' + str(stream_item['index'])

        # 有多个语种
        digout = False
        if len(audio_streams) > 1:
            for audio_stream in audio_streams:
                if 'tags' in audio_stream and 'title' in audio_stream['tags'] \
                        and ('国语' == audio_stream['tags']['title'] or '中语' == audio_stream['tags']['title']):
                    decode_map += ' -map 0:' + str(audio_stream['index'])
                    media_db.audio_long_name = audio_stream['codec_long_name']
                    media_db.audio_name = audio_stream['codec_name']
                    digout = True
                    break
        else:
            if len(audio_streams) == 1:
                media_db.audio_long_name = audio_streams[0]['codec_long_name']
                media_db.audio_name = audio_streams[0]['codec_name']
            logger.info('该视频音轨只有一个,不需要转换:' + media_db.abs_path)
            modify_state(media_db, MediaHelp.STATE_AUDIO_FINISH)
            return

        if not digout:
            if len(audio_streams) >= 1:
                media_db.audio_long_name = audio_streams[0]['codec_long_name']
                media_db.audio_name = audio_streams[0]['codec_name']
            # media_db.audio_long_name = stream_item['codec_long_name']
            # media_db.audio_name = stream_item['codec_name']
            for audio_stream in audio_streams:
                decode_map += ' -map 0:' + str(audio_stream['index'])
            #     out_content += str(index) + ':' + str(audio_stream) + '\n'
            #     index += 1
            # select_audio = len(audio_streams)
            # while len(audio_streams) <= select_audio or select_audio < 0:
            #     select_audio = int(input(out_content + '选择音轨:'))

        with lock:
            mulit_audio_path = ypath.join(MediaPath.src(), mulit_audio_dir)
        desc_mulit_path = ypath.decompose_path(media_db.abs_path, src_db.path,
                                               str(mulit_audio_path))

        out_file = desc_mulit_path + '.chi' + ypath.file_exten(
            media_db.abs_path)
        ypath.create_dirs(desc_mulit_path)
        if os.path.exists(out_file):
            os.remove(out_file)
        logger.info(out_file)
        copy_cmd = ffmpeg_tools + ' -i \"' + media_db.abs_path + '\"' + decode_map + '  -vcodec copy -acodec copy \"' + out_file + '\"'
        yutils.process_cmd(copy_cmd,
                           done_call=rm_on_audio_copy,
                           param=(media_db.abs_path, out_file,
                                  desc_mulit_path))
Ejemplo n.º 27
0
    def begin_threads(self, create_db_list: list, f_list, err_list):
        for link_item in f_list:
            if not yutils.is_gif(link_item.ext) and not yutils.is_photo(
                    link_item.ext):
                logger.info('这张不是图片:' + link_item.path)
                continue
            src_file = link_item.path
            file_stat = os.stat(src_file)
            if file_stat.st_size > PngImagePlugin.MAX_TEXT_MEMORY:
                err_list.append(src_file)
                continue
            pi = Photo()
            pi.src_abs_path = src_file
            pi.src_name = link_item.relative

            pi.src_mpath = MediaPath.pdc().search_by_abs_path(
                link_item.pic_root)
            try:
                file_steam = open(src_file, 'rb')
                pi.src_md5 = yutils.get_md5_steam(file_steam)
                pi.ctime = int(file_stat.st_ctime)
                pi.mtime = int(file_stat.st_mtime)
                desc_rela_name, pi.src_size = PhotoHelper.file_desc_dir(
                    file_stat, pi.src_abs_path, pi.src_md5)
                src_img = Image.open(file_steam)
                if src_img.mode == 'RGB':
                    pi.desc_rela_path = desc_rela_name + '.jpg'
                else:
                    pi.desc_rela_path = desc_rela_name + link_item.ext
                pi.src_width, pi.src_height = src_img.size
            except:
                err_list.append(src_file)
                logger.info('这张图有错误!!!!!!!!!!!!!!!!!!!!!!!:' + src_file)
                continue
            with lock:
                desc_root = MediaPath.desc()
                pi.desc_mpath = MediaPath.pdc().search_by_abs_path(
                    desc_root, False)
                desc_middle_path = ypath.join(desc_root, self.desc_middle_root,
                                              pi.desc_rela_path)
                desc_thum_path = ypath.join(desc_root, self.desc_thum_root,
                                            pi.desc_rela_path)
                desc_webp_path = ypath.join(desc_root, self.desc_webp_root,
                                            pi.desc_rela_path)
                ypath.create_dirs(desc_middle_path)
                ypath.create_dirs(desc_thum_path)
                ypath.create_dirs(desc_webp_path)

            m_img = PhotoHelper.convert_middle(src_img, link_item.path,
                                               desc_middle_path,
                                               self.middle_area)
            w, h = m_img.size
            pi.mid_width = w
            pi.mid_height = h
            pi.mid_size = os.path.getsize(desc_middle_path)
            pi.state = PicHelp.STATE_FINISH
            pi.is_gif = yutils.is_gif(link_item.ext)
            # webp_file = ypath.join(desc_webp_root, mulit_file_list[middle_file][0] + '.webp')
            # convert_webp(m_img, webp_file, middle_file)
            t_img = PhotoHelper.cut_middle2thum(m_img, desc_thum_path,
                                                self.thum_size)
            if m_img is not t_img:
                del m_img
                del t_img
            else:
                del m_img
            with lock:
                create_db_list.append(pi)
                if len(create_db_list) >= PhotoHelper.SYNC_PHOTO_DB_COUNT:
                    Photo.objects.bulk_create(create_db_list)
                    create_db_list.clear()
Ejemplo n.º 28
0
                print('删除文件:', middle_path, thum_path)
    ypath.del_none_dir(middle)
    ypath.del_none_dir(thum)
    print('[delete_not_exist] end')


if __name__ == '__main__':
    src = TmpUtil.src()
    src = ypath.join(src, pic_cfg.dir_root)
    desc = TmpUtil.desc()

    desc = ypath.join(desc, pic_cfg.dir_root)

    gif_space = TmpUtil.input_note(GIF_SPACE, '请指定gif的占位符的图片位置:\n')

    logger.info('初始化成功src:', src, ',desc:', desc, 'gif_space:', gif_space)

    middle = ypath.join(desc, pic_cfg.middle)
    thum = ypath.join(desc, pic_cfg.thum)
    other_file.clear()

    # 去重
    ypath.delrepeat_file(src)
    # 去掉middle中的图.
    delete_not_exist()
    link_dic = src2pc(False)

    if len(other_file) > 0:
        str = input('警告!发现非图片或gif的文件,请确认:\n').lower()
        if 'y' != str:
            sys.exit(0)
Ejemplo n.º 29
0
# from MryangService import MediaService as ms


def im_out(s_name, s_time=60):
    # 没事做了,睡1分钟在看看有没有事,这个如果service多了是否会造成空跑的影响?这个再说了.
    time.sleep(s_time)


def proxy_method(ins, method_log):
    print()


if __name__ == '__main__':
    # FileObserver.append_call(ms, '/media/')
    logger.info("服务启动正常,该服务进程id:" + str(os.getpid()))
    # tp.append(FileObserver.start, TmpUtil.src())
    # tp.append(proxy_method, ms, 'MediaService.loop')
    # tp.append(proxy_method, ps, 'PicService.loop')
    # ()
    # PhotoService.start()
    # PhotoConvert.start()
    tp = tp()
    tp.append(PhotoService.start)
    # tp.append(VideoService.start)
    # tp.append(statewatch.start)

    # PicConvert.start()
    # MPath.objects.all().delete()
    # tp.append(PicConvert.start)
    # tp.append(proxy_method, statewatch, 'statewatch.loop')