2012-12-10 15 views
8

Ich versuche, Albumcover aus iTunes .ITC2-Dateien zu speichern. Hexe kann ich tun. Aber bevor ich versuche, das Bild zu löschen, muss ich notieren, welchem ​​Album/Track/Künstler (einer der drei) es entspricht. Hat jemand herausgefunden, ob sie die Benennung der Cache-Dateien geändert haben? Weil "2100F8A77FA24601-F2E26C349A9AB861.itc2" "2100F8A77FA24601" tatsächlich meine Bibliotheks-ID ist, aber "F2E26C349A9AB861" nirgendwo in der XML-Datei meiner Bibliothek zu finden ist. Kann mir jemand erklären, wie man itc2-Dateien mit Spuren korreliert, die sich in der XML-Datei befinden.Verbinden der iTunes ITC2-Dateien und "iTunesLibrary.XML"

reference

Ich habe eine wenig Informationen darüber, wie iTunes ist aus dem obigen Link Setup. Aber dieser Beitrag ist veraltet und entspricht nicht zu 100% der heutigen Version von iTunes (v11).

Danke, Throdne

Antwort

2

Nun, eigentlich sollte der zweite Teil der .itc2 Dateinamen der Spur persistente ID sein, die Library.xml Datei im iTunes ist. Vielleicht haben Sie den Grafik-Cache für eine gelöschte Spur?

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

Wo:

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 

Also, wenn:

Library Persistent ID = BEAE1DB35624CB18 
Track Persistent ID = 2488665ADBC5420F 

Dann

Der Weg zum Kunstwerk aus der XML-Bibliothek auf diese Weise abgerufen von Informationen berechnet werden Der Ordner lautet:

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

Die iTunes XML-Bibliothek verwendet die plist xml format, die XML ist wrong. Trotzdem kannst du dich mit etwas XSLT-Zauberei zurecht finden.

Überprüfen Sie den Java-Code unten, dass die iTunes Library.xml verwandeln und stellen den berechneten Kunstwerk Pfad neben Künstler und Namen in output.xml verfolgen:

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

Und 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

Danke für den Beitrag, Es war sehr informativ und hilfreich. Aber kannst du über die xx, yy und zz gehen? Ich verstehe sie nicht vollständig. Kann mir vielleicht zeigen, wie man das Hex des ... Tracks berechnet? – Throdne

+1

Nehmen Sie zum Beispiel die Spur persistent ID: 2488665ADBC5420F. Sie endet mit 20F -> 02, 00, 15 in Dezimalform. Also der Ordner ist/15/00/02 /. –