File size: 4,964 Bytes
019f3a5
436734f
 
fd03c78
 
5d2e489
 
 
844e5c4
5c4b237
4478b28
5ff2b1d
5c4b237
ac6e5d2
5d2e489
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ac6e5d2
 
fd03c78
 
 
 
 
 
 
ac6e5d2
fd03c78
 
 
 
 
ac6e5d2
 
 
 
4478b28
ac6e5d2
 
 
 
 
019f3a5
 
436734f
019f3a5
fd03c78
ac6e5d2
 
 
 
 
5d2e489
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fd03c78
5d2e489
 
 
ac6e5d2
5d2e489
 
 
 
 
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
148
149
150
151
152
import streamlit as st
from huggingface_hub import HfApi
import os
import json
from datetime import datetime
from moviepy.editor import VideoFileClip
from PIL import Image
import io
import random

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

def extract_thumbnail(video_path, thumbnail_path):
    try:
        # Load the video
        video = VideoFileClip(video_path)
        
        # Get a random time point
        duration = video.duration
        random_time = random.uniform(0, duration)
        
        # Extract the frame
        frame = video.get_frame(random_time)
        
        # Convert the frame to a PIL Image
        image = Image.fromarray(frame)
        
        # Save the thumbnail
        image.save(thumbnail_path, "JPEG")
        
        # Close the video to free up resources
        video.close()
        
        return True
    except Exception as e:
        st.error(f"Failed to extract thumbnail: {str(e)}")
        return False

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:
        return None
    
    try:
        # 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",
        )
        
        return metadata
    
    except Exception as e:
        st.error(f"Failed to upload: {str(e)}")
        return None
    
    finally:
        # Cleanup temp files
        for file_path in [video_path, thumbnail_path, json_path]:
            if os.path.exists(file_path):
                os.remove(file_path)

# 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.")