2012-12-10 2 views
8

iTunes의 .ITC2 파일에서 앨범 사진을 덤프하려고합니다. 마녀 할 수있어. 그러나 이미지를 덤프하기 전에 해당 앨범/트랙/아티스트 (3 가지 중 어떤 것)를 기록해야합니다. 캐시 파일의 이름이 변경된 방법을 알고있는 사람이 있습니까? 왜냐하면 파일 이름이 "2100F8A77FA24601-F2E26C349A9AB861.itc2" "2100F8A77FA24601"이라는 것은 사실 내 라이브러리 ID이지만 "F2E26C349A9AB861"은 내 라이브러리의 XML 파일에서 찾을 수 없습니다. 누군가 XML 파일에있는 트랙과 itc2 파일의 상관 관계를 설명 할 수 있습니까? iTunes의 ITC2 파일과 "iTunesLibrary.XML"연결

reference

나는 iTunes가 위의 링크에서 설치하는 방법에 대한 약간의 정보를 얻을 수 있었다. 그러나이 게시물은 구식이며 iTunes의 최신 버전 (v11)에서는 100 % 정확하지 않습니다.

감사합니다, Throdne

답변

2

글쎄, 실제로 .itc2 파일 이름의 두 번째 부분은 아이튠즈 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의 마법으로 길을 찾을 수 있습니다.

아이튠즈 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를 살펴볼 수 있습니까? 나는 그들을 완전히 이해하지 못하고있다. 어쩌면 트랙의 16 진수를 계산하는 법을 보여 주시겠습니까? – Throdne

+1

예를 들어, 트랙 영구 ID : 2488665ADBC5420F를 가져옵니다. 20F -> 02, 00, 15 (십진법)로 끝납니다. 따라서 폴더는/15/00/02 /입니다. –

관련 문제