2012-12-10 17 views
8

iTunes' .ITC2 dosyalarından albüm resmini dökmeye çalışıyorum. Cadı yapabilirim. Ancak, görüntüyü denemeden önce, Album/Track/Artist (üçün herhangi biri) 'nin ne yazdığına dikkat etmeliyim. Önbellek dosyalarının adlandırılma biçimini değiştirdiklerini öğrenenler oldu mu? Çünkü, "2100F8A77FA24601-F2E26C349A9AB861.itc2" "2100F8A77FA24601" dosya adıyla aslında Kütüphane kimliğim ancak "F2E26C349A9AB861" kitaplığımın XML dosyasında bulunamadı. Birisi bana itc2 dosyalarını XML dosyasında bulunan parçalarla nasıl ilişkilendireceğini açıklayabilir. iTunes 'ITC2 dosyaları ve "iTunesLibrary.XML" bağlanıyor

reference

Ben iTunes yukarıdaki linkten kurulum nasıl hakkında biraz bilgi aldım. Ancak bu gönderi güncel olup, bugünün iTunes sürümüne (v11)% 100 doğru değildir.

sayesinde Throdne

cevap

2

Aslında .itc2 dosya adının ikinci kısmı iTunes Library.xml dosyası içinde iz kalıcı kimliği olmalıdır. Belki de silinmiş bir parça için sanat önbelleği var mı?

sanat yolu bu şekilde XML kütüphanesinden alınan bilgilerden hesaplanabilir:

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

Nerede:

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 

Yani eğer: Sonra

Library Persistent ID = BEAE1DB35624CB18 
Track Persistent ID = 2488665ADBC5420F 

klasör:

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

iTunes XML kitaplığı, wrong olan XML olan plist xml format kullanır. Yine de, bazı XSLT sihirbazı ile yolunuzu bulabilirsiniz.

iTunes Library.xml dönüşümü ve sanatçı yanında, hesaplanan sanat yolunu koymak ve output.xml içinde adını izlemek edeceğini, aşağıda java kodu kontrol edin:

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

Ve convert.xsl: yazı için

<?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

sayesinde, Çok bilgilendirici ve yardımcı oldu. Ama xx, yy ve zz’yi geçebilir misin? Onları tam olarak anlamadım. Belki de ... parçanın altını nasıl hesaplayacağımı göstersene. – Throdne

+1

Örneğin, pistin kalıcı kimliğini alın: 2488665ADBC5420F. Sırasıyla 20F -> 02, 00, 15 ile ondalık formda biter. Yani klasör/15/00/02 /. –