Показаны сообщения с ярлыком multimedia. Показать все сообщения
Показаны сообщения с ярлыком multimedia. Показать все сообщения

четверг, 17 декабря 2015 г.

Система видеонаблюдения для входной двери. 2. Купольная камера на лестничной площадке.

Для получения качественной картинки было решено установить купольную камеру на лестничной площадке. Для этой цели очень давно, больше года назад, я купил камеру ITP-020RT45N. Кто ее производит мне неизвестно. Производит ее мне неизвестная компания с название IIT. Продают эти камеры в основном в Беларусии.

Сенсор: 1/2.8" SONY 2.4 CMOS
Firmware ver.: DM368+IMX222_3.0.9.0
Software ver.: 4.1.0.20
Разрешение: 1080P (1920×1080), 720P (1280x720)
Линза: 2.8 - 12 мм
Чувствительность: 0,01 Люкс
Отношение сигнал/шум: >50дБ
Рабочее расстояние ИК подсветки: 20M
Интерфейс: RJ45 Ethernet
Питание: DC 12V/1000MA
Диапазон температур: -20 ~ 50°C
Защищенность: IP65
Размеры: 149 x 99(В)мм

Интерфейс управления камерой привязан к Windows IE c active X.
Разрешение камеры действительно высокое. Но шум тоже великоват (возможно это мои придирки). Скриншот с камеры при нормальном уровне освещенности. Тестовый лист находится на расстоянии около 3,5 метров от камеры.


Видео при хорошей освещенности. К сожалению, пришлось уменьшить размер и соответственно уменьшилось разрешение.
Если с RVi-R04La White я снимал поток rtsp с помощью totem, то с камерой он работать отказался и для трансляции я использовал vlc:

vlc "rtsp://user:password@192.168.1.14/0"

среда, 16 декабря 2015 г.

Система видеонаблюдения для входной двери. 1. Глазок.

Год назад я озадачился поставить вместо дверного глазка видеокамеру.

Собственно видеокамера продающаяся на Ali меня толкнула на такую поделку. Прикупил я безымянный глазок CMOS PC1089 800TVL PEEPHOLE DOORVIEW и систему записи RVi-H04La.

Сначала про камеру.

Внешне выглядит довольно качественно. Черненный алюминиевый корпус. Система линз, дающая широкий угол обзора, как у обычного дверного глазка.
Камера является аналоговой и имеет два разъёма подключения: питание 12 В и выход видео.
Продавец утверждал, что камера имеет разрешение 800 TVL.
Регистратор выдает поток 960x576

Stream #0.0: Video: libx264, yuv420p, 960x576, q=-1--1, 25 tbn, 25 tbc

Для тестирования я разместил перед камерой на расстоянии одного метра тестовую таблицу, напечатанную на листе А4, аналогичную той, что используется для проверки зрения.

Видео записывал, подключившись к регистратору RVi-H04La следующей командой:

avconv -f rtsp -i "rtsp://user:password@192.168.1.12:554/cam/realmonitor?channel=1&subtype=0" -y "PC1089_800TVL_low_light.mp4"

Дальше вы все можете видеть сами. Видеозаписи вписаны в окно размером 960х615
В работе камера оказалась достаточно отвратной. при низком уровне освещения качество изображения неудовлетворительное. Огромный шум, который сводит на нет разрешение камеры:



При свете показывает лучше.



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

суббота, 7 декабря 2013 г.

Аудио книги

В последнее время пристрастился я слушать аудио книги. Слушаю на сматрфоне LG Optimus G e975

Слушаю с помощью программы Ambling BookPlayer. Автор этой программы залег на дно, и уже не принимает советов и просьб по усовершенствованию программы (а у меня есть пара идеек). Зато GooglePlay уверенно принимает деньги за эту программу, чем я и воспользовался.

Аудио книги почему то принято разбивать на огромное количество файлов. Даже если один файл - одна глава, все равно это как то надумано. Мне почему то не нравится такая файло-помоечная структура. По крайней мере хранить этот бардак неудобно.

Я написал на bash небольшую программку, которая объединяет эти файлы в один, а заодно создает XML файл для экспорта в bookreader.
Работает она из под наутилуса Ubuntu.
#!/bin/bash
#----------------------------------------------------------------------
# Программа объеденения музыкальных файлов (книг)
# Для установки скопировать в папку 
#  ~/.local/share/nautilus/scripts

#----------------------------------------------------------------------
# --- Версионность ---
# Начальная версия
#VERSION=0.1
# улучшение алгоритмов кодирования
#VERSION=0.2
#VERSION=0.3
# Заполнение полей в соответствии с xml описанием для импорта в ambling book reader
#VERSION=0.4
# Добавлено переименование обложки в соответствии с названием книги.
#VERSION=0.41
# Баг. Обложка не конвертится. (fixed)
# Добавить полоску времени, а не пульсар (fixed)
#VERSION=0.42
# Добавлено управление битрейтом, генерацией Обложки, XML, результирующего файла (fixed)
VERSION=0.43

#----------------------------------------------------------------------
# Переменные и константы
ERROR=192
INPUT="concat:"
BITRATE="96k|32k|64k|128k|192k|256k"
MIN_BITRATE="96k|32k|64k|128k|192k|256k"
MAX_BITRATE="96k|32k|64k|128k|192k|256k"
CODEC="libvorbis"
CURENT_DIR=$(pwd)
IN_DURATION=0
CREATE_COVER=TRUE
CREATE_XML=TRUE
CREATE_ONEOGG=TRUE

#----------------------------------------------------------------------
# xml ambling bookplayer Tags
BOOK_NAME=""
AUTHOR_NAME=""
NARRATOR_NAME=""
PUBLISHER=""
COPYRIGHT=""
IMAGE_FILE_NAME=""
SERIES_NAME=""
SERIES_SEQUENCE=""

#----------------------------------------------------------------------
# audiofile Tags (атавизм, времени не было сделать ревизию)
TITLE=""
ARTIST=""
ALBUM_ARTIST=""
ALBUM=""
GENRE="AudioBook"
DATE=""
TRACK=""
PUBLISHER=""
ENCODED_BY=""
COPYRIGHT=""
COMPOSER=""
PERFORMER=""
DISC=""
ENCODER="ffmpeg"
COVER=""

check_installed()
{
  PKG_OK=$(dpkg-query -W --showformat='${Status}\n' $1 |grep "install ok installed")

  if [ "" == "$PKG_OK" ]; then
    zenity --no-wrap --error --text="$1 package not found!\n Install it"
    exit $ERROR
  fi
}

# Выход по ошибке
exit_on_error()
{
  yad --title "Error" --text "$1" 200 200
  exit 192
}

# Возвращает в секундах время звучания звукового файла
duration()
{
  RET=$(ffmpeg -i "$1" 2>&1 | grep Duration | awk '{ print $2 }' | tr -d ',')
  S=$(echo ${RET:0:2}*60*60+${RET:3:2}*60+${RET:6:2} | bc)
  echo $S
}

check_nautilus_env()
{
  #--------------------------------------------------------------------
  # Сохраняем для отладки
  echo "Аргументы командной строки запуска скрипта в Nautius" >> tst.txt
  echo "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" >> tst.txt
  echo "" >> tst.txt

  if [ "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" == "" ]; then
    echo "Этот скрипт запускается из под наутилуса"
    exit_on_error
  fi
}

#######################################################################
#                                Main code
#

#----------------------------------------------------------------------
check_nautilus_env
check_installed yad
check_installed python-mutagen

#----------------------------------------------------------------------
# Получаем имена тегов

