Бесконечный проигрыватель

В деле проигрывания mp3-файлов, кажется, не осталось белых пятен, но я таки решил внести свои 5 копеек.

Вот решил человек, скажем, послушать музыку. Что в этом деле самое сложное? Технические вопросы вынесем за скобки, проигрывателей сейчас — на любой вкус. Самое сложное находится вне сферы IT. Самое сложное — составить хороший плэй-лист. Такой, чтобы хватило на несколько часов, пока вы, скажем, клеите обои в квартире. Вот такую задачу я и решил на коленке с помощью языка Groovy.


Итак, берем подборку музыки гига на 4. Естественно, в этой коллекции композиций, которые обладателю нравятся, не более половины. Открываем последовательно каталоги с «песнями» и в именах любимых файлов, ставим лидирующие плюсы, например так:


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

Далее создаем вот такой скрипт и помешаем его в файл Player.groovy. Можно скопировать прямо отсюда. Скрипт отлажен и работает (в том числе прямо сейчас у меня в наушниках).

#!/usr/bin/groovy

import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel;

// Это функция для копирования потока в поток, на ее разборе можно не заморачиваться

def stream2stream = {is, os ->
 src  = Channels.newChannel(is);
 dest = Channels.newChannel(os);
 buffer = ByteBuffer.allocateDirect(16 * 1024);
 while (src.read(buffer) != -1) {
  buffer.flip();
  dest.write(buffer);
  buffer.compact();
 }
 buffer.flip();
 while (buffer.hasRemaining())dest.write(buffer);
}

// А вот отсюда начинается вся "соль"

v = new Vector()

new File(args[0]).eachFileRecurse {
 if(it.getName().startsWith('+') && it.getName().endsWith('mp3'))v.add(it)
}

Collections.shuffle(v) // ...и хорошенько перемешиваем!
                       //    Одна и та же подборка композиций
                       //    за счет этого каждый раз 
                       //    будет восприниматься как новая.

v.each{stream2stream(new FileInputStream(it), System.out)}


Часть этого кода (функцию копирования потока в поток) я уже публиковал на Мтааламу. Так что вся соль — в последних строках. Создаем рекурсивный список файлов заданного каталога, запихиваем в вектор и перемешиваем в случайном порядке (shuffle). Затем все эти файлы гоним непрерывным потоком на output программы. Этот output можно передать по конвейеру, например, простейшему аудиоплееру — mpg123,

/usr/bin/groovy Player.groovy /mnt/offline | mpg123 -

(вместо /mnt/offline нужно указать каталог с музыкой). А можно направить поток на вход программы ffmpeg и далее — ffserver'у, организовав многочасовую Интернет-трансляцию (пиратскую, вестимо).

/usr/bin/groovy Player.groovy /mnt/offline | ffmpeg -i - http://192.168.99.99:9999/radio.ffm
  • +9
  • 27 июля 2010, 03:05
  • yababay

Комментарии (4)

RSS свернуть / развернуть
+
0
Ну и способ
Тру юникс вэй послужать музычку
avatar

Gangsta

  • 27 июля 2010, 12:51
+
0
Да, ловлю себя на мысли, что без таких извращений мне уже просто послушать музычку как-то и не в кайф .

Смех смехом, а время, за которое я этот способ организовал, сопоставимо с затратами на создание плэйлиста для любого известного проигрывателя. Мне кажется удобно: зашел в любой каталог, запустил скрипт — и слушаешь только избранные мелодии рекурсивно не отвлекаясь несколько часов на управление проигрывателем.
avatar

yababay

  • 27 июля 2010, 13:39
+
0
Да unix подобные системы сами по себе — сплошной инструмент разработки. Этим мне они и нравятся — конечно способ воспроизведения да и вообще работа в консоли может показаться сложным, но в итоге время экономит. Пара строк скрипта заменяют много нажатий мышки)
avatar

Sergei_T

  • 27 июля 2010, 20:27
+
0
Во Лихо-плей !
avatar

Markony

  • 27 июля 2010, 17:40

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.