我创建了一个 XSPF 歌曲播放列表,需要将其复制到特定目录,如何做到这一点?最好是 Python。
编辑:几年前我已经发布了这个问题,当时我对事情的运作方式知之甚少。我已经设法使用我编写的一个小型 Python 脚本来做到这一点。
我创建了一个 XSPF 歌曲播放列表,需要将其复制到特定目录,如何做到这一点?最好是 Python。
编辑:几年前我已经发布了这个问题,当时我对事情的运作方式知之甚少。我已经设法使用我编写的一个小型 Python 脚本来做到这一点。
我自己在其他地方找不到这个,所以我编写了一个快速而肮脏的 PHP hack 来做到这一点(就在现在)。这绝不是一个优雅的解决方案,但对于我的目的来说已经足够好了。在最后注释掉该copy
部分并用一些echo
结构替换它以确保您的代码复制正确的文件可能是一个好主意。
帮助入口:
Usage example: ./copy_xspf.php --e -i myMusic.xspf -o /home/foo/bar
-i filename or --input filename - XSPF file to parse
-o directory or --input directory - directory to copy to (needs to exist!)
--help - display this help and terminate
脚本来源:
#!/usr/bin/php
<?php
// Quick and dirty hack.
for($i = 1; $i < count($argv); ++$i) {
if($argv[$i] == '--help' || $argv[$i] == '-e') {
echo "Usage example: ./copy_xspf.php --e -i myMusic.xspf -o /home/foo/bar\n";
echo "-i filename or --input filename - XSPF file to parse\n";
echo "-o directory or --input directory - directory to copy to (needs to exist!)\n";
echo "--help - display this help and terminate\n";
die();
}
if($argv[$i] == '--input' || $argv[$i] == '-i') {
if(!isset($argv[$i+1])) {
die("No input filename given (xspf file), use -i filename or --input filename\n");
} else {
$filename = $argv[$i+1];
}
}
if($argv[$i] == '--output' || $argv[$i] == '-o') {
if(!isset($argv[$i+1])) {
die("No output directory given, use -o directory or --output directory\n");
} else {
$outputDir = $argv[$i+1];
}
}
}
if(!isset($filename) || empty($filename)) {
die("No input filename given (xspf file), use -i filename or -input filename\n");
}
if(!isset($outputDir) || empty($outputDir)) {
die("No output directory given, use -o directory or --output directory\n");
} else {
$outputDir = rtrim($outputDir, '/');
}
$xml = file_get_contents($filename);
preg_match_all('#<location>(.*?)</location>#', $xml, $matches);
$matches = $matches[1]; // Select only the contents of (.*?), not the entire pattern
$matches = preg_replace('#file://(.*)#', '\\1', $matches); // Remove file://
foreach($matches as $key => $value) {
$matches[$key] = urldecode($value);
$matches[$key] = html_entity_decode($matches[$key]);
}
foreach($matches as $value) {
$base = basename($value);
echo "Copying $base ...\n";
copy($value, "$outputDir/$base");
}
我构建了一个 python 脚本来做同样的事情!
https://gist.github.com/coppolaemilio/13cdff09abb93ee6ed50f8f300c1327b
import os
from urllib.parse import unquote
from xml.dom import minidom
import shutil
import sys
# Read all files alongside this script
for FILE in os.listdir('.'):
if '.xspf' in FILE:
DEST_DIR = FILE.replace('.xspf', '')
# Parse xml and get the file list
file_array = []
xmldoc = minidom.parse(FILE)
itemlist = xmldoc.getElementsByTagName('location')
for s in itemlist:
filevalue = s.firstChild.nodeValue
filevalue = filevalue.replace('file:///', '')
filevalue = unquote(filevalue)
file_array.append(filevalue)
# Creating folder
if not os.path.exists(DEST_DIR):
os.makedirs(DEST_DIR)
# Copy files to new folder
for file in file_array:
head, tail = os.path.split(file)
print(file)
shutil.copy(file, './' + DEST_DIR + '/' + tail)