J'ai une liste de lecture VLC (.xspf) de plus de 100 chansons réparties sur tout mon ordinateur. Je cherche un moyen de sauvegarder cette liste de lecture et toutes ses chansons dans un autre dossier - lecteur flash, lecteur externe ou tout simplement un autre emplacement de mon ordinateur. Comment puis-je faire ceci?
EDIT
La playlist xspf est en XML et se présente sous un tel format:
<?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>
Cela devrait le faire, en supposant qu'aucun de vos noms de fichiers ne contienne <
:
grep -Po 'file://\K[^<]+' now.xspf | while IFS= read -r file; do
song="${file//%20/ }"
cp "$song" /path/to/target;
done
Le drapeau -o
indique à grep
d’imprimer uniquement la partie correspondante d’une ligne et le -P
active les expressions régulières compatibles Perl qui nous donnent \K
. Le \K
fait en sorte que grep
supprime tout ce qui correspond avant, de sorte que file://\K[^<]+
corresponde à la plus longue chaîne de caractères non -<
précédant file://
. .
Ceci est ensuite alimenté dans une boucle while avec IFS=
pour désactiver le fractionnement de Word à l'espace et -r
pour traiter les barres obliques inverses comme des caractères normaux.
La ligne SONG="${file//%20/ }"
convertit tous les %20
en (espaces vides). Sinon, il renvoie une erreur "chemin introuvable" lorsqu'il tente de copier les chansons de la dernière ligne.
Si vos noms de fichier peuvent contenir <
, utilisez ceci à la place:
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
Remarque: Les deux solutions supposent qu'aucun de vos noms de fichiers ne contient de nouvelles lignes.