Как читать файл iTunes XML в PHP
по какой-то причине iTunes решил использовать нестандартные форматы XML со своими файлами... так что мне трудно читать его с SimpleXMLElement...
iTunes в формате XML пример:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Major Version</key><integer>1</integer>
<key>Minor Version</key><integer>1</integer>
<key>Application Version</key><string>10.1.1</string>
<key>Features</key><integer>5</integer>
<key>Show Content Ratings</key><true/>
<key>Music Folder</key><string>file://localhost/D:/iTunes/Bob%20Russell%20Sermons/iTunes%20Media/</string>
<key>Library Persistent ID</key><string>B8EB1073DB45BBA1</string>
<key>Tracks</key>
<dict>
<key>290</key>
<dict>
<key>Track ID</key><integer>290</integer>
<key>Name</key><string>01-03 Good News</string>
<key>Artist</key><string>Bob Russell</string>
<key>Album</key><string>Not in Series</string>
<key>Grouping</key><string>Gospel, Decision Day, Salvation, Sin, Commandments, Mercy, Grace, Jesus Christ, Crucifixion, Resurrection, Justice, Hope</string>
<key>Genre</key><string>Speech</string>
<key>Kind</key><string>MPEG audio file</string>
<key>Size</key><integer>18140686</integer>
<key>Total Time</key><integer>1774132</integer>
<key>Year</key><integer>1999</integer>
<key>Date Modified</key><date>2010-09-09T17:41:58Z</date>
<key>Date Added</key><date>2011-01-18T19:31:43Z</date>
<key>Bit Rate</key><integer>80</integer>
<key>Sample Rate</key><integer>44100</integer>
<key>Comments</key><string>John 3:16-21; Light has come into the world, but men loved darkness; Romans 1:20; gather you as a mother hen gather chicks;1 Corinthians 15:19</string>
<key>Artwork Count</key><integer>1</integer>
<key>Persistent ID</key><string>7B3B348BF9BB95CE</string>
<key>Track Type</key><string>File</string>
<key>Location</key><string>file://localhost/D:/iTunes/Bob%20Russell%20Sermons/Sermons/1999/01-03%20Good%20News.mp3</string>
<key>File Folder Count</key><integer>3</integer>
<key>Library Folder Count</key><integer>1</integer>
</dict>
Вывод Через SimpleXML:
SimpleXMLElement Object
(
[key] => Array
(
[0] => Track ID
[1] => Name
[2] => Artist
[3] => Album
[4] => Genre
[5] => Kind
[6] => Size
[7] => Total Time
[8] => Year
[9] => Date Modified
[10] => Date Added
[11] => Bit Rate
[12] => Sample Rate
[13] => Comments
[14] => Artwork Count
[15] => Persistent ID
[16] => Track Type
[17] => Location
[18] => File Folder Count
[19] => Library Folder Count
)
[integer] => Array
(
[0] => 332
[1] => 6419273
[2] => 1415262
[3] => 1991
[4] => 32
[5] => 22050
[6] => 1
[7] => 3
[8] => 1
)
[string] => Array
(
[0] => 07-07 Thank God for America
[1] => Bob Russell
[2] => No Series
[3] => Speech
[4] => MPEG audio file
[5] => Isaiah 40:13-26
[6] => 94BD9A32817C24F1
[7] => File
[8] => file://localhost/D:/iTunes/Bob%20Russell%20Sermons/Sermons/1999/07-07%20Thank%20God%20for%20America.mp3
)
[date] => Array
(
[0] => 2010-05-28T03:27:34Z
[1] => 2011-01-18T19:31:47Z
)
)
я сталкиваюсь с проблемами, потому что ключи массива несовместимы, Если информация отсутствует. В одной речи он может иметь 8 целочисленных значений, в другой-5.... Какой лучший способ для меня прочитать эти данные?
2 ответов
Это plist XML-файл. Apple использует их много. Я бы рекомендовал найти библиотеку, которая анализирует файл plist в правильную собственную структуру данных. plistParser выглядит полезным.
plistParser пример:
<?php
include("PlistParser.inc");
$parser = new plistParser();
$plist = $parser->parse(dirname(__FILE__) . "/iTunes.xml");
var_dump($plist);
?>
выход:
array(8) {
["Major Version"]=>
int(1)
["Minor Version"]=>
int(1)
["Application Version"]=>
string(5) "8.0.1"
["Features"]=>
int(5)
["Show Content Ratings"]=>
bool(true)
["Music Folder"]=>
string(60) "file://localhost/Users/testUser/Music/iTunes/iTunes%20Music/"
["Library Persistent ID"]=>
string(15) "C39203948AF3D3E"
["Tracks"]=>
array(1) {
[1]=>
array(25) {
["Track ID"]=>
int(1)
["Name"]=>
string(8) "My Track"
["Artist"]=>
string(9) "My Artist"
["Album"]=>
string(8) "My Album"
["Genre"]=>
string(8) "My Genre"
["Kind"]=>
string(15) "MPEG audio file"
["Size"]=>
int(123456)
["Total Time"]=>
int(123456)
["Track Number"]=>
int(1)
["Year"]=>
int(2008)
["Date Modified"]=>
string(20) "2008-03-03T03:33:33Z"
["Date Added"]=>
string(20) "2008-03-03T03:33:33Z"
["Bit Rate"]=>
int(128)
["Sample Rate"]=>
int(44100)
["Comments"]=>
string(20) "All Rights Reserved."
["Release Date"]=>
string(20) "2007-03-12T04:01:37Z"
["Persistent ID"]=>
string(14) "C3E339393939E3"
["Track Type"]=>
string(4) "File"
["Podcast"]=>
bool(false)
["Unplayed"]=>
bool(true)
["File Type"]=>
int(123456)
["File Creator"]=>
int(123456)
["Location"]=>
string(66) "file://localhost/Users/testUser/Music/iTunes/iTunes%20Music/my.mp3"
["File Folder Count"]=>
int(4)
["Library Folder Count"]=>
int(1)
}
}
}
немного поздно, но я использовал этот точный совет для своего проекта, и я использовал plist parser почти год. Большая проблема заключается в том, что это своего рода общее решение для анализа Plist, хорошо адаптированное к конфигурационным и двоичным файлам, но оно не обрабатывает большие библиотеки iTunes без использования сотен мегабайт ОЗУ. Недавно я создал парсер на основе SAX для php, который будет правильно транслироваться через файл iTunes, доставляя правильно отформатированный массив для каждой записи песни.
в статья, включая GitHub gists, вам понадобится здесь:
http://streeme.posterous.com/how-to-read-an-itunes-music-library-xml-file