AUTHOR_NAME=$(mid3iconv --encoding=Windows-1251 --dry-run --debug "$1" | grep TPE1 | sed 's/TPE1=//')
if [ "$AUTHOR_NAME" == "" ]; then
  AUTHOR_NAME="$1"
fi

BOOK_NAME=$(mid3iconv --encoding=Windows-1251 --dry-run --debug "$1" | grep TIT2 | sed 's/TIT2=//')
if [ "$BOOK_NAME" == "" ]; then
  BOOK_NAME="$1"
fi

SERIES_NAME="$BOOK_NAME"

TAGS=$(yad --geometry=400x200 --center\
    --title="Enter Track Tags" \
    --form --text="$CURENT_DIR" \
    --field="Название Книги" \
    --field="Автор Книги" \
    --field="Название серии" \
    --field="Номер книги в серии" \
    --field="Читает" \
    --field="Обложка:FL" \
    --field="Конвертировать обложку:CHK" \
    --field="Создавать XML:CHK" \
    --field="Создавать ogg файл:CHK" \
    --field="Средний битрейт:CB" \
    --field="Минимальный битрейт:CB" \
    --field="Максимальный битрейт:CB" \
    --item-separator='|' \
    "$BOOK_NAME" \
    "$AUTHOR_NAME" \
    "$SERIES_NAME" \
    "$SERIES_SEQUENCE" \
    "$NARRATOR_NAME" \
    "$IMAGE_FILE_NAME" \
    $CREATE_COVER \
    $CREATE_XML \
    $CREATE_ONEOGG \
    $BITRATE \
    $MIN_BITRATE \
    $MAX_BITRATE \
    --button="gtk-ok:0" --button="gtk-cancel:1")

if [[ $? -eq 1 ]]; then
  #  cancel button pressed
  exit 192
fi

BOOK_NAME=$(echo $TAGS | awk 'BEGIN {FS="|" } { print $1 }')
BOOK_NAME=$(echo "$BOOK_NAME" | tr '[ ]' '[_]')
AUTHOR_NAME=$(echo $TAGS | awk 'BEGIN {FS="|" } { print $2 }')
AUTHOR_NAME=$(echo "$AUTHOR_NAME" | tr '[ ]' '[_]')
SERIES_NAME=$(echo $TAGS | awk 'BEGIN {FS="|" } { print $3 }')
SERIES_NAME=$(echo "$SERIES_NAME" | tr '[ ]' '[_]')
SERIES_SEQUENCE=$(echo $TAGS | awk 'BEGIN {FS="|" } { print $4 }')
SERIES_SEQUENCE=$(echo "$SERIES_SEQUENCE" | tr '[ ]' '[_]')
NARRATOR_NAME=$(echo $TAGS | awk 'BEGIN {FS="|" } { print $5 }')
NARRATOR_NAME=$(echo "$NARRATOR_NAME" | tr '[ ]' '[_]')
IMAGE_FILE_NAME=$(echo $TAGS | awk 'BEGIN {FS="|" } { print $6 }')
IMAGE_FILE_NAME=$(basename $IMAGE_FILE_NAME)
CREATE_COVER=$(echo $TAGS | awk 'BEGIN {FS="|" } { print $7 }')
CREATE_XML=$(echo $TAGS | awk 'BEGIN {FS="|" } { print $8 }')
CREATE_ONEOGG=$(echo $TAGS | awk 'BEGIN {FS="|" } { print $9 }')
BITRATE=$(echo $TAGS | awk 'BEGIN {FS="|" } { print $10 }')
MIN_BITRATE=$(echo $TAGS | awk 'BEGIN {FS="|" } { print $11 }')
MAX_BITRATE=$(echo $TAGS | awk 'BEGIN {FS="|" } { print $12 }')
BUTTON_OK=$(echo $TAGS | awk 'BEGIN {FS="|" } { print $13 }')
BUTTON_CANSEL=$(echo $TAGS | awk 'BEGIN {FS="|" } { print $14 }')

#----------------------------------------------------------------------
# Сохраняем для отладки
echo "RAW значения формы----------------------------------" > tst.txt
echo $TAGS >> tst.txt
echo "
Разобраные значения формы----------------------------------
BOOK_NAME: $BOOK_NAME
AUTHOR_NAME: $AUTHOR_NAME
SERIES_NAME: $SERIES_NAME
SERIES_SEQUENCE: $SERIES_SEQUENCE
NARRATOR_NAME: $NARRATOR_NAME
IMAGE_FILE_NAME: $IMAGE_FILE_NAME
" >> tst.txt

for arg
do
  NF=$(echo "$arg" | tr '[ ]' '[_]')
  INPUT=$INPUT"|$NF"
  if [ ! "$arg" == "$NF" ]; 
    then 
      if [ -e "$NF" ]; then
        exit_on_error "$NF: File exist already.\n\nExiting."
      fi
      mv "$arg" "$NF"; 
  fi
  NF_DURATION=$(duration $NF)
  IN_DURATION=$(( $IN_DURATION+$NF_DURATION ))
done

INPUT=$(echo "$INPUT" | sed 's/:|/:/')

FFMPEG_CMD="ffmpeg -i \"$INPUT\" \\
-maxrate $MAX_BITRATE -minrate $MIN_BITRATE -ab $BITRATE -acodec $CODEC \\
-metadata title=\"$BOOK_NAME\" \\
-metadata artist=\"$AUTHOR_NAME\" \\
-metadata genre=\"Audiobook\" \\
-metadata album_artist=\"$NARRATOR_NAME\" \\
-metadata album=\"$SERIES_NAME\" \\
-metadata date=\"$DATE\" \\
-metadata track=\"$SERIES_SEQUENCE\" \\
-metadata publisher=\"$PUBLISHER\" \\
-metadata encoded_by=\"$ENCODED_BY\" \\
-metadata copyright=\"$COPYRIGHT\" \\
-metadata composer=\"$COMPOSER\" \\
-metadata performer=\"$PERFORMER\" \\
-metadata disc=\"$DISC\" \\
-metadata encoder=\"$ENCODER\" \\
\"$AUTHOR_NAME-$BOOK_NAME.ogg\""

#----------------------------------------------------------------------
# Сохраняем для отладки
echo "--------------------------------"
echo "Время зввучания: $IN_DURATION сек." >> tst.txt

#----------------------------------------------------------------------
# Для отладки удобно эти команды скинуть в отдельные командные файлы
echo "#!/bin/bash" > ffmpeg_cmd.sh
echo "" >> ffmpeg_cmd.sh
echo "$FFMPEG_CMD" >> ffmpeg_cmd.sh
$(chmod +x ffmpeg_cmd.sh)

echo "#!/bin/bash" > cover_convert_cmd.sh
echo "" >> cover_convert_cmd.sh
echo "convert $IMAGE_FILE_NAME -resize 400x400 $AUTHOR_NAME-$BOOK_NAME.jpg">> cover_convert_cmd.sh
$(chmod +x cover_convert_cmd.sh)

#----------------------------------------------------------------------
# Сконвертируем обложку книги
if [ $CREATE_COVER == "TRUE" ]; then
  RET=$(./cover_convert_cmd.sh)
fi

#----------------------------------------------------------------------
# Сгенерим xml описание книги
if [ $CREATE_XML == "TRUE" ]; then
  echo "
    $BOOK_NAME
    $AUTHOR_NAME
    /sdcard/audiobooks/$AUTHOR_NAME-$BOOK_NAME.jpg
    $SERIES_NAME
    $SERIES_SEQUENCE
    $NARRATOR_NAME
    
        $BOOK_NAME 
        
    
    
        /sdcard/audiobooks/$AUTHOR_NAME-$BOOK_NAME.ogg
    
