Skip to main content

Notice

Please note that most of the software linked on this forum is likely to be safe to use. If you are unsure, feel free to ask in the relevant topics, or send a private message to an administrator or moderator. To help curb the problems of false positives, or in the event that you do find actual malware, you can contribute through the article linked here.
Topic: foo_uie_webview (Read 58155 times) previous topic - next topic
0 Members and 1 Guest are viewing this topic.

Re: foo_uie_webview

Reply #475
I need clarification with this script

Spoiler (click to show/hide)

I can access the infos folder located inside the foo_uie_webview/test/infos directory. My question is whether the infos folder is in the profile folder of foobar2000 and can it be accessed?

Re: foo_uie_webview

Reply #476
foo_uie_webview v0.2.0.0-alpha3

* New:
  * Methods
    * ReadDirectory(directoryPath, searchPattern): Reads the specified directory and returns the matching items as a JSON string. (alpha3)
    * IsPlaylistItemSelected(playlistIndex, itemIndex): Returns true if the specified item of the specified playlist is selected. (alpha3)
    * AddPath(playlistIndex, itemIndex, filePath, selectAddedItem): Adds an item to the specified playlist after the specified item using a file path and optionally selects it. (alpha3)
    * GetPlaylistItems(playlistIndex): Returns the items of the specified playlist as a JSON string. (alpha3)
    * SelectPlaylistItem(playlistIndex, itemIndex): Selects the specified item in the specified playlist. (alpha3)
    * DeselectPlaylistItem(playlistIndex, itemIndex): Deselects the specified item in the specified playlist. (alpha3)
    * GetSelectedPlaylistItems(playlistIndex): Returns the selected items of the specified playlist as a JSON string. (alpha3)
    * RemoveSelectedPlaylistItems(playlistIndex, crop): Removes the selected items from the specfied playlist. (alpha3)
    * RemovePlaylistItem(playlistIndex, itemIndex): Removes the specified item from the specified playlist. (alpha3)
    * DeletePlaylist(playlistIndex): Deletes the specified playlist. (alpha3)

You can download it only from GitHub during testing.

This release contains the ReadDirectory() method and a more complete implementation of playlist functionality. Example code can be found in Default-PlaylistTemplate.html.

Re: foo_uie_webview

Reply #477
foo_uie_webview v0.2.0.0-alpha3

* New:
  * Methods
    * ReadDirectory(directoryPath, searchPattern): Reads the specified directory and returns the matching items as a JSON string. (alpha3)
    * IsPlaylistItemSelected(playlistIndex, itemIndex): Returns true if the specified item of the specified playlist is selected. (alpha3)
    * AddPath(playlistIndex, itemIndex, filePath, selectAddedItem): Adds an item to the specified playlist after the specified item using a file path and optionally selects it. (alpha3)
    * GetPlaylistItems(playlistIndex): Returns the items of the specified playlist as a JSON string. (alpha3)
    * SelectPlaylistItem(playlistIndex, itemIndex): Selects the specified item in the specified playlist. (alpha3)
    * DeselectPlaylistItem(playlistIndex, itemIndex): Deselects the specified item in the specified playlist. (alpha3)
    * GetSelectedPlaylistItems(playlistIndex): Returns the selected items of the specified playlist as a JSON string. (alpha3)
    * RemoveSelectedPlaylistItems(playlistIndex, crop): Removes the selected items from the specfied playlist. (alpha3)
    * RemovePlaylistItem(playlistIndex, itemIndex): Removes the specified item from the specified playlist. (alpha3)
    * DeletePlaylist(playlistIndex): Deletes the specified playlist. (alpha3)

You can download it only from GitHub during testing.

This release contains the ReadDirectory() method and a more complete implementation of playlist functionality. Example code can be found in Default-PlaylistTemplate.html.
Super excited to dig into this! I'm adding all these properties and methods to my object definition and I noticed that alpha2's IsAutoPlaylist is both a property and a method. Edit: looks like the property was a mistake and it's just a method. It also doesn't return a boolean, but instead 0 or 1, which is fine but would be nicer if that could be updated.

Other things I found:
ReadDirectory -- Regardless of whether the entry is a directory, the IsDirectory property always returns a "(null)" value instead of a true/false boolean value. Because the response is returned as a string and not a true JSON object, you can't call JSON.parse() on the value as it is. Would be cool if it could return it as a raw JSON object and not a string to save post processing. Also, searchPattern is always required. Would be nice if that could default to "*.*" if no parameter is passed.

