2012-12-10 24 views
8

Tôi đang cố gắng xuất bản ảnh bìa album từ các tệp .ITC2 của iTunes. Phù thủy tôi có thể làm. Nhưng trước khi tôi thử và đổ hình ảnh, tôi cần phải lưu ý những gì Album/Track/Artist (bất kỳ của ba) mà nó tương ứng với. Có ai phát hiện ra nếu họ thay đổi cách các tập tin bộ nhớ cache được đặt tên? Bởi vì, với tên tệp là "2100F8A77FA24601-F2E26C349A9AB861.itc2" "2100F8A77FA24601" trên thực tế, ID thư viện của tôi nhưng "F2E26C349A9AB861" không được tìm thấy trong tệp XML của Thư viện của tôi. Ai đó có thể giải thích cho tôi làm thế nào để tương quan các tập tin itc2 với các bài hát được đặt trong tập tin XML.Liên kết các tệp ITC2 của iTunes và "iTunesLibrary.XML"

reference

tôi đã làm được một ít thông tin về cách iTunes được thiết lập từ liên kết ở trên. Nhưng bài đăng này đã lỗi thời và không chính xác 100% so với phiên bản iTunes hiện tại (v11).

Cảm ơn, Throdne

Trả lời

2

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> 
+0

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

+1

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 /. –

Các vấn đề liên quan