" > $AUTHOR_NAME-$BOOK_NAME.xml
fi

#----------------------------------------------------------------------
# Собственно, запуск конвертирования
if [ $CREATE_ONEOGG == "TRUE" ]; then
  touch /tmp/$$
  ( ( echo 1 
      while [ -f /tmp/$$ ] 
        do 
          sleep 10
   # Вычисления процента сконвертированного
          OUT_DURATION=$(duration "$AUTHOR_NAME-$BOOK_NAME.ogg")
          PERCENTAGE=$(( OUT_DURATION*100/IN_DURATION))
          echo $PERCENTAGE
        done
      echo 100 ) | yad --title "$CURENT_DIR" \
                     --progress \
                     --progress-text="$AUTHOR_NAME-$BOOK_NAME.ogg" \
                     --percent=0 --auto-close --no-buttons --width=300) &
  RET=$(./ffmpeg_cmd.sh)
  rm /tmp/$$
  wait
fi

#----------------------------------------------------------------------
# Конец
yad --no-wrap \
   --title "Конвертирование завершено" \
   --text "$CURENT_DIR/$AUTHOR_NAME-$BOOK_NAME.ogg"

rm ./cover_convert_cmd.sh
rm ./ffmpeg_cmd.sh
rm ./tst.txt


Если захотите ей воспользоваться, то сохрание ее в ~/.local/share/nautilus/scripts/merge_mp3.sh. После чего дайт права на исполнение следующей командой.
chmod +x ~/.local/share/nautilus/scripts/merge_mp3.sh
Кроме того необходимо установить пакеты yad и python-mutagen

Пользоваться ей очень просто. Сначала в Nautilus выделяю файлы книги, которые хочу объединить.




Затем нажимаю правую кнопку и выбираю скрипт:




В появившемся окне заполняю поля, которые будут отображаться bookplayer




Наблюдаем за ходом конвертирования



Дизастер! Оказалось, что в Android плохая реализация проигрывания ogg файлов с переменным битрейтом. Плеер не может точно позиционировать на выбранное место. Выглядит это так: вы выставляете проигрывание с позиции 1 час 28 мин 33 сек. Плеер передвигает вперед минут на 20 и начинает воспроизведение. За это я господ их Гугле материл. Бороться с этим можно только установив при кодировании постоянный битрейт.

Для книги вполне достаточно битрейта 96 к.


Полезные ссылки:
1. Кодирование аудио с потерями. Что к чему?
2. mutagen

среда, 22 августа 2012 г.

Linux. How to delete duplicate images 2?

Для создания и поддержания в актуальном виде коллекции изображений нужно иметь инструмент, позволяющий находить и удалять дубликаты. В свое время я пытался сделать такой инструмент.

Но подход, который я использовал требует значительной производительности и на больших коллекциях маленькая утилита разрастается достаточно большую программу со свое базой данных с интерфейсом и всеми прелестями программного проекта.

Более эффективно воспользоваться существующими инструментами, например мощной программой управления фотоколлекцией DigiKam.

Но штука в том, что DigiKam имеет очень мощный инструмент поиска дубликатов, не имеет возможности работы с дубликатами, кроме как мышкой и клавиатурой.

Я провел небольшое расследование и обнаружил, что результаты поиска дубликатов сохраняются в базе данных, которая обычно располагается в $HOME/Pictures/digikam4.db

Как DigiKam сохраняет результаты поиска я покажу на следующем примере.

Есть папка с изображениями.
В программе digikam запускаем поиск одинаковых изображений.

Результаты поиска сохраняются в таблице searches. Эта таблица содержит строки с результатами поиска.


Каждая строка в поле query хранит xml список содержащий id одинаковых изображений. На приведенном листинге я отформатировал xml, чтобы удобней его было читать.


 
  
   3
   2 
   1
  
 


Имена файлов изображений хранятся в таблице images и доступны по id


Путь доступен по полю (номер альбома) в таблице albums:


Путь к альбомам хранится в таблице albumroot:


Ниже пример реализации функции на bash получения пути изображения с id = 5
#!/bin/bash 

DBPATH=digikam4.db 

getPicture () 
{ 
  FILENAME=$(sqlite3 $DBPATH "SELECT name FROM images WHERE id=$1") 
  IDALBUM=$(sqlite3 $DBPATH "SELECT album FROM images WHERE id=$1") 
  REALTIVEPATH=$(sqlite3 $DBPATH "SELECT relativePath FROM albums WHERE id=$IDALBUM") 
  IDALBUMROOT=$(sqlite3 $DBPATH "SELECT albumRoot FROM albums WHERE id=$IDALBUM") 
  ROOTPATH=$(sqlite3 $DBPATH "SELECT specificPath FROM albumroots WHERE id=$IDALBUMROOT") 
  echo /home/${ROOTPATH}/${REALTIVEPATH}/${FILENAME} 
} 

FNAME=$(getPicture 5) 
echo $FNAME 

Ну, собственно, вот и венец творений.
Программа на bash, которая удаляет дубликаты изображений.
Программа удаляет дубликат меньшего размера.
Я ее успешно использую совместно с DigiKam 2.8 под Ubuntu.
Перед запуском скрипта нужно выйти из DigiKam, иначе скрипт не может получить доступ к базе, которая лочится.
#!/bin/bash
#-------------------------------------------------------------------
# Удаляет дубликаты картинок на основании поиска дубликатов в 
# программе DigiKam
#
# Проверено с DigiKam v2.8
COPYRUGHT="\n© http://axa-ru.blogspot.com. Licensed under GPLv3."

#-------------------------------------------------------------------
#VERSION=0.1 # initial version
#VERSION=0.11 # Some DeBugs
#VERSION=0.12 # Добавлено приоритет удаления
#VERSION=0.13 # Some changes
VERSION=0.14 # Испрвавление ошибки в delSmallPic()

DEBUG=0
VERBOSE=1
DBPATH=$HOME/Pictures/digikam4.db # Путь до базы даннх DigiKam
EXITERROR=192

SAVEPIC=""
PATTERN=0_WallPapers99

# Color ANSY sequence
BLACK="\033[0;30m"
RED="\033[0;31m"
GREEN="\033[0;32m"
YELLOW="\033[0;33m"
BLUE="\033[0;34m"
MAGENTA="\033[0;35m"
CYAN="\033[0;36m"
WHITE="\033[0;37m"
GRAY1="\033[38;5;252m"
GRAY2="\033[38;5;245m"
GRAY3="\033[38;5;238m"
NOCOLOR="\033[0;38m"

#-------------------------------------------------------------------
#  Возвращает по id изображения его полный путь
#  пример использования:
#     FNAME=$(getPicture 1653)
#  возвращает путь к картинке №1653

getPicture ()
{
  FILENAME=$(sqlite3 $DBPATH "SELECT name FROM images WHERE id=$1")
  IDALBUM=$(sqlite3 $DBPATH "SELECT album FROM images WHERE id=$1")
  REALTIVEPATH=$(sqlite3 $DBPATH "SELECT relativePath FROM albums WHERE id=$IDALBUM")
  IDALBUMROOT=$(sqlite3 $DBPATH "SELECT albumRoot FROM albums WHERE id=$IDALBUM")
  local ALBUM_TYPE=$(sqlite3 $DBPATH "SELECT type FROM albumroots WHERE id=$IDALBUMROOT")
  case $ALBUM_TYPE in
    1) ROOTPATH=/home$(sqlite3 $DBPATH "SELECT specificPath FROM albumroots WHERE id=$IDALBUMROOT");;
    2) echo "External media not supported yet. Exiting"; exit $EXITERROR;;
    3) ROOTPATH=$(sqlite3 $DBPATH "SELECT identifier FROM albumroots WHERE id=$IDALBUMROOT" | sed 's/networkshareid:?mountpath=//g' | sed 's/%2F/\//g');;
  esac  

  echo ${ROOTPATH}/${REALTIVEPATH}/${FILENAME}
}

