MultiMedia Info Column

Would it be possible to (optionally) add a MultiMedia column that lists multimedia info for files in the details view, such as:

For video files: Resolution, Frame Rate, Video Codec + BitRate, Audio Languages+Codecs+BitRate+Title (if MKV), Subtitle Languages+Codecs+Title (if MKV)
For Audio files: BitRate CBR/VBR
For Image files: Resolution (pixels + bit depth)

ie.

File.MKV 1280x720 25fps HEVC 2Mbit, English AAC 5.1 Main Audio, English AAC 2.0 Audio Commentary, Danish SRT Subs, English PGS SDH
File.MP3 128kbit VBR
File.PNG 4096x2048x16M

It should be the same column, only the contents would be dynamically filled out depending on the file type.

The data should be collected in the background as soon as the user enters the directory, and filled out in the view as it is being determined.

Another option would be to have a "Plugin Column" that can be tied to a Plug-In DLL that someone could then write (I could do that myself) that received a file name and returns the string to be displayed in the column.

Look here:

Yes, but that will occupy 5+ columns instead of a single one. I'd like a single column that adapts to the file type and lists the relevant information for that file type only (if possible).

I read something about scripts in there - does DOPUS have support for calling external code on each file and show a string returned from the external code in a column? Then I could make it myself...

There are columns like Description and Music Info which do that type of thing, but won't have the exact combination of information you're looking for.

Yes, Opus can call a script for each file, and your script can do whatever you want, including call external programs to generate the data.

Do you have a link to a place where this is explained? Preferably with a small sample to look at...

How do you "link up" the script to a specific column in the file list (so that the script can return what is to be displayed in the column)?

The manual has a section on scripting, and the Buttons/Scripts area of this forum has lots of examples which you can find via the Column tag.

Sorry to be such a pain :slight_smile: but could you make a sample script that encapsulates a new column that ends up calling a standard Windows .DLL (32-bit or 64-bit) that receives two char* values - one contains the fully qualified file name, and one used to return the value in. The returned value should be displayed as the column content.

I can make the .DLL easily, but aren't experienced enough in VBScript (where I don't think you can call external .DLLs unless they are ActiveX components) or JScript.

What I have so far (in VBScript, but as I said, it seems like DECLARE statement isn't supported there):

It can be in JScript - I will only code the .DLL :slight_smile:

option explicit

' MMedia
' (C) 2020 HeartWare

' This is a script for Directory Opus.
' See https://www.gpsoft.com.au/DScripts/redirect.asp?page=scripts for development information.



' Called by Directory Opus to initialize the script
Function OnInit(initData)
	initData.name = "MMedia"
	initData.version = "1.0"
	initData.copyright = "(C) 2020 HeartWare"
	initData.desc = "MultiMedia Info"
	initData.default_enable = true
	initData.min_version = "12.0"

	Dim col

	Set col = initData.AddColumn
	col.name = "MultiMediaInfo"
	col.method = "OnMultiMediaInfo"
	col.label = "MultiMedia Info"
	col.justify = "left"
	col.autogroup = true
End Function

' Declare Function GetInfo Lib "MultiMedia" (ByVal FileName as String) as String

' Implement the MultiMediaInfo column
Function OnMultiMediaInfo(ScriptColData)
  if ScriptColData.Col = "MultiMediaInfo" then
    if ScriptColData.item.is_dir then
      ScriptColData.value = ""
      ScriptColData.sort = 3
      Exit Function
    end if
  end if
End Function

If you want to do this via a DLL just make your DLL an ActiveX component. It doesn't require a lot of extra code to support, in fact Visual Studio can generate most of it for you automatically.

I don't use Visual Studio, and I'd prefer not to make it an ActiveX library. They require a registration and is inherently insecure...

There's nothing inherently unsecure about ActiveX. It's just a set of agreed COM interfaces, and not really any different to any other kind of DLL. The unsecure thing was how Internet Explorer used to download and run the code from any ActiveX DLL on any website many years ago, which was IE's fault not ActiveX's, and long in the past. Doing the same with any other type of DLL would be equally bad, but hasn't given DLLs in general a bad name.

It seems like JScript can't call plain old .DLL files either, so unless DOPUS implements support for external .DLLs to populate columns, the idea seems dead, and the useability (for me) of DOPUS falls below the threshold.

Too bad - it looked promising, and came so very close...

(no negative criticism of DOPUS intended - just that it doesn't do what I would like it to do)...

Or you could just make a simple COM DLL as Jon suggested, or make a basic command-line exe that passes the information back to a script via another method. Giving up just because you can't do something via the very first method you think of without any deviation won't get you far if you want to do esoteric things.

Every shell extension DLL on Windows uses a similar COM API, and there are usually hundreds of those on your system. It's not something to be scared of and easier to do things in the standard way in the long run.

ActiveX / COM DLLs need to be registered, which I am not willing to require.

A Plug-In system that would allow one to use plain old .DLLs in DOPUS would (in my eyes) be the way forward.

Two functions:

GetColumns(IDs,Names) - allows the .DLL to specify IDs of columns and their names (titles)
GetColumn(ID,FileName,Text) - Called for each ID in IDs for each File in the directory, and allows the .DLL to return the Text that should be displayed in that column.

Place the .DLL in a sub-directory "Plug-Ins" under DOPUS and let DOPUS load each of them at startup, then allow the Preferences to enable the Plugin for a particular Folder Format.

What's wrong with registering a DLL? It takes seconds and doesn't hurt anything. Thousands of other DLLs do it. Avoiding a good solution just because of that just makes things more difficult.

There is a plugin DLL system in Opus which you can use to generate items for the Description column, but you'd probably run into issues clashing with the existing Movie and AudioTags plugins that generate the standard metadata, unless you wanted to completely replace them with your own.

Look up the AudioTags plugin if you're interested in that. Source code for that one is available.

What's wrong with registering a DLL?

It requires administrator rights...

Look up the AudioTags plugin if you're interested in that.

I'll do that. Thanks...

Only if the DLL is written to register under HKLM.

As far as I can see, nothing stops a COM DLL being registered by a standard user (for just themselves) under HKCU from Windows 2000 and above. HKCR is a merged view of areas from both HKCU and HKLM, so the registration details can come from either place.

http://www.ewall.org/tech/msi/com-registration