Video length, dimensions, framerate, definition columns

[Note: A version of this functionality is now built in to the script in the root post.]

The following code has been tested and works

function OnInit(initData)
{
	initData.name = "Video Frame Columns";
	initData.version = "1.1";
	initData.copyright = "(c) 2018 Leo Davidson , updated by vijay saraff";
	initData.url = "https://resource.dopus.com/t/video-width-height-and-framerate-columns/28147";
	initData.desc = "Brings Explorer's Frame Width, Frame Height, and Frame Rate columns into Opus.";
	initData.default_enable = true;
	initData.min_version = "12.7";

	var col;
	var props;

	props = DOpus.FSUtil.GetShellPropertyList("System.Video.FrameHeight", "r");
	if (props.count == 1)
	{
		var prop = props(0);
		col = initData.AddColumn();
		col.name = "FrameHeight";
		col.method = "OnCol";
		col.label = prop.display_name;
		col.justify = "right";
		col.autogroup = true;
		col.userdata = prop.pkey;
		col.type = "number";
	}
	props = DOpus.FSUtil.GetShellPropertyList("System.Video.FrameWidth", "r");
	if (props.count == 1)
	{
		var prop = props(0);
		col = initData.AddColumn();
		col.name = "FrameWidth";
		col.method = "OnCol";
		col.label = prop.display_name;
		col.justify = "right";
		col.autogroup = true;
		col.userdata = prop.pkey;
		col.type = "number";
		//definition column
		col = initData.AddColumn();
		col.name = "Definition";
		col.method = "OnCol";
		col.label = "Definition";
		col.justify = "right";
		col.autogroup = true;
		col.userdata = prop.pkey;
		//col.type - "text";

	}

	props = DOpus.FSUtil.GetShellPropertyList("System.Video.FrameRate", "r");
	if (props.count == 1)
	{
		var prop = props(0);
		col = initData.AddColumn();
		col.name = "FrameRate";
		col.method = "OnCol";
		col.label = prop.display_name;
		col.justify = "right";
		col.autogroup = true;
		col.userdata = prop.pkey;
		col.type = "double";
	}
	
}

function OnCol(scriptColData)
{
	try
	{
		scriptColData.value = scriptColData.item.shellprop(scriptColData.userdata);
		DOpus.Output(scriptColData.col + " raw value:" + scriptColData.value);
		if (scriptColData.col == "FrameRate" && typeof(scriptColData.value) == "number")
		{
			scriptColData.value /= 1000;
		}
		if (scriptColData.col == "Definition" && typeof(scriptColData.value) == "number")
		{
			//DOpus.Output(scriptColData.col + " raw value:" + scriptColData.value);
			if (scriptColData.value >= 3840) {
				scriptColData.value = "4K";
			} else if ( scriptColData.value >= 1920) {
				scriptColData.value = "Full HD";
			} else if ( scriptColData.value >= 720) {
				scriptColData.value = "HD Ready";
			} else if ( scriptColData.value >= 640) {
				scriptColData.value = "DVD";
			} else {
				scriptColData.value = ""
			}		
		}
	}
	catch (e)
	{
		scriptColData.value = "<Error>";
		return;
	}
}
1 Like

Many many thanks for your help

You are welcome! Though you should add 8K to the definition column as well.

Root post updated with v2.0 (26/Mar/2018):

  • Requires Opus 12.7.3 beta or above.
  • Now populates all columns for each file at once, which greatly speeds things up.
  • Added Length column.
  • Added Relative Length column.
  • Added Definition column (8K, 4K, Full HD, etc.).
  • Added Dimensions column (combined width and height in a single column, with proper sorting; groups by Definition).
  • Framerate is now only shown to two decimal places, and always uses 2 to keep things aligned.
1 Like

I can get duration with mkv but not with mp4 or ts. Is there a way to make that happen. Most my files are ts and mp4. I updated to the beta version and under scripts it says ok now. Thanks.

  • Does duration show up for the same files in Explorer?

    If it doesn't work there either then something is wrong with the mp4 codecs/splitters on your system, or there's a problem related to the files themselves (e.g. something is blocking them from being opened, or they're not really mp4 and have the wrong extension).

  • Are you definitely looking at the Duration / Length column which the script provides, and not the one built-in to Opus?

Sorry I made the mistake of not using the correct duration. It works great now.

Thank you for this, it works great.

Sorry if this is a bit unrelated, but is there any way to get the "Video Codec" to work with more file types, or is there another label that's compatible with more file types? Seems like it fails with a lot of containers (.mkv, .mp4, .m4v).

Is there a column in Explorer that shows the information you need for your files? I can add it to the script if there is.

We'll probably also improve the internal Video Codec column in the future, but that'll take longer. Adding more columns to the script can be done very quickly.

1 Like

In Explorer, "Video Compression" almost always returns a value (if not always; a few of my files don't but that could just be my messed up videos). But the values are alphanumeric strings. They might correlate with codecs, I wasn't able to find much documentation at a glance.

@Leo

Could you please add Audio tracks column from Explorer as I cannot figure out how to add it myself

onedot3

Explorer doesn't have an Audio Tracks column here. It must be something added by a third-party component. It should be possible to import it, but I can't tell you the column/property names to use as it doesn't exist here and I don't know where it comes from.

Edit:

Hello,

I keep getting occasional errors with this script:

 13/05/2019 23:54 Video Frame Columns:  Object doesn't support this property or method (0x800a01b6)
 13/05/2019 23:54 Video Frame Columns:  Error at line 259, position 3
 13/05/2019 23:54 Video Frame Columns:  Object doesn't support this property or method (0x800a01b6)
 13/05/2019 23:54 Video Frame Columns:  Error at line 259, position 3

Any ideas why?

No, from a look at that line in the code. Can you give more detail on how to reproduce what you're seeing? Are there particular files, folders or actions that trigger it?

Is it possible to see the total duration of the videos in a folder?

I have several folders with videos inside and I would like to know the total duration of the videos that are inside each folder.

Yes, you can add that to the status bar, under Preferences / Display. It’s included in one of the sample configurations in the menu on the right.

Thanks for the reply, I have tested it and it works correctly.

Is it possible to do this in the column for folders?

Could be done using a separate script column.

I am not sure how performant it would be, though. Extracting video duration is quite slow, and doing it for all files under multiple folders would be very slow. You would probably want some kind of caching system, which a script could do but which is also much more complicated.

Yes.

It's alright. Not blazingly fast, but acceptable, even on HDDs.

3 Likes

Thanks!