Re-instate 'finish' event

Ensures a "buffer" is valid before using getDuration() in order to check for proper time to fire "finish"
Adds flag to ensure 'finish' only fires once.