view.py 2.57 KB
# coding=utf-8
from __future__ import absolute_import
import requests
import os
import ffmpy
import hashlib
import time

from six.moves import xrange
from celery import shared_task
from django.conf import settings
from gm_types.mimas import IMAGE_TYPE
from gm_upload.utils.image_utils import Picture
from gm_upload import upload_file

from talos.models.tractate import TractateImages
from talos.rpc import logging_exception
from qa.models.answer import AnswerImage, QuestionImage


from qa.cache import ViewRecord


def view_increase_amount(model_name, id_value, count, reverse=False):
    for _ in xrange(count):
        view_increase(model_name, id_value, reverse)


@shared_task
def view_increase(model_name, id_value, reverse=False):
    """

    :param model_name:
    :param id_value:
    :param reverse: 相反的,做减法
    :return:
    """
    view = ViewRecord(model_name)
    if reverse:
        view[id_value] = int(view[id_value] or '1') - 1
    else:
        view[id_value] = int(view[id_value] or '0') + 1

    return view[id_value]


@shared_task
def gif_create_webp(conent_id, content_type):
    """把GIF转成webp格式的图"""
    if not conent_id or not content_type:
        return

    if content_type == "answer":
        img_items = AnswerImage.objects.filter(image_type=IMAGE_TYPE.GIF, answer_id=conent_id)
    elif content_type == "question":
        img_items = QuestionImage.objects.filter(image_type=IMAGE_TYPE.GIF, question_id=conent_id)
    elif content_type == "tractate":
        img_items = TractateImages.objects.filter(image_type=IMAGE_TYPE.GIF, tractate_id=conent_id)
    else:
        return

    if not img_items:
        return

    for img_item in img_items:
        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(img_item.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图片
        img_item.image_webp = upload_file(output_path)
        img_item.save()

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