import sqlite3,json,os
K='/opt/struktur/youtube-research/knowledge.db'; CE='/opt/struktur/content-extraction/data/content_extraction.db'
ids=[54,65,68,71,78,80,90,97,100,102,117,119,128,134,140,195,196,251,256,258,293,299,300,301,307,311,319]
for label,path in [('K',K),('CE',CE)]:
c=sqlite3.connect('file:'+path+'?mode=ro',uri=True); c.row_factory=sqlite3.Row
print('DB',label)
if label=='K':
for vid in ids:
out={'video_id':vid}
for t in ['chapters','video_links','e2e_jobs','e2e_extractions','transcript_segments','processing_runs','graphiti_import_queue']:
try:
cs=[r[1] for r in c.execute('pragma table_info('+t+')')]
col='video_id' if 'video_id' in cs else None
if col:
n=c.execute('select count(*) from '+t+' where video_id=?',(vid,)).fetchone()[0]
if n: out[t]=n
except: pass
print(json.dumps(out))
else:
for vid in ids:
out={'source_video_id':vid}
for t in ['ce_sources','ce_items']:
cs=[r[1] for r in c.execute('pragma table_info('+t+')')]
if 'source_video_id' in cs:
rs=c.execute('select id,youtube_id,title,youtube_url,transcript_status,obsidian_artifact_path,source_snapshot_hash,transcript_hash,content_hash from ce_sources where source_video_id=?',(vid,)).fetchall()
if rs: out['ce_sources']=[{k:(str(x[k])[:180] if isinstance(x[k],str) else x[k]) for k in x.keys()} for x in rs]
print(json.dumps(out,ensure_ascii=False))
c.close()
# source/registry exact numeric lookup
c=sqlite3.connect('file:'+K+'?mode=ro',uri=True); c.row_factory=sqlite3.Row
for t in ['source_processing_registry','source_versions','reconciliation_decisions','graphiti_import_queue']:
print('TABLE',t)
cs=[r[1] for r in c.execute('pragma table_info('+t+')')]
for col in ['source_id','source_identity','video_id','youtube_id']:
if col in cs:
vals=[]
for vid in ids:
try:
rs=c.execute('select count(*) from '+t+' where "'+col+'"=?',(str(vid),)).fetchone()[0]
if rs: vals.append([vid,rs])
except: pass
if vals: print(col,vals)
c.close()