Here's a rundown of what the expression does, if anyone is interested.
The expression builds a List called [_times] which stores the duration of each file in the playlist (in seconds). As MC is displaying the playlist, it's also executing the expression for each file in order, updating the corresponding item in the List of durations and then returning the sum of all items until the current position.
Commented code:
// save sequence number of current file as [_index]
save(CustomData(#),_index)/
// if sequence number is invalid (blank or zero), return nothing
if(isequal([_index],0,4),,
// else: if the list of times is undefined, initialize [_times] to a blank list
if(isequal([_times],/[,7), save(,_times),)/
// change the value of the [_times] list item at the [_index] position
// this rebuilds the list with all values before the current position, plus the current duration, plus all values after the current position, then re-saves it as [_times]
// As MC executes this for each item in the playlist, the [_times] list grows until it holds a value for each item
// Note the "10000" value - if you use this on larger playlists, just increase it to a larger value
save(listbuild(1,;,listlimit([_times],Math([_index]-1),0), Math(int([duration,0])), listlimit([_times],10000,[_index])), _times)/
// calculate the sum of all items in the list until the current position, save as [_sum] (in seconds)
save(listmath(listlimit([_times],[_index],0),2),_sum)/
// formats the output, calculating the total number or hours and using FormatDate() for the minutes:seconds
Math(int([_sum]/3600)):formatdate(Math([_sum]/86400),mm:ss))
Note regarding Zelda: The CustomData(#) function always return blank in Zelda since there's no playlist context (no way to do that using MC API, as far as I know). So during testing one has to use some test/fake numbers as replacement.