# grab single 360p frames at given stream offsets via yt-dlp 2-second section downloads; clips deleted after frame extraction (local analysis only, nothing redistributed) import subprocess,sys,os,glob Y='/workspace/yt-venv/bin/yt-dlp' def hms(s): s=int(s); return f'{s//3600}:{s%3600//60:02d}:{s%60:02d}' def grab(vid,secs): os.makedirs(f'frames/{vid}',exist_ok=True); os.makedirs('data/video/tmp',exist_ok=True); need=[s for s in secs if not os.path.exists(f'frames/{vid}/{int(s):05d}.png')] if need: args=[Y,'-q','--no-warnings','-f','134/bv*[height<=360][ext=mp4]','-o',f'data/video/tmp/{vid}_%(section_start)s.%(ext)s'] for s in need: args+=['--download-sections',f'*{hms(s)}-{hms(s+2)}'] r=subprocess.run(args+[f'https://www.youtube.com/watch?v={vid}'],capture_output=True,text=True) if r.returncode: print('ERR',r.stderr[-300:]) for s in need: c=glob.glob(f'data/video/tmp/{vid}_{int(s)}*.mp4') if c: subprocess.run(['ffmpeg','-loglevel','error','-y','-i',c[0],'-frames:v','1',f'frames/{vid}/{int(s):05d}.png']); os.remove(c[0]) return [f'frames/{vid}/{int(s):05d}.png' for s in secs if os.path.exists(f'frames/{vid}/{int(s):05d}.png')] if __name__=='__main__': print(grab(sys.argv[1],[float(x) for x in sys.argv[2:]]))