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
Czy obejrzałeś rejestr? – Floris
Mam teraz, nic w rejestrze, ale myślę, że znalazłem preferencje –
Hack: zapisz kopię pliku, zmień ustawienie preferencji (odznacz pole "Zachowaj porządek"), zapisz drugą kopię, wykonaj różnicę .. może widzisz różnicę? – Floris