IsPlaylistItemSelected -- returns 0 or 1 instead of true/false

GetPlaylistItems/GetSelectedPlaylistItems -- Again, string not JSON and subsong is 0/1 not boolean. I'm sure you'll add methods for querying data about more than the active song, but I think Length would make a useful addition to this object so we can easily calculate playlist length.

RemoveSelectedPlaylistItems -- documentation says there's a crop parameter, but errors with it and works fine without.

I'm sure you're already on this, but we need some callbacks for watching changes to Playlists. Right now there's no way to tell that the user changed/edited a playlist so you can't update the UI accordingly unless you use a timer or some other async method.

One other request before things get set in stone. Most common coding style for JS/TS is to use camelCase for object property names and not PascalCase which I assume is more popular in C++ land. The built in properties and methods are fine to use PascalCase (and too late to change now!), but the JSON objects you send back would be prettier if the props were just "name", "size", etc. instead of their capitalized versions. Feel free to ignore as totally not a big deal.

Amazing work so far though! I tested most, but not everything. Some things like CreateAutoPlaylist it's unclear what the sort and flags params are supposed to be. I could not be more excited for how quickly this is coming along.

For those wanting to work in TS, I'm attaching my types.ts file which includes all the exposed properties and methods with their call signatures and return values if known. Includes a few minor corrections from the release notes and some cleaned up property names.

Re: foo_uie_webview

