Із зростанням популярності сервісу YouTube.com багатьом захотілося організувати подібний сервіс, але як це зробити? Наведу невеликий рецепт організації такого сервісу.

Функціональність

Для початку опишемо основний функціонал сайту (відразу визначимося і з ролями користувачів):

  • Гість
    • перегляд відеофайлів на сайті
  • Користувач
    • аплоад відеофайлів
  • Адміністратор
    • управління користувачами
    • управління файлами
  • WEB 2.0 фічі

    А тепер расширем наш базовий функціонал, щоб залучити аудиторію:

  • Гість
    • перегляд коментарів до відео
    • пошук файлів (по категорії, по тегам)
  • Користувач
    • можливість залишати коментарі до відео
    • можливість записувати відео з веб-камери
    • можливість пов’язувати відеоролик з категорією
    • можливість пов’язувати відеоролик з несоклькими теги (tags)
    • виставлення рейтингу відеофайлу
    • організація списку друзів
    • внутрішня система mail
    • закладки
  • Адміністратор
    • управління коментарями
    • керування категоріями
  • Це звичайно не весь функціонал YouTube, але ж треба з чогось починати

    Конфігурація сервера

    Наша система буде базуватися на LAMP:

    • Linux
    • Apache (версія 2.2 і вище)
    • MySQL (версія 5.0 і вище)
    • PHP (версія 5.2 і вище)

    Можливі проблеми

    А тепер розповімо про проблеми з якими Вам доведеться зіткнутися

    Конвертування Відео

    Якщо дозволити кожному з відвідувачів сайту заливати на сервер відеоролики в довільному форматі, то для того, щоб переглянути їх, Вам доведеться встановлювати на свій комп’ютер дуже багато кодеків, а якщо вимагати певний формат від користувача – то, з дуже великою ймовірністю, це відлякає від відвідувачів вашого сайту. І що ж робити? Правильно, конвертувати все відео файли в один формат, і будемо конфертировать у формат FLV (flash video – можна переглядати в більшості операційних систем, оскільки він використовує широко поширений Adobe Flash Player і плагіни до більшості браузерів, а також підтримується багатьма програмами для відтворення відео, наприклад, MPlayer, VLC media player та іншими програмами, що працюють за допомогою DirectShow).

    Нам знадобляться наступні програмні засоби (всі opensource):

  • mencoder або FFmpeg
  • flvtool2 (вимагає наявності Ruby)
  • PHP Program Package (‘example.php’ приклад конвертації з використанням mencoder’a) або ffmpeg class (‘ffmpeg.example1.php’ приклад конвертації з використанням ffmpeg)
  • Додатково можна ще використовувати mplayer для отримання інформації про оригінальному відеоролику.

    Чудово, якщо ми всі встановили і правильно зібрали, то ми тепер можемо конвертувати…

    Статус завантаження

    Ще такий момент – користувачам не подобається сидіти і чекати поки файл завантажиться на сервер, користувач він же допитливий, йому хоча б вивести progress bar треба:

    • http://www.emllabs.com/article.php?articleId=121/ (використовуючи Flash8 і PHP)
    • http://tomas.epineer.se/tesupload/
    • http://www.raditha.com/megaupload/
    • http://www.obokaman.com/p/descripcion-y-fuentes-del-upload-php-ajax-con-barra-de-progreso-1596
    • http://labs.beffa.org/w2box/demo/
    • http://trydobe.com/?page_id=3
    • http://ecosmear.com/relay/ (прикольний приклад, використовується perl)

    Всі посилання нарив на форумі xajax’a http://community.xajaxproject.org/viewtopic.php?pid=10100

    Ресурси

    Так, на сервер ми залили відео, показали як він швидко до нас заливався, але от біда, якщо ми будемо на нашому web-сервері конвертувати відео ролики сайт у нас буде швидше мертвий, ніж живий. Для цієї мети нам треба буде використовувати ще один (як мінімум) сервер, який буде забирати неотконвертированный файли з web-сервера і відправляти назад отконвертированные ролики. Тобто для вирішення цієї проблеми нам знадобитися ще залізо…

    Розподіл навантаження

    Конвертування це ресурсомісткі, а віддавати відеоролики всім бажаючим?… Це звичайно не буде так навантажувати процесор, але ось канал точно помре… як вихід у нас з’являються ще сервери, які зберігають у себе відеофайли:

    • http://mirror1.myphptube.com
    • http://mirror2.myphptube.com
    • і т. д.

    Як розподіляти навантаження – це вже вирішувати Вам. Але перш, ніж городити город Ви повинні визначити, який приблизно обсяг даних Вам потрібно зберігати, і далі вже вирішувати яка схема більше підійде, орієнтуємося, що 1 користувач заливає на сервер 20mb в місяць (234Gb на 1000 користувачів в рік), не популярні ролики не зберігаються більше року):

    • Обсяг даних ~ 0.3 Tb – 1.5 Tb:
      на кожному дзеркалі у нас зберігаються усі відеоролики
      у нас є mirror1 – сервер на якому завжди першим з’являється переконвертований відеоролик, решта з ним синхронізуються
    • Обсяг даних ~ 1.5 Tb – 3 Tb:
      усі відеоролики зберігаються тільки на головному сервері, якщо у відеоролика зростає популярність, він заливається і на інші дзеркала
    • Обсяг даних > 3Tb:
      відеролікі заливається на найближче дзеркало (маємо на увазі, що ролик залитий китайцем будуть дивитися в основному китайці, отже заливаємо його на дзеркало в Китаї)
      у міру зростання популярності ролика зеркалим його на сервер найближчий до эпицетру популярності (приклад: китаєць живе в США, його ролик залитий на дзеркало розташоване в США, дивляться його в основному в Китаї, бачачи це ролик буде отзеркален на Китайський сервер)

    Числа взяті зі стелі, проти китайців нічого не маю (просто взяті для прикладу), пишіть свої варіанти…

    База даних

    Далі я опишу простеньку архітектуру БД:

    users
    id autoincrement field
    login unique login
    password encrypt password
    email user email
    actcode activation code
    role ENUM(guest/user/admin)
    status not active / active / disable
    date_create
    date_update date of last change profile
    date_login date of last login
    another fields e.g. first name, last name
    friends
    id autoincrement field
    user_id1 user ID
    user_id2 user ID
    status request / ok / cancel
    date_create date of send request
    date_update date of accept or denied request
    files
    id autoincrement field
    title title of video file
    file name of file on file system
    status not convert / in process / ok
    access public / members only / friends only / private
    author_id ID of owner (users)
    category_id ID of category (categories)
    date_create
    date_update date of last changes
    another fields e.g. length, description
    mirrors
    id autoincrement field
    url mirror url
    date_create
    date_update date of last changes
    mirrors_link
    file_id ID of file (files)
    mirror_id ID of mirror (mirrors)
    status current status file downloading / ok
    date_create
    date_update date of last changes
    categories
    id autoincrement field
    pid parent category ID
    name name of category
    another fields e.g. metadescription, metakeywords
    tags
    id autoincrement field
    word tag word
    tags_link
    id autoincrement field
    tag_id tag ID (tags)
    file_id file ID (files)
    comments
    id autoincrement field
    author_id ID of owner (users)
    file_id file ID (files)
    message text of message
    date_create
    rate
    id autoincrement field
    author_id ID of owner (users)
    file_id file ID (files)
    rate integer value, e.g. for 0 to 10
    date_create
    messages
    id autoincrement field
    author_id ID of owner (users)
    user_id ID of recipient (users)
    type e.g. friend request-response / message admin
    author_folder outbox/draft/delete
    user_folder inbox/delete
    user_status read or not
    date_create
    bookmarks
    id autoincrement field
    author_id ID of owner (users)
    file_id file ID (files)
    title title of link
    description some description
    date_create

    Невелика примітка:

    • для полів огляду date_create і date_update використовуємо функцію gmdate(‘Y-m-d H:i:s’) – час за Гринвічем, це полегшить в подальшому життя при відображенні часу на сайті.

    Команда

    Яку краще всього зібрати команду для розробки такого проекту? Я пропоную наступний варіант:

    • 2 PHP-розробника
    • Flash розробник / дизайнер
    • 1 адміністратор
    • 1 тестувальник
    • 1 менеджер

    Оцінка

    Гість
    Користувач
    Адміністратор
    Інше
    Разом
    Загальна: 421h
    Статичні сторінки такі як “Contact Us”, “Terms of Use” etc. 1h/page
    Пошук простенький пошук за кількома параметрами 6h
    Хмара тегів 8h
    Перегляд відео FLV video player 16h
    Перегляд коментарів 6h
    Реєстрація включаючи валідацію e-mail 12h
    Нагадування паролю 2h
    Login/Logout 2h
    Upload file 14h
    Запис відео Необхідний один з таких серверів:

    FMS, Wowza (from Feb 2007) or Red5 (opensource)

    16h
    Progress bar 16h
    Додавання коментаря 4h
    Система рейтингів 2h
    Закладки create/edit/delete 8h
    Управління користувачами Список користувачів, перегляд і редагування профайлів 16h
    Керування категоріями 16h
    Дизайн 32h
    Розробка БД 16h
    Розробка архітектури 32h
    Сховище файлів від 8h до 96h 8h
    Конвертування відеофайлів 20h
    Налаштування серверів web-server, convert-server, mirrors 40h
    Розробка 256h
    Тестування 30%-50% від розробки 85h
    Менеджмент 10% мінімум 40h

    Так, не мало – 421 години, тобто приблизно 2,5 місяця розробки… і це ще дуже оптимістична оцінка, з урахуванням, що розробники використовують свої напрацювання або яку-небудь CMF систему аналогічну Zend Framework або phpXCore, а так само організовуємо найпростіше сховище файлів. Якщо ж розробка буде вестися з нуля – то можна сміливо множити цю оцінку на 2.

    Отже, такий проект коштуватиме не менше $10 000…

    P. S.

    Основна проблема не в реалізації системи, а в привличениии аудиторії, хто буде користуватися вашим сервісом якщо є YouTube (і навіть PornoTube)? Чим заманити? Якщо є ідеї – пишіть каменты…

    На момент написання статті домен MyPHPTube.com не був зареєстрований, якщо ви його таки зареєстрували, вишлете пива на мою домашню адресу… 😉

    Є кілька причин спонукали написати цю статтю:

  • хотілося написати розумну статтю для свого блогу (або претендує на “розумну”)
  • хотілося показати, що Package Program таки може стати в нагоді
  • продемонструвати, що OpenSource і LAMP теж рулить 😉