From b9ac80398ce9bc1ad61b4ecd2524f39daccf78b0 Mon Sep 17 00:00:00 2001 From: j Date: Fri, 25 Jun 2021 11:30:56 +0100 Subject: [PATCH 1/5] default to python3 --- bin/oxtimelines | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/oxtimelines b/bin/oxtimelines index a054953..6871d54 100755 --- a/bin/oxtimelines +++ b/bin/oxtimelines @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/python3 # -*- coding: utf-8 -*- # vi:si:et:sw=4:sts=4:ts=4 # GPL 2008-2014 From f3771f1b565310fe39dba4d67c6455e59187d951 Mon Sep 17 00:00:00 2001 From: j Date: Mon, 16 Aug 2021 18:26:09 +0200 Subject: [PATCH 2/5] fix multiline mode --- oxtimelines/timeline.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/oxtimelines/timeline.py b/oxtimelines/timeline.py index 250c001..5cef458 100644 --- a/oxtimelines/timeline.py +++ b/oxtimelines/timeline.py @@ -44,10 +44,9 @@ class Timelines(): self.render_slitscan = 'slitscan' in modes if 'multiline' in modes: info = ox.avinfo(video_files[0]) - self.render_multiline = info['video'][0]['width'] self.output_h = sizes[0] sizes = [info['video'][0]['height']] + sizes[1:] - self.render_multiline = True + self.render_multiline = info['video'][0]['width'] self._pool = ThreadPool(multiprocessing.cpu_count()) else: self.render_multiline = False @@ -460,7 +459,7 @@ class Timelines(): self.tile_path, line, 'slitscan', self.output_h, index, type ) ox.makedirs(os.path.dirname(tile_file)) - width = self.large_tile_image[mode][line].size[1] + width = self.large_tile_image[mode][line].size[0] img = self.large_tile_image[mode][line] if self.output_h != self.large_tile_image[mode][line].size[0]: img = img.resize((width, self.output_h), Image.BICUBIC) From 657a1dd2341858296bdf6447ce166e6927937c3a Mon Sep 17 00:00:00 2001 From: j Date: Sun, 21 Nov 2021 23:17:34 +0100 Subject: [PATCH 3/5] only use ffmpeg --- oxtimelines/ffmpeg.py | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/oxtimelines/ffmpeg.py b/oxtimelines/ffmpeg.py index 3a0fac2..c01515a 100644 --- a/oxtimelines/ffmpeg.py +++ b/oxtimelines/ffmpeg.py @@ -13,14 +13,7 @@ import numpy as np import ox -FFMPEG = None -for cmd in ('ffmpeg', 'avconv'): - cmd = ox.file.cmd(cmd) - if subprocess.call(['which', cmd], stdout=subprocess.PIPE) == 0: - FFMPEG = cmd - break -if not FFMPEG: - print("could not find ffmpeg, make sure its installed and available in PATH") +FFMPEG = 'ffmpeg' FPS = 25 class Video(object): From 8fa66491fe5f046dc922cb8efca209e2a8ed73af Mon Sep 17 00:00:00 2001 From: j Date: Fri, 25 Aug 2023 00:18:57 +0200 Subject: [PATCH 4/5] Image.ANTIALIAS->Image.LANCZOS --- oxtimelines/timeline.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/oxtimelines/timeline.py b/oxtimelines/timeline.py index 5cef458..0493b8d 100644 --- a/oxtimelines/timeline.py +++ b/oxtimelines/timeline.py @@ -213,10 +213,10 @@ class Timelines(): paste = (large_tile_x, 0) # render antialias tile - self.log and self.profiler.set_task('i.resize((1, h), Image.ANTIALIAS) # antialias timelines') + self.log and self.profiler.set_task('i.resize((1, h), Image.LANCZOS) # antialias timelines') if self.render_antialias or self.render_cuts: resize = (1, self.large_tile_h) - antialias_image = frame_image.resize(resize, Image.ANTIALIAS) + antialias_image = frame_image.resize(resize, Image.LANCZOS) if self.render_antialias: self.large_tile_image['antialias'].paste(antialias_image, paste) @@ -234,8 +234,8 @@ class Timelines(): # render data tile if self.render_data or self.detect_cuts: - self.log and self.profiler.set_task('i.resize((8, 8), Image.ANTIALIAS) # cut detection') - data_image = frame_image.resize((8, 8), Image.ANTIALIAS) + self.log and self.profiler.set_task('i.resize((8, 8), Image.LANCZOS) # cut detection') + data_image = frame_image.resize((8, 8), Image.LANCZOS) if self.render_data: self.large_tile_image['data'].paste(data_image, (large_tile_x * 8, 0)) self.log and self.profiler.unset_task() @@ -315,7 +315,7 @@ class Timelines(): if mode == 'keyframeswide': resize = (self.wide_frame_w, self.large_tile_h) self.log and self.profiler.set_task('i,resize((w, h)) # keyframeswide timelines') - frame_image = frame_image.resize(resize, Image.ANTIALIAS) + frame_image = frame_image.resize(resize, Image.LANCZOS) self.log and self.profiler.unset_task() left = int((self.frame_w * wide - image_w) / 2) crop = (left, 0, left + image_w, self.large_tile_h) @@ -423,7 +423,7 @@ class Timelines(): if self.full_tile_widths[0] > 0 and self.large_tile_h > 0: resized = self.large_tile_image[mode].resize(( self.full_tile_widths[0], self.large_tile_h - ), Image.ANTIALIAS) + ), Image.LANCZOS) self.full_tile_image.paste(resized, (self.full_tile_offset, 0)) self.full_tile_offset += self.full_tile_widths[0] self.full_tile_widths = self.full_tile_widths[1:] @@ -438,7 +438,7 @@ class Timelines(): print(tile_file) if self.render_small_tiles: resize = (self.full_tile_w, self.small_tile_h) - self.full_tile_image = self.full_tile_image.resize(resize, Image.ANTIALIAS) + self.full_tile_image = self.full_tile_image.resize(resize, Image.LANCZOS) tile_file = '%stimeline%s%dp.jpg' % ( self.tile_path, mode, self.small_tile_h ) @@ -490,7 +490,7 @@ class Timelines(): else: w = self.small_tile_last_w % 60 or 60 resize = (w, self.small_tile_h) - resized = self.large_tile_image[mode].resize(resize, Image.ANTIALIAS) + resized = self.large_tile_image[mode].resize(resize, Image.LANCZOS) paste = (small_tile_x, 0) self.small_tile_image[small_mode].paste(resized, paste) # save small tile From d3a4c0a140fdaa54a86d389e4707c468bdde9432 Mon Sep 17 00:00:00 2001 From: j Date: Sat, 18 Nov 2023 16:30:10 +0100 Subject: [PATCH 5/5] add dependencies to install --- setup.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/setup.py b/setup.py index a0b123d..5319668 100644 --- a/setup.py +++ b/setup.py @@ -1,23 +1,27 @@ # setup.py # -*- coding: UTF-8 -*- -try: - from setuptools import setup -except: - from distutils.core import setup + +from setuptools import setup def get_version(): import subprocess rev = subprocess.check_output(['git', 'rev-list', 'HEAD', '--count']).decode().strip() return rev or u'unknown' + setup(name='oxtimelines', - version='0.%s' % get_version() , + version='0.%s' % get_version(), scripts=[ 'bin/oxtimelines', ], packages=[ 'oxtimelines', ], + install_requires=[ + 'numpy', + 'ox', + 'Pillow', + ], author='0x2620', author_email='0x2620@0x2620.org', url="https://wiki.0x2620.org/wiki/oxtimelines",