├── .gitignore ├── .npmignore ├── LICENSE ├── README.md ├── lib └── plist.js ├── package.json └── tests ├── Cordova.plist ├── Xcode-Info.plist ├── Xcode-PhoneGap.plist ├── airplay.xml ├── iTunes-BIG.xml ├── iTunes-small.xml ├── sample1.plist ├── sample2.plist ├── test-base64.js ├── test-big-xml.js ├── test-build.js ├── test-parseFile.js ├── test-parseString.js └── utf8data.xml /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .npmignore 2 | .DS_Store 3 | tests/ 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2010-2011- Nathan Rajlich 2 | 3 | Permission is hereby granted, free of charge, to any person 4 | obtaining a copy of this software and associated documentation 5 | files (the "Software"), to deal in the Software without 6 | restriction, including without limitation the rights to use, 7 | copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the 9 | Software is furnished to do so, subject to the following 10 | conditions: 11 | 12 | The above copyright notice and this permission notice shall be 13 | included in all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 17 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 19 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 20 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ##### Atom and all repositories under Atom will be archived on December 15, 2022. Learn more in our [official announcement](https://github.blog/2022-06-08-sunsetting-atom/) 2 | # node-plist 3 | 4 | Provides facilities for reading and writing Mac OS X Plist (property list) files. These are often used in programming OS X and iOS applications, as well as the iTunes 5 | configuration XML file. 6 | 7 | Plist files represent stored programming "object"s. They are very similar 8 | to JSON. A valid Plist file is representable as a native JavaScript Object and vice-versa. 9 | 10 | ## Tests 11 | `npm test` 12 | 13 | ## Usage 14 | Parsing a plist from filename 15 | ``` javascript 16 | var plist = require('plist'); 17 | 18 | var obj = plist.parseFileSync('myPlist.plist'); 19 | console.log(JSON.stringify(obj)); 20 | ``` 21 | 22 | Parsing a plist from string payload 23 | ``` javascript 24 | var plist = require('plist'); 25 | 26 | var obj = plist.parseStringSync('Hello World!'); 27 | console.log(obj); // Hello World! 28 | ``` 29 | 30 | Given an existing JavaScript Object, you can turn it into an XML document that complies with the plist DTD 31 | 32 | ``` javascript 33 | var plist = require('plist'); 34 | 35 | console.log(plist.build({'foo' : 'bar'}).toString()); 36 | ``` 37 | 38 | 39 | 40 | ### Deprecated methods 41 | These functions work, but may be removed in a future release. version 0.4.x added Sync versions of these functions. 42 | 43 | Parsing a plist from filename 44 | ``` javascript 45 | var plist = require('plist'); 46 | 47 | plist.parseFile('myPlist.plist', function(err, obj) { 48 | if (err) throw err; 49 | 50 | console.log(JSON.stringify(obj)); 51 | }); 52 | ``` 53 | 54 | Parsing a plist from string payload 55 | ``` javascript 56 | var plist = require('plist'); 57 | 58 | plist.parseString('Hello World!', function(err, obj) { 59 | if (err) throw err; 60 | 61 | console.log(obj[0]); // Hello World! 62 | }); 63 | ``` 64 | -------------------------------------------------------------------------------- /lib/plist.js: -------------------------------------------------------------------------------- 1 | ;(function (exports, DOMParser, xmlbuilder) { 2 | // Checks if running in a non-browser environment 3 | 4 | var inNode = typeof process !== "undefined" && process.versions && !!process.versions.node 5 | , utf8_to_b64 6 | , b64_to_utf8; 7 | 8 | 9 | 10 | // this library runs in browsers and nodejs, set up functions accordingly 11 | if (inNode) { 12 | exports.parseFile = function (filename, callback) { 13 | console.warn('parseFile is deprecated. Please use parseFileSync instead.'); 14 | var fs = require('fs'); 15 | var inxml = fs.readFileSync(filename, 'utf8'); 16 | exports.parseString(inxml, callback); 17 | } 18 | 19 | exports.parseFileSync = function (filename) { 20 | var fs = require('fs'); 21 | var inxml = fs.readFileSync(filename, 'utf8'); 22 | return exports.parseStringSync(inxml); 23 | } 24 | 25 | // set up base64 encode/decode functions 26 | utf8_to_b64= function ( str ) { 27 | return new Buffer(str).toString('base64'); 28 | } 29 | b64_to_utf8 = function ( str ) { 30 | return new Buffer(str, 'base64').toString('utf8'); 31 | } 32 | } else { 33 | // we're in a browser context, find the DOMParser 34 | if (typeof window.DOMParser != 'undefined') { 35 | DOMParser = function(xmlStr) { 36 | return ( new window.DOMParser() ).parseFromString(xmlStr, 'text/xml'); 37 | }; 38 | } else if (typeof window.ActiveXObject != 'undefined' && 39 | new window.ActiveXObject('Microsoft.XMLDOM')) { 40 | DOMParser = function(xmlStr) { 41 | var xmlDoc = new window.ActiveXObject('Microsoft.XMLDOM'); 42 | xmlDoc.async = 'false'; 43 | xmlDoc.loadXML(xmlStr); 44 | return xmlDoc; 45 | }; 46 | } else { 47 | throw new Error('No XML parser found'); 48 | } 49 | 50 | // set up base64 encode/decode functions 51 | if (typeof window.btoa == 'undefined') { 52 | throw new Error('No base64 support found'); 53 | // TODO: shim btoa and atob if not present (ie < 10) 54 | //http://stackoverflow.com/questions/246801/how-can-you-encode-to-base64-using-javascript/247261#247261 55 | } else { 56 | utf8_to_b64= function ( str ) { 57 | return window.btoa(unescape(encodeURIComponent( str ))); 58 | } 59 | 60 | b64_to_utf8 = function ( str ) { 61 | return decodeURIComponent(escape(window.atob( str ))); 62 | } 63 | } 64 | 65 | } 66 | 67 | exports.parseString = function (xml, callback) { 68 | console.warn('parseString is deprecated. Please use parseStringSync instead.'); 69 | var doc, error, plist; 70 | try { 71 | doc = buildDOMParser().parseFromString(xml); 72 | plist = parsePlistXML(doc.documentElement); 73 | } catch(e) { 74 | error = e; 75 | } 76 | callback(error, plist); 77 | } 78 | 79 | exports.parseStringSync = function (xml) { 80 | var doc = buildDOMParser().parseFromString(xml); 81 | var plist; 82 | if (doc.documentElement.nodeName !== 'plist') { 83 | throw new Error('malformed document. First element should be '); 84 | } 85 | plist = parsePlistXML(doc.documentElement); 86 | 87 | // if the plist is an array with 1 element, pull it out of the array 88 | if(isArray(plist) && plist.length == 1) { 89 | plist = plist[0]; 90 | } 91 | return plist; 92 | } 93 | 94 | /** 95 | * convert an XML based plist document into a JSON representation 96 | * 97 | * @param object xml_node current XML node in the plist 98 | * @return built up JSON object 99 | */ 100 | function parsePlistXML(node) { 101 | var i, new_obj, key, val, new_arr; 102 | if (!node) 103 | return null; 104 | 105 | if (node.nodeName === 'plist') { 106 | new_arr = []; 107 | for (i=0;i < node.childNodes.length;i++) { 108 | // ignore comment nodes (text) 109 | if (node.childNodes[i].nodeType !== 3) { 110 | new_arr.push( parsePlistXML(node.childNodes[i])); 111 | } 112 | } 113 | return new_arr; 114 | } 115 | else if(node.nodeName === 'dict') { 116 | new_obj = {}; 117 | key = null; 118 | for (i=0;i < node.childNodes.length;i++) { 119 | // ignore comment nodes (text) 120 | if (node.childNodes[i].nodeType !== 3) { 121 | if (key === null) { 122 | key = parsePlistXML(node.childNodes[i]); 123 | } else { 124 | new_obj[key] = parsePlistXML(node.childNodes[i]); 125 | key = null; 126 | } 127 | } 128 | } 129 | return new_obj; 130 | } 131 | else if(node.nodeName === 'array') { 132 | new_arr = []; 133 | for (i=0;i < node.childNodes.length;i++) { 134 | // ignore comment nodes (text) 135 | if (node.childNodes[i].nodeType !== 3) { 136 | res = parsePlistXML(node.childNodes[i]); 137 | if (res) new_arr.push( res ); 138 | } 139 | } 140 | return new_arr; 141 | } 142 | else if(node.nodeName === '#text') { 143 | // TODO: what should we do with text types? (CDATA sections) 144 | } 145 | else if(node.nodeName === 'key') { 146 | return node.childNodes[0].nodeValue; 147 | } 148 | else if(node.nodeName === 'string') { 149 | var res = ''; 150 | for (var d=0; d < node.childNodes.length; d++) 151 | { 152 | res += node.childNodes[d].nodeValue; 153 | } 154 | return res; 155 | } 156 | else if(node.nodeName === 'integer') { 157 | // parse as base 10 integer 158 | return parseInt(node.childNodes[0].nodeValue, 10); 159 | } 160 | else if(node.nodeName === 'real') { 161 | var res = ''; 162 | for (var d=0; d < node.childNodes.length; d++) 163 | { 164 | if(node.childNodes[d].nodeType === 3) { 165 | res += node.childNodes[d].nodeValue; 166 | } 167 | } 168 | return parseFloat(res); 169 | } 170 | else if(node.nodeName === 'data') { 171 | var res = ''; 172 | for (var d=0; d < node.childNodes.length; d++) 173 | { 174 | if(node.childNodes[d].nodeType === 3) { 175 | res += node.childNodes[d].nodeValue; 176 | } 177 | } 178 | 179 | // validate that the string is encoded as base64 180 | var base64Matcher = new RegExp("^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$"); 181 | if (!base64Matcher.test(res.replace(/\s/g,'')) ) { 182 | throw new Error('malformed document. element is not base64 encoded'); 183 | } 184 | 185 | // decode base64 data as utf8 string 186 | return b64_to_utf8(res); 187 | } 188 | else if(node.nodeName === 'date') { 189 | return new Date(node.childNodes[0].nodeValue); 190 | } 191 | else if(node.nodeName === 'true') { 192 | return true; 193 | } 194 | else if(node.nodeName === 'false') { 195 | return false; 196 | } 197 | } 198 | 199 | 200 | function ISODateString(d){ 201 | function pad(n){return n<10 ? '0'+n : n} 202 | return d.getUTCFullYear()+'-' 203 | + pad(d.getUTCMonth()+1)+'-' 204 | + pad(d.getUTCDate())+'T' 205 | + pad(d.getUTCHours())+':' 206 | + pad(d.getUTCMinutes())+':' 207 | + pad(d.getUTCSeconds())+'Z' 208 | } 209 | 210 | // instanceof is horribly unreliable so we use these hackish but safer checks 211 | // http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray 212 | function isArray(obj) { 213 | return Object.prototype.toString.call(obj) === '[object Array]'; 214 | } 215 | 216 | function isDate(obj) { 217 | return Object.prototype.toString.call(obj) === '[object Date]'; 218 | } 219 | 220 | function isBoolean(obj) { 221 | return (obj === true || obj === false || toString.call(obj) == '[object Boolean]'); 222 | } 223 | 224 | function isNumber(obj) { 225 | return Object.prototype.toString.call(obj) === '[object Number]'; 226 | } 227 | 228 | function isObject(obj) { 229 | return Object.prototype.toString.call(obj) === '[object Object]'; 230 | } 231 | 232 | function isString(obj) { 233 | return Object.prototype.toString.call(obj) === '[object String]'; 234 | } 235 | 236 | /** 237 | * generate an XML plist string from the input object 238 | * 239 | * @param object obj the object to convert 240 | * @return string converted plist 241 | */ 242 | exports.build = function(obj) { 243 | var XMLHDR = { 'version': '1.0','encoding': 'UTF-8'} 244 | , XMLDTD = { 'ext': 'PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\"'} 245 | , doc = xmlbuilder.create() 246 | , child = doc.begin('plist', XMLHDR, XMLDTD).att('version', '1.0'); 247 | 248 | walk_obj(obj, child); 249 | return child.end({pretty: true }); 250 | } 251 | 252 | // depth first, recursive traversal of a javascript object. when complete, 253 | // next_child contains a reference to the build XML object. 254 | function walk_obj(next, next_child) { 255 | var tag_type, i, prop; 256 | 257 | if(isArray(next)) { 258 | next_child = next_child.ele('array'); 259 | for(i=0 ;i < next.length;i++) { 260 | walk_obj(next[i], next_child); 261 | } 262 | } 263 | else if (isObject(next)) { 264 | if (inNode && next instanceof Buffer) { 265 | next_child.ele('data').raw(next.toString('base64')); 266 | } else { 267 | next_child = next_child.ele('dict'); 268 | for(prop in next) { 269 | if(next.hasOwnProperty(prop)) { 270 | next_child.ele('key').txt(prop); 271 | walk_obj(next[prop], next_child); 272 | } 273 | } 274 | } 275 | } 276 | else if(isNumber(next)) { 277 | // detect if this is an integer or real 278 | tag_type =(next % 1 === 0) ? 'integer' : 'real'; 279 | next_child.ele(tag_type).txt(next.toString()); 280 | } 281 | else if(isDate(next)) { 282 | next_child.ele('date').raw(ISODateString(new Date(next))); 283 | } 284 | else if(isBoolean(next)) { 285 | val = next ? 'true' : 'false'; 286 | next_child.ele(val); 287 | } 288 | else if(isString(next)) { 289 | //if (str!=obj || str.indexOf("\n")>=0) str = ""; 290 | var base64Matcher = new RegExp("^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$"); 291 | if (!inNode && base64Matcher.test(next.replace(/\s/g,''))) { 292 | // data is base 64 encoded so assume it's a node 293 | next_child.ele('data').raw(utf8_to_b64(next)); 294 | } else { 295 | // it's not base 64 encoded, assume it's a node 296 | next_child.ele('string').raw(next); 297 | } 298 | } 299 | }; 300 | 301 | function buildDOMParser() { 302 | // prevent the parser from logging non-fatel errors 303 | return new DOMParser({errorHandler: function() {}}); 304 | } 305 | 306 | })(typeof exports === 'undefined' ? plist = {} : exports, typeof require !== 'undefined' ? require('xmldom').DOMParser : null, typeof require !== 'undefined' ? require('xmlbuilder') : xmlbuilder) 307 | // the above line checks for exports (defined in node) and uses it, or creates 308 | // a global variable and exports to that. also, if in node, require DOMParser 309 | // node-style, in browser it should already be present 310 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@atom/plist", 3 | "description": "Mac OS X Plist parser/builder for NodeJS. Convert a Plist file or string into a native JS object and native JS object into a Plist file.", 4 | "version": "0.4.4", 5 | "author": "Nathan Rajlich ", 6 | "contributors": [ 7 | "Hans Huebner ", 8 | "Pierre Metrailler", 9 | "Mike Reinstein ", 10 | "Vladimir Tsvang", 11 | "Mathieu D'Amours" 12 | ], 13 | "repository": { 14 | "type": "git", 15 | "url": "git://github.com/TooTallNate/node-plist.git" 16 | }, 17 | "keywords": [ 18 | "apple", 19 | "mac", 20 | "plist", 21 | "parser", 22 | "xml" 23 | ], 24 | "main": "./lib/plist", 25 | "dependencies": { 26 | "xmlbuilder": "0.4.x", 27 | "xmldom": "0.1.x" 28 | }, 29 | "devDependencies": { 30 | "nodeunit": "0.7.x" 31 | }, 32 | "scripts": { 33 | "test": "nodeunit tests" 34 | }, 35 | "engines": { 36 | "node": ">= 0.1.100" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /tests/Cordova.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 23 | 24 | 25 | UIWebViewBounce 26 | 27 | TopActivityIndicator 28 | gray 29 | EnableLocation 30 | 31 | EnableViewportScale 32 | 33 | AutoHideSplashScreen 34 | 35 | ShowSplashScreenSpinner 36 | 37 | MediaPlaybackRequiresUserAction 38 | 39 | AllowInlineMediaPlayback 40 | 41 | OpenAllWhitelistURLsInWebView 42 | 43 | BackupWebStorage 44 | 45 | ExternalHosts 46 | 47 | * 48 | 49 | Plugins 50 | 51 | Device 52 | CDVDevice 53 | Logger 54 | CDVLogger 55 | Compass 56 | CDVLocation 57 | Accelerometer 58 | CDVAccelerometer 59 | Camera 60 | CDVCamera 61 | NetworkStatus 62 | CDVConnection 63 | Contacts 64 | CDVContacts 65 | Debug Console 66 | CDVDebugConsole 67 | Echo 68 | CDVEcho 69 | File 70 | CDVFile 71 | FileTransfer 72 | CDVFileTransfer 73 | Geolocation 74 | CDVLocation 75 | Notification 76 | CDVNotification 77 | Media 78 | CDVSound 79 | Capture 80 | CDVCapture 81 | SplashScreen 82 | CDVSplashScreen 83 | Battery 84 | CDVBattery 85 | 86 | 87 | -------------------------------------------------------------------------------- /tests/Xcode-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | ${PRODUCT_NAME} 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleIconFiles 12 | 13 | CFBundleIdentifier 14 | com.joshfire.ads 15 | CFBundleInfoDictionaryVersion 16 | 6.0 17 | CFBundleName 18 | ${PRODUCT_NAME} 19 | CFBundlePackageType 20 | APPL 21 | CFBundleShortVersionString 22 | 1.0 23 | CFBundleSignature 24 | ???? 25 | CFBundleVersion 26 | 1.0 27 | LSRequiresIPhoneOS 28 | 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | UIInterfaceOrientationLandscapeRight 38 | 39 | UISupportedInterfaceOrientations~ipad 40 | 41 | UIInterfaceOrientationPortrait 42 | UIInterfaceOrientationPortraitUpsideDown 43 | UIInterfaceOrientationLandscapeLeft 44 | UIInterfaceOrientationLandscapeRight 45 | 46 | CFBundleAllowMixedLocalizations 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /tests/Xcode-PhoneGap.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | TopActivityIndicator 6 | gray 7 | EnableLocation 8 | 9 | EnableViewportScale 10 | 11 | AutoHideSplashScreen 12 | 13 | ShowSplashScreenSpinner 14 | 15 | MediaPlaybackRequiresUserAction 16 | 17 | AllowInlineMediaPlayback 18 | 19 | OpenAllWhitelistURLsInWebView 20 | 21 | ExternalHosts 22 | 23 | * 24 | 25 | Plugins 26 | 27 | com.phonegap.accelerometer 28 | PGAccelerometer 29 | com.phonegap.camera 30 | PGCamera 31 | com.phonegap.connection 32 | PGConnection 33 | com.phonegap.contacts 34 | PGContacts 35 | com.phonegap.debugconsole 36 | PGDebugConsole 37 | com.phonegap.file 38 | PGFile 39 | com.phonegap.filetransfer 40 | PGFileTransfer 41 | com.phonegap.geolocation 42 | PGLocation 43 | com.phonegap.notification 44 | PGNotification 45 | com.phonegap.media 46 | PGSound 47 | com.phonegap.mediacapture 48 | PGCapture 49 | com.phonegap.splashscreen 50 | PGSplashScreen 51 | com.joshfire.sas 52 | PGSmartAdServer 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /tests/airplay.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | duration 6 | 5555.0495000000001 7 | loadedTimeRanges 8 | 9 | 10 | duration 11 | 5555.0495000000001 12 | start 13 | 0.0 14 | 15 | 16 | playbackBufferEmpty 17 | 18 | playbackBufferFull 19 | 20 | playbackLikelyToKeepUp 21 | 22 | position 23 | 4.6269989039999997 24 | rate 25 | 1 26 | readyToPlay 27 | 28 | seekableTimeRanges 29 | 30 | 31 | duration 32 | 5555.0495000000001 33 | start 34 | 0.0 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /tests/iTunes-small.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Major Version1 6 | Minor Version1 7 | Application Version9.0.3 8 | Features5 9 | Show Content Ratings 10 | Music Folderfile://localhost/Users/nrajlich/Music/iTunes/iTunes%20Media/ 11 | Library Persistent ID6F81D37F95101437 12 | Tracks 13 | 14 | 96 15 | 16 | Track ID96 17 | NameEXP 18 | ArtistJimi Hendrix 19 | Album ArtistJimi Hendrix 20 | AlbumAxis: Bold As Love 21 | GenreRock 22 | KindMPEG audio file 23 | Size2317095 24 | Total Time115617 25 | Track Number1 26 | Year1967 27 | Date Modified2010-01-26T04:42:36Z 28 | Date Added2010-02-06T03:05:30Z 29 | Bit Rate160 30 | Sample Rate44100 31 | CommentsEAC-Lame3.92-Extreme 32 | Skip Count1 33 | Skip Date2010-02-22T23:30:15Z 34 | Persistent IDE4A63A7D3E89DBDF 35 | Track TypeFile 36 | Locationfile://localhost/Users/nrajlich/Music/iTunes/iTunes%20Media/Music/Jimi%20Hendrix/Axis_%20Bold%20As%20Love/01%20EXP.mp3 37 | File Folder Count5 38 | Library Folder Count1 39 | 40 | 98 41 | 42 | Track ID98 43 | NameUp From The Skies 44 | ArtistJimi Hendrix 45 | Album ArtistJimi Hendrix 46 | ComposerJimi Hendrix 47 | AlbumAxis: Bold As Love 48 | GenreRock 49 | KindMPEG audio file 50 | Size3552687 51 | Total Time177397 52 | Track Number2 53 | Year1967 54 | Date Modified2010-01-26T14:22:57Z 55 | Date Added2010-02-06T03:05:30Z 56 | Bit Rate160 57 | Sample Rate44100 58 | CommentsEAC-Lame3.92-Extreme 59 | Play Count3 60 | Play Date3349908136 61 | Play Date UTC2010-02-25T09:02:16Z 62 | Persistent ID91D3875329AE6FAE 63 | Track TypeFile 64 | Locationfile://localhost/Users/nrajlich/Music/iTunes/iTunes%20Media/Music/Jimi%20Hendrix/Axis_%20Bold%20As%20Love/02%20Up%20From%20The%20Skies.mp3 65 | File Folder Count5 66 | Library Folder Count1 67 | 68 | 100 69 | 70 | Track ID100 71 | NameSpanish Castle Magic 72 | ArtistJimi Hendrix 73 | Album ArtistJimi Hendrix 74 | ComposerJimi Hendrix 75 | AlbumAxis: Bold As Love 76 | GenreRock 77 | KindMPEG audio file 78 | Size3718303 79 | Total Time185678 80 | Track Number3 81 | Year1967 82 | Date Modified2010-01-26T04:36:55Z 83 | Date Added2010-02-06T03:05:30Z 84 | Bit Rate160 85 | Sample Rate44100 86 | CommentsEAC-Lame3.92-Extreme 87 | Play Count2 88 | Play Date3349701378 89 | Play Date UTC2010-02-22T23:36:18Z 90 | Persistent ID85E821CD210991D4 91 | Track TypeFile 92 | Locationfile://localhost/Users/nrajlich/Music/iTunes/iTunes%20Media/Music/Jimi%20Hendrix/Axis_%20Bold%20As%20Love/03%20Spanish%20Castle%20Magic.mp3 93 | File Folder Count5 94 | Library Folder Count1 95 | 96 | 102 97 | 98 | Track ID102 99 | NameWait Until Tomorrow 100 | ArtistJimi Hendrix 101 | Album ArtistJimi Hendrix 102 | ComposerJimi Hendrix 103 | AlbumAxis: Bold As Love 104 | GenreRock 105 | KindMPEG audio file 106 | Size3644116 107 | Total Time181968 108 | Track Number4 109 | Year1967 110 | Date Modified2010-01-26T14:22:31Z 111 | Date Added2010-02-06T03:05:30Z 112 | Bit Rate160 113 | Sample Rate44100 114 | CommentsEAC-Lame3.92-Extreme 115 | Play Count2 116 | Play Date3349701560 117 | Play Date UTC2010-02-22T23:39:20Z 118 | Persistent IDE08451DAFE2C4CDB 119 | Track TypeFile 120 | Locationfile://localhost/Users/nrajlich/Music/iTunes/iTunes%20Media/Music/Jimi%20Hendrix/Axis_%20Bold%20As%20Love/04%20Wait%20Until%20Tomorrow.mp3 121 | File Folder Count5 122 | Library Folder Count1 123 | 124 | 104 125 | 126 | Track ID104 127 | NameAin't No Telling 128 | ArtistJimi Hendrix 129 | Album ArtistJimi Hendrix 130 | ComposerJimi Hendrix 131 | AlbumAxis: Bold As Love 132 | GenreRock 133 | KindMPEG audio file 134 | Size2197454 135 | Total Time109635 136 | Track Number5 137 | Year1967 138 | Date Modified2010-01-26T04:42:49Z 139 | Date Added2010-02-06T03:05:30Z 140 | Bit Rate160 141 | Sample Rate44100 142 | CommentsEAC-Lame3.92-Extreme 143 | Play Count2 144 | Play Date3349701670 145 | Play Date UTC2010-02-22T23:41:10Z 146 | Persistent ID532B79B4E0A7FEDB 147 | Track TypeFile 148 | Locationfile://localhost/Users/nrajlich/Music/iTunes/iTunes%20Media/Music/Jimi%20Hendrix/Axis_%20Bold%20As%20Love/05%20Ain't%20No%20Telling.mp3 149 | File Folder Count5 150 | Library Folder Count1 151 | 152 | 106 153 | 154 | Track ID106 155 | NameLittle Wing 156 | ArtistJimi Hendrix 157 | Album ArtistJimi Hendrix 158 | ComposerJimi Hendrix 159 | AlbumAxis: Bold As Love 160 | GenreRock 161 | KindMPEG audio file 162 | Size2952393 163 | Total Time147382 164 | Track Number6 165 | Year1967 166 | Date Modified2010-01-26T10:06:03Z 167 | Date Added2010-02-06T03:05:30Z 168 | Bit Rate160 169 | Sample Rate44100 170 | CommentsEAC-Lame3.92-Extreme 171 | Play Count2 172 | Play Date3349908296 173 | Play Date UTC2010-02-25T09:04:56Z 174 | Persistent ID77D07266F04B6994 175 | Track TypeFile 176 | Locationfile://localhost/Users/nrajlich/Music/iTunes/iTunes%20Media/Music/Jimi%20Hendrix/Axis_%20Bold%20As%20Love/06%20Little%20Wing.mp3 177 | File Folder Count5 178 | Library Folder Count1 179 | 180 | 108 181 | 182 | Track ID108 183 | NameIf 6 Was 9 184 | ArtistJimi Hendrix 185 | Album ArtistJimi Hendrix 186 | ComposerJimi Hendrix 187 | AlbumAxis: Bold As Love 188 | GenreRock 189 | KindMPEG audio file 190 | Size6674842 191 | Total Time333505 192 | Track Number7 193 | Year1967 194 | Date Modified2010-01-26T06:39:09Z 195 | Date Added2010-02-06T03:05:30Z 196 | Bit Rate160 197 | Sample Rate44100 198 | CommentsEAC-Lame3.92-Extreme 199 | Persistent ID3E7764A9FF51A43E 200 | Track TypeFile 201 | Locationfile://localhost/Users/nrajlich/Music/iTunes/iTunes%20Media/Music/Jimi%20Hendrix/Axis_%20Bold%20As%20Love/07%20If%206%20Was%209.mp3 202 | File Folder Count5 203 | Library Folder Count1 204 | 205 | 110 206 | 207 | Track ID110 208 | NameYou Got Me Floatin' 209 | ArtistJimi Hendrix 210 | Album ArtistJimi Hendrix 211 | ComposerJimi Hendrix 212 | AlbumAxis: Bold As Love 213 | GenreRock 214 | KindMPEG audio file 215 | Size3354679 216 | Total Time167497 217 | Track Number8 218 | Year1967 219 | Date Modified2010-01-26T09:53:19Z 220 | Date Added2010-02-06T03:05:30Z 221 | Bit Rate160 222 | Sample Rate44100 223 | CommentsEAC-Lame3.92-Extreme 224 | Persistent ID77F9E16E1A27D117 225 | Track TypeFile 226 | Locationfile://localhost/Users/nrajlich/Music/iTunes/iTunes%20Media/Music/Jimi%20Hendrix/Axis_%20Bold%20As%20Love/08%20You%20Got%20Me%20Floatin'.mp3 227 | File Folder Count5 228 | Library Folder Count1 229 | 230 | 112 231 | 232 | Track ID112 233 | NameCastles Made Of Sand 234 | ArtistJimi Hendrix 235 | Album ArtistJimi Hendrix 236 | ComposerJimi Hendrix 237 | AlbumAxis: Bold As Love 238 | GenreRock 239 | KindMPEG audio file 240 | Size3346842 241 | Total Time167105 242 | Track Number9 243 | Year1967 244 | Date Modified2010-01-26T09:59:58Z 245 | Date Added2010-02-06T03:05:30Z 246 | Bit Rate160 247 | Sample Rate44100 248 | CommentsEAC-Lame3.92-Extreme 249 | Play Count1 250 | Play Date3348245334 251 | Play Date UTC2010-02-06T03:08:54Z 252 | Persistent IDCC85AD893315D8F3 253 | Track TypeFile 254 | Locationfile://localhost/Users/nrajlich/Music/iTunes/iTunes%20Media/Music/Jimi%20Hendrix/Axis_%20Bold%20As%20Love/09%20Castles%20Made%20Of%20Sand.mp3 255 | File Folder Count5 256 | Library Folder Count1 257 | 258 | 114 259 | 260 | Track ID114 261 | NameShe's So Fine 262 | ArtistJimi Hendrix 263 | Album ArtistJimi Hendrix 264 | ComposerNoel Redding 265 | AlbumAxis: Bold As Love 266 | GenreRock 267 | KindMPEG audio file 268 | Size3186450 269 | Total Time159085 270 | Track Number10 271 | Year1967 272 | Date Modified2010-01-26T10:06:13Z 273 | Date Added2010-02-06T03:05:30Z 274 | Bit Rate160 275 | Sample Rate44100 276 | CommentsEAC-Lame3.92-Extreme 277 | Persistent ID40F80094B78C21A9 278 | Track TypeFile 279 | Locationfile://localhost/Users/nrajlich/Music/iTunes/iTunes%20Media/Music/Jimi%20Hendrix/Axis_%20Bold%20As%20Love/10%20She's%20So%20Fine.mp3 280 | File Folder Count5 281 | Library Folder Count1 282 | 283 | 116 284 | 285 | Track ID116 286 | NameOne Rainy Wish 287 | ArtistJimi Hendrix 288 | Album ArtistJimi Hendrix 289 | ComposerJimi Hendrix 290 | AlbumAxis: Bold As Love 291 | GenreRock 292 | KindMPEG audio file 293 | Size4453912 294 | Total Time222458 295 | Track Number11 296 | Year1967 297 | Date Modified2010-01-26T04:34:42Z 298 | Date Added2010-02-06T03:05:30Z 299 | Bit Rate160 300 | Sample Rate44100 301 | CommentsEAC-Lame3.92-Extreme 302 | Play Count2 303 | Play Date3349908789 304 | Play Date UTC2010-02-25T09:13:09Z 305 | Persistent ID1EF98FE4F90860E3 306 | Track TypeFile 307 | Locationfile://localhost/Users/nrajlich/Music/iTunes/iTunes%20Media/Music/Jimi%20Hendrix/Axis_%20Bold%20As%20Love/11%20One%20Rainy%20Wish.mp3 308 | File Folder Count5 309 | Library Folder Count1 310 | 311 | 118 312 | 313 | Track ID118 314 | NameLittle Miss Lover 315 | ArtistJimi Hendrix 316 | Album ArtistJimi Hendrix 317 | ComposerJimi Hendrix 318 | AlbumAxis: Bold As Love 319 | GenreRock 320 | KindMPEG audio file 321 | Size2883430 322 | Total Time143934 323 | Track Number12 324 | Year1967 325 | Date Modified2010-01-26T04:40:43Z 326 | Date Added2010-02-06T03:05:30Z 327 | Bit Rate160 328 | Sample Rate44100 329 | CommentsEAC-Lame3.92-Extreme 330 | Play Count1 331 | Play Date3349700454 332 | Play Date UTC2010-02-22T23:20:54Z 333 | Persistent ID979BB1910DF12FA4 334 | Track TypeFile 335 | Locationfile://localhost/Users/nrajlich/Music/iTunes/iTunes%20Media/Music/Jimi%20Hendrix/Axis_%20Bold%20As%20Love/12%20Little%20Miss%20Lover.mp3 336 | File Folder Count5 337 | Library Folder Count1 338 | 339 | 120 340 | 341 | Track ID120 342 | NameBold As Love 343 | ArtistJimi Hendrix 344 | Album ArtistJimi Hendrix 345 | ComposerJimi Hendrix 346 | AlbumAxis: Bold As Love 347 | GenreRock 348 | KindMPEG audio file 349 | Size5048458 350 | Total Time252186 351 | Track Number13 352 | Year1967 353 | Date Modified2010-01-26T03:15:02Z 354 | Date Added2010-02-06T03:05:31Z 355 | Bit Rate160 356 | Sample Rate44100 357 | CommentsEAC-Lame3.92-Extreme 358 | Play Count1 359 | Play Date3349700706 360 | Play Date UTC2010-02-22T23:25:06Z 361 | Persistent IDABB6C4EB0AD99BE4 362 | Track TypeFile 363 | Locationfile://localhost/Users/nrajlich/Music/iTunes/iTunes%20Media/Music/Jimi%20Hendrix/Axis_%20Bold%20As%20Love/13%20Bold%20As%20Love.mp3 364 | File Folder Count5 365 | Library Folder Count1 366 | 367 | 122 368 | 369 | Track ID122 370 | NameThe Wind Cries Mary 371 | ArtistJimi Hendrix 372 | Album ArtistJimi Hendrix 373 | AlbumSMASH HITS 374 | KindMPEG audio file 375 | Size4041927 376 | Total Time202083 377 | Track Number3 378 | Year1967 379 | Date Modified2010-01-27T02:55:57Z 380 | Date Added2010-02-06T03:10:33Z 381 | Bit Rate160 382 | Sample Rate44100 383 | Play Count1 384 | Play Date3348245637 385 | Play Date UTC2010-02-06T03:13:57Z 386 | Sort NameWind Cries Mary 387 | Persistent ID80197A45473F89EC 388 | Track TypeFile 389 | Locationfile://localhost/Users/nrajlich/Music/iTunes/iTunes%20Media/Music/Jimi%20Hendrix/SMASH%20HITS/03%20The%20Wind%20Cries%20Mary.mp3 390 | File Folder Count5 391 | Library Folder Count1 392 | 393 | 124 394 | 395 | Track ID124 396 | NamePurple Haze 397 | ArtistJimi Hendrix 398 | Album ArtistJimi Hendrix 399 | AlbumSMASH HITS 400 | GenrePop 401 | KindMPEG audio file 402 | Size3443729 403 | Total Time172173 404 | Track Number1 405 | Year1967 406 | Date Modified2010-01-27T02:56:23Z 407 | Date Added2010-02-06T03:14:01Z 408 | Bit Rate160 409 | Sample Rate44100 410 | Persistent ID06456C5D35DB482D 411 | Track TypeFile 412 | Locationfile://localhost/Users/nrajlich/Music/iTunes/iTunes%20Media/Music/Jimi%20Hendrix/SMASH%20HITS/01%20Purple%20Haze.mp3 413 | File Folder Count5 414 | Library Folder Count1 415 | 416 | 126 417 | 418 | Track ID126 419 | NameFire 420 | ArtistJimi Hendrix 421 | Album ArtistJimi Hendrix 422 | AlbumSMASH HITS 423 | KindMPEG audio file 424 | Size3311006 425 | Total Time165537 426 | Track Number2 427 | Year1967 428 | Date Modified2010-01-26T07:00:16Z 429 | Date Added2010-02-06T03:14:01Z 430 | Bit Rate160 431 | Sample Rate44100 432 | Persistent IDC16EBCC5CAEBE9D4 433 | Track TypeFile 434 | Locationfile://localhost/Users/nrajlich/Music/iTunes/iTunes%20Media/Music/Jimi%20Hendrix/SMASH%20HITS/02%20Fire.mp3 435 | File Folder Count5 436 | Library Folder Count1 437 | 438 | 128 439 | 440 | Track ID128 441 | NameCan You See Me 442 | ArtistJimi Hendrix 443 | Album ArtistJimi Hendrix 444 | AlbumSMASH HITS 445 | KindMPEG audio file 446 | Size3058151 447 | Total Time152894 448 | Track Number4 449 | Year1966 450 | Date Modified2010-01-25T19:29:01Z 451 | Date Added2010-02-06T03:14:01Z 452 | Bit Rate160 453 | Sample Rate44100 454 | Play Count1 455 | Play Date3348245962 456 | Play Date UTC2010-02-06T03:19:22Z 457 | Persistent IDCD3CFEF2544357DF 458 | Track TypeFile 459 | Locationfile://localhost/Users/nrajlich/Music/iTunes/iTunes%20Media/Music/Jimi%20Hendrix/SMASH%20HITS/04%20Can%20You%20See%20Me.mp3 460 | File Folder Count5 461 | Library Folder Count1 462 | 463 | 130 464 | 465 | Track ID130 466 | Name51st Anniversary 467 | ArtistJimi Hendrix 468 | Album ArtistJimi Hendrix 469 | AlbumSMASH HITS 470 | KindMPEG audio file 471 | Size3910267 472 | Total Time195500 473 | Track Number5 474 | Year1967 475 | Date Modified2010-01-27T02:57:16Z 476 | Date Added2010-02-06T03:14:01Z 477 | Bit Rate160 478 | Sample Rate44100 479 | Play Count1 480 | Play Date3348246157 481 | Play Date UTC2010-02-06T03:22:37Z 482 | Persistent IDB256307FB73DFD2B 483 | Track TypeFile 484 | Locationfile://localhost/Users/nrajlich/Music/iTunes/iTunes%20Media/Music/Jimi%20Hendrix/SMASH%20HITS/05%2051st%20Anniversary.mp3 485 | File Folder Count5 486 | Library Folder Count1 487 | 488 | 132 489 | 490 | Track ID132 491 | NameHey Joe 492 | ArtistJimi Hendrix 493 | Album ArtistJimi Hendrix 494 | AlbumSMASH HITS 495 | KindMPEG audio file 496 | Size4198128 497 | Total Time209893 498 | Track Number6 499 | Year1966 500 | Date Modified2010-01-27T02:58:39Z 501 | Date Added2010-02-06T03:14:01Z 502 | Bit Rate160 503 | Sample Rate44100 504 | Play Count1 505 | Play Date3348246367 506 | Play Date UTC2010-02-06T03:26:07Z 507 | Persistent IDEFE7766FA7E1B8F7 508 | Track TypeFile 509 | Locationfile://localhost/Users/nrajlich/Music/iTunes/iTunes%20Media/Music/Jimi%20Hendrix/SMASH%20HITS/06%20Hey%20Joe.mp3 510 | File Folder Count5 511 | Library Folder Count1 512 | 513 | 134 514 | 515 | Track ID134 516 | NameStone Free 517 | ArtistJimi Hendrix 518 | Album ArtistJimi Hendrix 519 | AlbumSMASH HITS 520 | KindMPEG audio file 521 | Size4325608 522 | Total Time216267 523 | Track Number7 524 | Year1966 525 | Date Modified2010-01-26T16:48:43Z 526 | Date Added2010-02-06T03:14:01Z 527 | Bit Rate160 528 | Sample Rate44100 529 | Play Count1 530 | Play Date3348246583 531 | Play Date UTC2010-02-06T03:29:43Z 532 | Persistent IDB0A50C38343929B5 533 | Track TypeFile 534 | Locationfile://localhost/Users/nrajlich/Music/iTunes/iTunes%20Media/Music/Jimi%20Hendrix/SMASH%20HITS/07%20Stone%20Free.mp3 535 | File Folder Count5 536 | Library Folder Count1 537 | 538 | 136 539 | 540 | Track ID136 541 | NameThe Stars That Play With Laugh 542 | ArtistJimi Hendrix 543 | Album ArtistJimi Hendrix 544 | AlbumSMASH HITS 545 | GenrePop 546 | KindMPEG audio file 547 | Size5151112 548 | Total Time257541 549 | Track Number8 550 | Year1967 551 | Date Modified2010-01-27T02:54:02Z 552 | Date Added2010-02-06T03:14:01Z 553 | Bit Rate160 554 | Sample Rate44100 555 | Sort NameStars That Play With Laugh 556 | Persistent ID891984D14152F8B4 557 | Track TypeFile 558 | Locationfile://localhost/Users/nrajlich/Music/iTunes/iTunes%20Media/Music/Jimi%20Hendrix/SMASH%20HITS/08%20The%20Stars%20That%20Play%20With%20Laugh.mp3 559 | File Folder Count5 560 | Library Folder Count1 561 | 562 | 138 563 | 564 | Track ID138 565 | NameManic Depression 566 | ArtistJimi Hendrix 567 | Album ArtistJimi Hendrix 568 | AlbumSMASH HITS 569 | KindMPEG audio file 570 | Size4457794 571 | Total Time222876 572 | Track Number9 573 | Year1967 574 | Date Modified2010-01-25T04:58:22Z 575 | Date Added2010-02-06T03:14:01Z 576 | Bit Rate160 577 | Sample Rate44100 578 | Persistent ID2C5DA25ED3188C12 579 | Track TypeFile 580 | Locationfile://localhost/Users/nrajlich/Music/iTunes/iTunes%20Media/Music/Jimi%20Hendrix/SMASH%20HITS/09%20Manic%20Depression.mp3 581 | File Folder Count5 582 | Library Folder Count1 583 | 584 | 140 585 | 586 | Track ID140 587 | NameHighway Chile 588 | ArtistJimi Hendrix 589 | Album ArtistJimi Hendrix 590 | AlbumSMASH HITS 591 | KindMPEG audio file 592 | Size4258216 593 | Total Time212897 594 | Track Number10 595 | Year1967 596 | Date Modified2010-01-27T02:58:37Z 597 | Date Added2010-02-06T03:14:01Z 598 | Bit Rate160 599 | Sample Rate44100 600 | Persistent ID23C0537D7A558987 601 | Track TypeFile 602 | Locationfile://localhost/Users/nrajlich/Music/iTunes/iTunes%20Media/Music/Jimi%20Hendrix/SMASH%20HITS/10%20Highway%20Chile.mp3 603 | File Folder Count5 604 | Library Folder Count1 605 | 606 | 142 607 | 608 | Track ID142 609 | NameBurning Of The Midnight Lamp 610 | ArtistJimi Hendrix 611 | Album ArtistJimi Hendrix 612 | AlbumSMASH HITS 613 | KindMPEG audio file 614 | Size4364811 615 | Total Time218226 616 | Track Number11 617 | Year1967 618 | Date Modified2010-01-26T16:36:15Z 619 | Date Added2010-02-06T03:14:02Z 620 | Bit Rate160 621 | Sample Rate44100 622 | Persistent ID655489D0C55F6B6F 623 | Track TypeFile 624 | Locationfile://localhost/Users/nrajlich/Music/iTunes/iTunes%20Media/Music/Jimi%20Hendrix/SMASH%20HITS/11%20Burning%20Of%20The%20Midnight%20Lamp.mp3 625 | File Folder Count5 626 | Library Folder Count1 627 | 628 | 144 629 | 630 | Track ID144 631 | NameFoxy Lady 632 | ArtistJimi Hendrix 633 | Album ArtistJimi Hendrix 634 | AlbumSMASH HITS 635 | KindMPEG audio file 636 | Size4032514 637 | Total Time201613 638 | Track Number12 639 | Year1966 640 | Date Modified2010-01-27T02:57:08Z 641 | Date Added2010-02-06T03:14:02Z 642 | Bit Rate160 643 | Sample Rate44100 644 | Persistent IDA5449F6016FF8603 645 | Track TypeFile 646 | Locationfile://localhost/Users/nrajlich/Music/iTunes/iTunes%20Media/Music/Jimi%20Hendrix/SMASH%20HITS/12%20Foxy%20Lady.mp3 647 | File Folder Count5 648 | Library Folder Count1 649 | 650 | 194 651 | 652 | Track ID194 653 | NameFoxy Lady 654 | ArtistJimi Hendrix 655 | Album ArtistJimi Hendrix 656 | AlbumAre You Experienced? 657 | GenreRock 658 | KindMPEG audio file 659 | Size3998135 660 | Total Time199888 661 | Track Number1 662 | Year1967 663 | Date Modified2010-01-26T09:24:49Z 664 | Date Added2010-02-08T21:41:23Z 665 | Bit Rate160 666 | Sample Rate44100 667 | Play Count2 668 | Play Date3348665607 669 | Play Date UTC2010-02-10T23:53:27Z 670 | Persistent ID7E8EE581B46E9C72 671 | Track TypeFile 672 | Locationfile://localhost/Users/nrajlich/Music/iTunes/iTunes%20Media/Music/Jimi%20Hendrix/Are%20You%20Experienced_/01%20Foxy%20Lady.mp3 673 | File Folder Count5 674 | Library Folder Count1 675 | 676 | 196 677 | 678 | Track ID196 679 | NameManic Depresion 680 | ArtistJimi Hendrix 681 | Album ArtistJimi Hendrix 682 | AlbumAre You Experienced? 683 | GenreRock 684 | KindMPEG audio file 685 | Size4450581 686 | Total Time222511 687 | Track Number2 688 | Year1967 689 | Date Modified2010-01-26T10:19:06Z 690 | Date Added2010-02-08T21:41:23Z 691 | Bit Rate160 692 | Sample Rate44100 693 | Play Count3 694 | Play Date3348665830 695 | Play Date UTC2010-02-10T23:57:10Z 696 | Persistent IDB5761B106C80D283 697 | Track TypeFile 698 | Locationfile://localhost/Users/nrajlich/Music/iTunes/iTunes%20Media/Music/Jimi%20Hendrix/Are%20You%20Experienced_/02%20Manic%20Depresion.mp3 699 | File Folder Count5 700 | Library Folder Count1 701 | 702 | 198 703 | 704 | Track ID198 705 | NameRed House 706 | ArtistJimi Hendrix 707 | Album ArtistJimi Hendrix 708 | ComposerJimi Hendrix 709 | AlbumAre You Experienced? 710 | GenreRock 711 | KindMPEG audio file 712 | Size4483691 713 | Total Time223947 714 | Track Number3 715 | Year1967 716 | Date Modified2010-01-26T10:12:52Z 717 | Date Added2010-02-08T21:41:23Z 718 | Bit Rate160 719 | Sample Rate44100 720 | CommentsEAC-Lame3.92-Extreme 721 | Play Count2 722 | Play Date3348488681 723 | Play Date UTC2010-02-08T22:44:41Z 724 | Persistent IDEC7FEFA14DBBB959 725 | Track TypeFile 726 | Locationfile://localhost/Users/nrajlich/Music/iTunes/iTunes%20Media/Music/Jimi%20Hendrix/Are%20You%20Experienced_/03%20Red%20House.mp3 727 | File Folder Count5 728 | Library Folder Count1 729 | 730 | 200 731 | 732 | Track ID200 733 | NameCan You See Me 734 | ArtistJimi Hendrix 735 | Album ArtistJimi Hendrix 736 | AlbumAre You Experienced? 737 | GenreRock 738 | KindMPEG audio file 739 | Size3057209 740 | Total Time152842 741 | Track Number4 742 | Year1967 743 | Date Modified2010-01-25T07:23:09Z 744 | Date Added2010-02-08T21:41:23Z 745 | Bit Rate160 746 | Sample Rate44100 747 | Play Count2 748 | Play Date3348488833 749 | Play Date UTC2010-02-08T22:47:13Z 750 | Persistent ID410549558954A8A3 751 | Track TypeFile 752 | Locationfile://localhost/Users/nrajlich/Music/iTunes/iTunes%20Media/Music/Jimi%20Hendrix/Are%20You%20Experienced_/04%20Can%20You%20See%20Me.mp3 753 | File Folder Count5 754 | Library Folder Count1 755 | 756 | 202 757 | 758 | Track ID202 759 | NameLove Or Confusion 760 | ArtistJimi Hendrix 761 | Album ArtistJimi Hendrix 762 | AlbumAre You Experienced? 763 | GenreRock 764 | KindMPEG audio file 765 | Size3867530 766 | Total Time193358 767 | Track Number5 768 | Year1967 769 | Date Modified2010-01-26T01:16:40Z 770 | Date Added2010-02-08T21:41:23Z 771 | Bit Rate160 772 | Sample Rate44100 773 | Play Count1 774 | Play Date3348486108 775 | Play Date UTC2010-02-08T22:01:48Z 776 | Persistent IDA98A811BB24C6DDB 777 | Track TypeFile 778 | Locationfile://localhost/Users/nrajlich/Music/iTunes/iTunes%20Media/Music/Jimi%20Hendrix/Are%20You%20Experienced_/05%20Love%20Or%20Confusion.mp3 779 | File Folder Count5 780 | Library Folder Count1 781 | 782 | 204 783 | 784 | Track ID204 785 | NameI Don't Like Today 786 | ArtistJimi Hendrix 787 | Album ArtistJimi Hendrix 788 | AlbumAre You Experienced? 789 | GenreRock 790 | KindMPEG audio file 791 | Size4703972 792 | Total Time235180 793 | Track Number6 794 | Year1967 795 | Date Modified2010-01-26T10:12:25Z 796 | Date Added2010-02-08T21:41:23Z 797 | Bit Rate160 798 | Sample Rate44100 799 | Play Count1 800 | Play Date3348486344 801 | Play Date UTC2010-02-08T22:05:44Z 802 | Persistent IDBBFE0155E2F879AE 803 | Track TypeFile 804 | Locationfile://localhost/Users/nrajlich/Music/iTunes/iTunes%20Media/Music/Jimi%20Hendrix/Are%20You%20Experienced_/06%20I%20Don't%20Like%20Today.mp3 805 | File Folder Count5 806 | Library Folder Count1 807 | 808 | 206 809 | 810 | Track ID206 811 | NameMay This Be Love 812 | ArtistJimi Hendrix 813 | Album ArtistJimi Hendrix 814 | AlbumAre You Experienced? 815 | GenreRock 816 | KindMPEG audio file 817 | Size3822599 818 | Total Time191111 819 | Track Number7 820 | Year1967 821 | Date Modified2010-01-26T01:15:51Z 822 | Date Added2010-02-08T21:41:23Z 823 | Bit Rate160 824 | Sample Rate44100 825 | Play Count3 826 | Play Date3348666177 827 | Play Date UTC2010-02-11T00:02:57Z 828 | Persistent ID78223889FB353BDC 829 | Track TypeFile 830 | Locationfile://localhost/Users/nrajlich/Music/iTunes/iTunes%20Media/Music/Jimi%20Hendrix/Are%20You%20Experienced_/07%20May%20This%20Be%20Love.mp3 831 | File Folder Count5 832 | Library Folder Count1 833 | 834 | 208 835 | 836 | Track ID208 837 | NameFire 838 | ArtistJimi Hendrix 839 | Album ArtistJimi Hendrix 840 | AlbumAre You Experienced? 841 | GenreRock 842 | KindMPEG audio file 843 | Size3300127 844 | Total Time164989 845 | Track Number8 846 | Year1967 847 | Date Modified2010-01-26T10:19:03Z 848 | Date Added2010-02-08T21:41:23Z 849 | Bit Rate160 850 | Sample Rate44100 851 | Play Count1 852 | Play Date3348666342 853 | Play Date UTC2010-02-11T00:05:42Z 854 | Persistent ID5B469154D5C9EF15 855 | Track TypeFile 856 | Locationfile://localhost/Users/nrajlich/Music/iTunes/iTunes%20Media/Music/Jimi%20Hendrix/Are%20You%20Experienced_/08%20Fire.mp3 857 | File Folder Count5 858 | Library Folder Count1 859 | 860 | 210 861 | 862 | Track ID210 863 | NameThird Stone From The Sun 864 | ArtistJimi Hendrix 865 | Album ArtistJimi Hendrix 866 | ComposerJimi Hendrix 867 | AlbumAre You Experienced? 868 | GenreRock 869 | KindMPEG audio file 870 | Size8086499 871 | Total Time404088 872 | Track Number9 873 | Year1967 874 | Date Modified2010-01-26T09:46:24Z 875 | Date Added2010-02-08T21:41:23Z 876 | Bit Rate160 877 | Sample Rate44100 878 | CommentsEAC-Lame3.92-Extreme 879 | Persistent IDA4BE1B2AF07ACFA7 880 | Track TypeFile 881 | Locationfile://localhost/Users/nrajlich/Music/iTunes/iTunes%20Media/Music/Jimi%20Hendrix/Are%20You%20Experienced_/09%20Third%20Stone%20From%20The%20Sun.mp3 882 | File Folder Count5 883 | Library Folder Count1 884 | 885 | 212 886 | 887 | Track ID212 888 | NameRemember 889 | ArtistJimi Hendrix 890 | Album ArtistJimi Hendrix 891 | ComposerJimi Hendrix 892 | AlbumAre You Experienced? 893 | GenreRock 894 | KindMPEG audio file 895 | Size3372442 896 | Total Time168385 897 | Track Number10 898 | Year1967 899 | Date Modified2010-01-26T10:18:49Z 900 | Date Added2010-02-08T21:41:23Z 901 | Bit Rate160 902 | Sample Rate44100 903 | CommentsEAC-Lame3.92-Extreme 904 | Play Count2 905 | Play Date3348666822 906 | Play Date UTC2010-02-11T00:13:42Z 907 | Persistent ID0A0880195A74A800 908 | Track TypeFile 909 | Locationfile://localhost/Users/nrajlich/Music/iTunes/iTunes%20Media/Music/Jimi%20Hendrix/Are%20You%20Experienced_/10%20Remember.mp3 910 | File Folder Count5 911 | Library Folder Count1 912 | 913 | 214 914 | 915 | Track ID214 916 | NameAre You Experienced 917 | ArtistJimi Hendrix 918 | Album ArtistJimi Hendrix 919 | AlbumAre You Experienced? 920 | GenreRock 921 | KindMPEG audio file 922 | Size5094188 923 | Total Time254693 924 | Year1967 925 | Date Modified2010-01-26T09:50:18Z 926 | Date Added2010-02-08T21:41:23Z 927 | Bit Rate160 928 | Sample Rate44100 929 | Play Count1 930 | Play Date3348668074 931 | Play Date UTC2010-02-11T00:34:34Z 932 | Persistent ID481A059078D4EFDF 933 | Track TypeFile 934 | Locationfile://localhost/Users/nrajlich/Music/iTunes/iTunes%20Media/Music/Jimi%20Hendrix/Are%20You%20Experienced_/Are%20You%20Experienced.mp3 935 | File Folder Count5 936 | Library Folder Count1 937 | 938 | 216 939 | 940 | Track ID216 941 | NameHey Joe 942 | ArtistJimi Hendrix 943 | Album ArtistJimi Hendrix 944 | ComposerJimi Hendrix 945 | AlbumAre You Experienced? 946 | GenreRock 947 | KindMPEG audio file 948 | Size4207838 949 | Total Time210155 950 | Track Number1 951 | Year1967 952 | Date Modified2010-01-24T04:32:51Z 953 | Date Added2010-02-08T21:41:23Z 954 | Bit Rate160 955 | Sample Rate44100 956 | CommentsEAC-Lame3.92-Extreme 957 | Play Count2 958 | Play Date3348665407 959 | Play Date UTC2010-02-10T23:50:07Z 960 | Persistent IDD8CA36FCF4A8BBA3 961 | Track TypeFile 962 | Locationfile://localhost/Users/nrajlich/Music/iTunes/iTunes%20Media/Music/Jimi%20Hendrix/Are%20You%20Experienced_/01%20Hey%20Joe.mp3 963 | File Folder Count5 964 | Library Folder Count1 965 | 966 | 218 967 | 968 | Track ID218 969 | NameStone Free 970 | ArtistJimi Hendrix 971 | Album ArtistJimi Hendrix 972 | AlbumAre You Experienced? 973 | GenreRock 974 | KindMPEG audio file 975 | Size4327746 976 | Total Time216372 977 | Year1967 978 | Date Modified2010-01-24T04:27:53Z 979 | Date Added2010-02-08T21:41:24Z 980 | Bit Rate160 981 | Sample Rate44100 982 | Play Count1 983 | Play Date3348667436 984 | Play Date UTC2010-02-11T00:23:56Z 985 | Persistent ID237FA7D9D9AD6E7F 986 | Track TypeFile 987 | Locationfile://localhost/Users/nrajlich/Music/iTunes/iTunes%20Media/Music/Jimi%20Hendrix/Are%20You%20Experienced_/Stone%20Free.mp3 988 | File Folder Count5 989 | Library Folder Count1 990 | 991 | 220 992 | 993 | Track ID220 994 | NamePurple Haze 995 | ArtistJimi Hendrix 996 | Album ArtistJimi Hendrix 997 | AlbumAre You Experienced? 998 | GenreRock 999 | KindMPEG audio file 1000 | Size3431224 1001 | Total Time171546 1002 | Year1967 1003 | Date Modified2010-01-25T07:20:51Z 1004 | Date Added2010-02-08T21:41:24Z 1005 | Bit Rate160 1006 | Sample Rate44100 1007 | Play Count1 1008 | Play Date3348667607 1009 | Play Date UTC2010-02-11T00:26:47Z 1010 | Persistent IDD2960E190F8D85B1 1011 | Track TypeFile 1012 | Locationfile://localhost/Users/nrajlich/Music/iTunes/iTunes%20Media/Music/Jimi%20Hendrix/Are%20You%20Experienced_/Purple%20Haze.mp3 1013 | File Folder Count5 1014 | Library Folder Count1 1015 | 1016 | 222 1017 | 1018 | Track ID222 1019 | Name51ST Anniversary 1020 | ArtistJimi Hendrix 1021 | Album ArtistJimi Hendrix 1022 | AlbumAre You Experienced? 1023 | GenreRock 1024 | KindMPEG audio file 1025 | Size3925989 1026 | Total Time196284 1027 | Year1967 1028 | Date Modified2010-01-25T23:59:37Z 1029 | Date Added2010-02-08T21:41:24Z 1030 | Bit Rate160 1031 | Sample Rate44100 1032 | Play Count4 1033 | Play Date3355116022 1034 | Play Date UTC2010-04-26T15:40:22Z 1035 | Persistent ID0ECCDE0449BB37BA 1036 | Track TypeFile 1037 | Locationfile://localhost/Users/nrajlich/Music/iTunes/iTunes%20Media/Music/Jimi%20Hendrix/Are%20You%20Experienced_/51ST%20Anniversary.mp3 1038 | File Folder Count5 1039 | Library Folder Count1 1040 | 1041 | 224 1042 | 1043 | Track ID224 1044 | NameThe Wind Cries Mary 1045 | ArtistJimi Hendrix 1046 | Album ArtistJimi Hendrix 1047 | AlbumAre You Experienced? 1048 | GenreRock 1049 | KindMPEG audio file 1050 | Size4016375 1051 | Total Time200803 1052 | Year1967 1053 | Date Modified2010-01-26T09:20:34Z 1054 | Date Added2010-02-08T21:41:24Z 1055 | Bit Rate160 1056 | Sample Rate44100 1057 | Play Count5 1058 | Play Date3355115826 1059 | Play Date UTC2010-04-26T15:37:06Z 1060 | Sort NameWind Cries Mary 1061 | Persistent IDC843C532021E12D8 1062 | Track TypeFile 1063 | Locationfile://localhost/Users/nrajlich/Music/iTunes/iTunes%20Media/Music/Jimi%20Hendrix/Are%20You%20Experienced_/The%20Wind%20Cries%20Mary.mp3 1064 | File Folder Count5 1065 | Library Folder Count1 1066 | 1067 | 226 1068 | 1069 | Track ID226 1070 | NameHightway Chile 1071 | ArtistJimi Hendrix 1072 | Album ArtistJimi Hendrix 1073 | AlbumAre You Experienced? 1074 | GenreRock 1075 | KindMPEG audio file 1076 | Size4250950 1077 | Total Time212532 1078 | Year1967 1079 | Date Modified2010-01-24T04:31:03Z 1080 | Date Added2010-02-08T21:41:24Z 1081 | Bit Rate160 1082 | Sample Rate44100 1083 | Play Count1 1084 | Play Date3348667820 1085 | Play Date UTC2010-02-11T00:30:20Z 1086 | Persistent ID0571292CC8452E1E 1087 | Track TypeFile 1088 | Locationfile://localhost/Users/nrajlich/Music/iTunes/iTunes%20Media/Music/Jimi%20Hendrix/Are%20You%20Experienced_/Hightway%20Chile.mp3 1089 | File Folder Count5 1090 | Library Folder Count1 1091 | 1092 | 1093 | Playlists 1094 | 1095 | 1096 | NameLibrary 1097 | Master 1098 | Playlist ID230 1099 | Playlist Persistent IDA69C1BD116F1FECB 1100 | Visible 1101 | All Items 1102 | Playlist Items 1103 | 1104 | 1105 | Track ID214 1106 | 1107 | 1108 | Track ID226 1109 | 1110 | 1111 | Track ID220 1112 | 1113 | 1114 | Track ID218 1115 | 1116 | 1117 | Track ID224 1118 | 1119 | 1120 | Track ID222 1121 | 1122 | 1123 | Track ID194 1124 | 1125 | 1126 | Track ID216 1127 | 1128 | 1129 | Track ID196 1130 | 1131 | 1132 | Track ID198 1133 | 1134 | 1135 | Track ID200 1136 | 1137 | 1138 | Track ID202 1139 | 1140 | 1141 | Track ID204 1142 | 1143 | 1144 | Track ID206 1145 | 1146 | 1147 | Track ID208 1148 | 1149 | 1150 | Track ID210 1151 | 1152 | 1153 | Track ID212 1154 | 1155 | 1156 | Track ID96 1157 | 1158 | 1159 | Track ID98 1160 | 1161 | 1162 | Track ID100 1163 | 1164 | 1165 | Track ID102 1166 | 1167 | 1168 | Track ID104 1169 | 1170 | 1171 | Track ID106 1172 | 1173 | 1174 | Track ID108 1175 | 1176 | 1177 | Track ID110 1178 | 1179 | 1180 | Track ID112 1181 | 1182 | 1183 | Track ID114 1184 | 1185 | 1186 | Track ID116 1187 | 1188 | 1189 | Track ID118 1190 | 1191 | 1192 | Track ID120 1193 | 1194 | 1195 | Track ID124 1196 | 1197 | 1198 | Track ID126 1199 | 1200 | 1201 | Track ID122 1202 | 1203 | 1204 | Track ID128 1205 | 1206 | 1207 | Track ID130 1208 | 1209 | 1210 | Track ID132 1211 | 1212 | 1213 | Track ID134 1214 | 1215 | 1216 | Track ID136 1217 | 1218 | 1219 | Track ID138 1220 | 1221 | 1222 | Track ID140 1223 | 1224 | 1225 | Track ID142 1226 | 1227 | 1228 | Track ID144 1229 | 1230 | 1231 | 1232 | 1233 | NameMusic 1234 | Playlist ID360 1235 | Playlist Persistent IDCBEA1F13379F04CD 1236 | Distinguished Kind4 1237 | Music 1238 | All Items 1239 | Smart Info 1240 | 1241 | AQEAAwAAAAIAAAAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1242 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1243 | AAAAAA== 1244 | 1245 | Smart Criteria 1246 | 1247 | U0xzdAABAAEAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1248 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1249 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAQAAAAAAAAAAAAAAAAAAAAAAAAA 1250 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEAAAAAAAQIbEAAAAAAAAAAAAAAAAAAAAB 1251 | AAAAAAAQIbEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AgAIAAAA 1252 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARAAAAAAAACAE 1253 | AAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAA 1254 | AAAAAAAAAAAAPAIACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1255 | AAAAAAAAAEQAAAAAACAgAAAAAAAAAAAAAAAAAAAAAAEAAAAAACAAAAAAAAAAAAAAAAAAAAAA 1256 | AAEAAAAAAAAAAAAAAAAAAAAAAAAAAA== 1257 | 1258 | Playlist Items 1259 | 1260 | 1261 | Track ID214 1262 | 1263 | 1264 | Track ID226 1265 | 1266 | 1267 | Track ID220 1268 | 1269 | 1270 | Track ID218 1271 | 1272 | 1273 | Track ID224 1274 | 1275 | 1276 | Track ID222 1277 | 1278 | 1279 | Track ID194 1280 | 1281 | 1282 | Track ID216 1283 | 1284 | 1285 | Track ID196 1286 | 1287 | 1288 | Track ID198 1289 | 1290 | 1291 | Track ID200 1292 | 1293 | 1294 | Track ID202 1295 | 1296 | 1297 | Track ID204 1298 | 1299 | 1300 | Track ID206 1301 | 1302 | 1303 | Track ID208 1304 | 1305 | 1306 | Track ID210 1307 | 1308 | 1309 | Track ID212 1310 | 1311 | 1312 | Track ID96 1313 | 1314 | 1315 | Track ID98 1316 | 1317 | 1318 | Track ID100 1319 | 1320 | 1321 | Track ID102 1322 | 1323 | 1324 | Track ID104 1325 | 1326 | 1327 | Track ID106 1328 | 1329 | 1330 | Track ID108 1331 | 1332 | 1333 | Track ID110 1334 | 1335 | 1336 | Track ID112 1337 | 1338 | 1339 | Track ID114 1340 | 1341 | 1342 | Track ID116 1343 | 1344 | 1345 | Track ID118 1346 | 1347 | 1348 | Track ID120 1349 | 1350 | 1351 | Track ID124 1352 | 1353 | 1354 | Track ID126 1355 | 1356 | 1357 | Track ID122 1358 | 1359 | 1360 | Track ID128 1361 | 1362 | 1363 | Track ID130 1364 | 1365 | 1366 | Track ID132 1367 | 1368 | 1369 | Track ID134 1370 | 1371 | 1372 | Track ID136 1373 | 1374 | 1375 | Track ID138 1376 | 1377 | 1378 | Track ID140 1379 | 1380 | 1381 | Track ID142 1382 | 1383 | 1384 | Track ID144 1385 | 1386 | 1387 | 1388 | 1389 | NameMovies 1390 | Playlist ID430 1391 | Playlist Persistent ID619F42A5429501E0 1392 | Distinguished Kind2 1393 | Movies 1394 | All Items 1395 | Smart Info 1396 | 1397 | AQEAAwAAAAIAAAAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1398 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1399 | AAAAAA== 1400 | 1401 | Smart Criteria 1402 | 1403 | U0xzdAABAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1404 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1405 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAgAAAAAAAAAAAAAAAAAAAAAAAAA 1406 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEAAAAAAAggAYAAAAAAAAAAAAAAAAAAAAB 1407 | AAAAAAAAAAIAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAA= 1408 | 1409 | 1410 | 1411 | NameTV Shows 1412 | Playlist ID433 1413 | Playlist Persistent ID2A3B4D9E7DF7E1DC 1414 | Distinguished Kind3 1415 | TV Shows 1416 | All Items 1417 | Smart Info 1418 | 1419 | AQEAAwAAAAIAAAAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1420 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1421 | AAAAAA== 1422 | 1423 | Smart Criteria 1424 | 1425 | U0xzdAABAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1426 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1427 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAgAAAAAAAAAAAAAAAAAAAAAAAAA 1428 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEAAAAAAAggEQAAAAAAAAAAAAAAAAAAAAB 1429 | AAAAAAAAAEAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAA= 1430 | 1431 | 1432 | 1433 | NamePodcasts 1434 | Playlist ID349 1435 | Playlist Persistent ID5893FA607639E850 1436 | Distinguished Kind10 1437 | Podcasts 1438 | All Items 1439 | 1440 | 1441 | NameiTunes DJ 1442 | Playlist ID346 1443 | Playlist Persistent ID60C45B0A657E0FC9 1444 | Distinguished Kind22 1445 | Party Shuffle 1446 | All Items 1447 | 1448 | 1449 | Name90’s Music 1450 | Playlist ID300 1451 | Playlist Persistent IDF6C03EFBF4BEB1F4 1452 | All Items 1453 | Smart Info 1454 | 1455 | AQEAAwAAAAIAAAAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1456 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1457 | AAAAAA== 1458 | 1459 | Smart Criteria 1460 | 1461 | U0xzdAABAAEAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1462 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1463 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAEAAAAAAAAAAAAAAAAAAAAAAAAA 1464 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEAAAAAAAAB8YAAAAAAAAAAAAAAAAAAAAB 1465 | AAAAAAAAB88AAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEA 1466 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgFNMc3QAAQAB 1467 | AAAAAgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1468 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1469 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1470 | AAAAAAAAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAB 1471 | AAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAABAAAAAAAAAAAAAAA 1472 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEQAAAAAAAAAIAAAAAAAAAAA 1473 | AAAAAAAAAAEAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAA== 1474 | 1475 | 1476 | 1477 | NameClassical Music 1478 | Playlist ID343 1479 | Playlist Persistent ID9501F232E8586901 1480 | All Items 1481 | Smart Info 1482 | 1483 | AQEAAwAAAAIAAAAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1484 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1485 | AAAAAA== 1486 | 1487 | Smart Criteria 1488 | 1489 | U0xzdAABAAEAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1490 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1491 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQAAAAAAAAAAAAAAAAAAAAAA 1492 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAU0xzdAABAAEAAAACAAAAAQAAAAAAAAAA 1493 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1494 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1495 | AAAAAAAAADwAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1496 | AAAAAABEAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAB 1497 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1498 | AAAAAAAAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAg 1499 | AAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAAAAAAAAAAA 1500 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnpTTHN0AAEAAQAAAAcAAAAB 1501 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1502 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1503 | AAAAAAAAAAAAAAAAAAAACAEAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1504 | AAAAAAAAAAAAAAAAABIAQwBsAGEAcwBzAGkAYwBhAGwAAAAIAQAAAQAAAAAAAAAAAAAAAAAA 1505 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEABLAGwAYQBzAHMAaQBlAGsAAAAI 1506 | AQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgBD 1507 | AGwAYQBzAHMAaQBxAHUAZQAAAAgBAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1508 | AAAAAAAAAAAAAAAAAAAAAAAOAEsAbABhAHMAcwBpAGsAAAAIAQAAAQAAAAAAAAAAAAAAAAAA 1509 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEABDAGwAYQBzAHMAaQBjAGEAAAAI 1510 | AQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACjCv 1511 | MOkwtzDDMK8AAAAIAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1512 | AAAAAAAAAAAADgBDAGwA4QBzAGkAYwBh 1513 | 1514 | 1515 | 1516 | NameMusic Videos 1517 | Playlist ID340 1518 | Playlist Persistent ID8E2AFE4E1C2ABB13 1519 | All Items 1520 | Smart Info 1521 | 1522 | AQEAAwAAAAIAAAAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1523 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1524 | AAAAAA== 1525 | 1526 | Smart Criteria 1527 | 1528 | U0xzdAABAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1529 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1530 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAQAAAAAAAAAAAAAAAAAAAAAAAAA 1531 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAB 1532 | AAAAAAAAACAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAA= 1533 | 1534 | 1535 | 1536 | NameMy Top Rated 1537 | Playlist ID303 1538 | Playlist Persistent IDCCC0C1B6CCEA8937 1539 | All Items 1540 | Smart Info 1541 | 1542 | AQEAAwAAAAIAAAAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1543 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1544 | AAAAAA== 1545 | 1546 | Smart Criteria 1547 | 1548 | U0xzdAABAAEAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1549 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1550 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkAAAAQAAAAAAAAAAAAAAAAAAAAAAAA 1551 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEAAAAAAAAADwAAAAAAAAAAAAAAAAAAAAB 1552 | AAAAAAAAADwAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAA= 1553 | 1554 | 1555 | 1556 | NameRecently Added 1557 | Playlist ID337 1558 | Playlist Persistent ID3440763CBB97D6F6 1559 | All Items 1560 | Smart Info 1561 | 1562 | AQEAAwAAAAIAAAAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1563 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1564 | AAAAAA== 1565 | 1566 | Smart Criteria 1567 | 1568 | U0xzdAABAAEAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1569 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1570 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAIAAAAAAAAAAAAAAAAAAAAAAAAA 1571 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABELa4tri2uLa7//////////gAAAAAACTqA 1572 | La4tri2uLa4AAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5AgAAAQAA 1573 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAB 1574 | AAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAA 1575 | AAAAAAAA 1576 | 1577 | 1578 | 1579 | NameRecently Played 1580 | Playlist ID334 1581 | Playlist Persistent ID9C418444F8C06D46 1582 | All Items 1583 | Smart Info 1584 | 1585 | AQEAAwAAAAIAAAAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1586 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1587 | AAAAAA== 1588 | 1589 | Smart Criteria 1590 | 1591 | U0xzdAABAAEAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1592 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1593 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAAIAAAAAAAAAAAAAAAAAAAAAAAAA 1594 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABELa4tri2uLa7//////////gAAAAAACTqA 1595 | La4tri2uLa4AAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5AgAAAQAA 1596 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAB 1597 | AAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAA 1598 | AAAAAAAA 1599 | 1600 | 1601 | 1602 | NameTop 25 Most Played 1603 | Playlist ID306 1604 | Playlist Persistent IDB8A41A971A08EFE9 1605 | All Items 1606 | Smart Info 1607 | 1608 | AQEBAwAAABkAAAAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1609 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1610 | AAAAAA== 1611 | 1612 | Smart Criteria 1613 | 1614 | U0xzdAABAAEAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1615 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1616 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADkCAAABAAAAAAAAAAAAAAAAAAAAAAAA 1617 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAB 1618 | AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAAAEAAA 1619 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAA 1620 | AAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAA 1621 | AAAAAAAA 1622 | 1623 | Playlist Items 1624 | 1625 | 1626 | Track ID224 1627 | 1628 | 1629 | Track ID222 1630 | 1631 | 1632 | Track ID196 1633 | 1634 | 1635 | Track ID206 1636 | 1637 | 1638 | Track ID98 1639 | 1640 | 1641 | Track ID194 1642 | 1643 | 1644 | Track ID216 1645 | 1646 | 1647 | Track ID198 1648 | 1649 | 1650 | Track ID200 1651 | 1652 | 1653 | Track ID212 1654 | 1655 | 1656 | Track ID100 1657 | 1658 | 1659 | Track ID102 1660 | 1661 | 1662 | Track ID104 1663 | 1664 | 1665 | Track ID106 1666 | 1667 | 1668 | Track ID116 1669 | 1670 | 1671 | Track ID214 1672 | 1673 | 1674 | Track ID226 1675 | 1676 | 1677 | Track ID220 1678 | 1679 | 1680 | Track ID218 1681 | 1682 | 1683 | Track ID202 1684 | 1685 | 1686 | Track ID204 1687 | 1688 | 1689 | Track ID208 1690 | 1691 | 1692 | Track ID112 1693 | 1694 | 1695 | Track ID118 1696 | 1697 | 1698 | Track ID120 1699 | 1700 | 1701 | 1702 | 1703 | 1704 | 1705 | -------------------------------------------------------------------------------- /tests/sample1.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleIdentifier 8 | com.apple.dictionary.MySample 9 | CFBundleName 10 | MyDictionary 11 | CFBundleShortVersionString 12 | 1.0 13 | DCSDictionaryCopyright 14 | Copyright © 2007 Apple Inc. 15 | DCSDictionaryManufacturerName 16 | Apple Inc. 17 | DCSDictionaryFrontMatterReferenceID 18 | front_back_matter 19 | DCSDictionaryPrefsHTML 20 | MyDictionary_prefs.html 21 | DCSDictionaryXSL 22 | MyDictionary.xsl 23 | DCSDictionaryDefaultPrefs 24 | 25 | pronunciation 26 | 0 27 | display-column 28 | 1 29 | display-picture 30 | 1 31 | version 32 | 1 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /tests/sample2.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | OptionsLabel 6 | Product 7 | PopupMenu 8 | 9 | 10 | Key 11 | iPhone 12 | Title 13 | iPhone 14 | 15 | 16 | Key 17 | iPad 18 | Title 19 | iPad 20 | 21 | 22 | Key 23 | 24 | 34 | 35 | 36 | 37 | TemplateSelection 38 | 39 | iPhone 40 | Tab Bar iPhone Application 41 | iPad 42 | Tab Bar iPad Application 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /tests/test-base64.js: -------------------------------------------------------------------------------- 1 | /** 2 | * tests for base64 encoding and decoding, used in elements 3 | */ 4 | 5 | var path = require('path') 6 | , plist = require('../'); 7 | 8 | exports.testDecodeBase64 = function(test) { 9 | var file = path.join(__dirname, 'utf8data.xml'); 10 | var p = plist.parseFileSync(file); 11 | test.equal(p['Smart Info'], '✓ à la mode'); 12 | test.done(); 13 | } 14 | 15 | exports.testDecodeBase64WithNewlines = function(test) { 16 | var file = path.join(__dirname, 'utf8data.xml'); 17 | var p = plist.parseFileSync(file); 18 | test.equal(p['Newlines'], '✓ à la mode'); 19 | test.done(); 20 | } 21 | 22 | exports.testBase64Encode = function(test) { 23 | var to_write = { yay: '✓ à la mode' }; 24 | var out = plist.build(to_write); 25 | var p = plist.parseStringSync(out); 26 | test.equal(p['yay'], '✓ à la mode'); 27 | test.done(); 28 | } 29 | -------------------------------------------------------------------------------- /tests/test-big-xml.js: -------------------------------------------------------------------------------- 1 | var path = require('path') 2 | , plist = require('../') 3 | , file = path.join(__dirname, 'iTunes-BIG.xml') 4 | , startTime = new Date(); 5 | 6 | exports.textBigXML = function(test) { 7 | plist.parseFile(file, function(err, dicts) { 8 | var dict = dicts[0]; 9 | 10 | test.ifError(err); 11 | 12 | test.equal(dicts.length, 1); 13 | test.equal(dict['Application Version'], '9.2.1'); 14 | test.deepEqual(Object.keys(dict), [ 15 | 'Major Version' 16 | , 'Minor Version' 17 | , 'Application Version' 18 | , 'Features' 19 | , 'Show Content Ratings' 20 | , 'Music Folder' 21 | , 'Library Persistent ID' 22 | , 'Tracks' 23 | , 'Playlists' 24 | ]); 25 | 26 | test.done(); 27 | }); 28 | } 29 | -------------------------------------------------------------------------------- /tests/test-build.js: -------------------------------------------------------------------------------- 1 | var path = require('path') 2 | , fs = require('fs') 3 | , plist = require('../'); 4 | 5 | /* 6 | // TODO These assertions fail because CDATA entities get converted in the process 7 | exports.testBuildFromPlistFile = function(test) { 8 | var file = path.join(__dirname, 'sample2.plist'); 9 | 10 | plist.parseFile(file, function(err, dicts) { 11 | var dict = dicts[0]; 12 | test.ifError(err); 13 | 14 | // Try re-stringifying and re-parsing 15 | plist.parseString(plist.build(dict), function(err, dicts2) { 16 | test.ifError(err); 17 | test.deepEqual(dicts,dicts2); 18 | test.done(); 19 | }); 20 | }); 21 | } 22 | */ 23 | 24 | 25 | exports.testNonBase64StringsAsData = function(test) { 26 | var test_object = { 'a': 'test stringy thingy', 'b': 'this contains non base64 ✔ ' }; 27 | 28 | var result = plist.build(test_object); 29 | var DOMParser = require('xmldom').DOMParser; 30 | var doc = new DOMParser().parseFromString(result); 31 | 32 | test.equal('a', doc.documentElement.childNodes[1].childNodes[1].childNodes[0].nodeValue); 33 | test.equal('string', doc.documentElement.childNodes[1].childNodes[3].nodeName); 34 | test.equal('test stringy thingy', doc.documentElement.childNodes[1].childNodes[3].childNodes[0].nodeValue); 35 | 36 | test.equal('b', doc.documentElement.childNodes[1].childNodes[5].childNodes[0].nodeValue); 37 | test.equal ('string', doc.documentElement.childNodes[1].childNodes[7].nodeName); 38 | test.equal ('this contains non base64 ✔ ', doc.documentElement.childNodes[1].childNodes[7].childNodes[0].nodeValue); 39 | 40 | test.done(); 41 | } 42 | 43 | 44 | 45 | exports.testBuildFromObjectWithFunctions = function(test) { 46 | var test_object = { 'a': 'test stringy thingy', 'b': function(c, d){ return 'neat'; } }; 47 | 48 | // Try stringifying 49 | plist.parseString(plist.build(test_object), function(err, dicts) { 50 | test.equal(dicts[0].b, undefined); 51 | test.equal(dicts[0].a, 'test stringy thingy'); 52 | test.done(); 53 | }); 54 | } 55 | 56 | 57 | exports.testBuildFromSmallItunesXML = function(test) { 58 | var file = path.join(__dirname, 'iTunes-small.xml'); 59 | plist.parseFile(file, function(err, dicts) { 60 | var dict = dicts[0]; 61 | 62 | test.ifError(err); 63 | 64 | // Try re-stringifying and re-parsing 65 | plist.parseString(plist.build(dict), function(err, dicts2) { 66 | test.ifError(err); 67 | test.deepEqual(dicts,dicts2); 68 | test.done(); 69 | }); 70 | }); 71 | } 72 | 73 | exports.testBuildAirplayXML = function(test) { 74 | var file = path.join(__dirname, 'airplay.xml'); 75 | 76 | plist.parseFile(file, function(err, dicts) { 77 | var dict = dicts[0]; 78 | test.ifError(err); 79 | 80 | // Try re-stringifying and re-parsing 81 | plist.parseString(plist.build(dict), function(err, dicts2) { 82 | test.ifError(err); 83 | test.deepEqual(dicts,dicts2); 84 | test.done(); 85 | }); 86 | }); 87 | } 88 | 89 | exports.testCordovaPlist = function(test) { 90 | var file = path.join(__dirname, 'Cordova.plist'); 91 | 92 | plist.parseFile(file, function(err, dicts) { 93 | var dict = dicts[0]; 94 | test.ifError(err); 95 | test.equal(dict['TopActivityIndicator'], 'gray'); 96 | test.equal(dict['Plugins']['Device'], 'CDVDevice'); 97 | 98 | // Try re-stringifying and re-parsing 99 | plist.parseString(plist.build(dict), function(err, dicts2) { 100 | test.ifError(err); 101 | test.deepEqual(dicts,dicts2); 102 | test.done(); 103 | }); 104 | }); 105 | } 106 | 107 | exports.testBuildPhoneGapPlist = function(test) { 108 | var file = path.join(__dirname, 'Xcode-PhoneGap.plist'); 109 | 110 | plist.parseFile(file, function(err, dicts) { 111 | var dict = dicts[0]; 112 | test.ifError(err); 113 | 114 | test.equal(dict['ExternalHosts'][0], "*"); 115 | test.equal(dict['Plugins']['com.phonegap.accelerometer'], "PGAccelerometer"); 116 | 117 | //console.log('like they were', dict); 118 | //console.log('hmm', plist.build(dict)); 119 | // Try re-stringifying and re-parsing 120 | plist.parseString(plist.build(dict), function(err, dicts2) { 121 | test.ifError(err); 122 | test.deepEqual(dicts,dicts2); 123 | test.done(); 124 | }); 125 | }); 126 | } 127 | 128 | exports.testBuildXcodeInfoPlist = function(test) { 129 | var file = path.join(__dirname, 'Xcode-Info.plist'); 130 | 131 | plist.parseFile(file, function(err, dicts) { 132 | var dict = dicts[0]; 133 | test.ifError(err); 134 | 135 | test.equal(dict['CFBundleAllowMixedLocalizations'], true); 136 | test.equal(dict['CFBundleExecutable'], "${EXECUTABLE_NAME}"); 137 | test.equal(dict['UISupportedInterfaceOrientations~ipad'][0], "UIInterfaceOrientationPortrait"); 138 | 139 | // Try re-stringifying and re-parsing 140 | plist.parseString(plist.build(dict), function(err, dicts2) { 141 | test.ifError(err); 142 | test.deepEqual(dicts,dicts2); 143 | test.done(); 144 | }); 145 | }); 146 | } 147 | 148 | 149 | // this code does a string to string comparison. It's not very useful right 150 | // now because CDATA sections arent supported. save for later I guess 151 | /* 152 | function flattenXMLForAssert(instr) { 153 | return instr.replace(/\s/g,''); 154 | } 155 | 156 | // Builder test B - build plist from JS object, then compare flattened XML against original plist *file* content 157 | function testBuildAgainstFile(test, dict, infile) { 158 | var doc = plist.build(dict) 159 | , fileContent = fs.readFileSync(infile) 160 | , s1 = flattenXMLForAssert(doc.toString()) 161 | , s2 = flattenXMLForAssert(fileContent.toString()) 162 | , mismatch = ''; 163 | 164 | for (var i=0;iHello World!', function(err, res) { 5 | test.ifError(err); 6 | test.equal(res, 'Hello World!'); 7 | test.done(); 8 | }); 9 | } 10 | 11 | exports.testParseStringSync = function(test) { 12 | test.doesNotThrow(function(){ 13 | var res = plist.parseStringSync('test101'); 14 | test.equal(Object.keys(res)[0], 'test'); 15 | test.equal(res.test, 101); 16 | test.done(); 17 | }); 18 | } 19 | 20 | exports.testParseStringSyncFailsOnInvalidXML = function(test) { 21 | test.throws(function(){ 22 | var res = plist.parseStringSync('Hello World!'); 23 | }); 24 | test.done(); 25 | } 26 | 27 | exports.testDict = function(test) { 28 | plist.parseString('test101', function(err, res) { 29 | test.ifError(err); 30 | 31 | test.ok(Array.isArray(res)); 32 | test.equal(res.length, 1); 33 | test.equal(Object.keys(res[0])[0], 'test'); 34 | test.equal(res[0].test, 101); 35 | test.done(); 36 | }); 37 | } 38 | 39 | exports.testCDATA = function(test) { 40 | plist.parseString('', function(err, res) { 41 | test.ifError(err); 42 | test.equal(res, 'Hello World!<M'); 43 | test.done(); 44 | }); 45 | } 46 | -------------------------------------------------------------------------------- /tests/utf8data.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Smart Info 6 | 4pyTIMOgIGxhIG1vZGU= 7 | Newlines 8 | 4pyTIMOgIGxhIG1vZGU= 9 | 10 | 11 | --------------------------------------------------------------------------------