Skip to main content
salithan73779666
Participating Frequently
November 1, 2017
Answered

Is there any way to get frame count of timeline animation using JSX script?

  • November 1, 2017
  • 1 reply
  • 8349 views

I want to extract frame count using JSX script?
I have used following code. But it seems not sharp as expected (In case of decimal point of seconds it seems not good)

function getTimelineLength() {

    var ref = new ActionReference();

    ref.putProperty(charIDToTypeID('Prpr'), stringIDToTypeID('duration'));

    ref.putClass(stringIDToTypeID('timeline'));

    var desc = new ActionDescriptor();

    desc.putReference(charIDToTypeID('null'), ref);

    var TC = executeAction(charIDToTypeID('getd'), desc, DialogModes.NO);

    TC = TC.getObjectValue(stringIDToTypeID('duration'));

    var M = 0;

    try { M = TC.getInteger(stringIDToTypeID('minutes')); } catch (e) { }

    var S = 0;

    try { S = TC.getInteger(stringIDToTypeID('seconds')); } catch (e) { }

    var F = TC.getInteger(stringIDToTypeID('frame'));

    var FR = TC.getInteger(stringIDToTypeID('frameRate'));

    var A = new Array();

    A.push([[M], [S], [F], [FR]]);

    return A;

}

//option 1

var frameCount = timeLineInfo[0][2]  ( But this returns "0" value with newly opened document)

//option 2

var timeLineInfo =  getTimelineLength()

var frameCount = timeLineInfo[0][1] * timeLineInfo[0][3]  ( This is not returns correct value with decimal value of seconds )

Anyone have a better solution?

This topic has been closed for replies.
Correct answer r-bin

var r = new ActionReference();

r.putProperty(charIDToTypeID('Prpr'), stringIDToTypeID('frameCount'));

r.putClass(stringIDToTypeID('timeline'));

var ret = executeActionGet(r);

alert( ret.getInteger(stringIDToTypeID('frameCount')) );

//

1 reply

r-binCorrect answer
Legend
November 1, 2017

var r = new ActionReference();

r.putProperty(charIDToTypeID('Prpr'), stringIDToTypeID('frameCount'));

r.putClass(stringIDToTypeID('timeline'));

var ret = executeActionGet(r);

alert( ret.getInteger(stringIDToTypeID('frameCount')) );

//

salithan73779666
Participating Frequently
November 1, 2017

And again. Thanks alot r-bin.

c.pfaffenbichler
Community Expert
Community Expert
October 7, 2024

Apologies for delay, I must have missed the email. 
@schroef You put me on the right track, thanks! I had to swap out "timeline" for "animationClass" and now it works: 

var r = new ActionReference();
r.putProperty(charIDToTypeID('Prpr'), stringIDToTypeID('frameCount'));
r.putClass(stringIDToTypeID('animationClass'));
var ret = executeActionGet(r);
alert( ret.getInteger(stringIDToTypeID('frameCount')) );

 So that's working, but I'm still not seeing a way to get a frame animation frame's duration. The duration mentioned above seems to be for video clips maybe, as it throws an error when I try it with a frame animation. 

Is there a way to get those? For instance, from the attached PSD, I'd like to in the end get `[1,0.2,0.2,0.2,0.2,1]`


// determine durations in a frame animation;
// 2024, use it at your own risk;
if (app.documents.length > 0) {
var myDocument = app.activeDocument;
var theNumbers = new Array;
var theCounter = 1;
var theCheck = selectFrame (theCounter);
//var theFrameCount = GetFrameCount();
while (theCheck != false) {
var theDur = getFrameDelay(theCounter);
theCounter++;
theNumbers.push(theDur);
var theCheck = selectFrame (theCounter);
};
alert ("durations\n"+theNumbers.join("\n"))
};
////////////////////////////////////
////// get frame delay //////
function getFrameDelay (theIndex) {
try {
var ref = new ActionReference();  
ref.putProperty(charIDToTypeID('Prpr'), stringIDToTypeID('animationFrameDelay'));  
ref.putIndex(stringIDToTypeID('animationFrameClass'), theIndex);
var desc = new ActionDescriptor();  
desc.putReference(charIDToTypeID('null'), ref);           
var aaa = executeAction(charIDToTypeID('getd'), desc, DialogModes.NO);
return aaa.getDouble(stringIDToTypeID('animationFrameDelay'))
} catch (e) {return false}
};
////// select frame //////
function selectFrame (theIndex) {
try {
var desc18 = new ActionDescriptor();
var ref10 = new ActionReference();
ref10.putIndex( stringIDToTypeID( "animationFrameClass" ), theIndex );
desc18.putReference( charIDToTypeID( "null" ), ref10 );
executeAction( charIDToTypeID( "slct" ), desc18, DialogModes.NO );
return true
} catch (e) {return false}
};