2013-07-30 17 views
7

Jak mogę pracować, jeśli Itunes: Preferencje: Zaawansowane: Przechowywać iTunes Folder Organized jest ustawiony programowo na Windows, mojej aplikacji Java, który współdziała z iTunes musi to wiedzieć.Jak mogę pracować, jeśli Itunes: Przechowywać iTunes Folder organizowany jest ustawiony programowo na Windows

Niestety, ani plik iTunes xml, ani interfejs API COM Itunes nie udostępniają tych informacji. Zakładam, że są to preferencje zapisane gdzie indziej, ale jak mogę sprawdzić, czy włączone, czy nie, również muszę to wiedzieć dla Kopiowanie plików do iTunes Media Folder dodawane do biblioteki

Aktualizacja: Nic w rejestrze, ale Znalazlem pliki preferencje

C: \ Users \ nazwa_użytkownika \ AppData \ Roaming \ Apple Computer \ iTunes

wydaje się jednak być szyfrowane/zakodowany, nie wiem jak odczytać wartości

Aktualizacja 2:

Zapisane kopię pliku, zmienił wartość Kopiowanie plików do iTunes Media Folder podczas dodawania iw porównaniu do biblioteki i wybrali się na zmianę

<key>Documents:132</key> 
<data> 
AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV09SQjQAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAADUXX4fAc2UWH8BAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= 
</data> 

kontra

<key>Documents:132</key> 
<data> 
AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV09SQjQAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAACwf6jgsOrUhX8BAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= 
</data> 

, ale jak widać trudno zauważyć różnicę i czy jestem zaniepokojony, że zhackowałem tę wartość, która mogłaby przerwać między wersjami iTunes, czy istnieje sposób na zdekodowanie tego pliku?

Aktualizacja 3

stwierdziliśmy, że Apache Commons Configuration obsługuje format Jabłka plist jako formacie XML http://commons.apache.org/proper/commons-configuration/apidocs/org/apache/commons/configuration/plist/XMLPropertyListConfiguration.html ale niestety nie w formacie binarnym tutaj.

Napisałem ten kod, który wyszczególnił wszystkie klucze, a następnie próbował zdekodować właściwość położenia, ponieważ wiem, że zawiera tylko jeden plik ścieżki kodera base64.

public File getITunesXMLFile() 
    { 
     String homedir = System.getProperty("user.home"); 

     File prefsFile = new File(homedir,"AppData/Roaming/Apple Computer/iTunes/iTunesPrefs.xml"); 
     try 
     { 
      XMLPropertyListConfiguration xpc = new XMLPropertyListConfiguration(prefsFile); 
      xpc.load(); 
      Iterator<String> keys = xpc.getKeys(); 
      while(keys.hasNext()) 
      { 
       String nextKey = keys.next(); 
       System.out.println(nextKey+":"+xpc.getProperty(nextKey).getClass()); 
      } 
      ArrayList location = (ArrayList)xpc.getProperty("User Preferences.iTunes Library XML Location:1"); 
      System.out.println("Location:"+location.get(0).getClass()); 
      System.out.println("Location:"+location.get(1).getClass()); 

      System.out.println("Location1:"+ new BASE64Decoder().decodeBuffer(location.get(0).toString())); 
      System.out.println("Location2:"+ new BASE64Decoder().decodeBuffer(location.get(1).toString())); 
     } 
     catch(Exception ex) 
     { 
      MainWindow.logger.log(Level.SEVERE,"Unable to open iTunes Prefs file:"+prefsFile.getName(),ex); 
     } 
     File xmlFile = new File(homedir + "/Music/iTunes/iTunes Music Library.xml"); 
     if (!xmlFile.exists()) 
     { 
      return null; 
     } 
     return xmlFile; 
    } 

