File size: 4,567 Bytes
0824edc
 
 
 
 
 
 
 
 
e6dff50
0824edc
 
 
 
 
 
 
 
 
 
e6dff50
0824edc
e6dff50
0824edc
 
 
 
 
 
e6dff50
0824edc
2afefc2
0824edc
e6dff50
0824edc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e6dff50
0824edc
 
 
 
e6dff50
0824edc
 
 
 
 
 
 
2afefc2
0824edc
 
 
 
 
 
 
2afefc2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0824edc
2afefc2
 
 
 
 
0824edc
 
 
 
 
 
 
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
import os
import uuid
import requests
import io
import logging
from flask import Flask, request, jsonify, send_from_directory
from huggingface_hub import HfApi
import mimetypes

# 1. تنظیمات لاگینگ
logging.basicConfig(
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    level=logging.INFO
)
logger = logging.getLogger(__name__)

app = Flask(__name__, static_folder='static', static_url_path='/static')

# 2. خواندن متغیرهای محیطی
HF_TOKEN = os.getenv("HF_TOKEN")
HF_REPO_ID = "Asrasahar/Ezmary-uploads"

# 3. بررسی وجود توکن
if not HF_TOKEN:
    logger.error("FATAL ERROR: HF_TOKEN environment variable not set!")
    exit()

# 4. ایجاد یک نمونه از HfApi
hf_api = HfApi(token=HF_TOKEN)
logger.info(f"Public File Upload API Initialized. Target repo: {HF_REPO_ID}")

# --- توابع کمکی ---
def get_folder_by_mimetype(mimetype):
    if not mimetype: return "others"
    main_type = mimetype.split('/')[0]
    if main_type == "image": return "images"
    elif main_type == "video": return "videos"
    elif main_type == "audio": return "audios"
    elif main_type == "application":
        if 'pdf' in mimetype: return "documents/pdfs"
        elif 'zip' in mimetype or 'rar' in mimetype or '7z' in mimetype: return "archives"
        else: return "documents/applications"
    elif main_type == "text": return "documents/texts"
    else: return "others"

def process_and_upload(file_content: bytes, original_filename: str, mimetype: str) -> str:
    file_extension = os.path.splitext(original_filename)[1] or mimetypes.guess_extension(mimetype) or ""
    filename = f"{uuid.uuid4().hex}{file_extension}"
    target_folder = get_folder_by_mimetype(mimetype)
    path_in_repo = f"{target_folder}/{filename}"
    
    file_stream = io.BytesIO(file_content)
    logger.info(f"Uploading to Hugging Face: {path_in_repo}")
    hf_api.upload_file(path_or_fileobj=file_stream, path_in_repo=path_in_repo, repo_id=HF_REPO_ID, repo_type="dataset")
    direct_url = f"https://huggingface.co/datasets/{HF_REPO_ID}/resolve/main/{path_in_repo}"
    logger.info(f"File uploaded successfully! URL: {direct_url}")
    return direct_url

# --- بخش API ---
@app.route('/')
def serve_html():
    return send_from_directory(app.static_folder, 'index.html')

@app.route('/upload', methods=['POST'])
def upload_file_endpoint():
    try:
        # حالت اول: آپلود از کامپیوتر یا ربات (حالت FormData)
        if 'file' in request.files:
            uploaded_file = request.files['file']
            if uploaded_file.filename == '':
                return jsonify({"error": "No selected file"}), 400
            file_content = uploaded_file.read()
            direct_url = process_and_upload(file_content, uploaded_file.filename, uploaded_file.mimetype)
            return jsonify({"message": "File uploaded successfully!", "hf_url": direct_url}), 200

        # ***** این بخش دوباره اضافه شد *****
        # حالت دوم: آپلود از طریق لینک در وب سایت (حالت JSON)
        elif request.is_json and 'url' in request.json:
            file_url = request.json['url']
            if not file_url:
                return jsonify({"error": "No URL provided"}), 400

            logger.info(f"Downloading file from URL: {file_url}")
            response = requests.get(file_url, stream=True, timeout=30)
            response.raise_for_status()
            
            file_content = response.content
            mimetype = response.headers.get('Content-Type')
            original_filename = file_url.split('/')[-1].split('?')[0]

            direct_url = process_and_upload(file_content, original_filename, mimetype)
            return jsonify({"message": "File uploaded successfully!", "hf_url": direct_url}), 200
        # ***** پایان بخش اضافه شده *****
            
        else:
            return jsonify({"error": "Invalid request. Expected 'file' (form-data) or 'url' (json)."}), 400

    except requests.exceptions.RequestException as e:
        logger.error(f"Failed to download from URL: {e}", exc_info=True)
        return jsonify({"error": f"Failed to download from URL: {str(e)}"}), 400
    except Exception as e:
        logger.error(f"An internal server error occurred: {e}", exc_info=True)
        return jsonify({"error": f"An internal server error occurred: {str(e)}"}), 500

if __name__ == '__main__':
    port = int(os.environ.get('PORT', 7860))
    app.run(host='0.0.0.0', port=port, debug=False)