Reply #478
I assume the method should be renamed GetIsAutoPlaylist (it may already be that and it's just a documentation thing).
Thx for reporting. Hmm, only one is needed obviously.

Edit: Erh, I only found IsAutoPlaylist() as a method. It's not a property because it takes a playlist index as input and it does not behave as an indexed property.
ReadDirectory => IsDirectory always returns a (null) value instead of a true boolean. Because it is ireturned as a string and not a true JSON object you can't call JSON.parse() on the value as it is. Would be cool if it could return it as a raw JSON object and not a string to save post processing.
Strange. The example code returns true and false.

I haven't found a way to return 'true' JSON objects. All the COM interfaces from Internet Explorer are gone (luckily).

Edit: booleans should be returned a strings ("true" and "false"). JSON.Parse() can handle that. I'll fix it in the next release.
Also, searchPattern is always required. Would be nice if that could default to "*.*" if no parameter is passed.
I can do that.

Re: foo_uie_webview

Reply #479
D'oh, I edited my post with a lot more testing results while you were responding. Please check back there for other things I found.

Strange. The example code returns true and false.

I haven't found a way to return 'true' JSON objects. All the COM interfaces from Internet Explorer are gone (luckily).

Edit: booleans should be returned a strings ("true" and "false"). JSON.Parse() can handle that. I'll fix it in the next release.
Returning booleans as strings is actually worse since they'll get parsed as strings and won't get coerced into a boolean. Unless you mean returning the whole thing as a string and skipping the double quotes (i.e. "isDirectory": true) and then that's fine.

Having to call JSON.parse() is not a big deal at all. I've been doing that with other components forever, so that's perfectly acceptable.
Quote
Also, searchPattern is always required. Would be nice if that could default to "*.*" if no parameter is passed.
I can do that.
Woohoo!

Thanks for being so fast!

Re: foo_uie_webview

Reply #480
Strange. The example code returns true and false.

I haven't found a way to return 'true' JSON objects. All the COM interfaces from Internet Explorer are gone (luckily).

Edit: booleans should be returned a strings ("true" and "false"). JSON.Parse() can handle that. I'll fix it in the next release.
Returning booleans as strings is actually worse since they'll get parsed as strings and won't get coerced into a boolean. Unless you mean returning the whole thing as a string and skipping the double quotes (i.e. "isDirectory": true) and then that's fine.

Having to call JSON.parse() is not a big deal at all. I've been doing that with other components forever, so that's perfectly acceptable.
alpha3 returns "isDirectory": false (unquoted value) and got parsed as 0 in my test. The test case did not include a directory.

The current development build returns "isDirectory": "false" (quoted value) and displays "true"/"false" but I did not check the Javascript datatype; could be a string.

Re: foo_uie_webview

Reply #481
foo_uie_webview v0.2.0.0-alpha3

* New:
  * Methods
    * ReadDirectory(directoryPath, searchPattern): Reads the specified directory and returns the matching items as a JSON string. (alpha3)
    * IsPlaylistItemSelected(playlistIndex, itemIndex): Returns true if the specified item of the specified playlist is selected. (alpha3)
    * AddPath(playlistIndex, itemIndex, filePath, selectAddedItem): Adds an item to the specified playlist after the specified item using a file path and optionally selects it. (alpha3)
    * GetPlaylistItems(playlistIndex): Returns the items of the specified playlist as a JSON string. (alpha3)
    * SelectPlaylistItem(playlistIndex, itemIndex): Selects the specified item in the specified playlist. (alpha3)
    * DeselectPlaylistItem(playlistIndex, itemIndex): Deselects the specified item in the specified playlist. (alpha3)
    * GetSelectedPlaylistItems(playlistIndex): Returns the selected items of the specified playlist as a JSON string. (alpha3)
    * RemoveSelectedPlaylistItems(playlistIndex, crop): Removes the selected items from the specfied playlist. (alpha3)
    * RemovePlaylistItem(playlistIndex, itemIndex): Removes the specified item from the specified playlist. (alpha3)
    * DeletePlaylist(playlistIndex): Deletes the specified playlist. (alpha3)

You can download it only from GitHub during testing.

This release contains the ReadDirectory() method and a more complete implementation of playlist functionality. Example code can be found in Default-PlaylistTemplate.html.
Super excited to dig into this! I'm adding all these properties and methods to my object definition and I noticed that alpha2's IsAutoPlaylist is both a property and a method. Edit: looks like the property was a mistake and it's just a method. It also doesn't return a boolean, but instead 0 or 1, which is fine but would be nicer if that could be updated.
The interface description (MIDL) uses a boolean. Need to check why this does not work.
IsPlaylistItemSelected -- returns 0 or 1 instead of true/false
Same. The MIDL specifies a boolean.
GetPlaylistItems/GetSelectedPlaylistItems -- Again, string not JSON and subsong is 0/1 not boolean. I'm sure you'll add methods for querying data about more than the active song, but I think Length would make a useful addition to this object so we can easily calculate playlist length.
This is just a wrapper for the fb2k interface. Subsong must be an integer, not a boolean.
RemoveSelectedPlaylistItems -- documentation says there's a crop parameter, but errors with it and works fine without.
I removed the crop parameter and supplied 2 separate methods, one for the selected items and one for the unselected items.
I'm sure you're already on this, but we need some callbacks for watching changes to Playlists. Right now there's no way to tell that the user changed/edited a playlist so you can't update the UI accordingly unless you use a timer or some other async method.
On the To Do list.
One other request before things get set in stone. Most common coding style for JS/TS is to use camelCase for object property names and not PascalCase which I assume is more popular in C++ land. The built in properties and methods are fine to use PascalCase (and too late to change now!), but the JSON objects you send back would be prettier if the props were just "name", "size", etc. instead of their capitalized versions. Feel free to ignore as totally not a big deal.
I knew that would come up ;-) Not a biggy and I'll follow the Javascript conventions in the next release (which hurt my eyes. Please don't start a discussion about this.)
Amazing work so far though! I tested most, but not everything. Some things like CreateAutoPlaylist it's unclear what the sort and flags params are supposed to be. I could not be more excited for how quickly this is coming along.
The 'sort' parameter determines how the selected metadb items are sorted when they get added to a playlist. 'flags' I still need to elaborate.

Re: foo_uie_webview

Reply #482
alpha3 returns "isDirectory": false (unquoted value) and got parsed as 0 in my test. The test case did not include a directory.

The current development build returns "isDirectory": "false" (quoted value) and displays "true"/"false" but I did not check the Javascript datatype; could be a string.
That's super weird. IMO 0/1 would be better than "true"/"false" quoted because then you could at least double negate (!!isDirectory) it to get a negative instead of having to do an === "true" check.

This is what I'm seeing with alpha3 for all folders. This the first 7 items are folders and the last is a file.

Re: foo_uie_webview

Reply #483
The 'sort' parameter determines how the selected metadb items are sorted when they get added to a playlist. 'flags' I still need to elaborate.
Does that mean 'sort' is a titleFormat string then?


Re: foo_uie_webview

Reply #485
Yes. Have you looked at the example: "%album artist% | %album% | %tracknumber% | %title%"?
Ha! I didn't even think of that. Will definitely inspect that if I've got questions in the future.

