2012-12-10 27 views
8

लिंकिंग मैं आईट्यून्स। आईटीसी 2 फाइलों से एल्बम आर्टवर्क को डंप करने की कोशिश कर रहा हूं। चुड़ैल मैं कर सकता हूँ। लेकिन इससे पहले कि मैं छवि को आज़माकर डंप करता हूं, मुझे यह ध्यान रखना होगा कि एल्बम/ट्रैक/कलाकार (तीनों में से कोई भी) जो इसके अनुरूप है। क्या किसी को पता चला है कि क्या उन्होंने कैश फ़ाइलों का नाम बदल दिया है? क्योंकि, "2100F8A77FA24601-F2E26C349A9AB861.itc2" फ़ाइल नाम के साथ "2100F8A77FA24601" वास्तव में मेरी लाइब्रेरी आईडी है लेकिन "F2E26C349A9AB861" मेरी लाइब्रेरी की XML फ़ाइल में कहीं भी नहीं है। क्या कोई मुझे बता सकता है कि XML फ़ाइल में स्थित ट्रैक के साथ itc2 फ़ाइलों को कैसे सहसंबंधित किया जाए।आईट्यून्स आईटीसी 2 फाइलों और "आईट्यून्स लाइब्रेरी.एक्सएमएल"

reference

के बारे में मैं कैसे iTunes ऊपर के लिंक से सेटअप है एक छोटे से जानकारी प्राप्त किया था। लेकिन यह पोस्ट पुरानी है और iTunes (v11) के आज के संस्करण के लिए 100% सही नहीं है।

धन्यवाद, Throdne

उत्तर

2

ठीक है, वास्तव में, .itc2 फ़ाइल नाम का दूसरा हिस्सा ट्रैक लगातार आईडी आईट्यून Library.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 

आईट्यून्स एक्सएमएल लाइब्रेरी plist xml format का उपयोग करती है, जो एक्सएमएल wrong है। फिर भी, आप कुछ एक्सएसएलटी जादूगर के माध्यम से अपना रास्ता खोज सकते हैं।

नीचे जावा कोड की जाँच करें, कि आईट्यून 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> 
+0

पोस्ट के लिए धन्यवाद, यह बहुत जानकारीपूर्ण और सहायक था। लेकिन, क्या आप xx, yy, और zz पर जा सकते हैं? मैं उन्हें पूरी तरह से समझ नहीं रहा हूँ। शायद मुझे दिखाएं कि कैसे ... हेक्स की हेक्स की गणना करें? – Throdne

+1

उदाहरण के लिए, ट्रैक लगातार आईडी लें: 2488665ADBC5420F। यह क्रमशः दशमलव रूप में 20F -> 02, 00, 15 के साथ समाप्त होता है। तो फ़ोल्डर/15/00/02/है। –