Monday, December 9, 2019

#1 2017-07-17 10:51:42 am

DPaquin
Member
Registered: 2012-01-23
Posts: 97

File metadata information

I would like to know if the following is possible.

Is there a way in AppleScript to get file metadata information.

I am going to merge many video (i.e MP4, m44...) files together. Each of the files are located under a specific folder and were recorded individually. I now need to merge them together in order to have one big video file for a given event.

The duration of the video is important as I need to create some kind of index for someone to be able to go directly to that video sequence without having to look at the whole thing.

When I do a File "Get info" command a window appears with all the information that I need.

Is there a way to gather using AppleScript :
1 - the Name without the extension "filename" and
2 - the Duration "00:32"

Thanks!

Daniel

Offline

 

#2 2017-07-17 01:08:31 pm

Yvan Koenig
Member
Registered: 2006-09-14
Posts: 3673

Re: File metadata information

Here is a quick and dirty answer :

Applescript:

(*
[url]http://www.macscripter.net/viewtopic.php?id=45840[/url]
*)




--set hfsPath to "Seagate 3TB:Jazz youtube:Jimmy Giuffre:" as alias
set hfsPath to choose folder

set ourFilesAndNames to my listFolder:hfsPath

set localDecimalSeparator to item 2 of (0.1 as text) # Useful to convert the string duration to a number
set ourDescriptors to {}
repeat with aCouple in ourFilesAndNames
   set {hfsPath, itsBareName} to contents of aCouple
   set theDuration to (do shell script "mdls " & quoted form of POSIX path of hfsPath & " -name kMDItemDurationSeconds")
   --> "kMDItemDurationSeconds = 500.7366666666667"
   set theDuration to my remplace(theDuration, "kMDItemDurationSeconds = ", "")
   --> "500.7366666666667"
   # or
   --> "(null)"
   try
       set theDuration to my remplace(theDuration, ".", localDecimalSeparator) as number
       # Convert it in minutes:seconds
       set theSeconds to theDuration mod 60
       set theMinutes to theDuration div 60
       if theMinutes > 59 then
           set theHours to theMinutes div 60
           set theMinutes to theMinutes mod 60
           set theDuration to text 2 thru 3 of ((100 + theHours) as text) & ":" & text 2 thru 3 of ((100 + theMinutes) as text) & ":" & text 2 thru 3 of ((100 + theSeconds) as text)
       else
           set theDuration to text 2 thru 3 of ((100 + theMinutes) as text) & ":" & text 2 thru 3 of ((100 + theSeconds) as text)
       end if
       
   on error
       set theDuration to "(null)"
   end try
   set thePath to hfsPath as text
   -- set thePath to POSIX path of hfsPath # Enable it if you want to get POSIX paths
   
   set end of ourDescriptors to {thePath, itsBareName, theDuration}
end repeat

ourDescriptors

#=====

on listFolder:anAlias
   tell application "Finder"
       set allFiles to every file in anAlias as alias list
       
       set ourFiles to {}
       repeat with aFile in allFiles
           set itsExtension to name extension of aFile
           
           if itsExtension is in {"webm", "mp4", "mov"} then # Edit to fit your needs
               set itsName to get name of aFile
               set end of ourFiles to {aFile as text, text 1 thru -(2 + (count itsExtension)) of itsName}
           end if
       end repeat
   end tell
   return ourFiles
end listFolder:

#=====
(*
replaces every occurences of d1 by d2 in the text t
*)

on remplace(t, d1, d2)
   local oTIDs, l
   set {oTIDs, AppleScript's text item delimiters} to {AppleScript's text item delimiters, d1}
   set l to text items of t
   set AppleScript's text item delimiters to d2
   set t to l as text
   set AppleScript's text item delimiters to oTIDs
   return t
end remplace

#=====

Edited to take care of a possible null value returned as duration.
Edited to return duration as min:sec ( thank you Shane wink )

