Videos Courses - Calculate Total Duration
/I record a ton of videos on iPhone app programming, and I didn't have a good way to get the total time for a course from a set of videos.
I previously used VLC, but that gets out of hand when you have 30+ videos to manually calculate total duration.
I wrote a script in Python, since the mdls command didn't seem to work in Swift. Maybe next time it'll be Swift.
Run this code in Terminal and it'll calculate the lengths of all the .mp4 videos and output them to the console. It doesn't work with other video types, but you can grab the code and tweak it. I export all my videos with handbrake (normal settings), which gives me .mp4 video files that are small.
As of now, I have 101 videos from the first 14 days of my Swift iPhone programming course. Using this script I have a total of 12 hours 32 minutes of content.
- Preview the Swift iOS 8 course here.
- Download the Python code file: VideoDurationCalculator.py
Run the code
Open Terminal on Mac using Spotlight (Command + Spacebar) > type Terminal > Press enter
python VideoDurationCalculator.py /path/to/your/video/folder
Example:
python VideoDurationCalculator.py /Users/Shared/Course\ Videos/1\ -\ Swift\ in\ 31\ Days/Swift1\ -\ Export\ 1080
VideoDurationCalculator.py
import os
import commands
import sys
# Paul Solt - get the length of all videos within a folder (recursive)
#
# Depending on the number of files/folders, it can take time to complete
#(100 files ~2.018 seconds to run)
# Set your video folder path here
defaultPath = "/Users/Shared/Course Videos/1 - Swift in 31 Days/Swift1 - Handbrake 1080"
def main():
path = defaultPath
if len(sys.argv) == 2:
path = sys.argv[1]
else:
print "Notice: Using default path:", defaultPath, "\n"
#test path
if os.path.exists(path):
# Grab all the video (.mp4) files recursively for a folder
filenames = []
for root, dirs, files in os.walk(path):
for file in files:
if file.endswith(".mp4"):
filenames.append(os.path.join(root, file))
#Calculate the total time of all videos in folder
totalTimeInSeconds = 0
print "Calculating video lengths..."
for file in filenames:
# Calculate total time
lengthInSeconds = videoLength(file)
totalTimeInSeconds += lengthInSeconds
hours = int(totalTimeInSeconds / 3600)
minutes = int((totalTimeInSeconds - (hours * 3600)) / 60)
print "hours:", hours, "Minutes:", minutes
else:
print "Error: No folder found with path:", path
# Parse the plist format from mdls command on Terminal
# @return the time in seconds
# mdls -plist - filename.mp4
def videoLength(filename):
myCommand = "mdls -plist - "
myCommand = myCommand + "\"" + filename + "\""
status, plistInput = commands.getstatusoutput(myCommand)
videoLength = 0
searchTerm = "<key data-preserve-html-node="true">kMDItemDurationSeconds</key>"
# 1. find "<key data-preserve-html-node="true">kMDItemDurationSeconds</key>"
# 2. grab text until next </real>
realStart = "<real data-preserve-html-node="true">"
realEnd = "</real>"
index = plistInput.find(searchTerm)
# Offset by length of search term
startIndex = index + len(searchTerm)
# Calculate new start/end positions
startIndex = plistInput.find(realStart, startIndex)
endIndex = plistInput.find(realEnd, startIndex)
#offset start by length of realStart text
startIndex += len(realStart)
if startIndex != -1 and endIndex != -1:
#Split and parse as number
numberString = plistInput[startIndex:endIndex]
numberString = numberString.strip()
videoLength = float(numberString)
else:
print
return videoLength
# Run the main method
main()
Connect
- Do you have a better approach?
- Subscribe to my mailing list and get a free Swift video course.
- I'm teaching an online Swift iPhone app course.