2012-12-10 9 views
8

iTunesの.ITC2ファイルからアルバムアートワークをダンプしようとしています。魔女はできます。しかし、私が試してイメージをダンプする前に、それが対応するアルバム/トラック/アーティスト(3つのうちのどれ)をメモする必要があります。キャッシュファイルの名前の変更方法を知った人は誰ですか?なぜなら、ファイル名が「2100F8A77FA24601-F2E26C349A9AB861.itc2」の場合、「2100F8A77FA24601」は実際には私のライブラリIDですが、「F2E26C349A9AB861」は私のライブラリのXMLファイルにはありません。誰かがitc2ファイルとXMLファイルにあるトラックとを関連付ける方法を私に説明することはできますか?iTunesのITC2ファイルと「iTunesLibrary.XML」のリンク

reference

私はiTunesは上記のリンクからセットアップがいかにについて少し情報を手に入れました。しかし、このポストは時代遅れであり、今日のバージョンのiTunes(v11)では100%正確ではありません。

おかげで、Throdne

答えて

2

はまあ、実際には、.itc2ファイル名の2番目の部分はのiTunes Library.xmlのファイル内にあるトラック永続化idでなければなりません。おそらく、削除されたトラックのアートワークキャッシュがありますか?

アートワークへのパスは、このようにXMLライブラリーから取得した情報から計算することができます。

[itunes library folder]/Album Artwork/Cache/[Library Persistent ID]/XX/YY/ZZ/[Library Persistent ID - Track Persistent ID].itc2 

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 

もしそうなら:

Library Persistent ID = BEAE1DB35624CB18 
Track Persistent ID = 2488665ADBC5420F 

その後フォルダは次のとおりです。

[itunes library folder]/Album Artwork/Cache/BEAE1DB35624CB18/15/00/02/BEAE1DB35624CB18-2488665ADBC5420F.itc2 

iTunes XMLライブラリではplist xml formatが使用されています。このXMLはwrongです。 まだ、いくつかのXSLTソーサリーであなたの方法を見つけることができます。

のiTunes Library.xml変換やアーティストと一緒に、計算されたアートワークのパスを入れて、のOutput.xmlに名前を追跡することは、以下のJavaコードをチェックしてください:

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"))); 
    } 
} 

そして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

ポストのおかげで、非常に有益な情報でした。しかし、あなたはxx、yy、zzを調べることができますか?私はそれらを完全に理解していません。たぶん...トラックのヘクスを計算する方法を教えてください。 – Throdne

+1

たとえば、トラックの永続ID:2488665ADBC5420Fを取得します。 20F - > 02,00,15の10進数でそれぞれ終わります。したがって、フォルダは/ 15/00/02 /です。 –

関連する問題