Yvan KOENIG running Sierra 10.12.5 in French (VALLAURIS, France) lundi 17 juillet 2017 21:07:55

Last edited by Yvan Koenig (2017-07-19 07:17:39 am)

Offline

 

#3 2017-07-17 06:39:47 pm

Shane Stanley
Member
From:: Australia
Registered: 2002-12-07
Posts: 6065

Re: File metadata information

Here's an alternative that lets Spotlight do more of the work. Requires 10.10 or later:

Applescript:

use AppleScript version "2.4" -- Yosemite (10.10) or later
use framework "Foundation"
use scripting additions

-- choose folder and make URL
set theFolder to choose folder
set theURL to current application's |NSURL|'s fileURLWithPath:(POSIX path of theFolder)

-- start Spotlight search
set thePred to current application's NSPredicate's predicateWithFormat_("%K CONTAINS %@", current application's NSMetadataItemContentTypeTreeKey, "public.movie")
set theQuery to current application's NSMetadataQuery's new()
theQuery's setPredicate:thePred
theQuery's setSearchScopes:{theURL}
theQuery's startQuery()
repeat while theQuery's isGathering() as boolean
   delay 0.01
end repeat
theQuery's stopQuery()

-- set up results array, formatter for duration
set theResults to current application's NSMutableArray's array()
set theFormatter to current application's NSDateComponentsFormatter's new()

-- loop through results
set theCount to theQuery's resultCount()
repeat with i from 1 to theCount
   set aResult to (theQuery's resultAtIndex:(i - 1))
   set theName to (aResult's valueForAttribute:(current application's NSMetadataItemDisplayNameKey))
   set theDuration to (aResult's valueForAttribute:(current application's NSMetadataItemDurationSecondsKey))
   try
       set theDuration to (theFormatter's stringFromTimeInterval:theDuration)
   on error
       set theDuration to "unknown"
   end try
   -- format values tab-delimited
   (theResults's addObject:(current application's NSString's stringWithFormat_("%@    %@", theName's stringByDeletingPathExtension(), theDuration)))
end repeat
return (theResults's componentsJoinedByString:linefeed) as text

Edited to deal with files lacking the duration metadata.

Last edited by Shane Stanley (2017-07-18 05:22:32 am)


Shane Stanley <sstanley@myriad-com.com.au>
www.macosxautomation.com/applescript/apps/
latenightsw.com

Offline

 

#4 2017-07-18 05:29:19 am

DJ Bazzie Wazzie
Member
From:: the Netherlands
Registered: 2004-10-20
Posts: 2809
Website

Re: File metadata information

If you have AppleScript Toolbox installed:

Applescript:

set thePaths to AST list folder ((choose folder) as string) matching regex "\\.(mp4|mov|webm)$" with returning HFS paths

set report to "filename        duration"
repeat with aPath in thePaths
   set metadata to ((AST metadata for file aPath) & {kMDItemDurationSeconds:0})
   set duration to kMDItemDurationSeconds of metadata as integer
   set basename to kMDItemFSName of metadata
   -- remove extension
   set filename to (AST find regex "(.*)\\.(.*)$" in string basename regex group 2) as string
   -- convert time
   set sec to text -2 thru -1 of ("0" & duration mod 60)
   set theTime to text -2 thru -1 of ("0" & duration div 60) & ":" & sec
   
   set report to report & return & filename & tab & theTime
end repeat

Last edited by DJ Bazzie Wazzie (2017-07-19 05:57:05 am)

Offline

 

#5 2017-07-18 06:25:42 am

Yvan Koenig
Member
Registered: 2006-09-14
Posts: 3673

Re: File metadata information

In case you need to get the path attached to the returned datas (as is done by my original script) you may edit the second loop of Shane's script this way :

Applescript:

repeat with i from 1 to theCount
   set aResult to (theQuery's resultAtIndex:(i - 1))
   set thePath to (aResult's valueForAttribute:(current application's NSMetadataItemPathKey)) # ADDED
   set theName to (aResult's valueForAttribute:(current application's NSMetadataItemDisplayNameKey))
   set theDuration to (aResult's valueForAttribute:(current application's NSMetadataItemDurationSecondsKey))
   try
       set theDuration to (theFormatter's stringFromTimeInterval:theDuration)
   on error
       set theDuration to "unknown"
   end try
   -- format values tab-delimited
   -- set thePath to (POSIX file (thePath as text)) as text # If you want to convert it into Hfs path
   (theResults's addObject:(current application's NSString's stringWithFormat_("%@    %@    %@", thePath, theName's stringByDeletingPathExtension(), theDuration))) # EDITED
