{ "id": "166598", "key": "TIMOB-24486", "fields": { "issuetype": { "id": "7", "description": "gh.issue.story.desc", "name": "Story", "subtask": false }, "project": { "id": "10153", "key": "TIMOB", "name": "Titanium SDK/CLI", "projectCategory": { "id": "10100", "description": "Titanium and related SDKs used in application development", "name": "Client" } }, "fixVersions": [], "resolution": { "id": "3", "description": "The problem is a duplicate of an existing issue.", "name": "Duplicate" }, "resolutiondate": "2017-03-18T16:39:07.000+0000", "created": "2017-03-14T20:51:04.000+0000", "priority": { "name": "None", "id": "6" }, "labels": [ "i0S", "media", "openMusicLibrary" ], "versions": [ { "id": "18928", "name": "Release 6.0.2", "archived": false, "released": true, "releaseDate": "2017-02-27" } ], "issuelinks": [ { "id": "54575", "type": { "id": "10002", "name": "Duplicate", "inward": "is duplicated by", "outward": "duplicates" }, "outwardIssue": { "id": "165773", "key": "TIMOB-24372", "fields": { "summary": "iOS: Expose all missing MediaItem properties, allow Apple Music playback in Ti.Media.AudioPlayer", "status": { "description": "The issue is considered finished, the resolution is correct. Issues which are closed can be reopened.", "name": "Closed", "id": "6", "statusCategory": { "id": 3, "key": "done", "colorName": "green", "name": "Done" } }, "priority": { "name": "Medium", "id": "3" }, "issuetype": { "id": "2", "description": "A new feature of the product, which has yet to be developed.", "name": "New Feature", "subtask": false } } } } ], "assignee": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "updated": "2017-04-19T16:50:00.000+0000", "status": { "description": "The issue is considered finished, the resolution is correct. Issues which are closed can be reopened.", "name": "Closed", "id": "6", "statusCategory": { "id": 3, "key": "done", "colorName": "green", "name": "Done" } }, "components": [], "description": "h6.description\r\n\r\nExperiencing the JSON.stringify on a media item returns \"{}\" instead of a real stringified output that I can parse.\r\n\r\n{code:title=app.js}\r\n\r\nvar win = Ti.UI.createWindow({\r\n\t\tbackgroundColor : '#fff'\r\n\t});\r\n\r\n\tvar btn = Ti.UI.createButton({\r\n\t\ttitle : 'Trigger'\r\n\t});\r\n\r\n\tbtn.addEventListener('click', function() {\r\n\t\tTitanium.Media.openMusicLibrary({\r\n\t\t\tallowMultipleSelections : false,\r\n\t\t\tmediaTypes : Titanium.Media.MUSIC_MEDIA_TYPE_MUSIC | Titanium.Media.MUSIC_MEDIA_TYPE_ANY_AUDIO,\r\n\t\t\tsuccess : function(event) {\r\n\t\t\t\t// called when media returned from the MusicLibrary\r\n\t\t\t\talert(\"Results: \" + JSON.stringify(event.items[0]));\r\n\t\t\t},\r\n\t\t\tcancel : function() {\r\n\t\t\t\talert(\"Aborting \");\r\n\t\t\t},\r\n\t\t\terror : function(error) {\r\n\t\t\t\t// called when there's an error\r\n\t\t\t\tvar a = Titanium.UI.createAlertDialog({\r\n\t\t\t\t\ttitle : 'Music Library'\r\n\t\t\t\t});\r\n\t\t\t\tif (error.code == Titanium.Media.NO_MUSIC_PLAYER) {\r\n\t\t\t\t\ta.setMessage('Please run this test on device.');\r\n\t\t\t\t} else {\r\n\t\t\t\t\ta.setMessage('Unexpected error: ' + error.code);\r\n\t\t\t\t}\r\n\t\t\t\ta.show();\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t});\r\n\r\n\twin.add(btn);\r\n\r\n win.open();\r\n\r\n{code}\r\n\r\nThanks", "attachment": [], "flagged": false, "summary": " iOS: How to stringify a mediaItem properly.", "creator": { "name": "morahman", "key": "morahman", "displayName": "Motiur Rahman", "active": true, "timeZone": "Asia/Dhaka" }, "subtasks": [], "reporter": { "name": "morahman", "key": "morahman", "displayName": "Motiur Rahman", "active": true, "timeZone": "Asia/Dhaka" }, "environment": "Titanium SDK\r\n SDK Version = 6.0.2.GA\r\n Target Platform = iphone 5s v10.2.1\r\n\r\nOperating System\r\n Name = Mac OS X\r\n Version = 10.12.3\r\n Architecture = 64bit\r\n # CPUs = 4\r\n Memory = 8589934592\r\nNode.js\r\n Node.js Version = 4.6.2\r\n npm Version = 2.15.11\r\nTitanium CLI\r\n CLI Version = 5.0.11\r\n", "comment": { "comments": [ { "id": "412312", "author": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "body": "Just check the docs on the available methods. Media items cannot automatically be stringified. Also ensure to run on device and include the {{NSAppleMusicUsageDescription}} key.", "updateAuthor": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "created": "2017-03-14T21:00:11.000+0000", "updated": "2017-03-14T21:02:40.000+0000" }, { "id": "412358", "author": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "body": "Example of stringified objects:\r\n{code:js}\r\nvar win = Ti.UI.createWindow({\r\n backgroundColor: '#fff'\r\n});\r\n\r\nvar btn = Ti.UI.createButton({\r\n title: 'Trigger'\r\n});\r\n\r\nbtn.addEventListener('click', function() {\r\n Titanium.Media.openMusicLibrary({\r\n allowMultipleSelections: false,\r\n mediaTypes: Titanium.Media.MUSIC_MEDIA_TYPE_MUSIC | Titanium.Media.MUSIC_MEDIA_TYPE_ANY_AUDIO,\r\n success: function(event) {\r\n // called when media returned from the MusicLibrary\r\n\r\n var item = event.items[0];\r\n var stringifiedItem = JSON.stringify({\r\n title: item.title,\r\n artist: item.artist,\r\n albumTrackNumber: item.albumTrackNumber,\r\n // ...\r\n });\r\n\r\n Ti.API.info(stringifiedItem)\r\n\r\n alert(\"Result: \" + stringifiedItem);\r\n },\r\n cancel: function() {\r\n alert(\"Aborting \");\r\n },\r\n error: function(error) {\r\n // called when there's an error\r\n var a = Titanium.UI.createAlertDialog({\r\n title: 'Music Library'\r\n });\r\n if (error.code == Titanium.Media.NO_MUSIC_PLAYER) {\r\n a.setMessage('Please run this test on device.');\r\n } else {\r\n a.setMessage('Unexpected error: ' + error.code);\r\n }\r\n a.show();\r\n }\r\n });\r\n\r\n});\r\n\r\nwin.add(btn);\r\n\r\nwin.open();\r\n{code}", "updateAuthor": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "created": "2017-03-14T21:31:34.000+0000", "updated": "2017-03-14T21:32:02.000+0000" }, { "id": "412472", "author": { "name": "tamirishaysh", "key": "tamirishaysh", "displayName": "Tamir Ishay Sharbat", "active": true, "timeZone": "America/Los_Angeles" }, "body": "when I use JSON.parse on the stringifiedItem in the code above. will the output be a media item that I can play using the musicPlayer?", "updateAuthor": { "name": "tamirishaysh", "key": "tamirishaysh", "displayName": "Tamir Ishay Sharbat", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2017-03-15T08:29:49.000+0000", "updated": "2017-03-15T08:29:49.000+0000" }, { "id": "412481", "author": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "body": "As discussed in an earlier ticket, you should provide the Ti.Media.Item to the Ti.Media.AudioPlayer and check the docs for both API's. Like this:\r\n\r\n{code:js}\r\n// \"items\" is the array of media items\r\nvar musicPlayer = Ti.Media.systemMusicPlayer;\r\nmusicPlayer.setQueue(items[0]); // Get the first song into the queue\r\nmusicPlayer.play();\r\n{code}\r\n\r\nMore docs:\r\n- http://docs.appcelerator.com/platform/latest/#!/api/Titanium.Media.MusicPlayer-method-setQueue\r\n- http://docs.appcelerator.com/platform/latest/#!/api/Titanium.Media.Item\r\n- http://www.clearlyinnovative.com/titanium-appcelerator-quickie-using-system-music-player (a bit outdated, but explains the concept)", "updateAuthor": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "created": "2017-03-15T11:30:45.000+0000", "updated": "2017-03-15T11:30:45.000+0000" }, { "id": "412493", "author": { "name": "tamirishaysh", "key": "tamirishaysh", "displayName": "Tamir Ishay Sharbat", "active": true, "timeZone": "America/Los_Angeles" }, "body": "I know how to use them... the thing is I would like to save the music picked by the user. and I want to use JSON.stringify on a media item \r\nin order to do this, I think you know why (in case you don't know I am planning on using JSON.parse on the saved string and I am hoping to get\r\na media item from that action, a media item I can play using the music player, like you did above) but the output of JSON.stringify on \r\nthe media item is just an empty object (\"{}\") and when I parse that? well guess what, I get an empty object that I can do absolutely nothing \r\nwith. So if you by any chance find a way to save media items (I mean store them like in Ti.App.Properties) I will be more than glad to hear about it. In case you don't know about any then this is a bug (because we should be able to store this information) and let me know when you solve.\r\n\r\ndo you understand the problem now?\r\n", "updateAuthor": { "name": "tamirishaysh", "key": "tamirishaysh", "displayName": "Tamir Ishay Sharbat", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2017-03-15T15:33:47.000+0000", "updated": "2017-03-15T15:33:47.000+0000" }, { "id": "412792", "author": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "body": "I do an did before. But it's still the same thing: The Ti.MediaItem has no properties like other API's like Ti.Blob or Ti.UI.ListItem. The properties are received from the native side generically (see [this method|https://github.com/appcelerator/titanium_mobile/blob/master/iphone/Classes/TiMediaItem.m#L52] for details). This has been done to keep the properties flexible and only return the properties that are actually called. We would also never store them in Ti.App.Properties, because the API is simply not made for that and would make no sense here. \r\n\r\nAnd as said before, you would just need to build an object with the properties that you need and stringify that, I don't see any problem with that. The change would be to have manual properties for all item properties, causing the performance, compile time and flexibility to drop a bit, which isn't suitable as well. ", "updateAuthor": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "created": "2017-03-16T15:25:15.000+0000", "updated": "2017-03-16T15:25:15.000+0000" }, { "id": "413477", "author": { "name": "tamirishaysh", "key": "tamirishaysh", "displayName": "Tamir Ishay Sharbat", "active": true, "timeZone": "America/Los_Angeles" }, "body": "Hans I don't want the user to choose a song every time they go into the app. I want them to choose once and when they quit the app I want the song they chose to be saved so I can use it next time they enter the app\r\n\r\n{code:javascript}\r\n\tvar item = this.avalSounds[0].item;\r\n\tvar mediaItem = {\r\n\t\talbumArtist : item.albumArtist,\r\n\t\talbumTitle : item.albumTitle,\r\n\t\talbumTrackCount : item.albumTrackCount,\r\n\t\talbumTrackNumber : item.albumTrackNumber,\r\n\t\tapiName : item.apiName,\r\n\t\tartist : item.artist,\r\n\t\tartwork : item.artwork,\r\n\t\tbubbleParent : item.bubbleParent,\r\n\t\tcomposer : item.composer,\r\n\t\tdiscCount : item.discCount,\r\n\t\tdiscNumber : item.discNumber,\r\n\t\tgenre : item.genre,\r\n\t\tisCompilation : item.isCompilation,\r\n\t\tlyrics : item.lyrics,\r\n\t\tmediaType : item.mediaType,\r\n\t\tplayCount : item.playCount,\r\n\t\tplaybackDuration : item.playbackDuration,\r\n\t\tpodcastTitle : item.podcastTitle,\r\n\t\trating : item.rating,\r\n\t\tskipCount : item.skipCount,\r\n\t\ttitle : item.title,\r\n\t};\r\n\tvar x = JSON.stringify(mediaItem);\r\n\tvar y = JSON.parse(x);\r\n\tvar musicPlayer = Ti.Media.appMusicPlayer;\r\n\tmusicPlayer.setQueue([y]);\r\n\tmusicPlayer.play();\r\n{code}\r\n\r\nthe code above doesn't play the song the user picked. Which means that I cannot save the media item in the way you suggested and still play it using the music player. (this is the functionality I am looking for, not just saving information but actually playing it).\r\n(By the way when I change the second to last row with \"musicPlayer.setQueue([item])\" everything works fine so the problem is not my code but the fact that you can't play the media item after stringifying like you suggested)\r\nI am pretty sure there is a way to save media items like so using native ios programing. if you have any other suggestions please notify me otherwise I suggest you add this ability in the next sdk release\r\n", "updateAuthor": { "name": "tamirishaysh", "key": "tamirishaysh", "displayName": "Tamir Ishay Sharbat", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2017-03-17T09:22:40.000+0000", "updated": "2017-03-17T09:22:40.000+0000" }, { "id": "413634", "author": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "body": "You cannot save media items, not in Titanium and not natively (see reference [here|http://stackoverflow.com/a/8624460/5537752]). You would query items based on their properties, like you can do with {{Ti.Media.queryMusicLibrary}}, quere you would pass the track information and get matches to that specific predicate. One thing we should improve is to expose the {{MPMediaItemPropertyPersistentID}} property as the \"persistentID\", so you could store that one in your user defaults / Ti.App.Properties and use it as the argument for {{musicPlayer.setQueue()}}.\r\n\r\nThe following works after my patch:\r\n{code:js}\r\nvar win = Ti.UI.createWindow({\r\n backgroundColor: '#fff'\r\n});\r\n \r\nvar btn = Ti.UI.createButton({\r\n title: 'Trigger'\r\n});\r\n \r\nbtn.addEventListener('click', function() {\r\n Titanium.Media.openMusicLibrary({\r\n allowMultipleSelections: false,\r\n mediaTypes: Titanium.Media.MUSIC_MEDIA_TYPE_MUSIC | Titanium.Media.MUSIC_MEDIA_TYPE_ANY_AUDIO,\r\n success: function(event) {\r\n // called when media returned from the MusicLibrary\r\n \r\n var item = event.items[0];\r\n Ti.App.Properties.setString('mySong', item.persistentID);\r\n\r\n var musicPlayer = Ti.Media.systemMusicPlayer;\r\n musicPlayer.setQueue(Ti.App.Properties.getString('mySong', null)); // Get the first song into the queue\r\n musicPlayer.play();\r\n },\r\n cancel: function() {\r\n alert(\"Aborting \");\r\n },\r\n error: function(error) {\r\n // called when there's an error\r\n var a = Titanium.UI.createAlertDialog({\r\n title: 'Music Library'\r\n });\r\n if (error.code == Titanium.Media.NO_MUSIC_PLAYER) {\r\n a.setMessage('Please run this test on device.');\r\n } else {\r\n a.setMessage('Unexpected error: ' + error.code);\r\n }\r\n a.show();\r\n }\r\n });\r\n \r\n});\r\n \r\nwin.add(btn);\r\nwin.open();\r\n{code}\r\n\r\nIn your case, you could check if the track exists already and start your player afterwards. Is that something you could think of? Then I'd add it as part of [this PR|https://github.com/appcelerator/titanium_mobile/pull/8817] and you can patch your SDK right now. It would also be part of 6.1.0 then.\r\n\r\n*EDIT*: If just [added|https://github.com/appcelerator/titanium_mobile/pull/8817/commits/deeb9f46bd700f4490a0fc31824b59518130f131] the above discussed changes to the existing PR. If you agree, we'd resolve this ticket and get the PR handled in the other ticket, so we can include it into the core asap.", "updateAuthor": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "created": "2017-03-18T14:09:51.000+0000", "updated": "2017-03-18T14:26:03.000+0000" }, { "id": "413635", "author": { "name": "tamirishaysh", "key": "tamirishaysh", "displayName": "Tamir Ishay Sharbat", "active": true, "timeZone": "America/Los_Angeles" }, "body": "Thanks Hans :) . this solves my problem. \r\njust a few questions:\r\n\r\n1. from what sdk version is the \"persistentID\" property available and how can I check if a certain ID already exists?\r\n2. from what sdk version will I be able to use musicPlayer.setQueue() with persistentID?\r\n\r\nplease notify me when the master branch will include these functionalities.\r\n\r\nthanks again :) ", "updateAuthor": { "name": "tamirishaysh", "key": "tamirishaysh", "displayName": "Tamir Ishay Sharbat", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2017-03-18T15:45:19.000+0000", "updated": "2017-03-18T15:45:19.000+0000" }, { "id": "413636", "author": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "body": "Cool! So the PR is open and will be in 6.1.0 (final release not sure, yet). As soon the PR is merged, you cam grab a build and use it. Or you can go to Github and change the files manually (remove the red parts and replace it with the green ones). I will resolve this ticket as Duplicte now and ensure that the other gets reviewing in time. ", "updateAuthor": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "created": "2017-03-18T16:38:51.000+0000", "updated": "2017-03-18T16:38:51.000+0000" }, { "id": "413642", "author": { "name": "tamirishaysh", "key": "tamirishaysh", "displayName": "Tamir Ishay Sharbat", "active": true, "timeZone": "America/Los_Angeles" }, "body": "thanks! who do I need to talk to in order to get notify when the PR is merged?", "updateAuthor": { "name": "tamirishaysh", "key": "tamirishaysh", "displayName": "Tamir Ishay Sharbat", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2017-03-19T19:31:10.000+0000", "updated": "2017-03-19T19:31:10.000+0000" }, { "id": "413643", "author": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "body": "Just ensure you follow TIMOB-24372 and check when the status changes to \"Resolved - Fixed\". I will also ping you when it's done!", "updateAuthor": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "created": "2017-03-19T22:51:08.000+0000", "updated": "2017-03-19T22:51:08.000+0000" }, { "id": "416352", "author": { "name": "lmorris", "key": "lmorris", "displayName": "Lee Morris", "active": false, "timeZone": "America/Los_Angeles" }, "body": "Closing ticket as duplicate, please see TIMOB-24372.", "updateAuthor": { "name": "lmorris", "key": "lmorris", "displayName": "Lee Morris", "active": false, "timeZone": "America/Los_Angeles" }, "created": "2017-03-30T17:19:22.000+0000", "updated": "2017-03-30T17:19:22.000+0000" }, { "id": "417183", "author": { "name": "tamirishaysh", "key": "tamirishaysh", "displayName": "Tamir Ishay Sharbat", "active": true, "timeZone": "America/Los_Angeles" }, "body": "Was the PR merged yet? Can I use persistentID with the current master version?", "updateAuthor": { "name": "tamirishaysh", "key": "tamirishaysh", "displayName": "Tamir Ishay Sharbat", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2017-04-11T13:16:56.000+0000", "updated": "2017-04-11T13:16:56.000+0000" }, { "id": "417184", "author": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "body": "Hey Tamir, yeah you can (even with 6_1_X)! Use the {{persistentID}} on the Ti.Media.Item. See the example given in TIMOB-24372.", "updateAuthor": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "created": "2017-04-11T13:24:19.000+0000", "updated": "2017-04-11T13:24:19.000+0000" }, { "id": "417249", "author": { "name": "tamirishaysh", "key": "tamirishaysh", "displayName": "Tamir Ishay Sharbat", "active": true, "timeZone": "America/Los_Angeles" }, "body": "Great!, thanks Hans.\r\n\r\nJust one more question, how can I check if a given persistentID is indeed present in the user's music library?\r\n", "updateAuthor": { "name": "tamirishaysh", "key": "tamirishaysh", "displayName": "Tamir Ishay Sharbat", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2017-04-12T07:00:34.000+0000", "updated": "2017-04-12T07:00:34.000+0000" }, { "id": "417250", "author": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "body": "It should always be present, because it is the \"primary-key\" used by iOS to identify the asset. See the [Apple docs|https://developer.apple.com/reference/mediaplayer/mpmediaitempropertypersistentid] for more infos.", "updateAuthor": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "created": "2017-04-12T07:17:23.000+0000", "updated": "2017-04-12T07:17:23.000+0000" }, { "id": "417291", "author": { "name": "tamirishaysh", "key": "tamirishaysh", "displayName": "Tamir Ishay Sharbat", "active": true, "timeZone": "America/Los_Angeles" }, "body": "but what if the user happens to delete the item with the given persistentID. What will happen then? and how can I know when such thing happened?", "updateAuthor": { "name": "tamirishaysh", "key": "tamirishaysh", "displayName": "Tamir Ishay Sharbat", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2017-04-12T16:34:06.000+0000", "updated": "2017-04-12T16:34:06.000+0000" }, { "id": "417295", "author": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "body": "You mean if you pass an identifier to the player that does not exist? I didn't actually tested that case but I think the player would through an error event.", "updateAuthor": { "name": "hknoechel", "key": "hansknoechel", "displayName": "Hans Knöchel", "active": true, "timeZone": "Europe/Berlin" }, "created": "2017-04-12T16:48:34.000+0000", "updated": "2017-04-12T16:48:34.000+0000" }, { "id": "417299", "author": { "name": "tamirishaysh", "key": "tamirishaysh", "displayName": "Tamir Ishay Sharbat", "active": true, "timeZone": "America/Los_Angeles" }, "body": "and how would I know if the identifier does not exist before I pass it to the player? \r\nand how can I listen to that error event you mentioned? (I mean code wise).", "updateAuthor": { "name": "tamirishaysh", "key": "tamirishaysh", "displayName": "Tamir Ishay Sharbat", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2017-04-12T16:57:00.000+0000", "updated": "2017-04-12T16:57:00.000+0000" }, { "id": "417441", "author": { "name": "tamirishaysh", "key": "tamirishaysh", "displayName": "Tamir Ishay Sharbat", "active": true, "timeZone": "America/Los_Angeles" }, "body": "Hans, \r\nMay I suggest that you would be able to request the whole mediaItem (meaning an actual mediaItem like the ones we get from openMusicLibrary) using the persistentID...\r\n\r\nI am sure this would be very helpful to many people :)\r\n\r\nthanks;", "updateAuthor": { "name": "tamirishaysh", "key": "tamirishaysh", "displayName": "Tamir Ishay Sharbat", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2017-04-14T20:52:40.000+0000", "updated": "2017-04-14T20:52:40.000+0000" }, { "id": "417687", "author": { "name": "tamirishaysh", "key": "tamirishaysh", "displayName": "Tamir Ishay Sharbat", "active": true, "timeZone": "America/Los_Angeles" }, "body": "Hans the current builds on the build server are all fucked up!!\r\n\r\ncan you please instruct me on how to merge the PR myself?", "updateAuthor": { "name": "tamirishaysh", "key": "tamirishaysh", "displayName": "Tamir Ishay Sharbat", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2017-04-19T16:50:00.000+0000", "updated": "2017-04-19T16:50:00.000+0000" } ], "maxResults": 23, "total": 23, "startAt": 0 } } }