File size: 4,675 Bytes
019f3a5
436734f
 
fd03c78
 
844e5c4
 
 
 
 
faee608
 
 
 
 
5c4b237
4478b28
5ff2b1d
5c4b237
ac6e5d2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fd03c78
 
 
 
 
 
 
ac6e5d2
fd03c78
 
 
 
 
ac6e5d2
 
 
 
4478b28
ac6e5d2
 
 
 
 
019f3a5
 
436734f
019f3a5
fd03c78
ac6e5d2
 
 
 
 
 
 
 
436734f
 
ac6e5d2
 
 
 
 
 
 
 
 
 
436734f
 
 
fd03c78
 
ac6e5d2
fd03c78
 
 
 
 
 
 
 
 
 
ac6e5d2
 
 
 
 
fd03c78
2e0eb40
019f3a5
fd03c78
 
2e0eb40
019f3a5
fd03c78
019f3a5
 
fd03c78
 
 
 
 
 
 
 
 
 
 
 
 
 
ac6e5d2
fd03c78
 
 
 
 
 
 
ac6e5d2
 
 
fd03c78
 
 
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
import streamlit as st
from huggingface_hub import HfApi
import os
import json
from datetime import datetime
import cv2
import random
import subprocess
import sys

try:
    import cv2
except ImportError:
    subprocess.check_call([sys.executable, "-m", "pip", "install", "opencv-python"])
    import cv2

# Initialize the Hugging Face API with the token
api = HfApi(token=os.getenv("HF_API_TOKEN"))

def extract_thumbnail(video_path, thumbnail_path):
    video = cv2.VideoCapture(video_path)
    
    # Get total number of frames
    total_frames = int(video.get(cv2.CAP_PROP_FRAME_COUNT))
    
    # Choose a random frame
    random_frame = random.randint(0, total_frames - 1)
    
    # Set the frame position
    video.set(cv2.CAP_PROP_POS_FRAMES, random_frame)
    
    # Read the frame
    success, frame = video.read()
    if success:
        cv2.imwrite(thumbnail_path, frame)
    
    video.release()
    return success

def generate_metadata(video_name, title, description, uploader, file_location, thumbnail_location):
    return {
        "fileName": video_name,
        "title": title,
        "description": description,
        "uploader": uploader,
        "uploadTimestamp": datetime.now().isoformat(),
        "fileLocation": file_location,
        "thumbnailLocation": thumbnail_location,
        "views": 0,
        "likes": 0
    }

def upload_video_to_hf(video_file, video_name, title, description, uploader):
    # Create temp paths
    temp_dir = "temp"
    if not os.path.exists(temp_dir):
        os.makedirs(temp_dir)
    
    video_path = os.path.join(temp_dir, video_name)
    thumbnail_name = f"{os.path.splitext(video_name)[0]}_thumb.jpg"
    thumbnail_path = os.path.join(temp_dir, thumbnail_name)
    json_name = f"{os.path.splitext(video_name)[0]}-index.json"
    json_path = os.path.join(temp_dir, json_name)
    
    # Write the video content to a file
    with open(video_path, "wb") as f:
        f.write(video_file.read())
    
    # Extract and save thumbnail
    thumbnail_extracted = extract_thumbnail(video_path, thumbnail_path)
    if not thumbnail_extracted:
        st.error("Failed to extract thumbnail from video")
        return None
    
    # Upload the video
    video_location = f"videos/{video_name}"
    api.upload_file(
        path_or_fileobj=video_path,
        path_in_repo=video_location,
        repo_id="vericudebuget/ok4231",
        repo_type="space",
    )
    
    # Upload the thumbnail
    thumbnail_location = f"thumbnails/{thumbnail_name}"
    api.upload_file(
        path_or_fileobj=thumbnail_path,
        path_in_repo=thumbnail_location,
        repo_id="vericudebuget/ok4231",
        repo_type="space",
    )
    
    # Generate and upload metadata JSON
    metadata = generate_metadata(video_name, title, description, uploader, video_location, thumbnail_location)
    with open(json_path, "w") as f:
        json.dump(metadata, f, indent=2)
    
    api.upload_file(
        path_or_fileobj=json_path,
        path_in_repo=f"metadata/{json_name}",
        repo_id="vericudebuget/ok4231",
        repo_type="space",
    )
    
    # Cleanup temp files
    for file_path in [video_path, thumbnail_path, json_path]:
        if os.path.exists(file_path):
            os.remove(file_path)
    
    return metadata

# Streamlit app interface
st.title("Upload your video")
st.markdown("---")

# File uploader for video input
uploaded_video = st.file_uploader("Choose video file", type=["mp4", "avi", "mov"])

if uploaded_video:
    # Show the video details form
    with st.form("video_details"):
        st.write("Video Details")
        title = st.text_input("Title", placeholder="Enter video title")
        description = st.text_area("Description", placeholder="Enter video description")
        uploader = st.text_input("Uploader Name", placeholder="Enter your name")
        
        # Upload button within the form
        submit_button = st.form_submit_button("Upload Video")
        
        if submit_button:
            if not title or not uploader:
                st.error("Please fill in the title and uploader name.")
            else:
                with st.spinner("Uploading video, generating thumbnail and metadata..."):
                    metadata = upload_video_to_hf(
                        uploaded_video, 
                        uploaded_video.name, 
                        title, 
                        description, 
                        uploader
                    )
                    if metadata:
                        st.success("Upload completed successfully!")
                        st.json(metadata)

else:
    st.info("Please upload a video file to begin.")