end repeat

CAUTION. I added an instruction which may be enabled if you want to get Hfs path of the files. It may be useful if a component of the Hfs path contained a slash which is automatically replaced by a colon in POSIX format.


Yvan KOENIG running Sierra 10.12.5 in French (VALLAURIS, France) mardi 18 juillet 2017 14:23:50

Last edited by Yvan Koenig (2017-07-18 10:37:50 am)

Offline

 

#6 2017-07-18 06:54:48 am

Shane Stanley
Member
From:: Australia
Registered: 2002-12-07
Posts: 6065

Re: File metadata information

Yvan Koenig wrote:

My script return Hfs paths, the modified Shane's one return POSIX paths



One other thing I should point out: my version is recursive, searching all enclosed folders as well as the chosen folder.


Shane Stanley <sstanley@myriad-com.com.au>
www.macosxautomation.com/applescript/apps/
latenightsw.com

Offline

 

#7 2017-07-18 07:06:04 am

DJ Bazzie Wazzie
Member
From:: the Netherlands
Registered: 2004-10-20
Posts: 2809
Website

Re: File metadata information

Yvan Koenig wrote:

CAUTION. My script return Hfs paths, the modified Shane's one return POSIX paths



Does it matter? The TS asked only for filenames with no extension smile

Offline

 

#8 2017-07-18 07:21:36 am

Yvan Koenig
Member
Registered: 2006-09-14
Posts: 3673

Re: File metadata information

As the list of names and durations is not linked to a list of paths, it would be difficult to retrieve which file has a given couple of datas.
If a folder contain a file named trucmuche.mov and a file named trucmuche.mp4 how will you identify which one own the couple {trucmuche, 2:34} and which one own the couple  {trucmuche, 1:23} ?
It's why I took care to return the three values for every file.

More, with Shane's code - which is recursive - we may have different files with the same name in several subfolders.

But maybe it doesn't make sense for the asker.
I just choose to play safe.


Yvan KOENIG running Sierra 10.12.5 in French (VALLAURIS, France) mardi 18 juillet 2017 15:21:31

Last edited by Yvan Koenig (2017-07-18 07:24:27 am)

Offline

 

#9 2017-07-18 06:06:33 pm

Shane Stanley
Member
From:: Australia
Registered: 2002-12-07
Posts: 6065

Re: File metadata information

DJ Bazzie Wazzie wrote:

The TS asked only for filenames with no extension smile



They also asked for duration in the form of "00:32" wink


Shane Stanley <sstanley@myriad-com.com.au>
www.macosxautomation.com/applescript/apps/
latenightsw.com

Offline

 

#10 2017-07-19 05:58:24 am

DJ Bazzie Wazzie
Member
From:: the Netherlands
Registered: 2004-10-20
Posts: 2809
Website

Re: File metadata information

Shane Stanley wrote:
DJ Bazzie Wazzie wrote:

The TS asked only for filenames with no extension smile



They also asked for duration in the form of "00:32" wink



And it returns that from now on

Offline

 

#11 2017-07-19 01:11:23 pm

DPaquin
Member
Registered: 2012-01-23
Posts: 97

Re: File metadata information

Thanks everybody!

