Преобразования уже загруженный файл и сохраните его на модели FileField


Пожалуйста, ознакомьтесь с этим:

from os import path, remove

try:
    video = Video.objects.get(id=original_video_id)
except ObjectDoesNotExist:
    return False

convert_command = ['ffmpeg', '-i', input_file, '-acodec', 
       'libmp3lame', '-y', '-ac', '2', '-ar', 
       '44100', '-aq', '5', '-qscale', '10', 
       '%s.flv' % output_file]                     

convert_system_call = subprocess.Popen(
    convert_command,
    stderr=subprocess.STDOUT,
    stdout=subprocess.PIPE
)

logger.debug(convert_system_call.stdout.read())

try:

    f = open('%s.flv' % output_file, 'r')
    filecontent = ContentFile(f.read())
    video.converted_video.save('%s.flv' % output_file, 
                     filecontent, 
                     save=True)
    f.close()

    remove('%s.flv' % output_file)

    video.save()

    return True
except:
    return False


399
4
задан 1 февраля 2011 в 04:02 Источник Поделиться
Комментарии
2 ответа

Чистый, легко понять код. Тем не менее:

Никогда не скрывай ошибки с голой, за исключением. Изменение

try:
...
except:
return False

в

try:
...
except (IOError, AnyOther, ExceptionThat, YouExpect):
logging.exception("File conversion failed")

Также, если вам нужно поддержка Python 2.4 или выше, вы хотите использовать файлы контексте поддержка менеджера:

with open('%s.flv' % output_file, 'r') as f:
filecontent = ContentFile(f.read())
video.converted_video.save('%s.flv' % output_file,
filecontent,
save=True)
remove('%s.flv' % output_file)

Таким образом, файл будет закрыт сразу после выхода сблока, даже если есть ошибка. Для Python 2.5 вам придется от __будущее__ импорт with_statement , а также.

Вы также можете посмотреть, используя временный файл с tempfile для выходного файла.

4
ответ дан 1 февраля 2011 в 06:02 Источник Поделиться

В дополнение к очков, что Леннарт сделал, есть только одна незначительная вещь, которую я хотел бы добавить:

Вы повторяете выражение '%ы.вашы' % выходной_файл четыре раза в коде. Возможно, вы захотите хранить его в переменной, как именем = '%ы.вашы' % выходной_файл. Таким образом, есть меньше повторений и если вы когда-либо хотите изменить формат конечного файла, все, что вам придется изменить именем и convert_command переменных.

2
ответ дан 1 февраля 2011 в 03:02 Источник Поделиться