LINUX.ORG.RU

Копировать m3u-плейлист вместе с файлами

 


0

1

Есть m3u-плейлист. Как копировать все упомянутые в нём файлы из одного каталога в другой? Конечная цель - перенести подборку записей на другое устройство.

★★★

Последнее исправление: Dimez (всего исправлений: 2)

Написать скрипт, читающий содержимое файла и копирующий файлы из этого списка и сам файл.

Ваш К.О.

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

Хорошо, что представились, капитан, но нет, я не вашего ответа хотел. Ну и наверняка же можно без консоли - мышкой два раза кликнуть. Хотя one-liner тоже устроит.

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

Не, не ссылки, все локальные, пути относительные. Но если можно еще и скачать файлы с удаленных серверов (при наличии) то такая фича не помешает, но это уже будет решение более общей задачи.

Задача же тривиальная, наверняка есть готовое решение.

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

тут скорее –files-from=FILE подойдёт, нужно только m3u переделать под него

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

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

symon2014 ★★
()
Ответ на: комментарий от LINUX-ORG-RU

на свой страх и риск

local function m3u_transfer()
    local m3u_file , target_path = arg[1], arg[2];
    if not m3u_file or not target_path then
        error('usage ./script m3u_file target_directorry');
    end
    local m3u_file_data = io.open(m3u_file,'r');
    local line = m3u_file_data:read('*line');
    while(line) do
        if not line:find('#',1,true) then
        print(line)
        local pose = line:reverse():find('/',1,true);
        if not pose then return 0 end;
        local path = line:sub(1,#line-pose);
        pose = path:find('/',1,true);
        path = path:sub(pose,#path);
        local name = path:sub(#line-pose+2,#line)
        os.execute('mkdir -p '..target_path..'/'..path);
        os.execute('cp '..line..' '..target_path..'/'..path..'/'..name);
        end
        line = m3u_file_data:read('*line');
    end
    m3u_file_data:close();
end

m3u_transfer()

lua ./script.lua file.m3u target_dir

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от d00fy

Лишняя r погоды не делает. А так, я написал и убегаю сверкая пятками. :D

перепиши лучше на шелле

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

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от symon2014

Вы всё правильно поняли

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

Да, в данном случае все файлы локальные.

damix9 ★★★
() автор топика
Ответ на: комментарий от unDEFER
parallel "mkdir -p куда/{//}; cp -a {} куда/{//}" < playlist.m3u

Примерно такая команда вам нужна (не проверял)

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

Может DeaDBeeF?

Ну да, предположительно, есть такая фича.

Вообще программа интересная, надо попробовать. Даже распространяется по-человечески - просто в виде архива со всеми необходимыми файлами.

https://deadbeef.sourceforge.io/portable.html

These are cross-distro builds for x86_64 systems. You should use them in the following cases:
    ...
    You want the official build, created and tested by developer, linked to carefully selected (working!) library versions, built with proper settings, not messed up by some ignorant package maintainer
Позабавило.

На правах оффтопа:

Зануды не захотели ее опакечивать:

There is an open RFP bug open for 0xdeadbeef since 2010 https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=576975 but no progress has been made since 2014.
Facepalm. Даже в сраном Альте есть, а в «самом лучшем дистрибутиве для новичков» нет.

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

Это такая программка для Wine? :)

unDEFER, так не будет работать, потому что формат m3u содержит не только имена файлов.

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

Тоже задавался этим вопросом как и тс.

Сейчас ради интереса загуглил и сразу же нашел плагин для винампа с таким функционалом. Проверил - работает)

Виндовый софт рулит 👍

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

Точно!

  1. Открыть плейлист
  2. Выделить все, ПКМ -> Конвертировать
  3. Поставить галку «Копировать, если формат не изменяется», кодировщик выбрать «File Copy»
  4. Либо нажать галку Сохранить структуру каталогов и выбрать имя выходного файла %filename%, либо отжать указанную галку и заполнить это поле %list_index% %title%
  5. Нажать Ок чтобы начать запись файлов.

Спасибо, это то что нужно!

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

формат m3u содержит не только имена файлов.

Серьезно? Давно? А что там ещё может содержаться?

Пути я так понимаю. Но у меня команда сделана из расчёта этого.

unDEFER ★★★★★
()
Последнее исправление: unDEFER (всего исправлений: 1)

Есть еще одна программка AudioM. Тоже работает. Еще и создает файл плейлиста в папке назначения, хотя и с абсолютными путями, имеет красивый и очень простой интерфейс. Но не умеет сохранять оригинальную структуру каталогов или как-то менять имена звуковых файлов.

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

Я понял. Это как комментарии. Это элементарно фильтруется grep. А у gnu parallel есть директива skip().

unDEFER ★★★★★
()
Последнее исправление: unDEFER (всего исправлений: 1)
Ответ на: комментарий от Zadoff386

Конкретно это оказалось возможно сделать и линуксовыми программами, даже двумя.

Линуксового софта хватает хорошего, просто он опакечен по-дурацки.

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

Тогда односторочник будет примерно такой:

grep -v "^#" playlist.m3u | parallel "mkdir -p куда/{//}; cp -a {} куда/{//}"
unDEFER ★★★★★
()
Последнее исправление: unDEFER (всего исправлений: 1)
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.