I do have a lot to digest WOW!

Daniel

Offline

 

#12 2017-07-22 12:02:51 pm

DPaquin
Member
Registered: 2012-01-23
Posts: 97

Re: File metadata information

OK, I've taken the first code provided by Yvan and ran it on a local folder and the result was OK. However, running the same code with the data located on a NAS did not work. The duration is set to null.

LOCAL DRIVE :
{{"/Users/DanielPaquin/Desktop/27/M2U02701.mp4", "M2U02701", "31:13"}, {"/Users/DanielPaquin/Desktop/27/M2U02702.mp4", "M2U02702", "15:24"}, {"/Users/DanielPaquin/Desktop/27/M2U02703.mp4", "M2U02703", "01:08:14"} }


EXTERNAL DRIVE :
{{"/Volumes/Data/ZVinformatique/CompétitionCourante/27/M2U02701.mp4", "M2U02701", "(null)"}, {"/Volumes/Data/ZVinformatique/CompétitionCourante/27/M2U02702.mp4", "M2U02702", "(null)"}, {"/Volumes/Data/ZVinformatique/CompétitionCourante/27/M2U02703.mp4", "M2U02703", "(null)"}}



More than likely, the video files are going to be on an external drive. Bizarre, when looking at the directory path everything is correct. Why would that be ?

THANKS AGAIN!



[applescript]
--set hfsPath to "Seagate 3TB:Jazz youtube:Jimmy Giuffre:" as alias
set hfsPath to choose folder

set ourFilesAndNames to my listFolder:hfsPath

set localDecimalSeparator to item 2 of (0.1 as text) # Useful to convert the string duration to a number
set ourDescriptors to {}
repeat with aCouple in ourFilesAndNames
    set {hfsPath, itsBareName} to contents of aCouple
    set theDuration to (do shell script "mdls " & quoted form of POSIX path of hfsPath & " -name kMDItemDurationSeconds")
    display dialog "hfsPath: " & hfsPath
    --display dialog "theDuration: " & theDuration
    --> "kMDItemDurationSeconds = 500.7366666666667"
    set theDuration to my remplace(theDuration, "kMDItemDurationSeconds = ", "")
    --> "500.7366666666667"
    # or
    --> "(null)"
    try
        set theDuration to my remplace(theDuration, ".", localDecimalSeparator) as number
        # Convert it in minutes:seconds
        set theSeconds to theDuration mod 60
        set theMinutes to theDuration div 60
        if theMinutes > 59 then
            set theHours to theMinutes div 60
            set theMinutes to theMinutes mod 60
            set theDuration to text 2 thru 3 of ((100 + theHours) as text) & ":" & text 2 thru 3 of ((100 + theMinutes) as text) & ":" & text 2 thru 3 of ((100 + theSeconds) as text)
        else
            set theDuration to text 2 thru 3 of ((100 + theMinutes) as text) & ":" & text 2 thru 3 of ((100 + theSeconds) as text)
        end if
       
    on error
        set theDuration to "(null)"
    end try
    set thePath to hfsPath as text
    set thePath to POSIX path of hfsPath # Enable it if you want to get POSIX paths
   
    set end of ourDescriptors to {thePath, itsBareName, theDuration}
end repeat

ourDescriptors

#=====

on listFolder:anAlias
    tell application "Finder"
        set allFiles to every file in anAlias as alias list
       
        set ourFiles to {}
        repeat with aFile in allFiles
            set itsExtension to name extension of aFile
           
            if itsExtension is in {"webm", "mp4", "mov"} then # Edit to fit your needs
                set itsName to get name of aFile
                set end of ourFiles to {aFile as text, text 1 thru -(2 + (count itsExtension)) of itsName}
            end if
        end repeat
    end tell
    return ourFiles
end listFolder:

