Eluza133 commited on
Commit
7ff6fd1
·
verified ·
1 Parent(s): aa99a93

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +56 -12
app.py CHANGED
@@ -7,6 +7,9 @@ import time
7
  from datetime import datetime
8
  from huggingface_hub import HfApi, hf_hub_download
9
  from werkzeug.utils import secure_filename
 
 
 
10
 
11
  app = Flask(__name__)
12
  app.secret_key = 'supersecretkey' # Замените на безопасный ключ в продакшене
@@ -82,6 +85,29 @@ def periodic_backup():
82
  upload_db_to_hf()
83
  time.sleep(15)
84
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
85
  # Регистрация пользователя
86
  @app.route('/register', methods=['GET', 'POST'])
87
  def register():
@@ -271,8 +297,8 @@ def video_feed():
271
  <h1>Лента видео</h1>
272
  <div class="video-grid">
273
  {% for video in videos %}
274
- <a href="{{ url_for('video_page', title=video['title']) }}" class="video-item">
275
- <img src="https://via.placeholder.com/300x200?text={{ video['title'] }}" alt="{{ video['title'] }}">
276
  <h2>{{ video['title'] }}</h2>
277
  <p>{{ video['description'] }}</p>
278
  <p>Загрузил: {{ video['uploader'] }} | {{ video['upload_date'] }}</p>
@@ -288,13 +314,13 @@ def video_feed():
288
  </body>
289
  </html>
290
  '''
291
- return render_template_string(html, videos=videos, is_authenticated=is_authenticated, username=username)
292
 
293
  # Страница отдельного видео (доступна всем)
294
- @app.route('/video/<title>')
295
- def video_page(title):
296
  data = load_data()
297
- video = next((v for v in data['videos'] if v['title'] == title), None)
298
  if not video:
299
  return "Видео не найдено", 404
300
 
@@ -431,7 +457,7 @@ def profile():
431
  {% if user_videos %}
432
  {% for video in user_videos %}
433
  <div class="video-item">
434
- <img src="https://via.placeholder.com/300x200?text={{ video['title'] }}" alt="{{ video['title'] }}">
435
  <h3>{{ video['title'] }}</h3>
436
  <p>{{ video['description'] }}</p>
437
  <p>{{ video['upload_date'] }}</p>
@@ -454,7 +480,7 @@ def profile():
454
  </body>
455
  </html>
456
  '''
457
- return render_template_string(html, username=username, user_videos=user_videos)
458
 
459
  # Страница загрузки видео (только для авторизованных)
460
  @app.route('/upload', methods=['GET', 'POST'])
@@ -477,7 +503,24 @@ def upload_video():
477
  os.makedirs('uploads', exist_ok=True)
478
  video_file.save(temp_path)
479
 
480
- # Загрузка на Hugging Face
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
481
  api = HfApi()
482
  api.upload_file(
483
  path_or_fileobj=temp_path,
@@ -488,19 +531,20 @@ def upload_video():
488
  commit_message=f"Добавлено видео: {title} пользователем {uploader}"
489
  )
490
 
491
- # Обновление базы данных
492
  data = load_data()
493
- video_id = f"video_{len(data['videos']) + 1}"
494
  data['videos'].append({
495
  'id': video_id,
496
  'title': title,
497
  'description': description,
498
  'filename': filename,
 
499
  'uploader': uploader,
500
  'upload_date': datetime.now().strftime('%Y-%m-%d %H:%M:%S')
501
  })
502
  save_data(data)
503
- logging.info(f"Видео {title} загружено пользователем {uploader}")
504
 
505
  if os.path.exists(temp_path):
506
  os.remove(temp_path)
 
7
  from datetime import datetime
8
  from huggingface_hub import HfApi, hf_hub_download
9
  from werkzeug.utils import secure_filename
10
+ import cv2
11
+ import numpy as np
12
+ import uuid
13
 
14
  app = Flask(__name__)
15
  app.secret_key = 'supersecretkey' # Замените на безопасный ключ в продакшене
 
85
  upload_db_to_hf()
86
  time.sleep(15)
87
 
