Mercurial > hg > pub > prymula > scripts
diff verysimpleslideshow/verysimpleslideshow.py @ 0:dcd610585610
INIT
author | prymula <prymula76@outlook.com> |
---|---|
date | Thu, 21 Sep 2023 22:32:14 +0200 |
parents | |
children | 82b75cc1e524 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/verysimpleslideshow/verysimpleslideshow.py Thu Sep 21 22:32:14 2023 +0200 @@ -0,0 +1,288 @@ +#!/usr/bin/env python3 +# Very Simple Slide Show +# autor: Prymula (PRP) +# licencja: Public Domain +# data 02-09-2023 +# edytor: Geany + +import os, sys +import tempfile +import shutil +from sys import platform +from PIL import Image +from itertools import filterfalse + +VER = "0.230913-0" + +if platform == "linux" or platform == "linux2": + SLA = '/' +elif platform == "darwin": + SLA = '/' +elif platform == "win32": + SLA = '\\' + +#count = 0 +tmp_path = tempfile.mkdtemp() +#mp_path = dir_path = os.getcwd() +#list_path = dir_path = os.getcwd() +tmp_list = tmp_path + SLA + "list.txt" +# NIE USUWAC ! +#command = "ffmpeg -framerate 0.3 -pattern_type glob -i '"+tmp_path+"/*.jpg' -c:v libopenh264 -profile:v high -crf 20 -pix_fmt yuv420p output.mp4" +command = "ffmpeg -f concat -y -r 0.2 -safe 0 -i '"+tmp_list+"' -framerate 1 -c:v libx264 -profile:v high -crf 20 -pix_fmt yuv420p -filter:a 'atempo=0.5' output.mp4" +#command = "ffmpeg -f concat -y -r 0.2 -safe 0 -i '"+tmp_list+"' -framerate 1 -c:v mpeg4 -crf 20 -pix_fmt yuv420p output.mp4" + +#num = 0 +sample = None +try: + sample = Image.Resampling.LANCZOS + print ("Uzywam LANCZOS") +except AttributeError: + sample = Image.ANTIALIAS + print ("Uzywam: ANTIALIAS") + + +class App(): + + BASE_APSC = 724 + LONG = 1080 + HALF = 540 + BASE_MICRO = 810 + BASE = None + #n_pictures = 0 + count = 0 + + def list_files(self, dir_path): + res = [] + try: + for file_path in os.listdir(dir_path): + if os.path.isfile(os.path.join(dir_path, file_path)): + res.append(os.path.join(dir_path, file_path)) + except FileNotFoundError: + print(f"The directory {dir_path} does not exist") + except PermissionError: + print(f"Permission denied to access the directory {dir_path}") + except OSError as e: + print(f"An OS error occurred: {e}") + return res + + def file_exclusion(self, files): + for f in files[:]: + if f.rfind('.jpg') == -1: + #print('usuwam: '+f) + files.remove(f) + return files + + def get_files(self): + dir_path = os.getcwd() + print ("GETCWD: "+dir_path) + files = self.list_files(dir_path) + return a.file_exclusion(files) + + def create_horizontal_surface(self): + return Image.new('RGB', (a.LONG, a.BASE)) + + def create_vertical_surface(self): + return Image.new('RGB', (a.BASE, a.LONG)) + + def put_horizontal_image(self, image): + global sample + new = Image.new("RGB", (a.LONG, a.BASE)) + if image.size[0] != a.LONG: + image = image.resize((a.LONG, a.BASE), sample, None, 3.0) + new.paste(image, (0,0), mask = image) + return new + + def put_vertical_image(self, image): + global sample + new = Image.new("RGB", (a.BASE, a.LONG)) + if image.size[0] != a.BASE: + image = image.resize((a.BASE, a.LONG), sample, None, 3.0) + new.paste(image, (0,0), mask = image) + return new + + # dodaje portrety do kraiobrazu + def join_image_to_horizontal(self, image, destinity): + global sample # n_pictures + single = False + print ("DLUGOSC: "+str(len(image))) + if len(image) == 1: # and n_pictures > 0: # 1 + print ("SINGIELEK") + #num += 1 # tymczasowy + tmp = image[-1]. resize((a.HALF, a.BASE), sample, None, 3.0) + destinity.paste(tmp, (300,0), mask = tmp) + image.pop() + single = True + elif len(image) > 0: + #num += 1 # tymczasowy + tmp = image[-1].resize((a.HALF, a.BASE), sample, None, 3.0) + destinity.paste(tmp, (0,0), mask = tmp) + image.pop() + if len(image) > 0: + #num += 1 # tymczasowy + tmp = image[-1]. resize((a.HALF, a.BASE), sample, None, 3.0) + destinity.paste(tmp, (a.HALF,0), mask = tmp) + image.pop() + + return destinity, len(image), single + + # dodaje kraiobrazy do portretu + def join_image_to_vertical(self, image, destinity): + global sample # n_pictures + single = False + print ("DLUGOSC: "+str(len(image))) + if len(image) == 1: # and a.n_pictures > 0: # 1 + print ("SINGIELEK") + #num += 1 # tymczasowy + tmp = image[-1]. resize((a.BASE, a.HALF), sample, None, 3.0) + destinity.paste(tmp, (0,300), mask = tmp) + image.pop() + single = True + #a.n_pictures -= 1 + elif len(image) > 0: + #num += 1 # tymczasowy + tmp = image[-1].resize((a.BASE, a.HALF), sample, None, 3.0) + destinity.paste(tmp, (0,0), mask = tmp) + image.pop() + #a.n_pictures -= 1 + if len(image) > 0: + #num += 1 # tymczasowy + tmp = image[-1]. resize((a.BASE, a.HALF), sample, None, 3.0) + destinity.paste(tmp, (0, a.HALF), mask = tmp) + image.pop() + #a.n_pictures -= 1 + + return destinity, len(image), single + + def read_images_from_directory(self, files): + #global n_pictures + images_vertical = [] + images_horizontal = [] + if len(files) == 0: + print ('Brak plików JPG !') + a.cleanup() + exit (1) + for f in files: + image = Image.open(f).convert('RGBA') + if image.size[1] > image.size[0]: + s = float(image.size[0] / image.size[1]) + if s > 0.6 and s < 0.69: + a.BASE = a.BASE_APSC + print ("obraz vertical APSC: "+f+" s:"+str(s)) + images_vertical.insert(-1, image) + #a.n_pictures += 1 + elif s > 0.7 and s < 0.79: + a.BASE = a.BASE_MICRO + print ("obraz vertical MICRO: "+f+" s:"+str(s)) + images_vertical.insert(-1, image) + #a.n_pictures += 1 + else: + print ("Ver - Niedozwolony rozmiar zdjęcia s: "+str(s) + " Foto: "+f) + + if image.size[0] > image.size[1]: + s = float(image.size[0] / image.size[1]) + if s > 1.4 and s <= 1.51: + a.BASE = a.BASE_APSC + print ("obraz horizontal APSC: "+f+" s:"+str(s)); + images_horizontal.insert(-1, image) + #a.n_pictures += 1 + elif s > 1.3 and s < 1.39: + a.BASE = a.BASE_MICRO + print ("obraz horizontal MICRO: "+f+" s:"+str(s)); + images_horizontal.insert(-1, image) + #a.n_pictures += 1 + else: + print ("Hor - Niedozwolony rozmiar zdjęcia s: "+str(s) + " Foto: "+f) + + + + #print ("N_PICTURES: "+str(a.n_pictures)) + return images_vertical, images_horizontal + + def cleanup(self): + # NIEBEZPIECZNA ! lepiej niczym innym nie nadpisywać tych zmiennych + shutil.rmtree(tmp_path) + + def save_vertical_to_horizontal(self, images_vertical, jpg_names): + #global count + for i in images_vertical[:]: + output, list_size, single = a.join_image_to_horizontal(images_vertical, a.create_horizontal_surface()) + if list_size != 0 or single == True: + #output.show() + output.save(str(tmp_path)+SLA+jpg_names[a.count], format='JPEG') + a.count += 1 + + def save_horizontal_to_vertical(self, images_horizontal, jpg_names): + #global count + for i in images_horizontal[:]: + output, list_size, single = a.join_image_to_vertical(images_horizontal, a.create_vertical_surface()) + if list_size != 0 or single == True: + #output.show() + output.save(str(tmp_path)+SLA+jpg_names[a.count], format='JPEG') + a.count += 1 + + def save_vertical(self, images_vertica, jpg_names): + #global count + for i in images_vertical[:]: + output = a.put_vertical_image(i) + output.save(str(tmp_path)+SLA+jpg_names[a.count], format='JPEG') + #output.show() + images_vertical.pop() + a.count += 1 + + def save_horizontal(self, images_horizontal, jpg_names): + #global count + for i in images_horizontal[:]: + output = a.put_horizontal_image(i) + output.save(str(tmp_path)+SLA+jpg_names[a.count], format='JPEG') + #output.show() + images_horizontal.pop() + a.count += 1 + + def name_jpg_wihout_path(self): + files_jpg_names = a.file_exclusion(os.listdir()) + for f in files_jpg_names: + f = f[0] + "file " + #print ("Ekstrat: " + str(files_jpg_names)) + return files_jpg_names + + def at_unslash(self, path): + p = path.replace("\\","/") + print("PO KONWERSJI: "+p) + return p + + def dump_jpg_list(self, files_jpg_names): + print("tmp_list") + with open(tmp_list, 'w') as fp: + for item in files_jpg_names: + # FIXME - to nic nie daje dalej wyrzuca "invalid argument" + if platform == "win32": + fp.write("file '"+a.at_unslash(str(tmp_path) + SLA +"%s'\r\n" % item)) + else: + # write each item on a new line + fp.write("file '"+str(tmp_path) + SLA +"%s'\r\n" % item) + + print("Zapisany plik do list.txt --> "+item) + return files_jpg_names +a = App() +jpg_names = a.dump_jpg_list(a.name_jpg_wihout_path()) +if len(sys.argv) == 1 or sys.argv[-1] == '-H': + images_vertical, images_horizontal = a.read_images_from_directory(a.get_files()) + a.save_horizontal(images_horizontal, jpg_names) + a.save_vertical_to_horizontal(images_vertical, jpg_names) + #print ("_---------------N_PIC: "+str(a.n_pictures)) + + print(command) + os.popen(command).read() +elif sys.argv[-1] == '-V': + images_vertical, images_horizontal = a.read_images_from_directory(a.get_files()) + a.save_vertical(images_vertical, jpg_names) + a.save_horizontal_to_vertical(images_horizontal, jpg_names) + #print ("_---------------N_PIC: "+str(a.n_pictures)) + print(command) + os.popen(command).read() +else: + print ("\n\nUżycie:\n\n Uruchom skrypt w katalogu z plikami JPG\n\n 'vsss -H' | 'vsss' dla video horyzontalnego\n 'vsss -V' dla video vertykalnego\n\n \ + 'vsss -h' aby wyświetlić pomoc i numer wersji.\n verysimpleslideshow (vsss) ver. "+VER+"\n SEPT-2023") + + +a.cleanup()