LINUX.ORG.RU

bash и экранизация «ужаса»

 ,


0

2

Мне необходимо обработать огромное кол-во видеофайлов создав превьюшки к каждому из них. Написал вот такой скриптец:

#!/bin/sh

VIDEO_PATH="/var/www/wp-content/uploads"
PREVIEW_PATH="/var/www/wp-content/uploads/preview"
SIZE="250x250"
SEC=10

for X in `find $VIDEO_PATH/* -name "*.mp4"`; do
        FILENAME="${X}" #`basename $X .mp4`
        if [ ! -f $PREVIEW_PATH/"${FILENAME}".png ]; then
                ffmpeg -i "${X}" -vframes 1 -an -s $SIZE -ss $SEC $PREVIEW_PATH/"${FILENAME}".png
        fi
done

Всё отл, вот только есть одна проблема - ужасные имена файлов. Почти в каждом присутствует собака и знак доллара. И они не обрабатываются. Я вроде все переменные взял в кавычки, но видимо с экранизацией какая-то фигня, потому что по ходу дела вылезают ошибки:

Покер: no such file or directory

часть: no such file or directory

/var/www/wp-content/uploads//FreeVods_update_03_2012/Tourney/JonathanLittle: no such file or directory

Ну а последнее имя файла - JonathanLittle @ Контроль банка в МТТ Покер видео.mp4.

Жду любых замечаний и предложений.

★★★★★
Ответ на: комментарий от anonymous

Давай, например.

Питон был вброшен раньше, жду пример.

// Если будет акцент на том, что скрипт должен обрабатывает _любые_ допустимые файлы, оставлю за собой право на башизмы).

anonymous
()
Ответ на: комментарий от anonymous
#!/usr/bin/python3
import glob,os,os.path

video_path='/var/www/wp-content/uploads/'
preview_path='/var/www/wp-content/uploads/preview/'
size='250x250'
sec='10'

os.chdir(video_path)

for video in glob.iglob('*.mp4'):
  thumbnail=os.path.join(preview_path,video+'.png')

  if not os.path.exists(thumbnail):
    os.system('ffmpeg -i '+video+' -vframes 1 -an -s '+size+' -ss '+sec+' '+thumbnail)
anonymous
()
Ответ на: комментарий от anonymous

Если не нужно двойное расширение:

-thumbnail=os.path.join(preview_path,video+'.png')
+thumbnail=os.path.join(preview_path,video[:-4]+'.png')

anonymous
()
Ответ на: комментарий от anonymous

Круто, но есть два НО :)

1)

TaN: no such file or directory
(имя «файла 2013 FreeVods_update_03_2012 FreeVods_update_03_2012_ preview TaN _ LuckyLake @ разбор раздач, 8-я часть Покер видео.mp4»)
2) искать нужно рекурсивно, а не только в каталоге /var/www/wp-content/uploads/

soko1 ★★★★★
() автор топика
Ответ на: комментарий от soko1

Да, тупанул.

#!/usr/bin/python3
import os,os.path,subprocess

video_path='/var/www/wp-content/uploads/'
preview_path='/var/www/wp-content/uploads/preview/'
size='250x250'
sec='10'

os.chdir(video_path)

for subdirectory,_,videos in os.walk('.'):
  for video in videos:
    thumbnail=os.path.join(preview_path,video[:-3]+'png')

    if video.endswith('.mp4')and not os.path.exists(thumbnail):

      subprocess.call(('ffmpeg','-i',os.path.join(subdirectory,video),
        '-vframes','1','-an','-s',size,'-ss',sec,thumbnail))

anonymous
()
Ответ на: комментарий от soko1

искать нужно рекурсивно, а не только в каталоге /var/www/wp-content/uploads/

globstar If set, the pattern ** used in a pathname expansion context will match all files and zero or more directories and sub- directories. If the pattern is followed by a /, only directories and subdirectories match.

drBatty ★★
()
Ответ на: комментарий от anonymous

Изумительно :) Спасибо огромное. Пожалуй пример с питоном и буду использовать!

soko1 ★★★★★
() автор топика
Ответ на: комментарий от anonymous

for video in glob.iglob('*.mp4')

Не-а, это обход самого острого места: в shell тоже можно for ... in *.mp4.

os.system('ffmpeg -i '+...)

Уже не очень смотрится.

anonymous
()
Ответ на: комментарий от anonymous

+thumbnail=os.path.join(preview_path,video[:-4]+'.png')

Замечаем, что остались *.mpeg -> чуть меняем скрипт -> ??? -> non profit. splitext отменили?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.