gonzopi

git clone https://git.tarina.org/gonzopi
Log | Files | Refs | README | LICENSE

commit b11f4d1df6ec6fe7ac665944f28d33c1c5fcb670
parent e7aacbe03a669f084a5a1388730b4ba5c303b6d3
Author: rbckman <rob@tarina.org>
Date:   Tue, 14 Oct 2025 15:27:22 +0100

faststart check done right

Diffstat:
Mgonzopi.py | 55+++++++++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 53 insertions(+), 2 deletions(-)

diff --git a/gonzopi.py b/gonzopi.py @@ -952,6 +952,8 @@ def main(): except: pass os.system('cp ' + yanked + '.mp4 ' + paste + '.mp4') + os.system('cp ' + yanked + '.info ' + paste + '.info') + os.system('cp ' + yanked + '.nofaststart ' + paste + '.nofaststart') os.system('cp ' + yanked + '.jpeg ' + paste + '.jpeg') os.system('cp ' + yanked + '.h264 ' + paste + '.h264') os.system('cp ' + yanked + '.wav ' + paste + '.wav') @@ -1696,6 +1698,8 @@ def main(): except: db = correct_database(filmname,filmfolder,db) db.update('videos', where='filename="'+filmfolder+'.videos/'+video_origins+'.mp4"', soundlag=soundlag, videolength=float(time.time() - starttime), faststart=False) + with open(foldername+filename+'.nofaststart', 'w') as f: + f.write(str(int((time.time() - starttime)*1000))) #time.sleep(0.005) #get audio at least 0.1 longer #camera.capture(foldername + filename + '.jpeg', resize=(800,341)) #if slidecommander: @@ -4316,6 +4320,7 @@ def remove(filmfolder, filmname, scene, shot, take, sceneshotortake): if sceneshotortake == 'take': os.system('rm ' + foldername + filename + '.h264') os.system('rm ' + foldername + filename + '.mp4') + os.system('rm ' + foldername + filename + '.info') os.system('rm ' + foldername + filename + '.wav') os.system('rm ' + foldername + filename + '.jpeg') os.system('rm ' + foldername + filename + '_thumb.jpeg') @@ -4351,6 +4356,7 @@ def remove(filmfolder, filmname, scene, shot, take, sceneshotortake): if sceneshotortake == 'take': os.system('rm ' + foldername + filename + '.h264') os.system('rm ' + foldername + filename + '.mp4') + os.system('rm ' + foldername + filename + '.info') os.system('rm ' + foldername + filename + '.wav') os.system('rm ' + foldername + filename + '.jpeg') os.system('rm ' + foldername + filename + '_thumb.jpeg') @@ -4390,11 +4396,13 @@ def remove(filmfolder, filmname, scene, shot, take, sceneshotortake): os.makedirs(onthefloor) os.system('cp ' + foldername + filename + '.h264 ' + onthefloor + '') os.system('cp ' + foldername + filename + '.mp4 ' + onthefloor + '') + os.system('cp ' + foldername + filename + '.info ' + onthefloor + '') os.system('cp ' + foldername + filename + '.wav ' + onthefloor + '') os.system('cp ' + foldername + filename + '.jpeg ' + onthefloor + '') os.system('cp ' + foldername + filename + '_thumb.jpeg ' + onthefloor + '') os.system('rm ' + foldername + filename + '.h264 ') os.system('rm ' + foldername + filename + '.mp4 ') + os.system('rm ' + foldername + filename + '.info ') os.system('rm ' + foldername + filename + '.wav ') os.system('rm ' + foldername + filename + '.jpeg ') os.system('rm ' + foldername + filename + '_thumb.jpeg ') @@ -4575,6 +4583,7 @@ def organize(filmfolder, filmname): mv = 'mv ' + filmfolder + filmname + '/' + i + '/' + p + '/take' + str(unorganized_nr).zfill(3) run_command(mv + '.mp4 ' + filmfolder + filmname + '/' + i + '/' + p + '/take' + str(organized_nr).zfill(3) + '.mp4') run_command(mv + '.info ' + filmfolder + filmname + '/' + i + '/' + p + '/take' + str(organized_nr).zfill(3) + '.info') + run_command(mv + '.nofaststart ' + filmfolder + filmname + '/' + i + '/' + p + '/take' + str(organized_nr).zfill(3) + '.nofaststart') run_command(mv + '.h264 ' + filmfolder + filmname + '/' + i + '/' + p + '/take' + str(organized_nr).zfill(3) + '.h264') run_command(mv + '.wav ' + filmfolder + filmname + '/' + i + '/' + p + '/take' + str(organized_nr).zfill(3) + '.wav') run_command(mv + '.jpeg ' + filmfolder + filmname + '/' + i + '/' + p + '/take' + str(organized_nr).zfill(3) + '.jpeg') @@ -4828,6 +4837,14 @@ def is_audio_stereo(file_path): def get_video_length_str(filepath): video_origins = (os.path.realpath(filepath)) try: + if os.path.isfile(filepath[:-3]+'nofaststart') == True: + with open(filepath[:-3]+'nofaststart', 'r') as f: + duration_ms = f.readline().strip() + print('duration in ms: ' + str(duration_ms)) + return str(datetime.timedelta(seconds=round(int(duration_ms)/1000))) + except: + pass + try: if os.path.isfile(filepath[:-3]+'info') == True: with open(filepath[:-3]+'info', 'r') as f: duration_ms = f.readline().strip() @@ -5180,7 +5197,40 @@ def fastedit(filmfolder, filmname, filmfiles, scene): #print('writing shot lengths for fastedit mode') #with open(scenedir + '.fastedit', 'a') as f: # f.write(str(totlength)+'\n') + + +def check_faststart(file_path): + try: + # Load the media file + media_info = MediaInfo.parse(file_path) + + # Check if the file is MP4 + for track in media_info.tracks: + if track.track_type == "General": + if track.format.lower() not in ["mpeg-4", "mp4"]: + print(f"Error: '{file_path}' is not an MP4 file.") + # Check for IsStreamable field + is_streamable = track.to_data().get("is_streamable", "").lower() + if is_streamable == "yes": + print(f"Faststart is enabled for '{file_path}' (IsStreamable: Yes).") + elif is_streamable == "no": + print(f"Faststart is NOT enabled for '{file_path}' (IsStreamable: No).") + + # Fallback: Check MOOV atom position (if IsStreamable is not explicitly set) + # MediaInfo doesn't always provide direct MOOV position, so we infer from file structure + if "moov" in track.to_data().get("other_file_format", "").lower(): + print(f"Faststart is likely enabled for '{file_path}' (MOOV atom detected).") + return True + else: + print(f"Faststart is NOT enabled for '{file_path}' (MOOV atom not at start).") + return False + return + + print(f"Error: No general track found in '{file_path}'.") + except Exception as e: + print(f"Error analyzing '{file_path}': {str(e)}") + #-------------Get scene files-------------- @@ -5228,7 +5278,8 @@ def rendershot(filmfolder, filmname, renderfilename, scene, shot): time.sleep(3) pass #if faststart == False: - if os.path.isfile(renderfilename+'.info') == False: + if check_faststart(renderfilename+'.mp4') == False: + #if os.path.isfile(renderfilename+'.nofaststart') == True: tmp=filmfolder+'.tmp/'+filmname+'_'+str(scene).zfill(3)+'_'+str(shot).zfill(3)+'.mp4' vumetermessage('found new clip compiling...') #os.system('mv ' + video_origins + '.mp4 ' + video_origins + '_tmp.mp4') @@ -5241,9 +5292,9 @@ def rendershot(filmfolder, filmname, renderfilename, scene, shot): db = correct_database(filmname,filmfolder,db) db.update('videos', where='filename="'+video_origins+'.mp4"', faststart=True) compileshot(renderfilename,filmfolder,filmname) + run_command('rm '+renderfilename+'.nofaststart') audiohash = str(int(countsize(renderfilename + '.wav'))) videolength = get_video_length(video_origins+'.mp4') - with open(scenedir + '.audiohash', 'w') as f: f.write(audiohash) if os.path.isfile(renderfilename + '.mp4') == True: