I have added this as a second answer so as not to pollute the original version of this code.
It bugged me a little that the original OP included mp4 type files and my original version did not address that.
I also wanted to have a way of overwriting the meta file if I wanted without having to delete it in the file system..
Lastly some feed back would be great..
The hardest part was figuring out how to get an image from a mp4 video file.
I could have gone down the route of using Objective - C framworks for 'AV' but to be honest I struggled in the time frame I gave myself to figure this all out and in the end remembered that the unix QuickLook command qlmange can actually do this for us.
So the video image snapshot is written to the users tmp folder and referenced in the image viewer from there. ta da..
Again this is a working example and as with any examples the end user may need to adjust to their needs.
Main changes
- Added file type to accept mp4.
- Added a Feed back text area
- Added an overwrite file option
- Updated the image counter to include the file
name.

-- Copyright 2015 {Mark Hunte}. All rights reserved.
use scripting additions
use framework "Foundation"
use framework "cocoa"
use framework "AppKit"
--- set up window
property buttonWindow : class "NSWindow"
property theImage : class "NSImage"
property theImageView : class "NSImageView"
property altLabelField : class "NSTextField"
property altField : class "NSTextField"
property copyrightField : class "NSTextField"
property sigField : class "NSTextField"
property feedBacklField : class "NSTextField"
property countLabelField : class "NSTextField"
property the_selection : {}
property imageList : {} -- holds NSImage instances
property imageListSplit : {} -- to use for file when needing an alias
property thisImage : 0
property imageCount : 0
property copyright : "© 2015 CompanyName"
property signature : "Signature"
property checkBoxOverWriteBtn : class "NSButton"
property NSFileManager : class "NSFileManager"
property file_types : {"public.mpeg-4", "public.image"}
set NSFileManager to current application's NSFileManager's defaultManager
set height to 700
set width to 1000
set textFieldGap to 10
set labelFiieldGap to 5
set winRect to current application's NSMakeRect(0, 0, width, height)
set buttonWindow to current application's NSWindow's alloc()'s initWithContentRect:winRect styleMask:7 backing:2 defer:false
buttonWindow's setFrameAutosaveName:"buttonWindow"
--set up buttons
set writeButtonFrame to current application's NSMakeRect(155, (height - 270), 100, 25) -- button rect origin ,x,y ,size width,hieght
set writeBtn to current application's NSButton's alloc's initWithFrame:writeButtonFrame -- init button
writeBtn's setTitle:"write file"
set writeBtn's bezelStyle to 12 --NSRoundedBezelStyle
writeBtn's setButtonType:0 --NSMomentaryLightButton
writeBtn's setTarget:me
writeBtn's setAction:"writeFile:"
--
set checkBoxOverWriteButtonFrame to current application's NSMakeRect(25, (height - 240), 185, 50) -- button rect origin ,x,y ,size width,hieght
set checkBoxOverWriteBtn to current application's NSButton's alloc's initWithFrame:checkBoxOverWriteButtonFrame -- init button
checkBoxOverWriteBtn's setTitle:"Overight meta file if it Exists"
checkBoxOverWriteBtn's setButtonType:3 --NSSwitchButtonn
checkBoxOverWriteBtn's setTarget:me
--checkBoxOverWriteBtn's setAction:"checkBoxOverWriteFileSetState:"
checkBoxOverWriteBtn's setState:0
checkBoxOverWriteBtn's setAlignment:0
checkBoxOverWriteBtn's setImagePosition:3
set nextButtonFrame to current application's NSMakeRect(105, (height - 675), 50, 25) -- button rect origin ,x,y ,size width,hieght
set nextBtn to current application's NSButton's alloc's initWithFrame:nextButtonFrame -- init button
nextBtn's setTitle:"Next"
set nextBtn's bezelStyle to 12 --NSRoundedBezelStyle
nextBtn's setButtonType:0 --NSMomentaryLightButton
nextBtn's setTarget:me
nextBtn's setAction:"nextImage:"
--
set prevButtonFrame to current application's NSMakeRect(25, (height - 675), 50, 25)
set prevBtn to current application's NSButton's alloc's initWithFrame:prevButtonFrame
prevBtn's setTitle:"Prev"
set prevBtn's bezelStyle to 12 --NSRoundedBezelStyle
prevBtn's setButtonType:0 --NSMomentaryLightButton
prevBtn's setTarget:me
prevBtn's setAction:"previousImage:"
---
set selectionButtonFrame to current application's NSMakeRect((width - 715), (height - 690), 150, 25)
set selectionBtn to current application's NSButton's alloc's initWithFrame:selectionButtonFrame
selectionBtn's setTitle:"Select new Images"
set selectionBtn's bezelStyle to 12 --NSRoundedBezelStyle
selectionBtn's setButtonType:0 --NSMomentaryLightButton
selectionBtn's setTarget:me
selectionBtn's setAction:"finderSelection:"
--
set terminatButtonFrame to current application's NSMakeRect((width - 90), (height - 690), 75, 25)
set terminateBtn to current application's NSButton's alloc's initWithFrame:terminatButtonFrame
terminateBtn's setTitle:"Quit"
set terminateBtn's bezelStyle to 12 --NSRoundedBezelStyle
terminateBtn's setButtonType:0 --NSMomentaryLightButton
terminateBtn's setTarget:me
terminateBtn's setAction:"terminateMe"
--
-- add buttons to the window
buttonWindow's contentView's addSubview:nextBtn
buttonWindow's contentView's addSubview:prevBtn
buttonWindow's contentView's addSubview:selectionBtn
buttonWindow's contentView's addSubview:terminateBtn
buttonWindow's contentView's addSubview:writeBtn
buttonWindow's contentView's addSubview:checkBoxOverWriteBtn
--
-- set up image view
set imageViewFrame to current application's NSMakeRect(300, (height - 660), 640, 640) --origin ,x,y ,size width,hieght
set theImageView to current application's NSImageView's alloc()'s initWithFrame:imageViewFrame
theImageView's setImageFrameStyle:1
-- add image view to the window
buttonWindow's contentView's addSubview:theImageView
-- activate the window
buttonWindow's makeKeyAndOrderFront:buttonWindow
--- set alt label
set altLabelFrame to current application's NSMakeRect(25, (height - 60), 100, 25) --origin ,x,y ,size width,hieght
set altLabelField to current application's NSTextField's alloc()'s initWithFrame:altLabelFrame
altLabelField's setStringValue:"alt"
altLabelField's setBezeled:false
altLabelField's setDrawsBackground:false
altLabelField's setEditable:false
altLabelField's setSelectable:false
-- set up alt textField
set altFieldFrame to current application's NSMakeRect(25, ((height - 105)), 240, 50) --origin ,x,y ,size width,hiegh
set altField to current application's NSTextField's alloc()'s initWithFrame:altFieldFrame
---
--- set copyright label
set copyrightLabelFrame to current application's NSMakeRect(25, (height - 130), 100, 25) --origin ,x,y ,size width,hieght
set copyrightLabelField to current application's NSTextField's alloc()'s initWithFrame:copyrightLabelFrame
copyrightLabelField's setStringValue:"©opyright"
copyrightLabelField's setBezeled:false
copyrightLabelField's setDrawsBackground:false
copyrightLabelField's setEditable:false
copyrightLabelField's setSelectable:false
-- set up copyright textFields
set copyrightFieldFrame to current application's NSMakeRect(25, (height - 150), 240, 25) --origin ,x,y ,size width,hieght
set copyrightField to current application's NSTextField's alloc()'s initWithFrame:copyrightFieldFrame
--- set sig label
set sigLabelFrame to current application's NSMakeRect(25, (height - 180), 100, 25) --origin ,x,y ,size width,hieght
set sigLabelField to current application's NSTextField's alloc()'s initWithFrame:sigLabelFrame
sigLabelField's setStringValue:"signature"
sigLabelField's setBezeled:false
sigLabelField's setDrawsBackground:false
sigLabelField's setEditable:false
sigLabelField's setSelectable:false
sigLabelField's setDelegate:me
-- set up sig textFields
set sigFieldFrame to current application's NSMakeRect(25, (height - 200), 240, 25) --origin ,x,y ,size width,hieght
set sigField to current application's NSTextField's alloc()'s initWithFrame:sigFieldFrame
--- set image count label
set countLabelFrame to current application's NSMakeRect(320, (height - 25), 560, 25) --origin ,x,y ,size width,hieght
set countLabelField to current application's NSTextField's alloc()'s initWithFrame:countLabelFrame
countLabelField's setStringValue:"-"
countLabelField's setAlignment:2 --center
countLabelField's setBezeled:false
countLabelField's setDrawsBackground:false
countLabelField's setEditable:false
countLabelField's setSelectable:false
--
buttonWindow's contentView's addSubview:altLabelField
buttonWindow's contentView's addSubview:altField
buttonWindow's contentView's addSubview:copyrightLabelField
buttonWindow's contentView's addSubview:copyrightField
buttonWindow's contentView's addSubview:sigLabelField
buttonWindow's contentView's addSubview:sigField
buttonWindow's contentView's addSubview:countLabelField
---
--my finderSelection:(missing value)
set feedBacklFrame to current application's NSMakeRect(25, (height - 450), 240, 120) --origin ,x,y ,size width,hieght
set feedBacklField to current application's NSTextField's alloc()'s initWithFrame:feedBacklFrame
feedBacklField's setStringValue:""
feedBacklField's setEditable:false
buttonWindow's contentView's addSubview:feedBacklField
---
on nextImage:sender
feedBacklField's setStringValue:""
if thisImage is not greater than imageCount and thisImage is not equal to imageCount then
set thisImage to thisImage + 1
theImageView's setImage:(item thisImage of imageList)
end if
setUpTextFieldsStrings()
end nextImage:
on previousImage:sender
feedBacklField's setStringValue:""
if thisImage is less than 1 or thisImage is not equal to 1 then
set thisImage to thisImage - 1
theImageView's setImage:(item thisImage of imageList)
end if
setUpTextFieldsStrings()
end previousImage:
on setUpTextFieldsStrings()
--tell application "Finder" to set file_name to displayed name of ((item thisImage of imageListSplit) as alias)
set theSender to (current application's NSString's stringWithString:("setuptFields" as string))
set {thisFile_name, file_ext} to splitPath((item thisImage of imageListSplit), theSender)
set altField's stringValue to thisFile_name
set copyrightField's stringValue to copyright
set sigField's stringValue to signature
--display dialog ( file_ext as string)
set countLabelField's stringValue to ((thisFile_name as string) & "." & file_ext as string) & " -|- " & (thisImage & " of " & (count of imageListSplit) as string)
end setUpTextFieldsStrings
on writeFile:sender
set {posix_path, file_path, file_name, file_ext} to splitPath((item thisImage of imageListSplit), sender)
set meta_path to file_path & file_name & ".meta"
---display dialog meta_path
set overWriteState to ""
set overWriteState to checkBoxOverWriteBtn's state
set alreadyExists to false
set alreadyExists to NSFileManager's fileExistsAtPath:meta_path
if alreadyExists then
if not overWriteState then
set success to (file_name as string) & ".meta " & return & return & "Already exists in this location" & return & "It was not Overwritten"
feedBacklField's setStringValue:(success as string)
return
end if
end if
set alt_text to altField's stringValue
set copyrightText to copyrightField's stringValue
set signatureText to sigField's stringValue
set meta_text to "alt " & alt_text & return & "copyright " & copyrightText & return & "signature " & signatureText
set writeString to current application's NSString's stringWithString:meta_text
set stringEncoding to 4
--set success to writeString's writeToFile:(POSIX path of meta_path) atomically:true encoding:stringEncoding |error|:(missing value)
set theData to writeString's dataUsingEncoding:stringEncoding
--SETTING THE TYPECODE AS (unsigned long = 1413830740 )plain text allows QuickLook to read the file and TextEdit.app open it as default
set theAttributes to current application's NSDictionary's dictionaryWithDictionary:{NSFileHFSTypeCode:1.41383074E+9}
set success to NSFileManager's createFileAtPath:(POSIX path of meta_path) |contents|:theData attributes:theAttributes
if success then
if alreadyExists then
set writenOut to "Already exists and was Overwritten"
else
set writenOut to "Was written to file"
end if
set success to (file_name as string) & ".meta " & return & return & writenOut
else
set success to "Error: " & (file_name as string) & ".meta " & return & return & "Was not written to file"
end if
feedBacklField's setStringValue:(success as string)
--end tell
end writeFile:
on finderSelection:sender
set the_selection to {}
set imageList to {}
set imageListSplit to {}
set imageCount to 0
set thisImage to 0
using terms from application "Finder"
set the_selection to (choose file with prompt "Please select images:" with multiple selections allowed without invisibles)
end using terms from
repeat with i from 1 to number of items in the_selection
set this_item to (POSIX path of (item i of the_selection as alias))
set workSpace to current application's NSWorkspace's sharedWorkspace
set type to (workSpace's typeOfFile:this_item |error|:(missing value))
--Check_types
repeat with ii from 1 to number of items in file_types
set this_type to item ii of file_types
if (workSpace's type:type conformsToType:this_type) then
set end of imageListSplit to item i of the_selection
if this_type is "public.mpeg-4" then
tell application "System Events" to set save_path to POSIX path of (temporary items folder)
do shell script ("/usr/bin/qlmanage -t -s640 " & quoted form of this_item & space & " -o " & quoted form of save_path)
set theSender to (current application's NSString's stringWithString:("videoFile" as string))
set {movieFileName} to splitPath((item i of the_selection), theSender)
set end of imageList to (current application's NSImage's alloc()'s initWithContentsOfFile:(save_path & "/" & movieFileName & ".png" as string))
else
set end of imageList to (current application's NSImage's alloc()'s initWithContentsOfFile:this_item)
end if
exit repeat
end if
end repeat
end repeat
if imageList is not {} then
set imageCount to count of imageList
theImageView's setImage:(item 1 of imageList)
set thisImage to 1
my setUpTextFieldsStrings()
end if
end finderSelection:
on terminateMe()
tell me to quit
end terminateMe
on splitPath(selected_item, sender)
set file_ext to ""
set file_name to ""
set posix_path to ""
set posix_path to POSIX path of (selected_item as alias)
set posix_path to current application's NSString's stringWithString:(posix_path as string)
set file_path to ((posix_path's stringByDeletingLastPathComponent) as string) & "/"
set file_name to posix_path's lastPathComponent
set file_ext to file_name's pathExtension
set file_name to file_name's stringByDeletingPathExtension
if (sender's className as string) is "NSButton" then
return {posix_path, file_path, file_name, file_ext}
else if ((sender as string) is "setuptFields") then
return {file_name, file_ext}
else if ((sender as string) is "videoFile") then
return {posix_path's lastPathComponent}
end if
end splitPath