88
+ # Генерация случайного кадра из видео
89
+ def generate_thumbnail(video_path):
90
+ try:
91
+ cap = cv2.VideoCapture(video_path)
92
+ if not cap.isOpened():
93
+ raise Exception("Не удалось открыть видео")
94
+
95
+ frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
96
+ random_frame = np.random.randint(0, frame_count)
97
+ cap.set(cv2.CAP_PROP_POS_FRAMES, random_frame)
98
+
99
+ ret, frame = cap.read()
100
+ if not ret:
101
+ raise Exception("Не удалось извлечь кадр")
102
+
103
+ thumbnail_path = video_path.replace('.mp4', '_thumb.jpg') # Предполагаем, что видео в формате .mp4
104
+ cv2.imwrite(thumbnail_path, frame)
105
+ cap.release()
106
+ return thumbnail_path
107
+ except Exception as e:
108
+ logging.error(f"Ошибка генерации превью: {e}")
109
+ return None
110
+
111
  # Регистрация пользователя
112
  @app.route('/register', methods=['GET', 'POST'])
113
  def register():
 
297
  <h1>Лента видео</h1>
298
  <div class="video-grid">
299
  {% for video in videos %}
300
+ <a href="{{ url_for('video_page', video_id=video['id']) }}" class="video-item">
301
+ <img src="https://huggingface.co/datasets/{{ repo_id }}/resolve/main/thumbnails/{{ video['thumbnail'] }}" alt="{{ video['title'] }}">
302
  <h2>{{ video['title'] }}</h2>
303
  <p>{{ video['description'] }}</p>
304
  <p>Загрузил: {{ video['uploader'] }} | {{ video['upload_date'] }}</p>
 
314
  </body>
315
  </html>
316
  '''
317
+ return render_template_string(html, videos=videos, is_authenticated=is_authenticated, username=username, repo_id=REPO_ID)
318
 
319
  # Страница отдельного видео (доступна всем)
320
+ @app.route('/video/<video_id>')
321
+ def video_page(video_id):
322
  data = load_data()
323
+ video = next((v for v in data['videos'] if v['id'] == video_id), None)
324
  if not video:
325
  return "Видео не найдено", 404
326
 
 
457
  {% if user_videos %}
458
  {% for video in user_videos %}
459
  <div class="video-item">
460
+ <img src="https://huggingface.co/datasets/{{ repo_id }}/resolve/main/thumbnails/{{ video['thumbnail'] }}" alt="{{ video['title'] }}">
461
  <h3>{{ video['title'] }}</h3>
462
  <p>{{ video['description'] }}</p>
463
  <p>{{ video['upload_date'] }}</p>
 
480
  </body>
481
  </html>
482
  '''
483
+ return render_template_string(html, username=username, user_videos=user_videos, repo_id=REPO_ID)
484
 
485
  # Страница загрузки видео (только для авторизованных)
486
  @app.route('/upload', methods=['GET', 'POST'])
 
503
  os.makedirs('uploads', exist_ok=True)
504
  video_file.save(temp_path)
505
 
506
+ # Генерация превью
507
+ thumbnail_path = generate_thumbnail(temp_path)
508
+ if thumbnail_path:
509
+ thumbnail_filename = os.path.basename(thumbnail_path)
510
+ api = HfApi()
511
+ api.upload_file(
512
+ path_or_fileobj=thumbnail_path,
513
+ path_in_repo=f"thumbnails/{thumbnail_filename}",
514
+ repo_id=REPO_ID,
515
+ repo_type="dataset",
516
+ token=HF_TOKEN_WRITE,
517
+ commit_message=f"Добавлено превью для видео: {title}"
518
+ )
519
+ os.remove(thumbnail_path)
520
+ else:
521
+ thumbnail_filename = "default_thumb.jpg" # Запасной вариант, если превью не удалось создать
522
+
523
+ # Загрузка видео на Hugging Face
524
  api = HfApi()
525
  api.upload_file(
526
  path_or_fileobj=temp_path,
 
531
  commit_message=f"Добавлено видео: {title} пользователем {uploader}"
532
  )
533
 
534
+ # Обновление базы данных с уникальным ID
535
  data = load_data()
536
+ video_id = str(uuid.uuid4()) # Уникальный ID
537
  data['videos'].append({
538
  'id': video_id,
539
  'title': title,
540
  'description': description,
541
  'filename': filename,
542
+ 'thumbnail': thumbnail_filename,
543
  'uploader': uploader,
544
  'upload_date': datetime.now().strftime('%Y-%m-%d %H:%M:%S')
545
  })
546
  save_data(data)
547
+ logging.info(f"Видео {title} с ID {video_id} загружено пользователем {uploader}")
548
 
549
  if os.path.exists(temp_path):
550
  os.remove(temp_path)