ale niestety nie działa, gdy dane są zwracane jako ArrayList klasy typu [B, która nie ma sensu dla mnie, to nie jest poprawna nazwa dla klasy.

Wyjście jest

EQ Preferences.EQPresets:129:class java.util.ArrayList 
User Preferences.Documents:132:class java.util.ArrayList 
User Preferences.Gracenote User ID:1:class java.util.ArrayList 
User Preferences.Music Store:1:class java.util.ArrayList 
User Preferences.Pairing Preferences:301:class java.util.ArrayList 
User Preferences.Preferences:130:class java.util.ArrayList 
User Preferences.Radio Tuner Categories:131:class java.util.ArrayList 
User Preferences.Touch Remote Preferences:400:class java.util.ArrayList 
User Preferences.iTunes Library XML Location:1:class java.util.ArrayList 
User Preferences.iTunes..exe:AAC Encoder:class java.util.ArrayList 
User Preferences.iTunes..exe:iTunes Classic Visualiser:class java.util.ArrayList 
User Preferences.license-agreements.EA0962:class java.util.ArrayList 
User Preferences.storefront:class java.util.ArrayList 
Location:class [B 
Location:class [B 
Location1:[[email protected] 
Location2:[[email protected] 
+++++++++++++++++++++++++++++++++++++++++++++++ 

i również ten problem https://issues.apache.org/jira/browse/CONFIGURATION-262

Update 4

Znaleziony biblioteka, która obsługuje już code.google.com/p/plist binarny wygląda nadziei

Aktualizacja 5

Udało mi się użyć tej biblioteki do dekodowania położenia pliku Xml w następujący sposób (klasa Base64 z Apache Commons Codec 1).8)

public File getITunesXMLFile() 
    { 
     System.getProperties().list(System.out); 
     String homedir = System.getProperty("user.home"); 
     File prefsFile = new File(homedir,"AppData/Roaming/Apple Computer/iTunes/iTunesPrefs.xml"); 
     File xmlFile; 
     try 
     { 
      NSDictionary rootDict = (NSDictionary) PropertyListParser.parse(prefsFile); 
      NSDictionary userPrefs = (NSDictionary) rootDict.objectForKey("User Preferences"); 
      if(userPrefs!=null) 
      { 
       NSData iTunesLocation = (NSData) userPrefs.objectForKey("iTunes Library XML Location:1"); 
       if(iTunesLocation!=null) 
       { 
        String base64 = iTunesLocation.getBase64EncodedData(); 
        String filepath = new String(Base64.decodeBase64(base64),"UTF-16LE"); 
        xmlFile = new File(filepath); 
        System.out.println(filepath+":File Exists:"+xmlFile.exists()); 
        if (xmlFile.exists()) 
        { 
         return xmlFile; 
        } 
       } 
      } 
     } 
     catch(Exception ex) 
     { 
      ex.printStackTrace(); 
      //Use default then 
      xmlFile = new File(homedir + "/Music/iTunes/iTunes Music Library.xml"); 
      if (xmlFile.exists()) 
      { 
       return xmlFile; 
      } 
     } 
     return null; 
    } 

Aktualizacja 6

Próbowałem to zrobić dla danych byłem bardzo zainteresowany, jestem w stanie wyodrębnić base64encoded danych z dokumentami: 132 klucza, ale niestety próby dekodować to base64encoding naprawdę nie dostanie mnie nigdzie, może po prostu będę musiał szukać różnic w danych kodowanych base64 gdy flagi są włączone/wyłączone.

public boolean isiTunesCopyFolderToMediaFolder() 
    { 
     String homedir = System.getProperty("user.home"); 
     File prefsFile = new File(homedir,"AppData/Roaming/Apple Computer/iTunes/iTunesPrefs.xml"); 
     try 
     { 
      NSDictionary rootDict = (NSDictionary) PropertyListParser.parse(prefsFile); 
      NSDictionary userPrefs = (NSDictionary) rootDict.objectForKey("User Preferences"); 
      if(userPrefs!=null) 
      { 
       NSData options = (NSData) userPrefs.objectForKey("Documents:132"); 
       if(options!=null) 
       { 
        String base64 = options.getBase64EncodedData(); 
        System.out.println("optionBase54Data:"+base64); 
        String optionData = new String(Base64.decodeBase64(base64)); 
        System.out.println("optionData:"+optionData); 
        return true; 
       } 
      } 
     } 
     catch(Exception ex) 
     { 
      ex.printStackTrace(); 
     } 
     return false; 
    } 

wyjściowe przeważnie w przestrzenie (aaaa)

optionBase54Data: AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV09SQjQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAADUXX4fAc2UWH8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA =

oraz osadzone w wyjściu

WORB4

i

] ~ x

Przykładem pliku preferencji iTunes można znaleźć tutaj

http://www.jthink.net/jaikoz/scratch/iTunesPrefs.xml

+0

Czy obejrzałeś rejestr? – Floris

+0

Mam teraz, nic w rejestrze, ale myślę, że znalazłem preferencje –

+0

Hack: zapisz kopię pliku, zmień ustawienie preferencji (odznacz pole "Zachowaj porządek"), zapisz drugą kopię, wykonaj różnicę .. może widzisz różnicę? – Floris

Odpowiedz

0

skopiowane iTunesPrefs.xml z ustawieniem na i poza następnie porównano różnice.

z niego zaznaczone (prawda)

base64 kodowania: AAIAAAAAAAEAAAAGAQAA //// ///// wEAAHoAAP 8EAEYAbABhAHQAAAAAAAAA

wartość heksany: 02 01 06 01 01 7a 04 46 6c 61 74

Dzięki niemu nie sprawdził (fałsz)

Base64 kodowania: AAIAAAAAAAEAAAAGAQAA ///// wEAAHsAAP //// 8EAEYAbABhAHQAAAAAAAAA

Wartość Hex: 02 01 06 01 01 7b 04 46 6c 61 74

ta jest zawarta pod Preferencje: 130, jak te wartości są przechowywane Nie wiem, może można znaleźć coś na ten temat. Rozważ użycie wiersza polecenia, aby znaleźć różnice w pliku, diff dla systemu Linux lub fc dla systemu Windows.

Wiem, że to nie jest odpowiedź, ale to nie mieści się w komentarzu.