Как читать файл iTunes XML в PHP - PullRequest
7 голосов
/ 26 января 2011

По какой-то причине 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 ]

9 голосов
/ 26 января 2011

Это XML-файл plist . 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)
    }
  }
}
2 голосов
/ 02 марта 2011

Уже немного поздно, но я использовал этот точный совет для своего проекта и использовал plist parser почти год.Большая проблема в том, что это своего рода общее решение для анализа Plist, хорошо адаптированное для конфигурации и двоичных файлов, но оно не поддерживает большие библиотеки iTunes, не используя сотни мегабайт оперативной памяти.Недавно я создал парсер на основе SAX для php, который будет правильно передавать поток через файл iTunes, предоставляя правильно отформатированный массив для каждой записи песни.

статья со списком необходимых вам Github приведена здесь:

http://streeme.posterous.com/how-to-read-an-itunes-music-library-xml-file

...