update_qa_gif.py 4.08 KB
# -*- coding: UTF-8 -*-
import json
import requests
import math
import time
import queue
import os
import ffmpy
import hashlib

from concurrent.futures import ThreadPoolExecutor
from django.core.management import BaseCommand
from django.conf import settings
from django.db.models import Q, Max
from gm_upload import upload_file
from gm_types.mimas.enum import IMAGE_TYPE
from gm_upload.utils.image_utils import Picture

from qa.models import QuestionImage, AnswerImage
from concurrent.futures import ThreadPoolExecutor
from qa.utils.image import img_type, handle_image_type


answer_img_queue = queue.Queue()
max_answer_img_info = AnswerImage.objects.order_by("id").last()
question_img_queue = queue.Queue()
max_question_img_info = QuestionImage.objects.order_by("id").last()


class UpdateQaImgType(object):
    step = 200

    def qa_image_update(self, qa_images):
        """处理图片内容类型"""
        for qa_image in qa_images:
            if qa_image.image_webp:
                continue
            hash_key = hashlib.md5(str(time.time()).encode("utf8")).hexdigest()
            input_path = os.path.join(settings.GIF_CONVERT_PATH, "{}twp.gif".format(hash_key))
            output_path = os.path.join(settings.GIF_CONVERT_PATH, '{}twp.webp'.format(hash_key))

            img_url = Picture.get_no_watermark_path(qa_image.image_url)
            res = requests.get(img_url)
            # 文件存储到本地
            with open(input_path, 'wb') as f:
                f.write(res.content)
            # 使用底层 FFmpeg 库进行转码
            ff = ffmpy.FFmpeg(
                inputs={input_path: None},
                outputs={output_path: settings.GIF_FF_WEBP}
            )
            ff.run()
            # 上传webP图片
            qa_image.image_webp = upload_file(output_path)
            qa_image.save()

            if os.path.exists(input_path):
                os.remove(input_path)
            if os.path.exists(output_path):
                os.remove(output_path)
        return

    def handle_question(self):
        last_question_id = question_img_queue.get()

        if max_question_img_info.id <= last_question_id:
            question_img_queue.put(last_question_id)
            return

        print("当前执行的问答ID=======目标问答ID", last_question_id, max_question_img_info.id)
        per_num = 200

        q_imgs = QuestionImage.objects.filter(id__gt=last_question_id, image_type=IMAGE_TYPE.GIF)[:per_num]
        max_id = q_imgs.aggregate(max_id=Max('id'))
        question_img_queue.put(max_id.get('max_id'))
        self.qa_image_update(qa_images=q_imgs)

    def handle_answer(self):
        last_answer_id = answer_img_queue.get()

        if max_answer_img_info.id <= last_answer_id:
            answer_img_queue.put(last_answer_id)
            return

        print("当前执行的问答ID=======目标问答ID", last_answer_id, max_answer_img_info.id)
        per_num = 200

        a_imgs = AnswerImage.objects.filter(id__gt=last_answer_id, image_type=IMAGE_TYPE.GIF)[:per_num]
        max_id = a_imgs.aggregate(max_id=Max('id'))
        answer_img_queue.put(max_id.get('max_id'))
        self.qa_image_update(qa_images=a_imgs)


class Command(BaseCommand):
    step = 200

    def handle(self, *args, **kwargs):

        update_action = UpdateQaImgType()

        # q_count = QuestionImage.objects.filter(image_type=IMAGE_TYPE.GIF).order_by("id").count()
        # q_range = math.ceil(float(q_count) / 200)
        # question_img_queue.put(0)
        # for i in range(q_range):
        #     update_action.handle_question()
        # with ThreadPoolExecutor(max_workers=4) as ex:
        #     for i in range(q_range):
        #         ex.submit(update_action.handle_question)

        a_count = AnswerImage.objects.filter(id__gte=54207, image_type=IMAGE_TYPE.GIF).order_by("id").count()
        a_range = math.ceil(float(a_count) / 200)
        answer_img_queue.put(0)
        # for i in range(a_range):
        #     update_action.handle_answer()
        with ThreadPoolExecutor(max_workers=4) as ex:
            for i in range(a_range):
                ex.submit(update_action.handle_answer)