8

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

参照

上記のリンクから、iTunesのセットアップ方法に関する情報を少し入手しました。しかし、この投稿は古く、今日のバージョンのiTunes(v11)に対して100%正しいわけではありません。

ありがとう、Throdne

4

1 に答える 1

2

実際、.itc2ファイル名の2番目の部分は、iTunesLibrary.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ライブラリは、 XMLが正しく行われていないplistxml形式を使用しています。それでも、XSLTソーサリーを使って自分の道を見つけることができます。

以下のJavaコードを確認してください。これにより、iTunes Library.xmlが変換され、計算されたアートワークパスが、アーティスト名とトラック名とともに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")));
    }
}

そして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>
于 2013-03-14T17:28:19.400 に答える