scripts

среда, 7 августа 2013 г.

Формирование плей-листа на nodejs. Продолжение.

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

1.Объявления.

Немного расскажу о структуре плей-листа. Суть такая. Есть две папки notice/ и videos/.
В notice/ находятся объявления, которые надо часто показывать, а в videos/ - каталоги с роликами из которых случайным образом и формируется плей-лист. Таким образом структура плей-листа примерно такая:

ролик из videos/subdir1/
ролик из notice/
ролик из videos/subdir2/
ролик из notice/

Теперь появилась необходимость - обеспечить возможность указания нескольких notice в заданном порядке.

ролик из videos/subdir1/
ролик  notice/notice1
ролик  notice/notice2
ролик из videos/subdir2/
ролик  notice/notice1
ролик  notice/notice2

Я эту проблему решил так.
Ролики notices указываются в конфиге в виде массива, таким образом возможно задать последовательность их при формировании плей-листа.
notices : ['disp.mpg', 'mess.mpg'], // объявления
В программе при формировании записи плей-листа в цикле добавляются notices
 // добавление notices
for ( i = 0, len = config.notices.length; i < len; i += 1 ) {
   pl += '\n' + (nStr + (i + 1))  + ',type,0';
   pl +='\n' + (nStr + (i + 1))  + ',filename,' + config.gp26_notice + config.notices[i];
}
Логика такая - зайти в папку videos/ пройтись по всем ее подкаталогам, из каждого случайным образом взять ролик, а при формировании записи в плей-листе для ролика добавлять записи для объявлений.

2. Размер плей-листа.

 Второй вопрос, который надо было решить - размер плей-листа. Поясню. Допустим в videos/ четыре подкаталога 01_tv/, 02_miac/, 03_gp26/, 04_mult/.
Плей-лист формируется раз в сутки и крутиться целый день. При такой структуре каталога плей лист получается примерно таким
MPCPLAYLIST
1,type,0
1,filename,d:/gp26_videos/videos/01_tv/vrachi_13102011.mp4
2,type,0
2,filename,d:/gp26_videos/notice/disp.mpg
3,type,0
3,filename,d:/gp26_videos/notice/mess.mpg
4,type,0
4,filename,d:/gp26_videos/videos/02_miac/obraz_jizni_3.mp4
5,type,0
5,filename,d:/gp26_videos/notice/disp.mpg
6,type,0
6,filename,d:/gp26_videos/notice/mess.mpg
7,type,0
7,filename,d:/gp26_videos/videos/03_gp26/smotrovoi.mpg
8,type,0
8,filename,d:/gp26_videos/notice/disp.mpg
9,type,0
9,filename,d:/gp26_videos/notice/mess.mpg
10,type,0
10,filename,d:/gp26_videos/videos/04_mult/Masha_i_Medved_25.avi
11,type,0
11,filename,d:/gp26_videos/notice/disp.mpg
12,type,0
12,filename,d:/gp26_videos/notice/mess.mpg

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

numOfRep : 3, // кол-во повторов (сколько в цикле формировать плей-лист с дозаписью)

Реализация логики такая:

// чтобы плей-лист не был слишком коротким, можно увеличить количество повторов
            for ( rep = 0; rep < config.numOfRep; rep += 1 ) {
                // Обойти все подкаталаги и для каждого создать запись в плей-листе
                _.each(subdirs, function (subdir, i) {
                    createRecord(curStrPl, subdir + '/');
                    curStrPl += config.numOfNotices + 1;
                });
            }

 Пока разбирался с решением этих задач немного "причесал" код, сделал его более понятным и прозрачным. Вынес логику записи плей-листа в отдельную функцию.
/**
 *  Запись плей-листа на диск
 */
function recPl () {
    fs.open(config.plDir + config.plName,"w",0644, function (err, file_handle) {
        if ( !err ) {
            fs.write(file_handle, pl, null, 'ascii', function (err, writenn) {
                if (!err) {
                    logger.log('info', 'Playlist ' + config.plName + ' created.');
                }
            });
        } else {
            logger.log('error', 'Record playlist: Error opening file ' + config.plDir + config.plName);
        }
    });
}
Сам проект можно загрузить здесь.

Комментариев нет:

Отправить комментарий