For the record, the playlist template also gives me the "isDirectory": (null) issue.

 

Re: foo_uie_webview

Reply #486
For the record, the playlist template also gives me the "isDirectory": (null) issue.

confirming.

also my issue so far.

carouselv1.html:138  Error fetching image list: SyntaxError: Unexpected token '(', ..."rectory": (null)},{""... is not valid JSON
    at JSON.parse (<anonymous>)

Re: foo_uie_webview

Reply #487
confirming.

also my issue so far.
Until the issue is fixed, you can work around it by doing:
Code: [Select]
data = data.replace(/\(null\)/g, 'false');
JSON.parse(data);
You won't know if anything is actually a directory or not, but at least the code won't error.

Re: foo_uie_webview

Reply #488
Why do I have this notification in the console.

Tracking Prevention blocked access to storage for https://fonts.gstatic.com/s/materialicons/v142/flUhRq6tzZclQEJ-Vdg-IuiaDsNc.woff2.
Image-Info%20Management%20(Left%20Panel).html:1  Tracking Prevention blocked access to storage for https://fonts.gstatic.com/s/materialicons/v142/flUhRq6tzZclQEJ-Vdg-IuiaDsNc.woff2.
Image-Info%20Management%20(Left%20Panel).html:1  Tracking Prevention blocked access to storage for https://fonts.gstatic.com/s/materialsymbolsoutlined/v220/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDCvHOej.woff2.
Image-Info%20Management%20(Left%20Panel).html:1  Tracking Prevention blocked access to storage for https://fonts.gstatic.com/s/materialsymbolsoutlined/v220/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDCvHOej.woff2

 And what can I do to remove it thanks.

This is the project I'm working on.

Video 1

Video 2

Re: foo_uie_webview

Reply #489
confirming.

also my issue so far.
Until the issue is fixed, you can work around it by doing:
Code: [Select]
data = data.replace(/\(null\)/g, 'false');
JSON.parse(data);
You won't know if anything is actually a directory or not, but at least the code won't error.
If the size is 0 it most likely is a directory.

I'll release a fix ASAP.

Re: foo_uie_webview

Reply #490
Why do I have this notification in the console.

Tracking Prevention blocked access to storage for https://fonts.gstatic.com/s/materialicons/v142/flUhRq6tzZclQEJ-Vdg-IuiaDsNc.woff2.
Image-Info%20Management%20(Left%20Panel).html:1  Tracking Prevention blocked access to storage for https://fonts.gstatic.com/s/materialicons/v142/flUhRq6tzZclQEJ-Vdg-IuiaDsNc.woff2.
Image-Info%20Management%20(Left%20Panel).html:1  Tracking Prevention blocked access to storage for https://fonts.gstatic.com/s/materialsymbolsoutlined/v220/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDCvHOej.woff2.
Image-Info%20Management%20(Left%20Panel).html:1  Tracking Prevention blocked access to storage for https://fonts.gstatic.com/s/materialsymbolsoutlined/v220/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDCvHOej.woff2

 And what can I do to remove it thanks.

This is the project I'm working on.

Video 1

Video 2
Have you looked at https://learn.microsoft.com/en-us/microsoft-edge/web-platform/tracking-prevention

Re: foo_uie_webview

Reply #491
foo_uie_webview v0.2.0.0-alpha4

* New:
  * Events
    * OnAddedPlaylistItems(playlistIndex): Called when items have been added to the specified playlist. (alpha4)
    * OnReorderedPlaylistItems(playlistIndex): Called when the items of the specified playlist have been reordered. (alpha4)
    * OnRemovingPlaylistItems(playlistIndex): Called when removing items of the specified playlist. (alpha4)
    * OnRemovedPlaylistItems(playlistIndex): Called when items of the specified playlist have been removed. (alpha4)

    * OnPlaylistSelectedItemsChanged(playlistIndex): Called when the selected items of the specified playlist have been changed. (alpha4)
    * OnPlaylistFocusedItemChanged(playlistIndex, fromItemIndex, toItemIndex): Called when the focused item of the specified playlist has been changed. (alpha4)

    * OnModifiedPlaylistItems(playlistIndex): Called when some playlist items of the specified playlist have been modified. (alpha4)
    * OnModifiedPlaylistItemsFromPlayback(playlistIndex): Called when some playlist items of the specified playlist have been modified from playback. (alpha4)

    * OnEnsuredPlaylistItemIsVisible(playlistIndex, itemIndex): Called when the specified item of a playlist was ensured to be visible. (alpha4)

    * OnReplacedPlaylistItems(playlistIndex): Called when items of the specified playlist have been replaced. (alpha4)

    * OnChangedActivePlaylist(oldPlaylistIndex, newPlaylistIndex): Called when the active playlist is changed. (alpha4)
    * OnCreatedPlaylist(playlistIndex, name): Called when the specified playlist has been created. (alpha4)
    * OnReorderedPlaylists(): Called when the playlists have been reordered. (alpha4)
    * OnRemovingPlaylists(): Called when playlists are being removed. (alpha4)
    * OnRemovedPlaylists(): Called when playlists have been removed. (alpha4)

    * OnRenamedPlaylist(playlistIndex, name): Called when the specified playlist has been renamed. (alpha4)
    * OnLockedPlaylist(playlistIndex): Called when the specified playlist has been locked. (alpha4)
    * OnUnlockedPlaylist(playlistIndex): Called when the specified playlist has been unlocked. (alpha4)

    * OnDefaultFormatChanged(): Called when the default format has been changed. (alpha4)
    * OnChangedPlaybackOrder(playbackOrderIndex): Called when the playback order has been changed. (alpha4)

  * Fixed: Booleans in objects are now parsed correctly. (alpha4)
  * Fixed: Boolean parameters and return values are true Javascript booleans now. (alpha4)
  * Improved: The searchPattern parameter is now optional in ReadDirectory() and defaults to "*.*". (alpha4)
  * Improved: The CreateAutoPlaylist() sort and flags parameter can be omitted. They default to "" and 0 respectively. (alpha4)
  * Changed: Returned JSON objects now use Pascal casing. (alpha4)

You can download it only from GitHub during testing.

If the API and the implementation proves to be stable I'll release a version to the component repository so you can use it in public builds. Example code can be found in Default-PlaylistTemplate.html.

Re: foo_uie_webview

Reply #492
  * Fixed: Booleans in objects are now parsed correctly. (alpha4)
  * Fixed: Boolean parameters and return values are true Javascript booleans now. (alpha4)
  * Improved: The searchPattern parameter is now optional in ReadDirectory() and defaults to "*.*". (alpha4)
  * Improved: The CreateAutoPlaylist() sort and flags parameter can be omitted. They default to "" and 0 respectively. (alpha4)
  * Changed: Returned JSON objects now use Pascal casing. (alpha4)
!! Can't wait to test this out.

I understand this might be a huge pain in the ass at this point, so feel free to ignore, but one suggestion regarding all the new callbacks is that right now they kind of alternate between Category-Noun-Verb (OnPlaylistSelectedItemsChanged) and Verb-Category-Noun (OnAddedPlaylistItems). I personally find the first style a little more intuitive and it's what Marc and others have used for other JS components. For example, I know I want to handle the event for when playlist items have been modified, if it's always OnPlaylistItems____ then it's pretty easy to guess what it should be. On that note PlaylistItemsSelectedChanged/and PlaylistItemFocusedChanged might be a little clearer as well (or their Verb-Category-Noun alternatives).

It also might make maintenance easier for you long term if you consolidated all the OnReordered/Removed/Locked/Unlocked/Renamed/CreatedPlaylist methods into a single OnPlaylistsChanged callback and just leave it up to the user's script to get the new data. Half of those don't even specify a playlistIndex (for obvious reasons) so the script will need to listen and rebuild whatever DOM elements it has anyway for all the playlists. I'm struggling to think of a reason a script would respond differently knowing that a playlist was added/removed/reordered as opposed to just knowing a generic "playlists changed" event happened.

Anyway amazing work, and I'll try and test this out tonight!

Re: foo_uie_webview

Reply #493
  * Fixed: Booleans in objects are now parsed correctly. (alpha4)
  * Fixed: Boolean parameters and return values are true Javascript booleans now. (alpha4)
  * Improved: The searchPattern parameter is now optional in ReadDirectory() and defaults to "*.*". (alpha4)
  * Improved: The CreateAutoPlaylist() sort and flags parameter can be omitted. They default to "" and 0 respectively. (alpha4)
  * Changed: Returned JSON objects now use Pascal casing. (alpha4)
I understand this might be a huge pain in the ass at this point, so feel free to ignore
That's why I release early versions: to get feedback. I switched to Verb-Category-Noun because of OnPlaylistsRemoving which I found non-intuitive. Your point for consistency is stronger.
It also might make maintenance easier for you long term if you consolidated all the OnReordered/Removed/Locked/Unlocked/Renamed/CreatedPlaylist methods into a single OnPlaylistsChanged callback and just leave it up to the user's script to get the new data.
That part is not fixed in stone yet: the fb2k API returns more information but I haven't converted those parameters yet. One reason to keep them split is to avoid having code in every Javascript to determine the actual changed data: no fun to write, error-prone and not as efficient as C++.

Re: foo_uie_webview

Reply #494
  * Fixed: Booleans in objects are now parsed correctly. (alpha4)
  * Fixed: Boolean parameters and return values are true Javascript booleans now. (alpha4)
  * Improved: The searchPattern parameter is now optional in ReadDirectory() and defaults to "*.*". (alpha4)
  * Improved: The CreateAutoPlaylist() sort and flags parameter can be omitted. They default to "" and 0 respectively. (alpha4)
  * Changed: Returned JSON objects now use Pascal casing. (alpha4)
I understand this might be a huge pain in the ass at this point, so feel free to ignore
That's why I release early versions: to get feedback. I switched to Verb-Category-Noun because of OnPlaylistsRemoving which I found non-intuitive. Your point for consistency is stronger.
It also might make maintenance easier for you long term if you consolidated all the OnReordered/Removed/Locked/Unlocked/Renamed/CreatedPlaylist methods into a single OnPlaylistsChanged callback and just leave it up to the user's script to get the new data.
That part is not fixed in stone yet: the fb2k API returns more information but I haven't converted those parameters yet. One reason to keep them split is to avoid having code in every Javascript to determine the actual changed data: no fun to write, error-prone and not as efficient as C++.
Agree with that. I also prefer to have them like that to simplify callbacks usage.

Btw I have not revised it yet, but at least in SMP you have all functions definitions in a JS file which can be loaded within Visual Code and therefore show all SMP methods, callbacks and docs there. There is zero need to memorize anything. Attached an example config file (I think I didn't report this tip before except to TT). The SMP docs folder must be in the workspace folder.

I suppose a similar thing may be applied here, as long as you use the SMP doc files as example.
docs\foo_spider_monkey_panel.js
Callbacks.js
Flags.js

Re: foo_uie_webview

Reply #495
Does anyone have any experience using the new function instead of <iframe> ?
Code: [Select]
 function CreateIFrame() {
        };
I still can't get it to behave the same.
Is it possible for the current version ?
Thanks.

Re: foo_uie_webview

Reply #496
foo_uie_webview v0.2.0.0-alpha5

* Changed:
  * Callbacks
    * onPlaylistItemsAdded(playlistIndex, startindex, locations): Called when items have been added to the specified playlist. (alpha5)
    * onPlaylistItemsReordered(playlistIndex, items): Called when the items of the specified playlist have been reordered. (alpha5)
    * onPlaylistItemsRemoving(playlistIndex, removedItems, newCount): Called when removing items of the specified playlist. (alpha5)
    * onPlaylistItemsRemoved(playlistIndex, removedItems, newCount): Called when items of the specified playlist have been removed. (alpha5)
    * onPlaylistItemsModified(playlistIndex, items): Called when some playlist items of the specified playlist have been modified. (alpha5)
    * onPlaylistItemsModifiedFromPlayback(playlistIndex, items): Called when some playlist items of the specified playlist have been modified from playback. (alpha5)
    * onPlaylistItemsReplaced(playlistIndex, items): Called when items of the specified playlist have been replaced. (alpha5)

    * onPlaylistSelectedItemsChanged(playlistIndex, selectedItems): Called when the selected items of the specified playlist have been changed. (alpha5)

    * onPlaylistsReordered(playlistOrder): Called when the playlists have been reordered. (alpha5)
    * onPlaylistsRemoving(removedPlaylists, newCount): Called when playlists are being removed. (alpha5)
    * onPlaylistsRemoved(removedPlaylists, newCount): Called when playlists have been removed. (alpha5)

  * Changed: *Breaking Change* Callbacks follow the Category-Noun-Verb naming convention. (alpha5)
  * Changed: *Breaking Change* All properties, methods and callbacks to use camelCase convention. (alpha5)
  * Changed: *Breaking Change* The parameter list of most callbacks has been expanded. (alpha5)

You can download it only from GitHub during testing.