我正在尝试从iTunes的.ITC2文件转储专辑图片.我能做到的女巫.但在我尝试转储图像之前,我需要记下它对应的Album/Track/Artist(三者中的任何一个).有没有人发现他们是否改变了缓存文件的命名方式?因为文件名为"2100F8A77FA24601-F2E26C349A9AB861.itc2","2100F8A77FA24601"实际上是我的库ID,但在我的库的XML文件中找不到"F2E26C349A9AB861".有人可以向我解释如何将itc2文件与位于XML文件中的曲目相关联.
我确实从上面的链接获得了有关如何设置iTunes的一些信息.但这篇文章已经过时,并不是100%正确到今天的iTunes版本(v11).
谢谢,Throdne
小智 2
嗯,实际上,.itc2 文件名的第二部分应该是iTunes Library.xml文件内的曲目持久 ID 。也许您有已删除曲目的艺术作品缓存?
艺术品的路径可以通过从 XML 库检索的信息来计算,如下所示:
[itunes library folder]/Album Artwork/Cache/[Library Persistent ID]/XX/YY/ZZ/[Library Persistent ID - Track Persistent ID].itc2
Run Code Online (Sandbox Code Playgroud)
在哪里:
XX: First hex digit from the end in the track persistent id in decimal form
YY: Second hex digit from the end in the track persistent id in decimal form
ZZ: Third hex digit from the end in the track persistent id in decimal form
Run Code Online (Sandbox Code Playgroud)
因此,如果:
Library Persistent ID = BEAE1DB35624CB18
Track Persistent ID = 2488665ADBC5420F
Run Code Online (Sandbox Code Playgroud)
那么文件夹是:
[itunes library folder]/Album Artwork/Cache/BEAE1DB35624CB18/15/00/02/BEAE1DB35624CB18-2488665ADBC5420F.itc2
Run Code Online (Sandbox Code Playgroud)
iTunes XML 库使用plist xml 格式,这是 XML 的错误做法。尽管如此,您仍然可以通过一些 XSLT 魔法找到解决办法。
检查下面的 java 代码,它将转换iTunes Library.xml并将计算出的艺术作品路径与艺术家和曲目名称一起放入output.xml中:
测试.java:
import java.io.File;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
public class Test {
public static void main(String[] args) throws Exception {
String libraryFolder = "/Path/To/iTunes/";
TransformerFactory factory = TransformerFactory.newInstance();
Source xslt = new StreamSource(new File("convert.xsl"));
Transformer transformer = factory.newTransformer(xslt);
transformer.setParameter("library_folder", libraryFolder);
Source text = new StreamSource(new File(libraryFolder + "iTunes Library.xml"));
transformer.transform(text, new StreamResult(new File(libraryFolder + "output.xml")));
}
}
Run Code Online (Sandbox Code Playgroud)
和convert.xsl:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:param name="library_folder"/>
<xsl:template match="plist">
<xsl:variable name="libid">
<xsl:value-of select="dict/key[. = 'Library Persistent ID']/following-sibling::string[1]"/>
</xsl:variable>
<tracks>
<xsl:apply-templates select="dict/key[. = 'Tracks']/following-sibling::dict[1]/dict" mode="track">
<xsl:with-param name="libid"><xsl:value-of select="$libid"/></xsl:with-param>
</xsl:apply-templates>
</tracks>
</xsl:template>
<xsl:template match="dict" mode="track">
<xsl:param name="libid" />
<entry>
<xsl:variable name="trackid">
<xsl:value-of select="key[. = 'Persistent ID']/following-sibling::string[1]"/>
</xsl:variable>
<xsl:variable name="dig1">
<xsl:call-template name="HexToDecimal">
<xsl:with-param name="hexNumber" select="substring($trackid, string-length($trackid))"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="dig2">
<xsl:call-template name="HexToDecimal">
<xsl:with-param name="hexNumber" select="substring($trackid, string-length($trackid) - 1, 1)"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="dig3">
<xsl:call-template name="HexToDecimal">
<xsl:with-param name="hexNumber" select="substring($trackid, string-length($trackid) - 2, 1)"/>
</xsl:call-template>
</xsl:variable>
<artist><xsl:value-of select="key[. = 'Artist']/following-sibling::string[1]"/></artist>
<name><xsl:value-of select="key[. = 'Name']/following-sibling::string[1]"/></name>
<track_id><xsl:value-of select="$trackid"/></track_id>
<artwork><xsl:value-of select="concat($library_folder, 'Album Artwork/Cache/',$libid,'/',$dig1,'/',$dig2,'/',$dig3,'/',$libid,'-',$trackid,'.itc2')"/></artwork>
</entry>
</xsl:template>
<!-- Very simple hex to decimal, only one digit -->
<xsl:template name="HexToDecimal">
<xsl:param name="hexNumber" />
<xsl:value-of select="format-number(number(substring-before(substring-after('00/11/22/33/44/55/66/77/88/99/A10/B11/C12/D13/E14/F15/a10/b11/c12/d13/e14/f15/', $hexNumber), '/')),'00')" />
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1248 次 |
| 最近记录: |