From c5a4d36a76dd2fd7c11fdb755404e78935eed3e5 Mon Sep 17 00:00:00 2001 From: themixray <35273590+themixray@users.noreply.github.com> Date: Wed, 8 Dec 2021 12:19:54 +0300 Subject: [PATCH] Add files via upload --- build/lib/pygwin/record.py | 107 ++++++++++++++++++++++++++++++++++ dist/pgw-0.0.4-py3.7.egg | Bin 0 -> 45162 bytes setup.cfg | 2 +- setup.py | 8 ++- src/pgw.egg-info/PKG-INFO | 31 +++++----- src/pgw.egg-info/SOURCES.txt | 1 + src/pgw.egg-info/requires.txt | 4 ++ src/pygwin/record.py | 107 ++++++++++++++++++++++++++++++++++ 8 files changed, 239 insertions(+), 21 deletions(-) create mode 100644 build/lib/pygwin/record.py create mode 100644 dist/pgw-0.0.4-py3.7.egg create mode 100644 src/pygwin/record.py diff --git a/build/lib/pygwin/record.py b/build/lib/pygwin/record.py new file mode 100644 index 0000000..c2c2d0f --- /dev/null +++ b/build/lib/pygwin/record.py @@ -0,0 +1,107 @@ +from contextlib import contextmanager +from pygwin._pg import pg as _pg +import moviepy.editor as mpe +from array import array +from PIL import Image +import numpy as np +import threading +import pyautogui +import tempfile +import pyaudio +import wave +import time +import sys +import cv2 +import os + +class record: + def __init__(self,win,audio=False): + self._isaudio = audio + self._surface = win + self.reset() + def reset(self): + self._run = False + self._fpss = [] + self._frames = [] + self._codec = cv2.VideoWriter_fourcc(*"mp4v") + if self._isaudio: + self._apy = pyaudio.PyAudio() + self._aframs = [] + self._astrm = self.apy.open(format=pyaudio.paInt16,channels=1, + rate=44100,input=True,frames_per_buffer=1024) + def start(self,newThread=True): + self._run = True + if self._isaudio: + def audiot(self): + while self._run: + self._aframs.append(self.astrm.read(1024)) + self._athread = threading.Thread(target=lambda:audiot(self)) + self._athread.start() + def main(self): + while self.run: + self._record() + if newThread: + self._thread = threading.Thread(target=lambda:main(self)) + self._thread.start() + else:main() + def _record(self): + if self._run: + try: + self._frames.append(self._surface) + self._fpss.append(self._surface.rawFps) + except: + pass + def render(self, path): + temp = tempfile.gettempdir() + if self.isaudio: + wavpath = os.path.join(temp, 'audio.wav') + wavfile = wave.open(wavpath, 'wb') + wavfile.setnchannels(1) + wavfile.setsampwidth(self._apy.get_sample_size(pyaudio.paInt16)) + wavfile.setframerate(44100) + af = [] + for i in self._aframs: + af.append(array('h',i)) + wavfile.writeframes(b''.join(af)) + wavfile.close() + + fps = 0 + for i in self._fpss: + fps += i + fps = fps/len(self._fpss) + if self._isaudio: + noaudiopath = os.path.join(temp, 'noaudio.mp4') + else: + noaudiopath = path + out = cv2.VideoWriter(noaudiopath,self._codec, + fps,self._surface.size) + for i in self._frames: + frame = np.array(_pg.surfarray.array3d(i).swapaxes(0,1)) + frame = cv2.cvtColor(frame,cv2.COLOR_BGR2RGB) + out.write(frame) + out.release() + + if self._isaudio: + videoclip = mpe.VideoFileClip(noaudiopath) + audioclip = mpe.AudioFileClip(wavpath) + new_audioclip = mpe.CompositeAudioClip([audioclip]) + videoclip.audio = new_audioclip + @contextmanager + def ss(): + with open(os.devnull, "w") as devnull: + oso = sys.stdout + sys.stdout = devnull + try:yield + finally:sys.stdout=oso + with ss(): + videoclip.write_videofile(path) + os.remove(noaudiopath) + os.remove(wavpath) + def stop(self): + self._run = False + try: + self._thread.join() + except: + pass + if self._isaudio: + self._athread.join() diff --git a/dist/pgw-0.0.4-py3.7.egg b/dist/pgw-0.0.4-py3.7.egg new file mode 100644 index 0000000000000000000000000000000000000000..3b0747f9ea6106124c37e006347322fbf8ed86ed GIT binary patch literal 45162 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 b4+x;WS!o3?@6jZjn8eL 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
Hr!z1xfKKm6O)4hhaLw=oq)^=s z(tp9z!EPfH14AAUy5+wS`g1cYQj5?mpED&XST2Ndrw}6p11OuKM%Ya$xaGOv11C^z zKA6xE?9SQt-in2R;SDbXg8($9LDaTJ2^qL%=wSe;y7iW31xtUnQQ&4|U}$4TkFN#= zWZflb&i0K;37*!!%SVfafgws1J-)Up!u7(oN1MRxj9xi%!QU4$tagiqMOTxc3mIB+|}0D&BeI958cSsXxGajjP$d` zZX~Fj!S77;n=cS%vU_4R6H@-*H&h4hDhPz3-d=Q;5sd612s! z=y?@=11iGI8zorHgq64Wor=B#17WOQ9adw(2=e)l7_)!2#Z^Y#?14 P3>pkU+zbp%OF=vUtyL-` literal 0 HcmV?d00001 diff --git a/setup.cfg b/setup.cfg index a9d2be4..ad78919 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = pgw -version = 0.0.3 +version = 0.0.4 author = themixray author_email = simindeymo@gmail.com description = Python Grapchical Window. diff --git a/setup.py b/setup.py index 468f619..57517ec 100644 --- a/setup.py +++ b/setup.py @@ -1,6 +1,8 @@ from setuptools import setup -setup(name='pgw',packages=['pygwin'],version='0.0.3',author='themixray', +setup(name='pgw',packages=['pygwin'],version='0.0.4',author='themixray', description='A library for creating Python applications.', - license='MIT',install_requires=['cython','pywin32','pygame', - 'inputs','pydub','wxPython','pyautogui']) + license='MIT',install_requires= + ['cython','pywin32','pygame','inputs', + 'pydub','wxPython','pyautogui','moviepy', + 'pipwin','wave','opencv-python']) diff --git a/src/pgw.egg-info/PKG-INFO b/src/pgw.egg-info/PKG-INFO index 63827af..84468b7 100644 --- a/src/pgw.egg-info/PKG-INFO +++ b/src/pgw.egg-info/PKG-INFO @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: pgw -Version: 0.0.3 +Version: 0.0.4 Summary: A library for creating Python applications. Home-page: https://github.com/themixray/pygwin Author: themixray @@ -8,24 +8,21 @@ Author-email: simindeymo@gmail.com License: MIT Project-URL: Bug Tracker, https://github.com/themixray/pygwin/issues Project-URL: Wiki, https://github.com/themixray/pygwin/wiki +Description:

+ PyGWin +

+

+ A library for creating Python applications. +

+ +

+ + Documentation + +

+ Platform: UNKNOWN Classifier: Programming Language :: Python :: 3 Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Description-Content-Type: text/markdown -License-File: LICENSE - -

- PyGWin -

-

- A library for creating Python applications. -

- -

- - Documentation - -

- - diff --git a/src/pgw.egg-info/SOURCES.txt b/src/pgw.egg-info/SOURCES.txt index 9fa79f3..86abac0 100644 --- a/src/pgw.egg-info/SOURCES.txt +++ b/src/pgw.egg-info/SOURCES.txt @@ -18,6 +18,7 @@ src/pygwin/image.py src/pygwin/keyboard.py src/pygwin/mixer.py src/pygwin/mouse.py +src/pygwin/record.py src/pygwin/rect.py src/pygwin/surface.py src/pygwin/tray.py diff --git a/src/pgw.egg-info/requires.txt b/src/pgw.egg-info/requires.txt index 569ce2e..a13bd06 100644 --- a/src/pgw.egg-info/requires.txt +++ b/src/pgw.egg-info/requires.txt @@ -5,3 +5,7 @@ inputs pydub wxPython pyautogui +moviepy +pipwin +wave +opencv-python diff --git a/src/pygwin/record.py b/src/pygwin/record.py new file mode 100644 index 0000000..c2c2d0f --- /dev/null +++ b/src/pygwin/record.py @@ -0,0 +1,107 @@ +from contextlib import contextmanager +from pygwin._pg import pg as _pg +import moviepy.editor as mpe +from array import array +from PIL import Image +import numpy as np +import threading +import pyautogui +import tempfile +import pyaudio +import wave +import time +import sys +import cv2 +import os + +class record: + def __init__(self,win,audio=False): + self._isaudio = audio + self._surface = win + self.reset() + def reset(self): + self._run = False + self._fpss = [] + self._frames = [] + self._codec = cv2.VideoWriter_fourcc(*"mp4v") + if self._isaudio: + self._apy = pyaudio.PyAudio() + self._aframs = [] + self._astrm = self.apy.open(format=pyaudio.paInt16,channels=1, + rate=44100,input=True,frames_per_buffer=1024) + def start(self,newThread=True): + self._run = True + if self._isaudio: + def audiot(self): + while self._run: + self._aframs.append(self.astrm.read(1024)) + self._athread = threading.Thread(target=lambda:audiot(self)) + self._athread.start() + def main(self): + while self.run: + self._record() + if newThread: + self._thread = threading.Thread(target=lambda:main(self)) + self._thread.start() + else:main() + def _record(self): + if self._run: + try: + self._frames.append(self._surface) + self._fpss.append(self._surface.rawFps) + except: + pass + def render(self, path): + temp = tempfile.gettempdir() + if self.isaudio: + wavpath = os.path.join(temp, 'audio.wav') + wavfile = wave.open(wavpath, 'wb') + wavfile.setnchannels(1) + wavfile.setsampwidth(self._apy.get_sample_size(pyaudio.paInt16)) + wavfile.setframerate(44100) + af = [] + for i in self._aframs: + af.append(array('h',i)) + wavfile.writeframes(b''.join(af)) + wavfile.close() + + fps = 0 + for i in self._fpss: + fps += i + fps = fps/len(self._fpss) + if self._isaudio: + noaudiopath = os.path.join(temp, 'noaudio.mp4') + else: + noaudiopath = path + out = cv2.VideoWriter(noaudiopath,self._codec, + fps,self._surface.size) + for i in self._frames: + frame = np.array(_pg.surfarray.array3d(i).swapaxes(0,1)) + frame = cv2.cvtColor(frame,cv2.COLOR_BGR2RGB) + out.write(frame) + out.release() + + if self._isaudio: + videoclip = mpe.VideoFileClip(noaudiopath) + audioclip = mpe.AudioFileClip(wavpath) + new_audioclip = mpe.CompositeAudioClip([audioclip]) + videoclip.audio = new_audioclip + @contextmanager + def ss(): + with open(os.devnull, "w") as devnull: + oso = sys.stdout + sys.stdout = devnull + try:yield + finally:sys.stdout=oso + with ss(): + videoclip.write_videofile(path) + os.remove(noaudiopath) + os.remove(wavpath) + def stop(self): + self._run = False + try: + self._thread.join() + except: + pass + if self._isaudio: + self._athread.join()