commit e7ba83f0e14dab1fcfde99b3742a4bc4dd70fbfb Author: beaconborn Date: Mon Feb 14 21:49:37 2022 +0300 init diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..dd4c951 --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..579447a --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/prepare.py b/prepare.py new file mode 100644 index 0000000..52633ce --- /dev/null +++ b/prepare.py @@ -0,0 +1,105 @@ +#!/usr/bin/python3 +import argparse +import random +from argparse import ArgumentParser +from os import makedirs, path +from pathlib import Path + +from moviepy.editor import * +from moviepy.video.io.ffmpeg_tools import ffmpeg_extract_subclip +from pymediainfo import MediaInfo + + +class Args: + parser: ArgumentParser = argparse.ArgumentParser( + description='Extracting mediainfo, sample and screens from random timecodes from video') + parser.add_argument('-s', action='store_true', dest='screens', help="create screenshos") + parser.add_argument('-c', action='store_true', dest='sample', help="extract sample") + parser.add_argument('-m', action='store_true', dest='mediainfo', help='create mediainfo') + parser.add_argument('-n', action='store', dest="count", default=10, + help="number of screenschots, default 10", type=int) + parser.add_argument('-i', action='store', dest='input', help="input file", required=True) + args = parser.parse_args() + + +def sample(fold, exname, max_time): + """ + Create sample with duration 2m if file longer then 6m + """ + + print("sample") + sam = fold + "/sample" + exname + if max_time <= 360: + ffmpeg_extract_subclip(Args.args.input, max_time / 3, max_time * 2 / 3, targetname=sam) + else: + ffmpeg_extract_subclip(Args.args.input, max_time / 2 - 60, max_time / 2 + 60, targetname=sam) + + +def info(mfile, media_info): + print("Creating MediaInfo") + # print(media_info) + f = open(mfile, "w") + f.write(str(media_info)) + f.close() + + +def screens(fold, max_time): + + print("Creating %s screenschots" % Args.args.count) + i = 0 + max_time = round(max_time) + print("Rounded duration %ss" % max_time) + screen_create = VideoFileClip(Args.args.input) + mintimescr = round(max_time * 0.05) + maxtimescr = round(max_time * 0.95) + + while i < Args.args.count: + i += 1 + time = random.randint(mintimescr, maxtimescr) + imgname = fold + "/" + str(time) + ".png" + print("%s at time %ds" % (i, time)) + screen_create.save_frame(imgname, t=time) + + screen_create.reader.close() + screen_create.audio.reader.close_proc() + + +class Head: + """ + Creates mediainfo, screenshots and sample from file + """ + + def __init__(self): + bname: str + + bname = path.basename(Args.args.input) + fname = path.splitext(bname)[0] + exname = path.splitext(bname)[1] + print("Filename is %s" % bname) + fold = str(Path.home()) + "/samples/" + fname + if path.isdir(fold): + print("Directory %s is exist" % fold) + else: + try: + makedirs(fold) + except OSError: + print("Creation of the directory %s failed" % fold) + else: + print("Successfully created the directory %s " % fold) + print("\nFiles will be located at %s" % fold) + media_info = MediaInfo.parse(Args.args.input, output="", parse_speed=2) + mi = MediaInfo.parse(Args.args.input) + mfile = fold + "/mediainfo.txt" + duration = mi.tracks[0] + max_time = duration.duration / 1000 + + if Args.args.sample: + sample(fold, exname, max_time) + if Args.args.screens: + screens(fold, max_time) + if Args.args.mediainfo: + info(mfile, media_info) + + +if __name__ == '__main__': + Head() diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..ad72bc3 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +setuptools +moviepy +pymediainfo \ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..8f76fff --- /dev/null +++ b/setup.py @@ -0,0 +1,24 @@ +from setuptools import setup + +try: + import multiprocessing +except: + pass + +install_requires = [ + 'setuptools', + 'moviepy', + 'pymediainfo', +] + +setup( + name='prepare', + version='0.1.1', + url='', + zip_safe=True, + install_requires=install_requires, + include_package_data=True, + author='beaconborn', + author_email='rik.slava@mail.com', + description='Creating screens, Media Info and sample from script' +)