media/app/videokeyframe.py
2025-06-24 11:45:33 +08:00

62 lines
1.8 KiB
Python

import asyncio
import os, sys
import argparse
import json
from sqlor.dbpools import DBPools
from appPublic.jsonConfig import getConfig
from appPublic.log import debug
from appPublic.dictObject import DictObject
from appPublic.timeUtils import curDateString, timestampstr
from appPublic.uniqueID import getID
from appPublic.folderUtils import listFile, _mkdir
from ahserver.filestorage import FileStorage
import av
def get_1st_keyframe(mloc, loctype, userid):
# Open the video file
fs = FileStorage()
if loctype == '0': # webpath
mloc1 = fs.realPath(mloc)
debug(f'{mloc=}, {mloc1=}')
mloc = mloc1
container = av.open(mloc)
# Iterate through the video to find the first key frame
kcnt = 0
for frame in container.decode(video=0):
if frame.key_frame:
kcnt += 1
if kcnt > 10:
# Save the key frame as an image
name = os.path.basename(mloc).split('.')[0] + '.jpg'
fn = fs._name2path(name, userid=userid)
webpath = fs.webpath(fn)
_mkdir(os.path.dirname(fn))
frame.to_image().save(fn)
return webpath
async def gen_video_keyframe():
db = DBPools()
async with db.sqlorContext('mediadb') as sor:
sql = "select * from media where mtype = 'video' and logo_url is null and mloctype in ('0', '1')"
recs = await sor.sqlExe(sql, {})
for r in recs:
wp = get_1st_keyframe(r.mlocation, r.mloctype, r.ownerid)
ns = {'id':r.id, 'logo_url':wp}
await sor.U('media', ns)
async def main():
parser = argparse.ArgumentParser(prog=sys.argv[0])
parser.add_argument('-w', '--workdir')
args = parser.parse_args()
workdir = args.workdir or os.getcwd()
config = getConfig(workdir, {'workdir':workdir})
DBPools(config.databases)
await gen_video_keyframe()
if __name__ == '__main__':
loop = asyncio.new_event_loop()
loop.run_until_complete(main())