Vâng, trên thực tế, phần thứ hai của tên tập tin .itc2 nên theo dõi id dai dẳng đó là bên trong tập tin iTunes Library.xml. Có lẽ bạn có bộ nhớ cache ảnh nghệ thuật cho một bản nhạc đã xóa?
Đường dẫn đến các tác phẩm nghệ thuật có thể được tính toán từ các thông tin lấy từ thư viện XML theo cách này:
[itunes library folder]/Album Artwork/Cache/[Library Persistent ID]/XX/YY/ZZ/[Library Persistent ID - Track Persistent ID].itc2
đâu:
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
Vì vậy, nếu:
Library Persistent ID = BEAE1DB35624CB18
Track Persistent ID = 2488665ADBC5420F
Sau đó, thư mục là:
[itunes library folder]/Album Artwork/Cache/BEAE1DB35624CB18/15/00/02/BEAE1DB35624CB18-2488665ADBC5420F.itc2
Thư viện XML iTunes sử dụng plist xml format, được thực hiện bằng XML wrong. Tuy nhiên, bạn có thể tìm thấy cách của bạn thông qua một số phép thuật XSLT.
Kiểm tra mã java dưới đây, mà sẽ chuyển đổi iTunes Library.xml và đặt đường dẫn tác phẩm nghệ thuật tính toán, cùng với nghệ sĩ và theo dõi tên trong output.xml:
Test.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")));
}
}
Và 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>
Cám ơn bài viết, Nó rất thông tin và hữu ích. Nhưng, bạn có thể đi qua xx, yy và zz không? Tôi không hoàn toàn hiểu họ. Có thể chỉ cho tôi cách tính toán hex của ... track? – Throdne
Ví dụ: lấy ID theo dõi liên tục: 2488665ADBC5420F. Nó kết thúc với 20F -> 02, 00, 15 ở dạng thập phân, tương ứng. Vì vậy, thư mục là/15/00/02 /. –