#=====
(*
replaces every occurences of d1 by d2 in the text t
*)
on remplace(t, d1, d2)
    local oTIDs, l
    set {oTIDs, AppleScript's text item delimiters} to {AppleScript's text item delimiters, d1}
    set l to text items of t
    set AppleScript's text item delimiters to d2
    set t to l as text
    set AppleScript's text item delimiters to oTIDs
    return t
end remplace

#=====[applescript]

Offline

 

#13 2017-07-22 02:08:25 pm

Yvan Koenig
Member
Registered: 2006-09-14
Posts: 3673

Re: File metadata information

I tested with files stored on an external HD but I'm not using a NAS.
I don't know if it may explain the difference.

Here is what I got :
{{"/Volumes/Seagate 3TB/Jazz youtube/Ahmad Jamal/Ahmad Jamal + Ben Webster, 1960, studio 61.mp4", "Ahmad Jamal + Ben Webster, 1960, studio 61", "26:02"}, {"/Volumes/Seagate 3TB/Jazz youtube/Ahmad Jamal/Ahmad Jamal + Yusef Lateef - Marciac (2011-08-08).mp4", "Ahmad Jamal + Yusef Lateef - Marciac (2011-08-08)", "11:06"}, {"/Volumes/Seagate 3TB/Jazz youtube/Ahmad Jamal/Ahmad Jamal - One - Vienne 2011.mp4", "Ahmad Jamal - One - Vienne 2011", "08:18"}, {"/Volumes/Seagate 3TB/Jazz youtube/Ahmad Jamal/Ahmad Jamal - Poinciana - Olympia 2012.mp4", "Ahmad Jamal - Poinciana - Olympia 2012", "10:53"}, {"/Volumes/Seagate 3TB/Jazz youtube/Ahmad Jamal/Ahmad Jamal Trio & George Coleman - My foolish heart.mp4", "Ahmad Jamal Trio & George Coleman - My foolish heart", "10:16"}, {"/Volumes/Seagate 3TB/Jazz youtube/Ahmad Jamal/Ahmad Jamal Trio - Germany 1999.mp4", "Ahmad Jamal Trio - Germany 1999", "43:52"}, {"/Volumes/Seagate 3TB/Jazz youtube/Ahmad Jamal/Ahmad Jamal Trio-1959-Darn That Dream.webm", "Ahmad Jamal Trio-1959-Darn That Dream", "(null)"}}

I activated the use of POSIX paths because it clearly show that the files aren't on the boot volume.

Just a question : the script rely upon Spotlight to get the metadatas. Are you sure that this feature search in the NAS ?

Yvan KOENIG running Sierra 10.12.6 in French (VALLAURIS, France) samedi 22 juillet 2017 22:05:23

Last edited by Yvan Koenig (2017-07-22 02:11:53 pm)

Offline

 

#14 2017-07-22 03:28:49 pm

DPaquin
Member
Registered: 2012-01-23
Posts: 97

Re: File metadata information

The script rely upon Spotlight to get the metadatas. Are you sure that this feature search in the NAS ?


It did not.

I've re-index the whole thing and it does now appear when doing a search with spotlight.

However, when I do a get info on the file, the duration does not show.

Then the script works as expected. I am not sure what to do to get the duration for file on the NAS.

Moving files from to NAS onto local the local drive is not option.

My NAS is a Synology DS214+.

Thanks!

Daniel

Browser: Safari 602.1
Operating System: Mac OS X (10.13 Developer Beta 3)

Last edited by DPaquin (2017-07-22 08:24:38 pm)

Offline

 

#15 2017-07-22 09:01:53 pm

Shane Stanley
Member
From:: Australia
Registered: 2002-12-07
Posts: 6065

Re: File metadata information

DPaquin wrote:

I am not sure what to do to get the duration for file on the NAS.



All the alternatives here rely on Spotlight, which won't index your NAS disks. In fact, I think you will find that Get Info also fails to get the duration of files stored on your NAS disks, for the same reason.

