Pull to refresh

Comments 22

Ваш converting.py я бы вынес как Task в Celery, который хорошо интегрируется с Django с Redis в качестве бэкенда очереди. Навскидку os.system поломается с пробельными именами, все же рекомендуется subprocess использовать для таких вещей.
Спасибо, учту!
Всё же буду выкладывать проект на github, там как раз воспользуюсь Вашими замечаниями.
Offtopic: насчет redis и celery. Как раз вчера с багом разобрался наконец: если используются события, то после первого перезапуска celery-воркеров redis начинает забиваться ненужной ерундой, и с каждым перезапуском скорость забивания возрастает( у меня, например, мегабайт 100 в день было, что для in-memory базы очень критично). Причем, судя по коду, этот баг был всегда, и мне кажется, что у всех, кто использует redis+celery+мониторинг, redis должен быть забит большей частью ненужной ерундой сейчас. По крайней мере, после ручного удаления всего хлама и применения полу-фикса (в комментариях) размер базы с 250M до 2M снизился.

Ask частичный воркэраунд закоммитил (крутой чел, там голову сломать можно), но ни в каких релизах этого пока нет. Так что используйте celery+redis сейчас с осторожностью, а если уже используете, то обновите celery и kombu до последних версий с гитхаба, прочтите внимательно описание бага и посмотрите, не удастся ли уменишьть базу раз эдак в 100, удалив ненужные ключи и перезапустив redis.
М! Понятненько. Я не замечал, у меня такой связки на машинах меньше чем с 24 ГБ памяти не стояло, так что болталось там пара гигабайт и болталось, ничему не мешало. Спасибо за варнинг.
Согласен! Просто ради скорости использовал уже разработанный «велосипед» [youtube-upload].
На github буду как раз напрямую api youtube'a использовать.
Да-да, гитхаб было бы очень здорово. Заранее спасибо.
Как размещу unstable, отпишу апдейт в этом топике.
Я как-то раз делал что-то подобное, только не загрузку на youtube, а конвертацию принятых от пользователей файлов в .flv. Тоже была очередь и конвертация ffmpeg'ом. Только вот сам скрипт конвертации я делал демоном: очень удобно, он постоянно висит и смотрит, не появилось ли чего в очереди, и не надо проверять чтобы другой файл одновременно не конвертировался. Может быть вам стоит попробовать сделать тоже демоном, а не запуск из crontab.
А, и еще, лучше всего ffmpeg запускать командой nice -n 20, чтобы процесс конвертации имел приоритет пониже, иначе, пока будет конвертироваться, все остальное будет дико тормозить)
Спасибо за совет, попробую.
Демонов пока что не доводилось писать )
Пожалуйста!
Если нужна информация как писать демона на питоне, могу поделиться готовым куском кода, обращайтесь в личку )
Почему-то мне кажется, что файл 03_praktikantki.mov на youtube лучше не выкладывать :) А за статью спасибо!
По-хорошему, сразу можно лить нормальный mp4 в H.264, а не .flv, а для этого нужно ffmpeg ставить с libfaac0 (из мультиверса) и libavcodec-extra-52 (с медибунту), тогда x264 будет полноценно работать. Вплоть до Маверика актуально, в Натти, кажись, сразу экстра есть. И да, не забывать про «-fpre», после которого нужно указывать путь к пресетам x264.
Спасибо, попробую!.. изначально попытался — не вышло, возможно Ваш совет спасёт ситуацию ;]
> материалы у нас готовятся в формате mov, а средний вес 15
> минутной программы = 3,5Гб. Заливать файл такого размера
> утомительно и глупо, гораздо правильнее будет конвертировать
> ролики в mp4 (например)


Простите, не удержался. MOV и MP4 — это всего лишь контейнеры для хранения аудио/видео потоков, которые к формату имеют весьма посредственное отношение, их указание само по себе ничего не говорит читателю про видео, которое в них хранится.
Правильнее было бы указать разрешение и битрейт видео, ну и кодек не помешает, чтобы не удивляться как это видео с одинаковым разрешением может различаться битрейтом в 30 раз.
Ок. Спасибо за поправку. Исходные данные:
Video = 720x576, 25fps, DV PAL, interlaced, video bit rate 25000000 bits/second
Audio = 2 channels, 48000 Hz, 16 bits

Во, что пережимаем видно по строке ffmpeg.
По поводу os.system и Celery уже сказали, придерусь тогда вот к чему:

> enter и exit — самая простая аутентификация.
Можно проще. См django.contrib.auth.views.login docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.views.login

далее, вместо
if request.user.is_authenticated():
        return HttpResponseRedirect('/')

используем декоратор @login_required из django.contrib.auth.decorators

Что за моделька People не понял… Возможно стоит обратить внимание на профили docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users Или это оно и есть?

И, в завершение, попробуйте использовать TemplateResponse вместо render_to_response. Они более функциональные и их можно удобно обрабатывать в Middleware потом.
seriyPS, спасибо за замечание.
Про декоратор @login_required мне тоже уже рассказали. Менять в статье не стал, т.к. новый вариант с учётом всех «пожеланий» будет на github (вот линк https://github.com/1vank1n/YTupload).

Что за моделька People не понял…

Да это и есть «профиль». Сделал его на будущее, дабы была возможность закрепить пользователя за определённым плейлистом, либо добавление дополнительной инфы, может быть какая статистика, чтоб записывалась.

Про TemplateResponse посмотрю, не встречал.
Пожалуй продолжу:

Импортировать settings напрямую не рекомендуется. Юзайте основной settings файл Django и from django.conf import settings docs.djangoproject.com/en/dev/topics/settings/#using-settings-in-python-code

Куча неиспользуемых импортов во вьюхе типа from django.shortcuts import get_object_or_404, get_list_or_404 и from django.template import RequestContext etc.

А чего-это у вас в
<form method="post" name="uploadform">
CSRF токен не используется?

*/1 * * * * python /var/www/YTupload/converting.py &> /dev/null */1 можно заменить на просто * если я правильно помню

{% if not d.status %}<a value="{{ d.filename }}" href="#">{% endif %}{{ d.filename }}</a> 
Если d.status есть, то останется бесхозный тег
</a>
Спасибо, учту!
CSRF токен не используется?

Про csrf-токен не волновался потому, что в-первую очередь это для внутреннего использования, но в билде это учту.

{% if not d.status %}<a value="{{ d.filename }}" href="#">{% endif %}{{ d.filename }}</a>

Да, {% if %} здесь стоит повторить для чистоты кода, а вообще он используется здесь, чтобы не было соблазна один и тотже файл 2 раза закачать.
Sign up to leave a comment.

Articles