DurationAV (Duration columns for folders)

This add-in creates six custom columns: DurationAV, DurationAudio, DurationVideo, DurationAVAvg, DurationAudioAvg, and DurationVideoAvg.

Like the built-in duration column, these columns display the lengths of audio and video files. However, unlike the built-in column, they also work for folders, showing the sum of durations for all files within each folder (non-recursively).

The DurationAV column represents the combined total of DurationAudio and DurationVideo.

DurationAVAvg, DurationAudioAvg, and DurationVideoAvg display the average duration per valid file.

How to set up and use

:one: Save ColumnDurationAV.js.txt to   ↓

%appdata%\GPSoftware\Directory Opus\Script AddIns

:two: Toggle the columns with

Set COLUMNSTOGGLE="duration(!,a,0)"
Set COLUMNSTOGGLE="scp:DurationAV/DurationAV(!,a,0)"
Set COLUMNSTOGGLE="scp:DurationAV/DurationAVAvg(!,a,0)"
Set COLUMNSTOGGLE="scp:DurationAV/DurationAudio(!,a,0)"
Set COLUMNSTOGGLE="scp:DurationAV/DurationAudioAvg(!,a,0)"
Set COLUMNSTOGGLE="scp:DurationAV/DurationVideo(!,a,0)"
Set COLUMNSTOGGLE="scp:DurationAV/DurationVideoAvg(!,a,0)"

Things you might enjoy reading

How to use buttons and scripts from this forum

The script's inner workings

JScript
function OnInit(initData) {
    initData.name = 'DurationAV';
    initData.version = '2024-11-14';
    initData.url = 'https://resource.dopus.com/t/durationav-duration-columns-for-folders/42701';
    initData.desc = 'Display duration for folders.';
    initData.default_enable = true;
    initData.min_version = '13.0';
}

function OnAddColumns(addColData) {
    var col = addColData.AddColumn();
    col.name = 'DurationAV';
    col.method = 'OnColumn';
    col.justify = 'right';
    col.type = 'duration';
    col.multicol = true;

    var col = addColData.AddColumn();
    col.name = 'DurationAudio';
    col.method = 'OnColumn';
    col.justify = 'right';
    col.type = 'duration';
    col.multicol = true;

    var col = addColData.AddColumn();
    col.name = 'DurationVideo';
    col.method = 'OnColumn';
    col.justify = 'right';
    col.type = 'duration';
    col.multicol = true;

    var col = addColData.AddColumn();
    col.name = 'DurationAVAvg';
    col.method = 'OnColumn';
    col.justify = 'right';
    col.type = 'duration';
    col.multicol = true;

    var col = addColData.AddColumn();
    col.name = 'DurationAudioAvg';
    col.method = 'OnColumn';
    col.justify = 'right';
    col.type = 'duration';
    col.multicol = true;

    var col = addColData.AddColumn();
    col.name = 'DurationVideoAvg';
    col.method = 'OnColumn';
    col.justify = 'right';
    col.type = 'duration';
    col.multicol = true;
}

function OnColumn(scriptColData) {
    var item = scriptColData.item;

    var durationAudio = 0;
    var durationVideo = 0;
    var countAudio = 0;
    var countVideo = 0;

    if (item.is_dir) {
        var folderEnum = DOpus.FSUtil().ReadDir(item);
        while (!folderEnum.complete) {
            var folderItem = folderEnum.Next();
            var meta = folderItem.metadata;
            if (meta == 'audio') {
                var d = meta.audio.duration;
                if (typeof d == 'number') {
                    durationAudio += d;
                    countAudio++;
                }
            } else if (meta == 'video') {
                var d = meta.video.duration;
                if (typeof d == 'number') {
                    durationVideo += d;
                    countVideo++;
                }
            }
        }
        folderEnum.Close();
    } else {
        var meta = item.metadata;
        if (meta == 'audio') {
            durationAudio = meta.audio.duration;
            if (typeof durationAudio != 'number') durationAudio = 0;
            countAudio = 1;
        } else if (meta == 'video') {
            durationVideo = meta.video.duration;
            if (typeof durationVideo != 'number') durationVideo = 0;
            countVideo = 1;
        }
    }

    scriptColData.columns('DurationAudio').value = durationAudio;
    scriptColData.columns('DurationVideo').value = durationVideo;
    scriptColData.columns('DurationAV').value = durationAudio + durationVideo;

    scriptColData.columns('DurationAudioAvg').value = countAudio ? durationAudio / countAudio : '---';
    scriptColData.columns('DurationVideoAvg').value = countVideo ? durationVideo / countVideo : '---';
    scriptColData.columns('DurationAVAvg').value = (countAudio + countVideo) ? (durationAudio + durationVideo) / (countAudio + countVideo) : '---';
}
9 Likes

Update 2024-11-14

  • columns now have Opus 13 duration type
  • added columns that show the average duration
1 Like