You can, however, get it using AVFoundation. This script requires 10.11 or later:

Applescript:

use AppleScript version "2.5" -- 10.11 or later
use framework "Foundation"
use framework "AVFoundation"
use scripting additions

-- get files
set theFolder to choose folder
set theURL to current application's |NSURL|'s fileURLWithPath:(POSIX path of theFolder)
set fileManager to current application's NSFileManager's defaultManager()
set {theFiles, theError} to fileManager's contentsOfDirectoryAtURL:theURL includingPropertiesForKeys:{} options:(current application's NSDirectoryEnumerationSkipsHiddenFiles) |error|:(reference)
-- eliminate non-video files
set thePred to current application's NSPredicate's predicateWithFormat:"pathExtension IN %@" argumentArray:{{"mp4", "mov", "webm"}}
set vidFiles to theFiles's filteredArrayUsingPredicate:thePred

-- set up results array, formatter for duration
set theResults to current application's NSMutableArray's array()
set theFormatter to current application's NSDateComponentsFormatter's new()

-- lop through
repeat with aFile in vidFiles
   -- get localized name
   set {theResult, theName, theError} to (aFile's getResourceValue:(reference) forKey:(current application's NSURLLocalizedNameKey) |error|:(reference))
   -- create an AVAsset so you can get duration
   set theAsset to (current application's AVURLAsset's assetWithURL:aFile)
   set durationInfo to theAsset's duration() -- returns record like: {value:2911360, timescale:1000, flags:1, epoch:0}
   if durationInfo is missing value then
       set theTime to "unknown"
   else
       -- calculate duration in seconds and format as string
       set theDuration to (value of durationInfo) / (timescale of durationInfo)
       set theDuration to (theFormatter's stringFromTimeInterval:theDuration)
   end if
   (theResults's addObject:(current application's NSString's stringWithFormat_("%@    %@", theName's stringByDeletingPathExtension(), theDuration)))
