File size: 1,986 Bytes
e60e640
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import cv2
import tempfile
import requests
import os
from PIL import Image
from transformers import pipeline

classifier = pipeline("image-classification", model="Falconsai/nsfw_image_detection")


def download_file(url):
    response = requests.get(url, stream=True)
    tmp = tempfile.NamedTemporaryFile(delete=False)
    for chunk in response.iter_content(1024):
        tmp.write(chunk)
    tmp.close()
    return tmp.name


def get_video_duration(video_path):
    cap = cv2.VideoCapture(video_path)
    fps = cap.get(cv2.CAP_PROP_FPS)
    frame_count = cap.get(cv2.CAP_PROP_FRAME_COUNT)
    cap.release()
    return frame_count / fps if fps > 0 else 0


def extract_frame(video_path, second):
    cap = cv2.VideoCapture(video_path)
    fps = cap.get(cv2.CAP_PROP_FPS)
    frame_number = int(fps * second)

    cap.set(cv2.CAP_PROP_POS_FRAMES, frame_number)
    success, frame = cap.read()
    cap.release()

    if not success:
        return None

    tmp_file = tempfile.NamedTemporaryFile(suffix=".jpg", delete=False)
    cv2.imwrite(tmp_file.name, frame)
    return tmp_file.name


def get_frame_times(duration, file_size_mb):
    if duration <= 2:
        return [1, 2]

    elif duration <= 10:
        return [2]

    elif duration <= 15:
        return [4, 9, 13]

    if file_size_mb > 14:
        return [4, 9, 13]

    return [2]


def check_image_nsfw(image_path):
    image = Image.open(image_path).convert("RGB")
    result = classifier(image)

    for r in result:
        if r["label"] == "nsfw" and r["score"] > 0.5:
            return True

    return False


def check_video_nsfw(video_path):
    size_mb = os.path.getsize(video_path) / (1024 * 1024)
    duration = get_video_duration(video_path)

    times = get_frame_times(duration, size_mb)

    for t in times:
        frame = extract_frame(video_path, t)
        if frame:
            if check_image_nsfw(frame):
                return True  # 🚨 return immediately if ANY frame is NSFW

    return False