IMetadbHandleList
This will be used in the examples below:
var handle_list = plman.GetPlaylistItems(plman.ActivePlaylist);
You can create an empty handle list with fb.CreateHandleList.
var handle_list = fb.CreateHandleList();
If you need to create a handle list from a single handle, you can do this...
var handle = fb.GetFocusItem();
if (handle) {
var handle_list = fb.CreateHandleList(handle);
}
Properties
Count | number |
read |
Methods
AddItem(handle)
#
Arguments | ||
---|---|---|
handle | IMetadbHandle |
No return value.
AddItems(handle_list)
#
Arguments | ||
---|---|---|
handle_list | IMetadbHandleList |
No return value.
AttachImage(image_path[, art_id])
#
Arguments | ||
---|---|---|
image_path | string |
|
art_id | AlbumArtId | Default 0 . |
No return value.
Any errors such as invalid path, corrupt image,
target file type not supporting embedded art, etc
should all silently fail. Any existing artwork with
the specified art_id
will be overwritten. There is
no need to remove it first.
Example
var handle_list = plman.GetPlaylistItems(plman.ActivePlaylist);
if (handle_list.Count > 0) {
var image_path = "C:\\path\\to\\image.jpg";
handle_list.AttachImage(image_path, 0);
}
handle_list.Dispose();
AttachImage2(image[, art_id, format])
#
Arguments | ||
---|---|---|
image | IJSImage | |
art_id | AlbumArtId | Default 0 . |
format | number |
Default 0 is JPG . Use 1 for WebP . |
No return value.
Any existing artwork with the specified art_id
will be
overwritten. There is no need to remove it first.
CalcTotalDuration()
#
Returns total in seconds.
CalcTotalSize()
#
Returns total in bytes.
ClearStats()
#
See Playback Statistics.
Clone()
#
Returns an IMetadbHandleList instance.
Example
var handle_list2 = handle_list.Clone();
CopyToClipboard()
#
Returns a boolean
value.
Example
var handle_list = plman.GetPlaylistSelectedItems(plman.ActivePlaylist);
handle_list.CopyToClipboard();
handle_list.Dispose();
// To "cut" playlist items, we need to check there are
// no locks in place preventing removal.
var PlaylistLockFilterMask = {
filter_add : 1,
filter_remove : 2,
filter_reorder : 4,
filter_replace : 8,
filter_rename : 16,
filter_remove_playlist : 32,
};
var ap = plman.ActivePlaylist;
var mask = plman.GetPlaylistLockFilterMask(ap);
if (!(mask & PlaylistLockFilterMask.filter_remove)) {
var handle_list = plman.GetPlaylistSelectedItems(ap);
if (handle_list.CopyToClipboard()) {
plman.UndoBackup(ap);
plman.RemovePlaylistSelection(ap);
}
handle_list.Dispose();
}
DoDragDrop(effect)
#
Arguments | ||
---|---|---|
effect | number |
Returns a number
.
Drop(count)
#
Arguments | ||
---|---|---|
count | number |
Returns an IMetadbHandleList instance.
It will be a copy of the original handle list with count
handles removed
from the beginning. If the supplied count
exceeds the handle list count,
an empty handle list will be returned.
Dispose()
#
No return value.
Find(handle)
#
Arguments | ||
---|---|---|
handle | IMetadbHandle |
Returns position of handle or -1
on failure.
GetItem(index)
#
Arguments | ||
---|---|---|
index | number |
Returns an IMetadbHandle instance.
Example
var handle = handle_list.GetItem(0);
GetLibraryRelativePaths()
#
Returns a VBArray
so you need to use .toArray()
on the result.
This is useful for creating an Album List
like script in
folder structure
mode where you'd like the monitored music
folder removed from the path of each handle list item.
Example
If the foobar2000 Media Library is
configured to watch D:\Music\
and the path of
the first item in the handle list is
D:\Music\Albums\Artist\Some Album\Some Song.flac
then...
var handle_list = fb.GetLibraryItems();
handle_list.SortByRelativePath();
var relative_paths = handle_list.GetLibraryRelativePaths().toArray();
console.log(relative_paths[0]);
// Albums\Artist\Some Album\Some Song.flac
GetOtherInfo()
#
This returns a JSON
object in string form so you need to
use JSON.parse
on the result. It provides all the information
viewable on the Details
tab in the main Properties
dialog. This
can be technical/location info as well as database fields
from 3rd party components if present.
Example
var handle_list = plman.GetPlaylistItems(plman.ActivePlaylist);
var str = handle_list.GetOtherInfo();
console.log(str);
{
"General": {
"Avg. bitrate": "259 kbps",
"Channels": "2",
"Codec": "MP3 (82.5%); AAC (17.5%)",
"Codec profile": "MP3 VBR V0 (39.1%); MP3 CBR (24.3%); AAC LC (17.5%); MP3 VBR V2 (11.7%); MP3 VBR (3.9%); MP3 ABR (3.5%)",
"Duration": "5:24:44.445 (859 264 046 samples)",
"Encoding": "lossy",
"Sample rate": "44100 Hz",
"Tag type": "id3v2.4 (82.5%)",
"Tool": "LAME3.97 (27.6%); LAME3.99r (13.7%); LAME3.90 (7.4%); LAME3.98r (5.5%); LAME3.99 (5.4%); Lavf (4.7%); LAME3.97b (3.8%); LAME3.98b (3.5%); LAME3.96r (1.2%); LAME3.100 (1.1%)"
},
"Location": {
"File names": "Bat For Lashes - Clouds.mp3, Bat For Lashes - Daphne.m4a, Bat For Lashes - Lumen.m4a, Bat For Lashes - Plan The Escape.mp3 ...",
"Folder name": "E:\\Music\\Tracks",
"Last modified": "2021-12-01 00:00:00",
"Total size": "601 MB (631 125 587 bytes)"
}
}
GetQueryItems(query)
#
Arguments | ||
---|---|---|
query | string |
Returns an IMetadbHandleList instance.
Note
Errors will be thrown on invalid queries so if you're not using predefined safe queries and are accepting user input, you should use this inside a try/catch statement. An empty handle list will be returned if the query is valid but there are no results.
GroupByTag(tag)
#
Arguments | ||
---|---|---|
tag | string |
Returns a VBArray
so you need to use .toArray()
on the result.
The allows library viewers to cater for multiple value tags.
Example
var items = fb.GetLibraryItems();
var arr = items.GroupByTag('artist').toArray();
// note the +=2 here
// even elements are the tag value
// odd number elements are the handles for that tag value
for (var i = 0; i < arr.length; i += 2) {
var artist = arr[i];
// the order of these will be random. You must sort them yourself.
var artist_handles = arr[i + 1];
}
InsertItem(index, handle)
#
Arguments | ||
---|---|---|
index | number |
|
handle | IMetadbHandle |
No return value.
Example
var handle = ...
handle_list.InsertItem(0, handle);
InsertItems(index, handle_list)
#
Arguments | ||
---|---|---|
index | number |
|
handle_list | IMetadbHandleList |
No return value.
MakeDifference(handle_list)
#
Arguments | ||
---|---|---|
handle_list | IMetadbHandleList |
No return value.
Example
var one = plman.GetPlaylistItems(0);
var two = plman.GetPlaylistItems(1);
one.MakeDifference(two);
one
now only contains handles that were unique to one
. Anything
that also existed in two
will have been removed. The order of
items in one
will be randomised. two
should be untouched.
MakeIntersection(handle_list)
#
Arguments | ||
---|---|---|
handle_list | IMetadbHandleList |
No return value.
Example
var one = plman.GetPlaylistItems(0);
var two = plman.GetPlaylistItems(1);
one.MakeIntersection(two);
one
now only contains handles that were in BOTH one
AND two
. The order of items in one
will be randomised.
two
should be untouched.
OptimiseFileLayout([minimise])
#
Arguments | ||
---|---|---|
minimise | boolean |
Default false . |
No return value.
With minimise
set to false
, provides the functionality
of Utilities>Optimize file layout
or if minimise
is true
then Utilities>Optimize file layout + minimize file size
.
Unlike the context menu versions, there is no prompt.
Randomise()
#
No return value.
RefreshStats()
#
See Playback Statistics.
RemoveAll()
#
No return value.
RemoveAttachedImage([art_id])
#
Arguments | ||
---|---|---|
art_id | AlbumArtId | Default 0 . |
No return value.
RemoveAttachedImages()
#
No return value.
RemoveByIdx(idx)
#
Arguments | ||
---|---|---|
idx | number |
No return value.
Example
handle_list.RemoveByIdx(0);
RemoveDuplicates()
#
No return value.
RemoveDuplicatesByFormat(pattern)
#
Arguments | ||
---|---|---|
pattern | string |
No return value.
Example
// This ensures the handle list will
// contain no more than 1 track by the same artist.
var handle_list = fb.GetLibraryItems();
handle_list.Randomise();
handle_list.RemoveDuplicatesByFormat("%artist%");
RemoveFromIdx(from, num)
#
Arguments | ||
---|---|---|
from | number |
|
num | number |
No return value.
ReplaceItem(index, handle)
#
Arguments | ||
---|---|---|
index | number |
|
handle | IMetadbHandle |
No return value.
Reverse()
#
No return value.
RunContextCommand(command)
#
Arguments | ||
---|---|---|
command | string |
The full path to the command must be supplied. Case is not important. |
Returns true
if a matching command was found, false
otherwise.
Example
var handle_list = plman.GetPlaylistSelectedItems(plman.ActivePlaylist);
handle_list.RunContextCommand("Properties");
SaveAs(path)
#
Arguments | ||
---|---|---|
path | string |
No return value.
Saves using native foobar2000 .fpl
format so you should use that as the file extension. The
parent folder must already exist.
Example
var handle_list = plman.GetPlaylistItems(plman.ActivePlaylist);
handle_list.SaveAs("z:\\blah.fpl");
SortByFormat(pattern, direction)
#
Arguments | ||
---|---|---|
pattern | string |
|
direction | number |
Ascending while > 0 . |
No return value.
Example
var handle_list = fb.GetLibraryItems();
var pattern = "%album artist%|%date%|%album%|%discnumber%|%tracknumber%";
handle_list.SortByFormat(pattern, 1);
SortByPath()
#
No return value.
SortByRelativePath()
#
No return value.
Note
This method should only be used on a handle list containing items that are
monitored as part of the Media Library
.
Take(count)
#
Arguments | ||
---|---|---|
count | number |
Returns an IMetadbHandleList instance.
It will contain the first count
handles from the original handle list. If the count
exceeds the handle list count, a copy will be returned.
UpdateFileInfoFromJSON(str)
#
Arguments | ||
---|---|---|
str | string |
This method is for writing tags to files. The behaviour of whatever tag names
you supply match the standard Properties
dialog.
You must supply a stringifed array
or object
as per these examples:
Example
This example uses an array
and its length must match the
handle list
count. A fail safe way of doing this is
looping through the handle list
and filling the array as you go.
// assume we've selected one album
var handle_list = plman.GetPlaylistSelectedItems(plman.ActivePlaylist);
// an empty array
var arr = [];
for (var i = 0; i < handle_list.Count; i++) {
// Each element of the array must be an object
// of key names/values, indicated by the curly braces.
arr.push({
"tracknumber" : i + 1,
"totaltracks" : handle_list.Count,
"album" : "Greatest Hits", // a simple string for a single value
"genre" : ["Rock", "Hard Rock"] // use an array for multi-value tags
});
}
var str = JSON.stringify(arr);
handle_list.UpdateFileInfoFromJSON(str);
handle_list.Dispose();
If you want to write the exact same tags to each and every track in the
handle list
, you can use an object
instead.
var handle_list = plman.GetPlaylistSelectedItems(plman.ActivePlaylist);
var obj = {
"album" : "Greatest Hits",
"genre" : ["Rock", "Hard Rock"]
};
var str = JSON.stringify(obj);
handle_list.UpdateFileInfoFromJSON(str);
handle_list.Dispose();
You can use blank values to clear any existing tags.
Example
var obj = {
"album" : ""
};
Do not try using any method of using empty objects or blank tag names to
avoid tagging any files. You should filter your handle list
first
to make sure it only contains files you really want to update.