#-------------------------------------------------------------------
#  Удаляет меньшую картинку из двух
#  
delSmallPic()
{
  ((DEBUG)) && echo "    ***** $FUNCNAME"

  if [ "$SAVEPIC" == "" ]; then 
    #((DEBUG)) && echo "    $LINENO: Init SAVEPIC"
    SAVEPIC="$1";
  else
    local W0=$(identify -format '%w' "$SAVEPIC" 2> /dev/null)
    local H0=$(identify -format '%h' "$SAVEPIC" 2> /dev/null)
    local W1=$(identify -format '%w' "$1" 2> /dev/null)
    local H1=$(identify -format '%h' "$1" 2> /dev/null)

    ((DEBUG)) && echo "    $LINENO: PIC1=$SAVEPIC"
    ((DEBUG)) && echo "    $LINENO: PIC2=$1"
    ((DEBUG)) && echo "    $LINENO: $W0 -eq $W1 -a $H0 -eq $H1"

    # Если картинки одинаковы то удаляет ту, в пути (имени)
    # которой есть $PATTERN
    if [ $W0 -eq $W1 -a $H0 -eq $H1 ]; then
      ((DEBUG)) && echo "    $LINENO: PIC1 == PIC2"
      if [[ "$SAVEPIC" =~ .*$PATTERN.* ]]; then
        echo "Delete $SAVEPIC"
        ((DEBUG)) && printf "    %s: " $LINENO
        ! ((DEBUG)) && rm "$SAVEPIC"
        SAVEPIC="$1"
      else
        ((DEBUG)) && printf "    %s: " $LINENO
        echo "Delete $1"
        ! ((DEBUG)) && rm "$1"
      fi
    else 
      if [ $W0 -le $W1 -o $H0 -le $H1 ]; then
        ((DEBUG)) && echo "    $LINENO: PIC1 <= PIC2"
        echo "Delete $SAVEPIC"
        ((DEBUG)) && printf "    %s: " $LINENO
        ! ((DEBUG)) && rm "$SAVEPIC"
        SAVEPIC="$1"
      else
        ((DEBUG)) && echo "    $LINENO: PIC1 > PIC2"
        ((DEBUG)) && printf "    %s: " $LINENO
        echo "Delete $1"
        ! ((DEBUG)) && rm "$1"
      fi    
    fi
  fi
}

#-------------------------------------------------------------------
#  Удаляет дубликаты картинок из списка
#  В качестве параметра получает список id картинок с разделителями пробелами
delDupPic ()
{
  while (( "$#" )); do
    local PAR=$1
    PICURL=$(getPicture "$PAR")
    if [ ! -f $PICURL ]; then
      echo -e "${RED}File $PICURL das not exists.${NOCOLOR}"
      # echo -e "${RED}Use digiKam!!!${NOCOLOR}"
      # exit $EXITERROR
    fi
    ((DEBUG)) && echo "  $LINENO: PAR=$PAR, PICURL=$PICURL"
    delSmallPic $PICURL
    shift
  done
}

#-------------------------------------------------------------------
#  main code
#

  while getopts "Dd:hVv" SWITCH ; do
    case $SWITCH in
      D) DEBUG=1;;
      d) if [[ $OPTARG == "" ]]; then 
           printf "$SCRIPT:$LINENO: must be argument\n"; 
           exit $ERROR; 
         else 
           PATTERN=$OPTARG; 
         fi;;
      h) echo -e "usage: 
  ${CYAN}$0 [-OPTION]${NOCOLOR}

    OPTION is
    ${CYAN}D${NOCOLOR}       - Debug On
    ${CYAN}d [PAT]${NOCOLOR} - Delete first pic by PATtern
                Example: 
                 deldup.sh -d 00_Picture 
                will delete any picture
                 /mnt/nas3d0/Pictures/Wallpaper/00_Pictures/Pictures_0123.jpg 
    ${CYAN}h${NOCOLOR}       - This help
    ${CYAN}v${NOCOLOR}       - Verbose output, No output by default"
        exit 0
        ;;
      V) echo -e "${CYAN}$0 Version $VERSION\n${COPYRUGHT}${NOCOLOR}"; exit 0;;
      v) VERBOSE=1;;
      *) printf "$SCRIPT:$LINENO: script error: unhandled argument\n"; exit $ERROR;;
    esac
  done


((DEBUG)) && echo "$LINENO: TOTAL=$TOTAL"

# Type=7 - записи после операции поиска дубликатов
X=$(sqlite3 $DBPATH "SELECT id FROM searches where type=7 LIMIT 1")
TOTAL=$(sqlite3 $DBPATH "SELECT COUNT (*) FROM searches WHERE type=7")
echo "$TOTAL Duplicate Images Will be Delete "
((LAST=TOTAL+X))
((DEBUG)) && echo "$LINENO: X=$X, LAST=$LAST, TOTAL=$TOTAL"

while [ $X -lt $LAST ]
do
  SAVEPIC=""
  # Получаем список записей с дублированными картинками 
  # Ниже показан отформатированный пример. 
  # 
  # 
  #   
  #     
  #       5033
  #       201
  #       84132
  #     
  #   
  # 
  LISTEQPIC=$(sqlite3 $DBPATH "SELECT query FROM searches WHERE id=$X" | sed 's/<\/listitem>/,/g' | sed 's///g' | sed 's/.*oneof\">//' | sed 's/,<\/.*//' | sed 's/,/ /g' )
  ((DEBUG)) && echo "$LINENO: X=$X, LISTEQPIC=$LISTEQPIC"
  delDupPic $LISTEQPIC
  ((X++))
done

По хорошему этот скрипт можно оформить в виде плагина в DigiKam и запускать оттуда. Будет функциональней и удобней. Но мне лень ковырять сам DigiKam. Если кто сделает такое добро, то отпишите.


Полезные ссылки:

воскресенье, 12 августа 2012 г.

Corbina (beeline) radio.

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

Для поиска работающих радиостанций я написал простенький скрипт на bash:
#!/bin/bash

PORT=8000

