From cd817ffcb8d067f2bfcf0f526c59dc9d13fb8cb6 Mon Sep 17 00:00:00 2001 From: darosior Date: Mon, 25 Feb 2019 00:01:42 +0100 Subject: [PATCH 01/19] Request runtime permission tu use camera. fixes #30 --- zbarcam/zbarcam.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/zbarcam/zbarcam.py b/zbarcam/zbarcam.py index 955ff19..b485249 100644 --- a/zbarcam/zbarcam.py +++ b/zbarcam/zbarcam.py @@ -46,6 +46,9 @@ def _setup(self): """ Postpones some setup tasks that require self.ids dictionary. """ + if platform == 'android': + from android.permissions import request_permission, Permission + request_permission(Permission.CAMERA) self._remove_shoot_button() self._enable_android_autofocus() self.xcamera._camera.bind(on_texture=self._on_texture) From bb8faac2abf90fe3840d74d1e7c1d04565d8bd70 Mon Sep 17 00:00:00 2001 From: Andre Miras Date: Sat, 2 Mar 2019 12:57:18 +0100 Subject: [PATCH 02/19] Migrating to pyzbar, Python3 and NDK 17, refs #32 pyzbar is a ctypes wrapper on top of libzbar. It covers more features than zbarlight, such as returning detected code types. Also easier to debug since it's pure Python. With it the code detection issues on Android seems to be fixed, refs #32 --- buildozer.spec | 24 ++++++++++++++++-------- requirements/requirements.txt | 5 +++-- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/buildozer.spec b/buildozer.spec index 71defb8..dcefa30 100644 --- a/buildozer.spec +++ b/buildozer.spec @@ -38,7 +38,13 @@ version.filename = %(source.dir)s/zbarcam/version.py # (list) Application requirements # comma seperated e.g. requirements = sqlite3,kivy -requirements = kivy, pil, libiconv, libzbar, zbarlight>=2.1 +requirements = + kivy==5fc5385, + libiconv, + libzbar, + Pillow==4.3.0, + python3, + pyzbar==0.1.8 # (str) Custom source folders for requirements @@ -89,20 +95,22 @@ fullscreen = 0 #android.presplash_color = #FFFFFF # (list) Permissions -#android.permissions = INTERNET android.permissions = CAMERA -# (int) Android API to use -#android.api = 19 +# (int) Target Android API, should be as high as possible. +android.api = 27 -# (int) Minimum API required -#android.minapi = 9 +# (int) Minimum API your APK will support. +android.minapi = 21 # (int) Android SDK version to use -#android.sdk = 20 +android.sdk = 20 # (str) Android NDK version to use -#android.ndk = 9c +android.ndk = 17c + +# (int) Android NDK API to use. This is the minimum API your app will support, it should usually match android.minapi. +android.ndk_api = 21 # (bool) Use --private data storage (True) or --dir public storage (False) #android.private_storage = True diff --git a/requirements/requirements.txt b/requirements/requirements.txt index 71e6821..1e5ca39 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -1,5 +1,6 @@ -zbarlight==2.2 -Kivy==1.10.1 +pyzbar==0.1.8 +# 5fc5385 adds opencv 4 support +https://github.com/kivy/kivy/archive/5fc5385.zip Kivy-Garden==0.1.4 Pillow==4.3.0 numpy==1.13.3 From 4260df603f2d3663ceb770663d2f9687cee5a089 Mon Sep 17 00:00:00 2001 From: Andre Miras Date: Sat, 2 Mar 2019 13:22:01 +0100 Subject: [PATCH 03/19] Fixes Android build error Uses upstream recipes and bump Pillow --- buildozer.spec | 4 +- .../recipes/libzbar/__init__.py | 59 ------------------- .../recipes/libzbar/werror.patch | 13 ---- .../recipes/zbarlight/__init__.py | 28 --------- requirements/requirements.txt | 2 +- 5 files changed, 3 insertions(+), 103 deletions(-) delete mode 100644 python-for-android/recipes/libzbar/__init__.py delete mode 100644 python-for-android/recipes/libzbar/werror.patch delete mode 100644 python-for-android/recipes/zbarlight/__init__.py diff --git a/buildozer.spec b/buildozer.spec index dcefa30..3f0cd0c 100644 --- a/buildozer.spec +++ b/buildozer.spec @@ -42,7 +42,7 @@ requirements = kivy==5fc5385, libiconv, libzbar, - Pillow==4.3.0, + Pillow==5.2.0, python3, pyzbar==0.1.8 @@ -241,7 +241,7 @@ p4a.local_recipes = %(source.dir)s/python-for-android/recipes/ [buildozer] # (int) Log level (0 = error only, 1 = info, 2 = debug (with command output)) -log_level = 1 +log_level = 2 # (int) Display warning if buildozer is run as root (0 = False, 1 = True) warn_on_root = 1 diff --git a/python-for-android/recipes/libzbar/__init__.py b/python-for-android/recipes/libzbar/__init__.py deleted file mode 100644 index ceb9aa0..0000000 --- a/python-for-android/recipes/libzbar/__init__.py +++ /dev/null @@ -1,59 +0,0 @@ -import os -from pythonforandroid.toolchain import shprint, current_directory -from pythonforandroid.recipe import Recipe -from multiprocessing import cpu_count -import sh - - -class LibZBarRecipe(Recipe): - - version = '0.10' - - url = 'https://github.com/ZBar/ZBar/archive/{version}.zip' - - depends = [('hostpython2', 'hostpython3crystax'), 'libiconv'] - - patches = ["werror.patch"] - - def should_build(self, arch): - return not os.path.exists( - os.path.join(self.ctx.get_libs_dir(arch.arch), 'libzbar.so')) - - def get_recipe_env(self, arch=None, with_flags_in_cc=True): - env = super(LibZBarRecipe, self).get_recipe_env(arch, with_flags_in_cc) - libiconv = self.get_recipe('libiconv', self.ctx) - libiconv_dir = libiconv.get_build_dir(arch.arch) - env['CFLAGS'] += ' -I' + os.path.join(libiconv_dir, 'include') - env['LDSHARED'] = env['CC'] + \ - ' -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions' - env['LDFLAGS'] += " -landroid -liconv" - return env - - def build_arch(self, arch): - super(LibZBarRecipe, self).build_arch(arch) - env = self.get_recipe_env(arch) - with current_directory(self.get_build_dir(arch.arch)): - shprint(sh.Command('autoreconf'), '-vif', _env=env) - shprint( - sh.Command('./configure'), - '--host=' + arch.toolchain_prefix, - '--target=' + arch.toolchain_prefix, - '--prefix=' + self.ctx.get_python_install_dir(), - # Python bindings are compiled in a separated recipe - '--with-python=no', - '--with-gtk=no', - '--with-qt=no', - '--with-x=no', - '--with-jpeg=no', - '--with-imagemagick=no', - '--enable-pthread=no', - '--enable-video=no', - '--enable-shared=yes', - '--enable-static=no', - _env=env) - shprint(sh.make, '-j' + str(cpu_count()), _env=env) - libs = ['zbar/.libs/libzbar.so'] - self.install_libs(arch, *libs) - - -recipe = LibZBarRecipe() diff --git a/python-for-android/recipes/libzbar/werror.patch b/python-for-android/recipes/libzbar/werror.patch deleted file mode 100644 index 9fe5d36..0000000 --- a/python-for-android/recipes/libzbar/werror.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/configure.ac b/configure.ac -index 256aedb..727caba 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -3,7 +3,7 @@ AC_PREREQ([2.61]) - AC_INIT([zbar], [0.10], [spadix@users.sourceforge.net]) - AC_CONFIG_AUX_DIR(config) - AC_CONFIG_MACRO_DIR(config) --AM_INIT_AUTOMAKE([1.10 -Wall -Werror foreign subdir-objects std-options dist-bzip2]) -+AM_INIT_AUTOMAKE([1.10 -Wall foreign subdir-objects std-options dist-bzip2]) - AC_CONFIG_HEADERS([include/config.h]) - AC_CONFIG_SRCDIR(zbar/scanner.c) - LT_PREREQ([2.2]) diff --git a/python-for-android/recipes/zbarlight/__init__.py b/python-for-android/recipes/zbarlight/__init__.py deleted file mode 100644 index 5f2b78f..0000000 --- a/python-for-android/recipes/zbarlight/__init__.py +++ /dev/null @@ -1,28 +0,0 @@ -import os -from pythonforandroid.recipe import PythonRecipe - - -class ZbarLightRecipe(PythonRecipe): - version = '1.2' - url = 'https://github.com/Polyconseil/zbarlight/archive/{version}.tar.gz' - depends = [ - ('python2', 'python3crystax'), 'setuptools', 'libzbar'] - call_hostpython_via_targetpython = False - - def get_recipe_env(self, arch=None, with_flags_in_cc=True): - # TODO: python 3 support - env = super(ZbarLightRecipe, self).get_recipe_env(arch, with_flags_in_cc) - libzbar = self.get_recipe('libzbar', self.ctx) - libzbar_dir = libzbar.get_build_dir(arch.arch) - env['PYTHON_ROOT'] = self.ctx.get_python_install_dir() - env['CFLAGS'] += ' -I' + os.path.join(libzbar_dir, 'include') - env['CFLAGS'] += ' -I' + env['PYTHON_ROOT'] + '/include/python2.7' - # TODO - env['LDSHARED'] = env['CC'] + \ - ' -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions' - # TODO: hardcoded Python version - env['LDFLAGS'] += " -landroid -lpython2.7 -lzbar" - return env - - -recipe = ZbarLightRecipe() diff --git a/requirements/requirements.txt b/requirements/requirements.txt index 1e5ca39..30e0383 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -2,5 +2,5 @@ pyzbar==0.1.8 # 5fc5385 adds opencv 4 support https://github.com/kivy/kivy/archive/5fc5385.zip Kivy-Garden==0.1.4 -Pillow==4.3.0 +Pillow==5.2.0 numpy==1.13.3 From 72f7ab65ad5f6385097412e1faa2e2a146d7e8f4 Mon Sep 17 00:00:00 2001 From: Andre Miras Date: Sat, 2 Mar 2019 14:56:39 +0100 Subject: [PATCH 04/19] Bumps buildozer version, reduces CI build log verbisoty --- dockerfiles/Dockerfile-android | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dockerfiles/Dockerfile-android b/dockerfiles/Dockerfile-android index 374b70d..9c67834 100644 --- a/dockerfiles/Dockerfile-android +++ b/dockerfiles/Dockerfile-android @@ -49,8 +49,8 @@ WORKDIR ${WORK_DIR} # install buildozer and dependencies RUN curl --location --progress-bar ${MAKEFILES_URL}/buildozer.mk --output buildozer.mk RUN make -f buildozer.mk -# enforces buildozer master (afebba5) until next release -RUN pip install --upgrade https://github.com/kivy/buildozer/archive/afebba5.zip +# enforces buildozer master (cf880a3) until next release +RUN pip install --upgrade https://github.com/kivy/buildozer/archive/cf880a3.zip COPY . ${WORK_DIR} ENTRYPOINT ["./dockerfiles/start.sh"] From d6f5ab23df0be59bd09d7c13d5b33e0f979ec63b Mon Sep 17 00:00:00 2001 From: Andre Miras Date: Sat, 2 Mar 2019 14:57:46 +0100 Subject: [PATCH 05/19] Buildozer exclude directories --- buildozer.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildozer.spec b/buildozer.spec index 3f0cd0c..f7add57 100644 --- a/buildozer.spec +++ b/buildozer.spec @@ -22,7 +22,7 @@ source.include_exts = py,png,jpg,kv,atlas #source.exclude_exts = spec # (list) List of directory to exclude (let empty to not exclude anything) -#source.exclude_dirs = tests, bin +source.exclude_dirs = tests, bin, venv, opencv-* # (list) List of exclusions using pattern matching #source.exclude_patterns = license,images/*/*.jpg From 0e4c93b6ce60081d78287c5b7103c7303761285a Mon Sep 17 00:00:00 2001 From: Andre Miras Date: Sat, 2 Mar 2019 15:00:35 +0100 Subject: [PATCH 06/19] Migrating to pyzbar, refs #32 Also requests permissions earlier before importing kv code. --- zbarcam/zbarcam.py | 37 ++++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/zbarcam/zbarcam.py b/zbarcam/zbarcam.py index b485249..26a54df 100644 --- a/zbarcam/zbarcam.py +++ b/zbarcam/zbarcam.py @@ -1,7 +1,8 @@ import os +from collections import namedtuple import PIL -import zbarlight +from pyzbar import pyzbar from kivy.app import App from kivy.clock import Clock from kivy.lang import Builder @@ -30,12 +31,13 @@ class ZBarCam(AnchorLayout): """ resolution = ListProperty([640, 480]) - codes = ListProperty([]) + symbols = ListProperty([]) + Symbol = namedtuple('Symbol', ['type', 'data']) # checking all possible types by default - code_types = ListProperty(zbarlight.Symbologies.keys()) + code_types = ListProperty(set(pyzbar.ZBarSymbol)) - # TODO: handle code types def __init__(self, **kwargs): + self._request_android_permissions() # lazy loading the kv file rather than loading at module level, # that way the `XCamera` import doesn't happen too early Builder.load_file(os.path.join(MODULE_DIRECTORY, "zbarcam.kv")) @@ -46,9 +48,6 @@ def _setup(self): """ Postpones some setup tasks that require self.ids dictionary. """ - if platform == 'android': - from android.permissions import request_permission, Permission - request_permission(Permission.CAMERA) self._remove_shoot_button() self._enable_android_autofocus() self.xcamera._camera.bind(on_texture=self._on_texture) @@ -74,8 +73,18 @@ def _enable_android_autofocus(self): params.setFocusMode('continuous-video') camera.setParameters(params) + def _request_android_permissions(self): + """ + Requests CAMERA permission on Android. + """ + print('_request_android_permissions()') + if not self.is_android(): + return + from android.permissions import request_permission, Permission + request_permission(Permission.CAMERA) + def _on_texture(self, instance): - self.codes = self._detect_qrcode_frame( + self.symbols = self._detect_qrcode_frame( texture=instance.texture, code_types=self.code_types) @staticmethod @@ -89,7 +98,12 @@ def _detect_qrcode_frame(texture, code_types): if platform == 'ios' and fmt == 'BGRA': fmt = 'RGBA' pil_image = PIL.Image.frombytes(mode=fmt, size=size, data=image_data) - return zbarlight.scan_codes(code_types, pil_image) or [] + symbols = [] + codes = pyzbar.decode(pil_image, symbols=code_types) + for code in codes: + symbol = ZBarCam.Symbol(type=code.type, data=code.data) + symbols.append(symbol) + return symbols @property def xcamera(self): @@ -106,15 +120,16 @@ def is_android(self): DEMO_APP_KV_LANG = """ +#:import ZBarSymbol pyzbar.pyzbar.ZBarSymbol BoxLayout: orientation: 'vertical' ZBarCam: id: zbarcam - code_types: 'qrcode', 'ean13' + code_types: ZBarSymbol.QRCODE, ZBarSymbol.EAN13 Label: size_hint: None, None size: self.texture_size[0], 50 - text: ', '.join([str(code) for code in zbarcam.codes]) + text: ', '.join([str(symbol.data) for symbol in zbarcam.symbols]) """ From 3120969cb91c967713465a004f00b6276003753f Mon Sep 17 00:00:00 2001 From: Andre Miras Date: Sat, 2 Mar 2019 21:18:31 +0100 Subject: [PATCH 07/19] Rotates and mirrors image on Android, fixes #32 Also drops PIL support since Pillow recipe also works on Android. --- zbarcam/zbarcam.py | 40 +++++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/zbarcam/zbarcam.py b/zbarcam/zbarcam.py index 26a54df..cc89198 100644 --- a/zbarcam/zbarcam.py +++ b/zbarcam/zbarcam.py @@ -2,24 +2,14 @@ from collections import namedtuple import PIL -from pyzbar import pyzbar from kivy.app import App from kivy.clock import Clock from kivy.lang import Builder from kivy.properties import ListProperty from kivy.uix.anchorlayout import AnchorLayout from kivy.utils import platform - -# Pillow is not currently available for Android: -# https://github.com/kivy/python-for-android/pull/786 -try: - # Pillow - PIL.Image.frombytes - PIL.Image.Image.tobytes -except AttributeError: - # PIL - PIL.Image.frombytes = PIL.Image.frombuffer - PIL.Image.Image.tobytes = PIL.Image.Image.tostring +from PIL import ImageOps +from pyzbar import pyzbar MODULE_DIRECTORY = os.path.dirname(os.path.realpath(__file__)) @@ -77,27 +67,38 @@ def _request_android_permissions(self): """ Requests CAMERA permission on Android. """ - print('_request_android_permissions()') if not self.is_android(): return from android.permissions import request_permission, Permission request_permission(Permission.CAMERA) + @classmethod + def _fix_android_image(cls, pil_image): + """ + On Android, the image seems mirrored and rotated somehow, refs #32. + """ + if not cls.is_android(): + return pil_image + pil_image = pil_image.rotate(90) + pil_image = ImageOps.mirror(pil_image) + return pil_image + def _on_texture(self, instance): self.symbols = self._detect_qrcode_frame( texture=instance.texture, code_types=self.code_types) - @staticmethod - def _detect_qrcode_frame(texture, code_types): + @classmethod + def _detect_qrcode_frame(cls, texture, code_types): image_data = texture.pixels size = texture.size fmt = texture.colorfmt.upper() # PIL doesn't support BGRA but IOS uses BGRA for the camera # if BGRA is detected it will switch to RGBA, color will be off # but we don't care as it's just looking for barcodes - if platform == 'ios' and fmt == 'BGRA': + if cls.is_ios() and fmt == 'BGRA': fmt = 'RGBA' pil_image = PIL.Image.frombytes(mode=fmt, size=size, data=image_data) + pil_image = cls._fix_android_image(pil_image) symbols = [] codes = pyzbar.decode(pil_image, symbols=code_types) for code in codes: @@ -115,9 +116,14 @@ def start(self): def stop(self): self.xcamera.play = False - def is_android(self): + @staticmethod + def is_android(): return platform == 'android' + @staticmethod + def is_ios(): + return platform == 'ios' + DEMO_APP_KV_LANG = """ #:import ZBarSymbol pyzbar.pyzbar.ZBarSymbol From df71936f93a40dd211b9ea780e4978d871868f80 Mon Sep 17 00:00:00 2001 From: Andre Miras Date: Sat, 2 Mar 2019 21:24:30 +0100 Subject: [PATCH 08/19] Reduces verbosity on CI --- .travis.yml | 2 +- dockerfiles/Dockerfile-android | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 471c208..ec4490e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,7 +18,7 @@ before_install: - sudo apt install --yes --no-install-recommends xvfb install: - - docker build --tag=$TAG --file=$DOCKERFILE . + - docker build --tag=$TAG --file=$DOCKERFILE --build-arg CI . before_script: - sh -e /etc/init.d/xvfb start diff --git a/dockerfiles/Dockerfile-android b/dockerfiles/Dockerfile-android index 9c67834..e23b4e3 100644 --- a/dockerfiles/Dockerfile-android +++ b/dockerfiles/Dockerfile-android @@ -9,6 +9,7 @@ # docker run -it --rm zbarcam-android FROM ubuntu:18.04 +ARG CI=false ENV USER="user" ENV HOME_DIR="/home/${USER}" ENV WORK_DIR="${HOME_DIR}" \ @@ -53,4 +54,6 @@ RUN make -f buildozer.mk RUN pip install --upgrade https://github.com/kivy/buildozer/archive/cf880a3.zip COPY . ${WORK_DIR} +# limits the amount of logs for Travis +RUN if [ "${CI}" = "true" ]; then sed 's/log_level = [0-9]/log_level = 1/' -i buildozer.spec; fi ENTRYPOINT ["./dockerfiles/start.sh"] From 3dd17158d9b97e9e5df97777e6e761385f4e3a1e Mon Sep 17 00:00:00 2001 From: Andre Miras Date: Sat, 2 Mar 2019 21:33:20 +0100 Subject: [PATCH 09/19] Fixes unit tests, refs pyzbar migration (0e4c93b) --- tests/test_zbarcam.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tests/test_zbarcam.py b/tests/test_zbarcam.py index 43c348b..62ff679 100644 --- a/tests/test_zbarcam.py +++ b/tests/test_zbarcam.py @@ -39,7 +39,7 @@ def test_detect_qrcode_frame_one_qrcode(self): symbols = self.zbarcam._detect_qrcode_frame(texture, code_types) self.assertEqual( symbols, - ['zbarlight test qr code']) + [ZBarCam.Symbol(type='QRCODE', data=b'zbarlight test qr code')]) def test_detect_qrcode_frame_one_qrcode_one_ean(self): """ @@ -60,7 +60,10 @@ def test_detect_qrcode_frame_two_qrcodes(self): texture = Image(fixture_path).texture code_types = self.zbarcam.code_types symbols = self.zbarcam._detect_qrcode_frame(texture, code_types) + Symbol = ZBarCam.Symbol self.assertEqual( - symbols, - ['second zbarlight test qr code', 'zbarlight test qr code'] + symbols, [ + Symbol(type='QRCODE', data=b'second zbarlight test qr code'), + Symbol(type='QRCODE', data=b'zbarlight test qr code'), + ] ) From bd56936afb5a11f3e137bc8568c2df223b44b26b Mon Sep 17 00:00:00 2001 From: Andre Miras Date: Sat, 2 Mar 2019 21:59:48 +0100 Subject: [PATCH 10/19] Updates CHANGELOG.md --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d286c26..70260ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Change Log +## [Unreleased] + + - Adds Python3 support, refs #5 + - Fully migrated Android from PIL to Pillow, refs #13 + - Handles Android runtime permissions, refs #30 + - Fixes codes not detected on Android, refs #32 + - Migrates from zbarlight to pyzbar + ## [20190223] - Fix zbarlight dependency in setup.py, refs #28 From 796486f99b89fe7a06c752fe3b7cb506aa0de24f Mon Sep 17 00:00:00 2001 From: Andre Miras Date: Sat, 2 Mar 2019 22:57:52 +0100 Subject: [PATCH 11/19] Speeds up install via "#egg=kivy" on requirements Since we're installing from master@5fc5385 adding the egg suffix so the kivy directory gets checked before trying to install. --- requirements/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements/requirements.txt b/requirements/requirements.txt index 30e0383..9e27048 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -1,6 +1,6 @@ pyzbar==0.1.8 # 5fc5385 adds opencv 4 support -https://github.com/kivy/kivy/archive/5fc5385.zip +https://github.com/kivy/kivy/archive/5fc5385.zip#egg=kivy Kivy-Garden==0.1.4 Pillow==5.2.0 numpy==1.13.3 From 7da188ddfa4e8171505802cafb0404a76ad94936 Mon Sep 17 00:00:00 2001 From: Andre Miras Date: Sat, 2 Mar 2019 23:02:12 +0100 Subject: [PATCH 12/19] Updates Makefile with Python3 and opencv 4 support, fixes #33 --- CHANGELOG.md | 9 +++--- Makefile | 83 +++++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 71 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 70260ec..2fa437b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,11 +2,12 @@ ## [Unreleased] - - Adds Python3 support, refs #5 - - Fully migrated Android from PIL to Pillow, refs #13 - - Handles Android runtime permissions, refs #30 - - Fixes codes not detected on Android, refs #32 - Migrates from zbarlight to pyzbar + - Add Python3 support, refs #5 + - Fully migrated Android from PIL to Pillow, refs #13 + - Handle Android runtime permissions, refs #30 + - Fixe codes not detected on Android, refs #32 + - Update Make with Python3 and opencv 4 support, refs #33 ## [20190223] diff --git a/Makefile b/Makefile index 54728e3..4ce170b 100644 --- a/Makefile +++ b/Makefile @@ -3,20 +3,41 @@ PIP=$(VENV_NAME)/bin/pip TOX=`which tox` GARDEN=$(VENV_NAME)/bin/garden PYTHON=$(VENV_NAME)/bin/python -SYSTEM_DEPENDENCIES=virtualenv build-essential libpython2.7-dev libsdl2-dev libzbar-dev \ - cmake python-numpy tox wget curl +SYSTEM_DEPENDENCIES= \ + build-essential \ + cmake \ + curl \ + libpython$(PYTHON_VERSION)-dev \ + libsdl2-dev \ + libzbar-dev \ + python-numpy \ + tox \ + virtualenv \ + wget OS=$(shell lsb_release -si) -OPENCV_VERSION=2.4.13.6 +PYTHON_MAJOR_VERSION=3 +PYTHON_MINOR_VERSION=6 +PYTHON_VERSION=$(PYTHON_MAJOR_VERSION).$(PYTHON_MINOR_VERSION) +PYTHON_WITH_VERSION=python$(PYTHON_VERSION) +# python3 has a "m" suffix for both include path and library +PYTHON_M=$(PYTHON_WITH_VERSION) +SITE_PACKAGES_DIR=$(VENV_NAME)/lib/$(PYTHON_WITH_VERSION)/site-packages +OPENCV_VERSION=4.0.1 +OPENCV_ARCHIVE=$(OPENCV_BASENAME).tar.gz OPENCV_BASENAME=opencv-$(OPENCV_VERSION) -OPENCV_BUILD=$(OPENCV_BASENAME)/build/lib/cv2.so -OPENCV_DEPLOY=$(VENV_NAME)/lib/python2.7/site-packages/cv2.so +OPENCV_BUILD_LIB_DIR=$(OPENCV_BASENAME)/build/lib +OPENCV_BUILD=$(OPENCV_BUILD_LIB_DIR)/cv2.so +OPENCV_DEPLOY=$(SITE_PACKAGES_DIR)/cv2.so NPROC=`grep -c '^processor' /proc/cpuinfo` +ifeq ($(PYTHON_MAJOR_VERSION), 3) + PYTHON_M := $(PYTHON_M)m +endif all: system_dependencies opencv virtualenv virtualenv: - test -d venv || virtualenv -p python2 venv + test -d venv || virtualenv -p python$(PYTHON_MAJOR_VERSION) venv . venv/bin/activate $(PIP) install Cython==0.26.1 $(PIP) install -r requirements/requirements.txt @@ -27,25 +48,53 @@ ifeq ($(OS), Ubuntu) sudo apt install --yes --no-install-recommends $(SYSTEM_DEPENDENCIES) endif -$(OPENCV_BUILD): +$(OPENCV_ARCHIVE): curl --location https://github.com/opencv/opencv/archive/$(OPENCV_VERSION).tar.gz \ - --progress-bar --output $(OPENCV_BASENAME).tar.gz + --progress-bar --output $(OPENCV_ARCHIVE) + +$(OPENCV_BUILD): $(OPENCV_ARCHIVE) tar -xf $(OPENCV_BASENAME).tar.gz cmake \ - -D BUILD_DOCS=OFF -D BUILD_PACKAGE=OFF -D BUILD_PERF_TESTS=OFF \ - -D BUILD_TESTS=OFF -D BUILD_opencv_apps=OFF \ - -D BUILD_opencv_nonfree=OFF -D BUILD_opencv_stitching=OFF \ - -D BUILD_opencv_superres=OFF -D BUILD_opencv_ts=OFF \ - -D BUILD_WITH_DEBUG_INFO=OFF -D WITH_1394=OFF -D WITH_CUDA=OFF \ - -D WITH_CUFFT=OFF -D WITH_GIGEAPI=OFF -D WITH_JASPER=OFF \ - -D WITH_OPENEXR=OFF -D WITH_PVAPI=OFF -D WITH_GTK=OFF \ - -D BUILD_opencv_python=ON -B$(OPENCV_BASENAME)/build -H$(OPENCV_BASENAME) + -D CMAKE_SHARED_LINKER_FLAGS=-l$(PYTHON_M) \ + -D BUILD_SHARED_LIBS=ON \ + -D BUILD_STATIC_LIBS=OFF \ + -D BUILD_DOCS=OFF \ + -D BUILD_OPENCV_APPS=OFF \ + -D BUILD_OPENCV_JAVA=OFF \ + -D BUILD_OPENCV_JAVA_BINDINGS_GENERATOR=OFF \ + -D BUILD_OPENCV_NONFREE=OFF \ + -D BUILD_OPENCV_PYTHON2=OFF \ + -D BUILD_OPENCV_PYTHON3=ON \ + -D BUILD_OPENCV_STITCHING=OFF \ + -D BUILD_OPENCV_SUPERRES=OFF \ + -D BUILD_OPENCV_TS=OFF \ + -D BUILD_PACKAGE=OFF \ + -D BUILD_PERF_TESTS=OFF \ + -D BUILD_TESTS=OFF \ + -D BUILD_WITH_DEBUG_INFO=OFF \ + -D OPENCV_SKIP_PYTHON_LOADER=ON \ + -D OPENCV_PYTHON$(PYTHON_MAJOR_VERSION)_INSTALL_PATH=$(SITE_PACKAGES_DIR) \ + -D PYTHON$(PYTHON_MAJOR_VERSION)_PACKAGES_PATH=$(SITE_PACKAGES_DIR) \ + -D PYTHON$(PYTHON_MAJOR_VERSION)_EXECUTABLE=$(PYTHON) \ + -D PYTHON$(PYTHON_MAJOR_VERSION)_INCLUDE_PATH=/usr/include/$(PYTHON_M)/ \ + -D PYTHON$(PYTHON_MAJOR_VERSION)_LIBRARIES=/usr/lib/x86_64-linux-gnu/lib$(PYTHON_M).so \ + -D PYTHON_DEFAULT_EXECUTABLE=/usr/bin/python$(PYTHON_MAJOR_VERSION) \ + -D WITH_1394=OFF \ + -D WITH_CUDA=OFF \ + -D WITH_CUFFT=OFF \ + -D WITH_GIGEAPI=OFF \ + -D WITH_GTK=OFF \ + -D WITH_JASPER=OFF \ + -D WITH_OPENEXR=OFF \ + -D WITH_PVAPI=OFF \ + -B$(OPENCV_BASENAME)/build -H$(OPENCV_BASENAME) cmake --build $(OPENCV_BASENAME)/build -- -j$(NPROC) opencv_build: $(OPENCV_BUILD) $(OPENCV_DEPLOY): opencv_build virtualenv - cp $(OPENCV_BUILD) $(OPENCV_DEPLOY) + cp $(OPENCV_BUILD) $(SITE_PACKAGES_DIR) + cp $(OPENCV_BUILD_LIB_DIR)/python$(PYTHON_MAJOR_VERSION)/*.so $(SITE_PACKAGES_DIR) opencv: $(OPENCV_DEPLOY) From 2e47383d4b9fba335ba09acca0c7c938d9f8cd47 Mon Sep 17 00:00:00 2001 From: Andre Miras Date: Sun, 3 Mar 2019 00:11:42 +0100 Subject: [PATCH 13/19] Updates build dependencies, fixes #33 Also ordered them alphabetically. --- dockerfiles/Dockerfile-android | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/dockerfiles/Dockerfile-android b/dockerfiles/Dockerfile-android index e23b4e3..e8c35bd 100644 --- a/dockerfiles/Dockerfile-android +++ b/dockerfiles/Dockerfile-android @@ -27,16 +27,30 @@ ENV LANG="en_US.UTF-8" \ LANGUAGE="en_US.UTF-8" \ LC_ALL="en_US.UTF-8" -# install system dependencies (required to setup all the tools) +# install system dependencies RUN apt install -qq --yes --no-install-recommends \ - cmake make curl ca-certificates xz-utils unzip openjdk-8-jdk sudo \ - python-pip python-setuptools zip - -# install build dependencies (required to successfully build the project) -# TODO: should this go to a Makefile instead so it can be shared/reused? -RUN apt install -qq --yes --no-install-recommends \ - python3.6 libpython3.6-dev python3-setuptools \ - file autoconf automake libtool gettext pkg-config + autoconf \ + automake \ + cmake \ + make \ + ca-certificates \ + curl \ + gettext \ + libffi-dev \ + libltdl-dev \ + libpython3.6-dev \ + libtool \ + file \ + openjdk-8-jdk \ + pkg-config \ + python3.6 \ + python3-setuptools \ + python-pip \ + python-setuptools \ + sudo \ + unzip \ + xz-utils \ + zip # prepare non root env RUN useradd --create-home --shell /bin/bash ${USER} From e972ed166004b5eb562f13c388592ea2e7099265 Mon Sep 17 00:00:00 2001 From: Andre Miras Date: Sun, 3 Mar 2019 01:08:20 +0100 Subject: [PATCH 14/19] Updates README.md and OpenCV.md docs --- OpenCV.md | 8 ++------ README.md | 28 ++++++++++++++++++++-------- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/OpenCV.md b/OpenCV.md index 1225584..d89beb7 100644 --- a/OpenCV.md +++ b/OpenCV.md @@ -3,14 +3,10 @@ ## Linux Camera support In order to be able to use the camera on Linux, you need to compile OpenCV. Simply installing `opencv-python` from pypi is not enough. -Currently only OpenCV2 works with Kivy on Linux (see https://github.com/kivy/kivy/issues/5404). Use the [Makefile](Makefile) provided to compile and install OpenCV library. ``` make system_dependencies -make opencv_build -``` -Then copy your compiled `cv2.so` to your virtualenv: -``` -cp opencv-*/build/lib/cv2.so venv/lib/python2.7/site-packages/cv2.so +make opencv ``` +It would build OpenCV and deploy it to your virtualenv. diff --git a/README.md b/README.md index 87009fb..6f06049 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![Build Status](https://secure.travis-ci.org/kivy-garden/garden.zbarcam.png?branch=develop)](http://travis-ci.org/kivy-garden/garden.zbarcam) Real time Barcode and QR Code scanner using the camera. -It's built on top of [Kivy](https://github.com/kivy/kivy) and [ZbarLight](https://github.com/Polyconseil/zbarlight). +It's built on top of [Kivy](https://github.com/kivy/kivy) and [pyzbar](https://github.com/NaturalHistoryMuseum/pyzbar). screenshot @@ -11,20 +11,23 @@ It's built on top of [Kivy](https://github.com/kivy/kivy) and [ZbarLight](https: Simply import and instanciate `ZBarCam` in your kvlang file and access its `symbols` property. ```yaml #:import ZBarCam kivy.garden.zbarcam +#:import ZBarSymbol pyzbar.pyzbar.ZBarSymbol BoxLayout: orientation: 'vertical' ZBarCam: id: zbarcam # optional, by default checks all types - code_types: 'qrcode', 'ean13' + code_types: ZBarSymbol.QRCODE, ZBarSymbol.EAN13 Label: - size_y: 20 - size_hint_y: None - text: ", ".join([str(code) for code in zbarcam.codes]) + size_hint: None, None + size: self.texture_size[0], 50 + text: ', '.join([str(symbol.data) for symbol in zbarcam.symbols]) ``` ## Install -Install system requirements (Ubuntu 16.04): + +### Ubuntu +Install system requirements (Ubuntu 18.04): ```sh sudo apt install libzbar-dev ``` @@ -35,12 +38,20 @@ garden install xcamera ``` Install zbarcam: +Via `garden`: +```sh +garden install --upgrade zbarcam +``` +Via `pip`: ```sh -garden install zbarcam +pip install --upgrade https://github.com/kivy-garden/garden.zbarcam/archive/develop.zip ``` You may also need to compile/install OpenCV manually, see [OpenCV.md](OpenCV.md). +### Android +Build for Android via buildozer, see [buildozer.spec](buildozer.spec). + ## Contribute To play with the project, install system dependencies and Python requirements using the [Makefile](Makefile). ```sh @@ -49,6 +60,7 @@ make Then verify everything is OK by running tests. ```sh make test +make uitest ``` ## Troubleshooting @@ -62,7 +74,7 @@ garden install xcamera ### Android `ValueError: Empty module name` More likely an import issue in your `.kv` file. Try to `from zbarcam import ZBarCam` in your `main.py` to see the exact error. -It's common to forget `pil` in `buildozer.spec` `requirements` section. +It's common to forget `Pillow` in `buildozer.spec` `requirements` section. ## Credits I borrowed a lot of code from [tito/android-zbar-qrcode](https://github.com/tito/android-zbar-qrcode). From 1ccfe3889d7f5b618b04cd9ff2f67afe873921f5 Mon Sep 17 00:00:00 2001 From: Andre Miras Date: Sun, 3 Mar 2019 02:54:50 +0100 Subject: [PATCH 15/19] Update Makefile and Dockerfile-linux, fixes #33 - makes sure all system deps are installed via Docker - fixes Makefile opencv deploy target --- .dockerignore | 1 + Makefile | 13 ++++++------- dockerfiles/Dockerfile-linux | 24 +++++++++++++++++------- 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/.dockerignore b/.dockerignore index 7313fd3..cfd2643 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,3 +1,4 @@ +bin/ venv/ .git/ .buildozer/ diff --git a/Makefile b/Makefile index 4ce170b..c769638 100644 --- a/Makefile +++ b/Makefile @@ -26,8 +26,8 @@ OPENCV_VERSION=4.0.1 OPENCV_ARCHIVE=$(OPENCV_BASENAME).tar.gz OPENCV_BASENAME=opencv-$(OPENCV_VERSION) OPENCV_BUILD_LIB_DIR=$(OPENCV_BASENAME)/build/lib -OPENCV_BUILD=$(OPENCV_BUILD_LIB_DIR)/cv2.so -OPENCV_DEPLOY=$(SITE_PACKAGES_DIR)/cv2.so +OPENCV_BUILD=$(OPENCV_BUILD_LIB_DIR)/python$(PYTHON_MAJOR_VERSION)/cv2*.so +OPENCV_DEPLOY=$(SITE_PACKAGES_DIR)/cv2*.so NPROC=`grep -c '^processor' /proc/cpuinfo` ifeq ($(PYTHON_MAJOR_VERSION), 3) PYTHON_M := $(PYTHON_M)m @@ -36,13 +36,15 @@ endif all: system_dependencies opencv virtualenv -virtualenv: +venv: test -d venv || virtualenv -p python$(PYTHON_MAJOR_VERSION) venv . venv/bin/activate $(PIP) install Cython==0.26.1 $(PIP) install -r requirements/requirements.txt $(GARDEN) install xcamera +virtualenv: venv + system_dependencies: ifeq ($(OS), Ubuntu) sudo apt install --yes --no-install-recommends $(SYSTEM_DEPENDENCIES) @@ -90,11 +92,8 @@ $(OPENCV_BUILD): $(OPENCV_ARCHIVE) -B$(OPENCV_BASENAME)/build -H$(OPENCV_BASENAME) cmake --build $(OPENCV_BASENAME)/build -- -j$(NPROC) -opencv_build: $(OPENCV_BUILD) - -$(OPENCV_DEPLOY): opencv_build virtualenv +$(OPENCV_DEPLOY): $(OPENCV_BUILD) virtualenv cp $(OPENCV_BUILD) $(SITE_PACKAGES_DIR) - cp $(OPENCV_BUILD_LIB_DIR)/python$(PYTHON_MAJOR_VERSION)/*.so $(SITE_PACKAGES_DIR) opencv: $(OPENCV_DEPLOY) diff --git a/dockerfiles/Dockerfile-linux b/dockerfiles/Dockerfile-linux index eaf01d5..e2780cc 100644 --- a/dockerfiles/Dockerfile-linux +++ b/dockerfiles/Dockerfile-linux @@ -26,13 +26,23 @@ ENV LANG="en_US.UTF-8" \ # install system dependencies RUN apt install --yes --no-install-recommends \ - python python-dev virtualenv make lsb-release pkg-config build-essential \ - sudo tox - -# install kivy system dependencies -# https://kivy.org/docs/installation/installation-linux.html#dependencies-with-sdl2 -RUN apt install --yes --no-install-recommends \ - libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev + build-essential \ + ccache \ + cmake \ + curl \ + libsdl2-dev \ + libsdl2-image-dev \ + libsdl2-mixer-dev \ + libsdl2-ttf-dev \ + libpython3.6-dev \ + lsb-release \ + make \ + pkg-config \ + python3 \ + python3-dev \ + sudo \ + tox \ + virtualenv # prepare non root env RUN useradd --create-home --shell /bin/bash ${USER} From b08dd01e37d0b5ebbe129526447be88422d5a54e Mon Sep 17 00:00:00 2001 From: Andre Miras Date: Sun, 3 Mar 2019 04:06:07 +0100 Subject: [PATCH 16/19] Additional deps fixes, refs #33 - makes sure venv (with numpy) are ready to build OpenCV - adds libzbar-dev system dep to Docker - s/zbarlight/pyzbar/ on setup.py - runs tox on Python3 --- Makefile | 7 ++++--- dockerfiles/Dockerfile-android | 2 +- dockerfiles/Dockerfile-linux | 1 + requirements/requirements.txt | 2 +- setup.py | 2 +- tox.ini | 2 +- 6 files changed, 9 insertions(+), 7 deletions(-) diff --git a/Makefile b/Makefile index c769638..5360553 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,6 @@ SYSTEM_DEPENDENCIES= \ libpython$(PYTHON_VERSION)-dev \ libsdl2-dev \ libzbar-dev \ - python-numpy \ tox \ virtualenv \ wget @@ -34,7 +33,7 @@ ifeq ($(PYTHON_MAJOR_VERSION), 3) endif -all: system_dependencies opencv virtualenv +all: system_dependencies virtualenv opencv venv: test -d venv || virtualenv -p python$(PYTHON_MAJOR_VERSION) venv @@ -54,7 +53,9 @@ $(OPENCV_ARCHIVE): curl --location https://github.com/opencv/opencv/archive/$(OPENCV_VERSION).tar.gz \ --progress-bar --output $(OPENCV_ARCHIVE) -$(OPENCV_BUILD): $(OPENCV_ARCHIVE) +# The build also relies on virtualenv, because we make references to it. +# Plus numpy is required to build OpenCV Python module. +$(OPENCV_BUILD): $(OPENCV_ARCHIVE) virtualenv tar -xf $(OPENCV_BASENAME).tar.gz cmake \ -D CMAKE_SHARED_LINKER_FLAGS=-l$(PYTHON_M) \ diff --git a/dockerfiles/Dockerfile-android b/dockerfiles/Dockerfile-android index e8c35bd..2460257 100644 --- a/dockerfiles/Dockerfile-android +++ b/dockerfiles/Dockerfile-android @@ -37,7 +37,7 @@ RUN apt install -qq --yes --no-install-recommends \ curl \ gettext \ libffi-dev \ - libltdl-dev \ + libltdl-dev \ libpython3.6-dev \ libtool \ file \ diff --git a/dockerfiles/Dockerfile-linux b/dockerfiles/Dockerfile-linux index e2780cc..e47af54 100644 --- a/dockerfiles/Dockerfile-linux +++ b/dockerfiles/Dockerfile-linux @@ -35,6 +35,7 @@ RUN apt install --yes --no-install-recommends \ libsdl2-mixer-dev \ libsdl2-ttf-dev \ libpython3.6-dev \ + libzbar-dev \ lsb-release \ make \ pkg-config \ diff --git a/requirements/requirements.txt b/requirements/requirements.txt index 9e27048..a36a298 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -3,4 +3,4 @@ pyzbar==0.1.8 https://github.com/kivy/kivy/archive/5fc5385.zip#egg=kivy Kivy-Garden==0.1.4 Pillow==5.2.0 -numpy==1.13.3 +numpy==1.16.1 diff --git a/setup.py b/setup.py index d0fde5c..28b66d6 100644 --- a/setup.py +++ b/setup.py @@ -9,4 +9,4 @@ url='https://github.com/AndreMiras/garden.zbarcam', packages=['zbarcam'], package_data={'zbarcam': ['*.kv']}, - install_requires=['zbarlight>=2.1', 'kivy', 'pillow', 'numpy']) + install_requires=['pyzbar', 'kivy', 'pillow', 'numpy']) diff --git a/tox.ini b/tox.ini index 7013c1a..1682167 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = pep8,isort-check,py2 +envlist = pep8,isort-check,py36 # no setup.py to be ran skipsdist = True # trick to enable pre-installation of Cython From d0cfda99de678c1bab8f0dfc58714ea881ee3a15 Mon Sep 17 00:00:00 2001 From: Andre Miras Date: Sun, 3 Mar 2019 17:01:59 +0100 Subject: [PATCH 17/19] Minor buildozer.spec cleaning Also added `android` dependency explicitly even though it's being pulled automatically via p4a master. --- buildozer.spec | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/buildozer.spec b/buildozer.spec index f7add57..62cb0b5 100644 --- a/buildozer.spec +++ b/buildozer.spec @@ -31,14 +31,13 @@ source.exclude_dirs = tests, bin, venv, opencv-* # version = 0.1 # (str) Application versioning (method 2) -# version.regex = __version__ = ['"](.*)['"] version.regex = __version__ = ['"](.*)['"] -# version.filename = %(source.dir)s/main.py version.filename = %(source.dir)s/zbarcam/version.py # (list) Application requirements # comma seperated e.g. requirements = sqlite3,kivy requirements = + android, kivy==5fc5385, libiconv, libzbar, @@ -166,7 +165,6 @@ android.accept_sdk_license = True #android.gradle_dependencies = # (str) python-for-android branch to use, defaults to master -#p4a.branch = stable p4a.branch = master # (str) OUYA Console category. Should be one of GAME or APP @@ -214,7 +212,6 @@ android.arch = armeabi-v7a # (str) The directory in which python-for-android should look for your own build recipes (if any) #p4a.local_recipes = -p4a.local_recipes = %(source.dir)s/python-for-android/recipes/ # (str) Filename to the hook for p4a #p4a.hook = From 663c71c5c10cffb5b7d198e2787977f8e76ef280 Mon Sep 17 00:00:00 2001 From: Andre Miras Date: Sun, 3 Mar 2019 17:16:28 +0100 Subject: [PATCH 18/19] Updates CHANGELOG.md --- CHANGELOG.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2fa437b..927bdff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,12 +2,12 @@ ## [Unreleased] - - Migrates from zbarlight to pyzbar - - Add Python3 support, refs #5 + - Add Python3.6 support, refs #5 - Fully migrated Android from PIL to Pillow, refs #13 - Handle Android runtime permissions, refs #30 - Fixe codes not detected on Android, refs #32 - - Update Make with Python3 and opencv 4 support, refs #33 + - Migrate from zbarlight to pyzbar, refs #32 + - Migrate to Python3.6 and opencv 4, refs #33 ## [20190223] From e7bf68ee60c680acdf70572ba32df3e0d8c91f23 Mon Sep 17 00:00:00 2001 From: Andre Miras Date: Sun, 3 Mar 2019 17:19:20 +0100 Subject: [PATCH 19/19] 20190303 --- CHANGELOG.md | 2 +- zbarcam/version.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 927bdff..7ba0054 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Change Log -## [Unreleased] +## [20190303] - Add Python3.6 support, refs #5 - Fully migrated Android from PIL to Pillow, refs #13 diff --git a/zbarcam/version.py b/zbarcam/version.py index 6b084ce..b9801a0 100644 --- a/zbarcam/version.py +++ b/zbarcam/version.py @@ -1 +1 @@ -__version__ = '2019.0223' +__version__ = '2019.0303'