trial and error

It’s not trial and error, it’s trial and observation. Error implies a failure, but the only failure is when truly nothing is gained. An error, in this way, is when the unexpected happens as a result of the trial, but nothing is learned. If nothing was learned, the trial would never change. Or if it did, the change would be random, directionless. Observation, however, of an unexpected result, is learning. It affords educated change. It provides the direction necessary for further learning, discovery and development. Observation precedes evolution.

I guess I’m learning Python

I just wrote the first script I’ve written in years and it works beautifully. It’s very dirty, and I’m sure I’ll rewrite it to be more robust, but for now it gets the job done. The job, so to speak, is relatively simple. Take a large single audiobook file and break it up into smaller, regular tracks. Using python, ffprobe, ffmpeg and very liberal use of google, I got it done in just few hours total time. But this is starting pretty much from scratch. I couldn’t remember how to start a python script. It’s amazing what one is able to remember when the need arises. I seemingly intuitively knew to use str() and float() to correct a concat error? That one surprised me. Anyway, here it is in all it’s glory.


#!/usr/bin/python

## this is a very quick and dirty file splitter
## i think this only works for non-chapter .m4b
## quicksplit.py author title filename

import sys
import subprocess
import os

author = sys.argv[1]
title = sys.argv[2]
filename = sys.argv[3]

start = 0
end = 0
track = 1
segment = 1800 # time in seconds

probe_command = "ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 '" + filename + "'"

print("Audiobook " + title + " written by " + author)

## get the total duration of the file and convert to float
duration = float(subprocess.check_output(probe_command, shell=True))

while start < duration : end = start + segment ## get a new endpoint by adding the segment length if end > duration : ## check of we've iterated past the actual duration
end = duration
print("Break from " + str(start) + " to " + str(end) + " until " + str(duration))
split_command = "ffmpeg -i '" + filename + "' -ss " + str(start) + " -to " + str(end) + " -acodec copy '" + author + " - " + title + " - " + str(track) + ".mp4' #print(split_command)
subprocess.call(split_command, shell=True)
start = end ## iterate start to where we left off
track = track + 1