while [ $PORT -lt 10000 ]; do
   printf "\r%s  " "$PORT"
   RESULT=$(mplayer -frames 0  http://radio.corbina.ru:$PORT/ 2>/dev/null | grep playback)
   if [ "$RESULT" == "Starting playback..." ]
   then 
      NAME=$(mplayer -frames 0  http://radio.corbina.ru:$PORT/ 2>/dev/null | grep Name)
      echo -e "\rhttp://radio.corbina.ru:$PORT   $NAME"
   fi
   ((PORT++))
done
Запустив его в консоли через пару минут мы получаем все работающие станции в диапазоне портов от 8000 до 10000:
http://radio.corbina.ru:8000 Name : (GTM) CorBinA PsychedeliC StaTioN http://radio.corbina.ru:8005 Name : POP CorBinA RaDiO StatioN http://radio.corbina.ru:8010 Name : Corbina Dark & Metal Radio http://radio.corbina.ru:8015 Name : DruM and BasS CorBinA RaDiO StatioN http://radio.corbina.ru:8025 Name : (GTM) HousE CorBinA RaDiO StatioN http://radio.corbina.ru:8030 Name : BriT CorBinA RaDiO StatioN http://radio.corbina.ru:8035 Name : (GTM) AmbienT CorBinA RaDiO StatioN http://radio.corbina.ru:8040 Name : Deep Mix Moscow Radio: deepmix.ru http://radio.corbina.ru:8050 Name : EuroHIT CorBinA RaDiO StatioN http://radio.corbina.ru:8067 Name : ShaNsoN CorBinA RaDiO StatioN http://radio.corbina.ru:8071 Name : RagnaroK CorBinA RaDiO StatioN http://radio.corbina.ru:8073 Name : RocK-Ru CorBinA RaDiO StatioN http://radio.corbina.ru:8107 Name : Heavy Music Atmospheric Radio http://radio.corbina.ru:9040 Name : Deep Mix Moscow Radio: deepmix.ru http://radio.corbina.ru:9045 Name : Deep Mix Moscow Radio: deepmix.ru http://radio.corbina.ru:9054 Name : Corbina Radio: Big Beat radio (HighQuality) http://radio.corbina.ru:9056 Name : Corbina Radio: BigBeat Radio

пятница, 11 марта 2011 г.

Конвертирование cue в Nautilus

В интернете на треккерах можно найти достаточно большое количество музыкального контента в lossless формате. Так сложилось, что я храню свою музыкальную коллекцию в виде mp3 файлов и мне приходится конвертировать ape, flac или WavPack в формат mp3.

Как правило исходник имеет в своем составе один большой ape, flac или wv файл и файл cue, в котором сохранена информация о дорожках из которых состоит образ диска.

Я использую для конвертирования из ape/flac/wv в mp3/ogg скрипт, работающий в nautilus.

Как это работает.

Процесс конвертирования выглядит следующим образом:
1. Выбираю cue-файл, по правой кнопке из меню Script выбираю Split-Audio-by-CUE.sh.
Дальше все действия происходят автоматически.
2. Все файлы сохраняются в каталоге original. Тамже сохраняются промежуточные файлы конвертации.
Исходный ape/flac файл распаковывается в wav.
3. Wav файл кодируется в mp3 или ogg
4. В соответствии с описанием в cue-файле mp3/ogg разбивается на треки

Как это установить.

Сначала нужно установить необходимые пакеты: $ sudo apt-get install flac lame mp3splt vorbis-tools wavpack $ wget http://axaru.opendrive.com/files/56708443_kKKU9/mac-3.99-u4_3.99-4.5_amd64.deb $ sudo dpkg -i mac-3.99-u4_3.99-4.5_amd64.deb Я использую 64-х битную версию. Если у вас стоит 32-х битная, то скомпилируйте сами deb пакет.
Исходник mac-3.99 тут или тут. Пропатченный APELink.cpp.

Нужно создать каталог, где будут храниться скрипты, необходимые для обработки audio файлов: $ mkdir -p $HOME/.gnome2/nautilus-scripts/EasyTAG сохранить в нем под именем Split-Audio-by-CIE.sh следующий скрипт:
#!/bin/bash

# Split audio archive file (ape or flac) by cue
#
# Filename: Split-audio-by-CUE.sh
#
# Setup:
# sudo apt-get install flac lame mp3splt vorbis-tools wavpack
# wget http://members.iinet.net.au/~aidanjm/mac-3.99-u4_b3-1_i386.deb 
# sudo dpkg -i mac-3.99-u4_b3-1_i386.deb 
#
# Version         Changes
# ------------   ---------------------------------------------------------------
#VERSION=0.1      # Initial version convertion Nautilus ape or flac to mp3 or ogg
#VERSION=0.11     # Eliminate some bug in wav encoding
#VERSION=0.12     # Saving original files to ORG directory.
VERSION=0.13     # Added decompressing from wave pack

# Copyleft AxaRu http://axa-ru.blogspot.com/2011/

# For debug set to 1
DEBUG=0

# Uncoment actual format
ENCODING=mp3     
#ENCODING=ogg    

# Lame encoding quality
#MP3QUALITY=hifi
MP3QUALITY=cd

# Directory for saving original files
ORGDIR=original
BASEDIR="$(pwd)"

#===============================================================================

using()
{
   zenity --info --no-wrap --text="Nautilus script for decopmpressing ape or flac audo file by que.\n\n
Using:
\t\tSimple select some cue file in nautilus, tape right mouse button and select:
\t\tScript->Audio tags manip->Split-audio-by-CUE.sh\n
Adjusting:
\t\tTarget encoding mp3 or Ogg select by uncomment appropriate variable
\t\t\n
Debuging:
\t\tIn the script Split-audio-by-CUE.sh setup DEBUG variable to 1
\t\tand You will see debug message in Gnome popup windows"
}

save_files()
{
  if [ -d "$ORGDIR" ]; then
     zenity --error --text="Directory $ORGDIR exist in current catalog.
Please remove its and start script agan"
     exit 1
  fi
  out="$(mkdir "$ORGDIR")"
  out="$(mv * "$ORGDIR")"
}

exit_error()
{
  out="$(rm *)"
  out="$(mv "$ORGDIR"/* .)"
  out="$(rmdir "$ORGDIR")"
  exit 1
}

((DEBUG)) && zenity --error --text="Lets Go!"

save_files
# Проверить, что был выбран один файл ($# = 1)
  if [ $# -ne 1 ] ; then
    using
    exit_error
  fi

# Считать cue файл
  CUENAME="$1"
    ((DEBUG)) && zenity --error --text="Cue:        $CUENAME"

  # Найти строку, начинающуюся с тега "FILE" прочитать файл
  AUDNAME="$(awk "/FILE/" "$ORGDIR/$CUENAME" | awk -F"\"" '{ print $2 }')"
    ((DEBUG)) && zenity --error --text="Audio file: $AUDNAME"

  # Проверить, что такой файл существует

  if [ ! -f "$ORGDIR/$AUDNAME" ] ; then
    zenity --error --text="Input file $ORGDIR/$AUDNAME doesn't exist"
    exit_error
  fi

  # Разархивировать в wav
( 
  case "$AUDNAME" in
    *.[fF][lL][aA][cC] )
      fn=${AUDNAME%.[fF][lL][aA][cC]}
      echo "# Deflating \"$fn.flac\" to wav"
      echo "30"
      ((DEBUG)) && zenity --error --text="Flac decompressing : $fn"
      out="$(cd "$BASEDIR/$ORGDIR"; flac "-d" "$AUDNAME" -o "${fn}.wav")"
      ;;
    *.[aA][pP][eE] )
      fn=${AUDNAME%.[aA][pP][eE]}
      echo "# Deflating \"$fn.ape\" to wav"
      echo "30"
      ((DEBUG)) && zenity --error --text="Ape decompressing : $fn"
      out="$(cd "$BASEDIR/$ORGDIR"; mac "$AUDNAME" "${fn}.wav" "-d")"
      ;;
    *.[wW][vV] )
      fn=${AUDNAME%.[wW][vV]}
      echo "# Deflating \"$fn.wv\" to wav"
      echo "30"
      ((DEBUG)) && zenity --error --text="Wave Pack decompressing : $fn"
      out="$(cd "$BASEDIR/$ORGDIR"; wvunpack "$AUDNAME")"
      ;;
    *.[wW][aA][vV] )
      fn=${AUDNAME%.[wW][aA][vV]}
      ((DEBUG)) && zenity --error --text="No need decompressing : $fn"
      ;;
    * )
      zenity --error --text="Unknown format"
      exit 1
      ;;
  esac


  # Закодировать в mp3 или ogg
  echo "# Encoding wav to mp3"
  echo "60"
  case $ENCODING in
    "mp3" )
      out="$(cd "$BASEDIR/$ORGDIR"; lame --preset "$MP3QUALITY" "$fn.wav" "$fn.mp3")"
      ;;
    "ogg" )
      out="$(cd "$BASEDIR/$ORGDIR"; oggenc -q 6 -o "$fn.ogg" "$fn.wav")"
      ;;
  esac

  # Разрезать на треки
  echo "# Splitting to tracks"
  echo "90" ; sleep 1
  out="$(cd "$BASEDIR/$ORGDIR"; mp3splt -f -c "$CUENAME" -o "../@n-@t" "$fn.mp3")"

  echo "# Done"
  echo "100" 

) |   zenity --progress \
      --title="$1" \
      --text="dummy_text_dummy_text_dummy_text_dummy_text_dummy_text_dummy_text_" \
      --percentage=0