end repeat
return (theResults's componentsJoinedByString:linefeed) as text


Shane Stanley <sstanley@myriad-com.com.au>
www.macosxautomation.com/applescript/apps/
latenightsw.com

Offline

 

#16 2017-07-22 09:34:25 pm

DPaquin
Member
Registered: 2012-01-23
Posts: 97

Re: File metadata information

Exactly, "Get Info" fails to get the duration of files stored on my NAS disks.

I ran the script created by Shane and it now work on my NAS.

I'll keep working on the script because this is only the beginning.

Many thanks everybody, this was impossible for me to write something like this. I do have a real lack of knowledge when comes to write such AppleScript programs.

You guys are great!

MANY THANKS!

Daniel

Offline

 

#17 2019-11-17 02:36:30 am

byronheath
Member
Registered: 2019-11-16
Posts: 13

Re: File metadata information

Hey all I am a total novice at this . So sorry if I don't speak the language you would understand

I only recently found how apple scripts can make my life so much easier

Shane thank you so much for this . It works great

Thank you for your time , It is greatly appreciated

I was wandering after the last line: return (theResults's componentsJoinedByString:linefeed) as text

What would I need to add that the script opens Text edit app and copies the the result that appeared as text of the result box of script editor

Here is a link to the image to explain what information I would like to be able to save in a text document

https://imgur.com/jfX5Zez

If its possible can the text file be saved in the same location when the script prompted in the beginning where I selected the folder that contained the media

Hopefully I have explained what I am looking to do

Again thank you so much

Offline

 

#18 2019-11-17 04:35:04 am

KniazidisR
Member
Registered: 2019-03-03
Posts: 768

Re: File metadata information

Here is how to write to text file. But with avi and mkv movies the Shane's script gives durations=0. I don't know why. Well, to write durations to text file replace this:

Applescript:

return (theResults's componentsJoinedByString:linefeed) as text

with this:

Applescript:


set aText to (theResults's componentsJoinedByString:linefeed) as text

set filepath to (POSIX path of theFolder) & "myMoviesDurations.txt"

set openfile to open for access filepath with write permission
write aText as «class utf8» to openfile
close access openfile

Last edited by KniazidisR (2019-11-17 04:47:24 am)


Model: MacBook Pro
macOS Mojave -- version 10.14.4
Safari -- version 12.1
Firefox -- version 70.0

Offline

 

#19 2019-11-17 06:23:46 am

Shane Stanley
Member
From:: Australia
Registered: 2002-12-07
Posts: 6065

Re: File metadata information

KniazidisR wrote:

But with avi and mkv movies the Shane's script gives durations=0. I don't know why.



Presumably for the same reason QuickTime can't play them -- they're not formats supported by AVFoundation. A pity.


Shane Stanley <sstanley@myriad-com.com.au>
www.macosxautomation.com/applescript/apps/
latenightsw.com

Offline

 

#20 2019-11-17 09:23:54 am

byronheath
Member
Registered: 2019-11-16
Posts: 13

Re: File metadata information

KniazidisR Thank you...You are a legend !!

It would of been great if AVFoundation supported more formats

Luckily I need it for .mov and .mp4 files

Again I can't thank everyone enough that contributed to the forum

Offline

 

#21 2019-11-17 09:48:17 am

byronheath
Member
Registered: 2019-11-16
Posts: 13

Re: File metadata information

Maybe I am pushing my luck here a bit but would it be possible to get the duration with frames also
for eg. 01(hours)04(minutes)23(seconds)04(frames) > 01:04:23:04

also could I set the "myMoviesDurations.txt" to the name of the folder the media is sitting in (POSIX path of theFolder)

Offline

 

#22 2019-11-17 12:23:31 pm

KniazidisR
Member
Registered: 2019-03-03
Posts: 768

Re: File metadata information

OK...:

Applescript:


use AppleScript version "2.5" -- 10.11 or later
use framework "Foundation"
use framework "AVFoundation"
use scripting additions

-- get files
set theFolder to choose folder
set theURL to current application's |NSURL|'s fileURLWithPath:(POSIX path of theFolder)
set fileManager to current application's NSFileManager's defaultManager()
set {theFiles, theError} to fileManager's contentsOfDirectoryAtURL:theURL includingPropertiesForKeys:{} options:(current application's NSDirectoryEnumerationSkipsHiddenFiles) |error|:(reference)
-- eliminate non-video files
set thePred to current application's NSPredicate's predicateWithFormat:"pathExtension IN %@" argumentArray:{{"mp4", "mov", "webm"}}
set vidFiles to theFiles's filteredArrayUsingPredicate:thePred

-- set up results array, formatter for duration
set theResults to current application's NSMutableArray's array()
set theFormatter to current application's NSDateComponentsFormatter's new()

-- lop through
repeat with aFile in vidFiles
   -- get localized name
   set {theResult, theName, theError} to (aFile's getResourceValue:(reference) forKey:(current application's NSURLLocalizedNameKey) |error|:(reference))
   -- create an AVAsset so you can get duration
   set theAsset to (current application's AVURLAsset's assetWithURL:aFile)
   set durationInfo to theAsset's duration() -- returns record like: {value:2911360, timescale:1000, flags:1, epoch:0}
   
   if durationInfo is missing value then
       set theTime to "unknown"
       set framesNumber to "unknown"
   else
       -- calculate duration in seconds and format as string
       set theSeconds to (value of durationInfo) / (timescale of durationInfo)
       set theDuration to (theFormatter's stringFromTimeInterval:theSeconds)
       -- Determine frames number here
       set theTracks to (get theAsset's tracks())
       repeat with i from 1 to count theTracks
           set aTrack to item i of theTracks
           if (aTrack's mediaType()) as string is "vide" then exit repeat
       end repeat
       set videoTrack to aTrack
       set frameRate to videoTrack's nominalFrameRate()
       set framesNumber to (theSeconds * frameRate) as integer
   end if
   
   (theResults's addObject:(current application's NSString's stringWithFormat_("%@    %@:%@", theName's stringByDeletingPathExtension(), theDuration, framesNumber)))
end repeat

set aText to (theResults's componentsJoinedByString:linefeed) as text

tell application "Finder" to set folderName to name of theFolder
set filepath to (POSIX path of theFolder) & folderName & ".txt"
set openfile to open for access filepath with write permission
set eof of openfile to 0
write aText as «class utf8» to openfile
close access openfile

Last edited by KniazidisR (2019-11-17 12:45:48 pm)


Model: MacBook Pro
macOS Mojave -- version 10.14.4
Safari -- version 12.1
Firefox -- version 70.0

Offline

 

#23 2019-11-19 09:22:25 am

byronheath
Member
Registered: 2019-11-16
Posts: 13

Re: File metadata information

KniazidisR that is awesome . Thank you

I see the script works out the entire frame count of the full duration of the file for eg 6530 which is the correct amount of frames for a 4min21sec05frames file at  25frames per a second

The duration of the file I have for eg. 00(h):04(m):21(sec):05(frames)

The previous script would just give the duration of 4m21sec and discard the 05 frames

How can I get the whole timecode represented with out the script rounding off the frames to the closest second ?

I was thinking if we started with the the full frame count and went from frames > timecode

I found the below script about getting frame count and converting to timecode but I haven't figured how to apply it to KniazidisR frame count in the last script he wrote

tell application "QuickTime Player"
   tell document 1 to set {currentTime, timeScale, theDuration, FrameCount} to {current time, time scale, duration, count (frames of track "Video track")}
end tell

set FrameRate to (FrameCount * timeScale) / theDuration div 1
tell (currentTime / timeScale) to set {hr, mn, sc} to {it div 3600, it mod 3600 div 60, it mod 3600 mod 60 div 1}
set fr to (currentTime mod timeScale div (timeScale / FrameRate))
set SMPTE to addZero(TimeOffset + hr) & ":" & addZero(mn) & ":" & addZero(sc) & ":" & addZero(fr)
display dialog "TCR " & SMPTE

Could anyone help

What I am asking is there a way from the original script in this forum to have not just the hour:Minutes:seconds displayed but also the frames so the whole timecode of each video
hh:mm:ss:ff


Thank you all for your help

I will continue to try

Last edited by byronheath (2019-11-19 04:25:19 pm)

Offline

 

#24 2019-11-19 11:42:25 pm

KniazidisR
Member
Registered: 2019-03-03
Posts: 768

Re: File metadata information

byronheath wrote:

I see the script works out the entire frame count of the full duration of the file for eg 6530 which is the correct amount of frames for a 4min21sec05frames file at  25frames per a second


Hi, byronheath.
If I understood correctly, then you just need to replace this in my script:

Applescript:

set framesNumber to (theSeconds * frameRate) as integer

with this:

Applescript:

set framesNumber to round ((theSeconds * frameRate) - ((theSeconds * frameRate) as integer))

Last edited by KniazidisR (2019-11-19 11:44:13 pm)


Model: MacBook Pro
macOS Mojave -- version 10.14.4
Safari -- version 12.1
Firefox -- version 70.0

Offline

 

#25 2019-11-20 12:36:03 am

byronheath
Member
Registered: 2019-11-16
Posts: 13

Re: File metadata information

Thank you so much for helping me you are a legend

Sorry I am not explaining it well

I have attached a video link so you can see it in visual form

I have burnt in timecode so you can see the duration rolling as clip plays

I would like to see the timecode as it is represtend on the video in below link

https://vimeo.com/374343428

so the final out come will be 00:00:03:17 (the 17 will be represented in the frames)

Again thank you so much

Offline

 

Board footer

Powered by FluxBB

RSS (new topics) RSS (active topics)