Salve todos os arquivos de música em uma lista de reprodução VLC xspf em outra pasta

3

Eu tenho uma lista de reprodução VLC (.xspf) de mais de 100 músicas espalhadas por todo o meu computador. Eu estou procurando uma maneira de salvar esta lista de reprodução e todas as suas músicas para outra pasta - flash drive, drive externo ou apenas um local diferente no meu computador. Como posso fazer isso?

EDITAR

A lista de reprodução xspf está em XML e é um desses formatos:

<?xml version="1.0" encoding="UTF-8"?>
<playlist xmlns="http://xspf.org/ns/0/" xmlns:vlc="http://www.videolan.org/vlc/playlist/ns/0/" version="1">
    <title>Playlist</title>
    <trackList>
        <track>
            <location>file:///home/subroot/Music/3%20Days%20Grace%20-%20Wake%20Up.mp3</location>
            <title>Wake Up</title>
            <creator>3 Days Grace</creator>
            <album>Three Days Grace</album>
            <trackNum>10</trackNum>
            <annotation> </annotation>
            <duration>206036</duration>
            <extension application="http://www.videolan.org/vlc/playlist/0">
                <vlc:id>0</vlc:id>
            </extension>
        </track>
        .
        . [Many more tracks here]
        .
    </trackList>
    <extension application="http://www.videolan.org/vlc/playlist/0">
            <vlc:item tid="0"/>
            .
            . [Other id's here]
            .
    </extension>
</playlist>
    
por Parto 23.05.2014 / 15:59

1 resposta

2

Isso deve ser feito, supondo que nenhum dos seus nomes de arquivo contenha < :

grep -Po 'file://\K[^<]+' now.xspf | while IFS= read -r file; do
    song="${file//%20/ }"
    cp "$song" /path/to/target;
done

Explicação

O -o sinalizador diz grep para imprimir apenas a parte correspondente de uma linha e o -P ativa Perl Compatible Regular Expressions que nos fornecem \K . O \K faz com que grep descarte tudo que foi correspondido antes, portanto, o resultado é que file://\K[^<]+ corresponderá à string mais longa de caracteres que não são < e que vêm após file:// .

Isso é então enviado para um loop while com IFS= para desativar a divisão de palavras no espaço em branco e -r para tratar as barras invertidas como caracteres normais.

A linha SONG="${file//%20/ }" converte todos os %20 em (espaço vazio). Caso contrário, ele retornará um erro de "caminho não encontrado" quando tentar copiar as músicas na última linha.

Se os nomes dos seus arquivos puderem conter < , use isso:

perl -lne '@foo=(m#file://(.+?)</location>#g); END{print $_ for @foo}' playlist.xspf |
while IFS= read -r file; do
    cp "$file" /path/to/target/;
done

Observação: As duas soluções assumem que nenhum dos seus nomes de arquivo contém novas linhas.

    
por terdon 23.05.2014 / 16:56