((DEBUG)) && zenity --error --text="All done"
exit
и дать ему права на исполнение $ chmod +x $HOME/.gnome2/nautilus-scripts/EasyTAG/Split-Audio-by-CIE.sh

Недостатки

Конвертирование звуковых файлов относительно длительный процесс. На моем ноуте он продолжается в течении 3-5 минут. Я попытался, насколько это возможно как то показать ход исполнения. Но здесь мои возможности сильно ограничены.

Буду рад коментариям и замечаниям.


Полезные ссылки:


Updated 22/04/2012

понедельник, 31 января 2011 г.

Как изменить размер обложки диска из Nautilus

При редактировании коллекции музыки с помощью EasyTAG рутинная операция по конвертации изображения обложки достает неимоверно.

Приходится либо запускать графический редактор, либо писать каждый раз команду изменения размера, потом снова переключаться в EasyTAG чтобы включить картинку в звуковой файл

Но нет ничего проще прикрутить команду конвертации изображения на правую клавишу мыши в наутилусе. Для этого создаем файл ~/.gnome2/nautilus-scripts/Multimedia/convert_to_cover_mp3
#!/bin/bash

while [ $# -gt 0 ]; do
 picture=$1
 cover_file="Cover.jpg"
 /usr/bin/convert -resize 500x500! "$picture" "$cover_file"
 shift
done
И даем ему права на исполнение: $ chmod +x ~/.gnome2/nautilus-scripts/Multimedia/convert_to_cover_mp3
Чтобы изменить размер картинки теперь нужно просто на файле кликнуть правую клавишу мыши и выбрать написанный нами скрипт.



суббота, 26 декабря 2009 г.

Как сохранить видео из YouTube

В старых версиях firefox флэш видео сохранялось в каталоге /tmp и было доступно для простого копирования. Но начиная с версии firefox с 3.6 до 9 c adobe flash player 11.1.102.55 файл видео помечается как удаленный.

Чтобы сохранить его я пользуюсь вот этим скриптом для nautilus:

#!/bin/bash

############################################################################
# File: cp-ffox-video.sh
# Description: script for copy flash video from firefox to current directory
#
# Copyleft http://axa-ru.blogspot.com/2009/12/how-to-save-video-from-youtube.html

lsof | grep Flash | while read psLine 
do 
  PID=$(echo $psLine | awk '{print $2}')
  FD=$(echo $psLine | awk '{print $4}' | tr -d 'u')
  FILE=$(echo $psLine | awk '{print $9}' | tr -d '/tmp/')
  cp /proc/$PID/fd/$FD $FILE.flv
done

exit 0

Скрипт нужно сохранить в каталоге ~/.gnome2/nautilus-scripts под именем cp-ffox-video.sh

Как им пользоваться:
  1. Посмотреть видео.
  2. Свернуть (но не закрывать) firefox.
  3. Открыть в nautilus папку куда мы желаем сохранить видео.
    Нажимаем правую клавишу мыши и выбираем скрипт cp-ffox-video.sh




Полезные ссылки:


Upd. 09.05.2011
Upd. 30.10.2011 - Изменил скрипт для совместимости с Firefox 7.0.1 и adobe flash player 11.0.1.152
Upd. 03.11.2011 - Проверил на совместимость с Firefox 8.0
Upd. 22.11.2012 - Проверил на совместимость с Firefox 16.0.1 и Shockwave Flash 11.2 r202.

четверг, 17 декабря 2009 г.

Как сохранить на диск фотографии из photofile.name, picasa, flickr за два клика

Случилось так, что у меня сгорел диск с архивами фоток. И понадобилось мне скачать обратно на диск мои фотографии из photofile

Кликать мышкой на каждой из пары сотен? Это не наш метод.

Прошерстил я гугл и нашел, что был плагин к Total Commander, выполняющий такую операцию. Но оказалось, что автор год назад прекратил его поддержку и заботливо поудалял все исходники и архивы с ним.

Не знаю уж что с ним делали: били-ли, паяльником паяли-ли или бабла заплатили. Но факт налицо.

Я таки нашел этот плагин в польских закоулках, поковырялся с ним минут 10 и написал небольшой скрипт на bash, с похожей функциональностью.

Вот он:
Для http://photofile.name
#!/bin/sh
# gpf.sh - simple script for save photo from http://photofile.name
wget $1all -O- | grep '#mainImageLink' | sed -e 's/<img src=.*//' -e 's/\/#mainImageLink">/.jpg/' -e 's/^ *//' | awk -F/ '{printf "http://%s.%s.photofile.ru/photo/%s/%s/%s\n", $3,  $2, $3, $4, $5 }' | wget -i-

Сохраняем скрипт на диск в каталог куда будим фотки даунлоадить. Даем ему права на исполнение.

chmod 755 gpf.sh

Как им пользоваться? Проще простого:

  1. Открываем phtotfile.ru на нужном нам альбоме





  2. Копируем в буфер обмена URL.
  3. В терминале вводим команду :
    ./gpf.sh <URL>

    В данном примере:
    ./gpf.sh http://photofile.name/users/axa_ru/3218616/

  4. Все. Фотографии скачиваются в текущий каталог.
    Пьем пиво.
Скрипт позволяет копировать фотки из любых открытых альбомов в свойствах которых не установлена отметка "Защита оригиналов фотографий"

Пытливые и любознательные могут упростить/усложнить скрипт для скачивания фоток из закрытых альбомов и/или других ресурсов.

Вот аналогичный скрипт для http://picasaweb.google.com(ru)

#!/bin/sh
# gpcs.sh - simple script for save photo from http://picasaweb.google.com(ru)
wget $1 -O- | grep '<div><img src="' | sed -e :a -e 's/<\/div>/\x0A/' -e 's/<div><img src=\"//' -e ta | sed -e 's/".*//' -e 's/s160\///' | wget -i-

Для http://www.flickr.com

Есть отдельное комьюнити посвященное управлению фотографиями для http://code.flickr.com/

Flickr - наверное один из самых навороченных сервисов, по хранению фотоконтента. Его парадигма близка к идеологии мака. Нет папок, есть сеты и теги.

Под сетом обычно подразумевается коллекция фотографий, объединенная по какому либо признаку, по времени, месту или жанру.


#!/bin/sh
# gflk.sh - simple script for save photo from http://www.flickr.com/photos
wget $1 -O- | grep 'title=' | grep 'photo_container pc_m' | sed -e 's/.*http/http/' -e 's/m.jpg.*/b_d.jpg/' | wget -i-

Скрипт скачивает 18 фотографий за раз (столько выдает flickr на одну страницу)

Скачивание аналогично, как и для photofile.name.



PS.
  • Скрипты написаны в стиле unix, но легко могут быть переделаны для WinDos.

  • Никаких гарантий ни за что не несу.
    Если кто спросит где все файлы - отмазка "сбой произошел"
    Если придет управление "К" - бегите в M$. Там помогут.

  • Не понимаю, нахрен было городить какой то плагин к total commader?


Вот похожая тема на форуме про Asus WL500gP: http://wl500g.info/showthread.php?t=19035&highlight=midnight+commander
Если нет подходящей темы, открывайте новую.

воскресенье, 5 июля 2009 г.

Настраиваем swisscenter

192.168.1.63 - адрес компьютера в моей сети, на который установлен swisscenter. У Вас он будет, вероятно другим.

Локализация

  1. Открыть страницу конфигурации http://192.168.1.63/config/
  2. Перейти на вкладку Expert Options->Edit System Settings
  3. Добавить системную переменную CONFIG_PAGE_CHARSET и присвоить ей значение Windows-1251
  4. Добавить системную переменную PLAYER_PAGE_CHARSET и присвоить ей значение Windows-1251
  5. Загрузить изображение Росийского флага и сохранить его в каталог /opt/lampp/htdocs/images/flags Кодировка UTF-8 пока не поддерживается полностью. Можно перевести меню на русский и оно будет корректно отображаться, но содержимое id3 будет показываться в виде знаков вопроса. Однако автор обещает к версии 1.23 исправить это недоразумение.

Добавление в библиотеку audio файлов

  1. Открыть вкладку Setup -> Media Locations
    • В поле Location : ввести путь к audio файлам (/mnt/nas3d0/Music)
    • В поле Category : выбрать Music Videos
    • Нажать кнопку Add
  2. Открыть вкладку Media Management -> Search for new media
    • В поле Media type : выбрать Audio
    • Нажать кнопку Search for new media
r2c1r2c2

среда, 1 июля 2009 г.

Установка SwissCenter

Swisscenter - Это мультимедия сервер, разработанный для совместного использования с устройствами типа nmt. Его возможности показывают скриншоты Как пишут американцы: "убедитесь что у Вас установлен XAMP"
  1. Войти под root и остановить XAMPP
    $su
    #/opt/lampp/lampp stop
  2. Установить unzip
    #apt-get install unzip
  3. Скачать и установить swisscenter
    #wget www.swisscenter.co.uk/downloads/swisscenter.zip
    #unzip swisscenter.zip -d /opt/lampp/htdocs 
    #chown -R nobody:nogroup /opt/lampp/htdocs
  4. Создать базу данных и проверить работу В firefox набрать адрес машины: http://localhost/config (если проверка делается с той же машины, где устанавливался XAMPP) или с другой машины нужно ввести ip адрес сервера приложений: http://192.168.1.63/config Выбрать пункт Installation -> Create Database
  5. Устранение бага "memory_limit"

    С установками по умолчанию по каким то причинам на экране телевизора не показывается background. Хотя если заходить на страницу swisscenter - все отображается правильно. Чтобы устранить этот баг нужно в файле /opt/lampp/etc/php.ini заменить значение параметра memory_limit с 8MB на 32MB.
  6. Зарегистрировать сервис на HDX 1000 Для этого в меню HDX 1000 перейти в пункт Web Services->Add / Edit->*Add New Service В поле Name ввести желаемое имя. В поле URL http://192.168.1.63/index.php, где 192.168.1.63 - адрес сервера в Вашей сети, на котором установлен swisscenter
  7. Обновление версии swisscenter
    • Открыть главное меню с браузера компьютера или на экране телевизора.
    • Перейти на страницу 4. Configuration -> 7. Update SwissCenter
    • Выбрать обновление на стабильную или версию разработчика.
  8. Ниже показаны некоторые скриншоты:
Ссылки:

четверг, 11 июня 2009 г.

Jukebox для HDX1000

Jukebox - это программа, обеспечивающая доступ к мультимедия контенту, хранящемуся в домашней сети. Кроме удобного интерфейса, jukebox, как правило, предоставляет дополнительные сервисы, как , удобный поиск и доступ к фильму (музыкальному диску), описание фильма (музыкального диска), информацию об артистах и др. Juxebox могут быть дополнением к медиасерверу или отдельным продуктом. Для платформы NMT разработано несколько jukebox-ов. Ни один из них я пока не пробовал. Собираюсь сделать это в ближайшее время. Ниже помещены скриншоты, найденных мной jukebox-ов для nmt, ссылки на домашнюю страницу и "содранное" описание.

(YetAnother)MovieJukebox is a command line tool, written in Java, which recursively scans your video library for video files (AVI, MKV, etc.) and analyzes these files in order to extract information like: year, language, subtitles, container, part, fps, audio and video codecs. Other movie and television information like, director, rating, etc. are collected using various plugins for online databases such as IMDb, TheMovieDB, TheTVDB, Allocine, FilmAffinity, FilmWeb, etc. MovieJukebox generates a bunch of XML movie descriptions and indexes as well as HTML reports that are compatible with the Popcorn Hour NMT : HTML reports embed links for playing the movie directly from the jukebox. Supports user created skins that allow for the complete customization of the HTML reports.

squeezenmt A music jukebox for the syabas NMT (Networked Media Tank) which gets it's content from Squeezecenter displays on the TV and issues commands to Squeezecenter to play on any players i.e. squeezeboxes, transporter, squeezeboom or softsqueeze etc. All the information is retrieved real time from Squeezecenter/slimserver. Please note this does not play the music through the NMT but is just a visual jukebox interface that tells squeezecenter what to play. Look and feel is based on YAMJ and uses xsl stylesheets which would enable others to skin to create their own look. Features
  • Amazon art download Can turn on the optional amazon cover art download for any missing covers
  • Main menu linked to the Home button on the remote with links to all menus and random cover art from your own collection.
  • Artist menu Browse artist albums. Contains a chooser to jump to alphabetical groups i.e. Art...Day or Elv...Fat
  • Genre menu Browse albums by genre. Contains Alphabetical chooser.
  • Playlist menu Browse saved playlists and either play whole playlist or add particular songs to the end of the current playing playlist.
  • Now Playing Browse the currently playing songs. Save as a new playlist by entering on screen a playlist name. Remove songs from the current playlist.
  • Album detail Choose a player to play the album/songs (supports control of multiple players). Add albums or songs to the 'Now Playing' playlist.

My Lil Movie JukeBox Maker
  • Plays movies from wherever they are on your network.
  • Plays all movie file types that the NMT supports, ..avi, vob, iso, mkv, plus more.
  • User Options for your exported html Menu Pages and Detail pages.
    • Export Location
    • Genre/Filter Setup/Selection, ... 20 filters are completely customizable.
    • Background image selection for Index, Detail and Actor pages.
    • Selectable Play Button images.
    • Index Movie Cover size, and columns per page, and covers per page.
    • Notes section w/ Goofs, Trivia, Film locations, etc.
    • Title pages can be renamed, .. as well as main index filename.
    • IMDB rating, Video format, SeenIt, Display back cover, .. all selectable.
    • Show Crew, Cast, Actor Links are all selectable.
    • 5 Movie locations are supported as well as "nested sub-folders"
    • LOCATOR button to show available NETWORK SHARES.
  • Automatic setup of the Movie Collector Software.
  • Filters, Sorts, Language, and initial setting are now automatically set for you! (when you run the Setup program)
  • Optional generation & export of Actor/Director Biography pages.
    • 400 major Actors/Directors are available for export! The scripts will automatically SCAN your movie database to determine which actors/directors are used,and export only those pages.
  • Optional cleanup of the exported thumbnails using IrfanView.
  • Optional conversion/mirroring/Blue Glow of the Movie Cover. (imagemagick)
  • Supports Box Sets & Episodes. Version 6 now supports added features for Series and Boxsets!!!
  • Supports English and 6 Languages!! (for Genre Links & Page Titles)
  • LITE mode - Makes it easy for the New User to get setup and running.
    • Only four inputs required to begin enjoying the Movie Jukebox.
  • Easy update when you add additional movies at a later date! Update times for adding additional movies: approx 20 min. for a 1100 movie database.
  • Standard Definition TV Mode, ... now support for Std. Def. TVs!

joe's mediabox
Music Album Browser
  • scans your harddisk
  • reads the id3-tags of your mp3
  • generates playlists
  • fetches missing covers from amazon.de
  • supports *cover*.jp , *front*.jpg, *folder*.jpg within your mp3-folder
  • supports three different menus
  • simple static menu for about 40 albums
  • php menu with supportf of searching for artist, genre, year(works only if id3-tags are correct)
  • album flow menu (based on michael t's movie flow)

Kroozbox media player for NMT Kroozbox is a database to HTML gateway written in Java that can run under Windows or Linux. The original goal was to have access to PVD (Personal Video Database) directly from the Popcorn without any export and remashing of the data (needed with other JukeBox). However, it can also be use to access any type of database content. The system is open, making templates to have access to any database is easy (SQL command knowledge necessary). There are also templates for Extreme Movie Manager and My Movies. Kroozbox will not run locally on the NMT box. It is intended to be run on an PC located on your local network. Features:
  • New in 1.7: Music Jukebox
  • SSDP (UPNP) - plublish any number of services
  • HTTP transport.
  • Firbird DB, MySQL, etc
  • Template based
  • Windows NT service
  • Easy HTTP to SQL language integration
  • Easy installation
  • ...

пятница, 5 июня 2009 г.

Граббинг audio дисков

Я использую терминальный интерфейс abcde для грабления дисков.

Команда граббинга выглядит так:
$ abcde -c .abcde.conf


Для того, чтобы это работало должны быть установлены abcde, lame и id3v2
$ sudo apt-get install abcde lame id3v2
Мой файл конфигурации .abcde.conf
# -----------------$HOME/.abcde.conf----------------- #
#
# A sample configuration file to convert music cds to
# MP3 format using abcde version 2.3.99.6
#
# http://andrews-corner.org/abcde.html
# -------------------------------------------------- #

# Specify the encoder to use for MP3. In this case
# the alternatives are gogo, bladeenc, l3enc, xingmp3enc, mp3enc.
MP3ENCODERSYNTAX=lame

# Specify the path to the selected encoder. In most cases the encoder
# should be in your $PATH as I illustrate below, otherwise you will
# need to specify the full path. For example: /usr/bin/lame
LAME=lame

# Specify your required encoding options here. Multiple options can
# be selected as '--preset standard --another-option' etc.
LAMEOPTS='--preset extreme'

# Output type for MP3.
OUTPUTTYPE="mp3"

# The cd ripping program to use. There are a few choices here: cdda2wav,
# dagrab, cddafs (Mac OS X only) and flac.
CDROMREADERSYNTAX=cdparanoia

# Give the location of the ripping program and pass any extra options:
CDPARANOIA=cdparanoia
CDPARANOIAOPTS="--never-skip=40"

# Give the location of the CD identification program:
CDDISCID=cd-discid

# Give the base location here for the encoded music files.
OUTPUTDIR="$HOME/music/"

# Decide here how you want the tracks labelled for a standard 'single-artist',
# multi-track encode and also for a multi-track, 'various-artist' encode:
OUTPUTFORMAT='${OUTPUT}/${ARTISTFILE}/${ALBUMFILE}/${TRACKNUM}-${TRACKFILE}'
VAOUTPUTFORMAT='${OUTPUT}/VA-${ALBUMFILE}/${TRACKNUM}-${ARTISTFILE}-${TRACKFILE}'

# Decide here how you want the tracks labelled for a standard 'single-artist',
# single-track encode and also for a single-track 'various-artist' encode.
# (Create a single-track encode with 'abcde -1' from the commandline.)
ONETRACKOUTPUTFORMAT='${OUTPUT}/${ARTISTFILE}-${ALBUMFILE}/${ALBUMFILE}'
VAONETRACKOUTPUTFORMAT='${OUTPUT}/Various-${ALBUMFILE}/${ALBUMFILE}'

# Put spaces in the filenames instead of the more correct underscores:
mungefilename ()
{
echo "$@" | sed s,:,-,g | tr / _ | tr -d \'\"\?\[:cntrl:\]
}

# What extra options?
MAXPROCS=2                                # Run a few encoders simultaneously
PADTRACKS=y                               # Makes tracks 01 02 not 1 2
EXTRAVERBOSE=y                            # Useful for debugging
EJECTCD=y                                 # Please eject cd when finished :-)


PS.
Не смотря на то, что технически нетрудно хранить и слушать музыку в lossless формате, я предпочитаю хранить ее в проприетарном mp3.

Причины простые: я, уезжая куда-нибудь, беру с собой iPod или обычный телефон. А они поддерживают большей частью формат mp3.

Если хотите знать больше о Grabbing (Ripping) CD дисков в Ubuntu, то здесь Вы найдете исчерпывающую информацию: Ubuntu Documentation > Community Documentation > CDRipping





суббота, 18 апреля 2009 г.

Слушаем www.101.ru на HDX 1000

Я уже писал ранее, что товарищи из Корбины поодключали половину радиостанций, которые я слушал через их внутреннюю сеть на моем HDX 1000. А мне нравились радио от www.101.ru. Последнее время слушал русское регги. Их (Корбины) польза была в том, что потоковое радио воспроизводилось в формате понятном для Networked Media Tank. Да помогут нам идеи Чучхе. Будем сами решать эту задачу. Идея состоит в том, что на какой нибудь машине запустить программу приема, транскодирования и трансляции потокового радио. Первое что попадается в поисковиках - это vlc. Вот её и попробуем. Далее все действия выполняются на примере www.101.ru, Русское Регги. Адрес потока этой радиостанции : mms.online.ru/c14_4_128?st=040761200123645986120090418
На любой компьютер, находящийся в сети любым способом (через менеджер пакетов или из командной строки) устанавливаем пакет vlc и запускаем его. Я ставил на Asus eee 901, на котором запущена Ubuntu.
На вкладке Media->Open Netwok вводим протокол потока mms и адрес потока. Выбираем пункт меню Stream Alt-S
Play locally - заставит vlc воспроизводить поток на компьютере, где запускается vlc. Галка на HTTP - поределяет протокол для транслируемого потока. В поле Address указываем ip компьютера, где запущен vlc. В поле Port, соответственно указываем порт, в который будет воспроизводится поток. Выбираем Profile: Ogg/Vorbis. Можно выбрать и mp3, но он проприетарный и для него нужно ставить дополнительные библиотеки.
На HDX1000 создаем html файл следующего содержания:
<html><b>
           Test www.101.ru Russian Reggey<br><br><br>
<a href="http://192.168.1.172:1234" aod>Russian Reggey</a>
</b>
</html>
Открываем его на HDX 1000 и нажимаем кнопку Ok на пульте Секунд через 10 радиостанция начнет воспроизводится. Вместо графического пакета vlc можно запустить консольный вариант cvlc:
>cvlc -vvv mms://mms.online.ru/c14_4_128?st=040761200123645986120090418 --sout "#transcode{acodec=vorb,ab=128,channels=2}:duplicate{dst=std{access=http,mux=ogg,dst=192.168.1.172:1234}}"