Release: 8ad0730237b133d3d03c875bf7f97bba
This commit is contained in:
parent
aa39140bc8
commit
1c06aab615
26
__init__.py
26
__init__.py
@ -24,8 +24,9 @@ media (Media Tools)
|
||||
"""
|
||||
__DEPENDENCIES__ = []
|
||||
|
||||
import io
|
||||
import logging
|
||||
from PIL import Image, ImageEnhance
|
||||
from PIL import Image, ImageEnhance, ExifTags
|
||||
|
||||
logger_name = 'MEDIA'
|
||||
logger = logging.getLogger(logger_name)
|
||||
@ -106,6 +107,13 @@ class image(object):
|
||||
self._im = get_pil_image(media_instance)
|
||||
if self._im is None:
|
||||
return False
|
||||
try:
|
||||
self._exif = dict(self._im._getexif().items())
|
||||
except AttributeError:
|
||||
self._exif = {}
|
||||
if type(self._im) is not Image.Image:
|
||||
self._im = self._im.copy()
|
||||
logger.debug('loading image from %s', repr(media_instance))
|
||||
return True
|
||||
|
||||
def save(self, full_path):
|
||||
@ -119,6 +127,12 @@ class image(object):
|
||||
im.save(fh, 'JPEG')
|
||||
return True
|
||||
|
||||
def image_data(self):
|
||||
im = self._im.copy().convert('RGB')
|
||||
output = io.BytesIO()
|
||||
im.save(output, format='JPEG')
|
||||
return output.getvalue()
|
||||
|
||||
def resize(self, max_size):
|
||||
if self._im is None:
|
||||
logger.warning('No image available to be resized')
|
||||
@ -130,11 +144,19 @@ class image(object):
|
||||
self._im = self._im.resize((int(x * float(max_size) / xy_max), int(y * float(max_size) / xy_max)), Image.NEAREST).rotate(0)
|
||||
return True
|
||||
|
||||
def rotate_by_orientation(self, orientation):
|
||||
def rotate_by_orientation(self, orientation=None):
|
||||
if self._im is None:
|
||||
logger.warning('No image available, rotation not possible')
|
||||
return False
|
||||
|
||||
if orientation is None:
|
||||
exif_tags = dict((v, k) for k, v in ExifTags.TAGS.items())
|
||||
try:
|
||||
orientation = self._exif[exif_tags['Orientation']]
|
||||
logger.debug("No orientation given, orientation %s extract from exif data", repr(orientation))
|
||||
except KeyError:
|
||||
return False
|
||||
|
||||
if orientation == ORIENTATION_HALF_ROTATED:
|
||||
angle = 180
|
||||
elif orientation == ORIENTATION_LEFT_ROTATED:
|
||||
|
@ -1,23 +1,23 @@
|
||||
<?xml version="1.0" ?>
|
||||
<coverage branch-rate="0.9643" branches-covered="81" branches-valid="84" complexity="0" line-rate="0.9759" lines-covered="324" lines-valid="332" timestamp="1580584174451" version="4.5">
|
||||
<coverage branch-rate="0.9667" branches-covered="87" branches-valid="90" complexity="0" line-rate="0.9775" lines-covered="347" lines-valid="355" timestamp="1580683820455" version="4.5">
|
||||
<!-- Generated by coverage.py: https://coverage.readthedocs.io -->
|
||||
<!-- Based on https://raw.githubusercontent.com/cobertura/web/master/htdocs/xml/coverage-04.dtd -->
|
||||
<sources/>
|
||||
<packages>
|
||||
<package branch-rate="0.9643" complexity="0" line-rate="0.9759" name=".user_data.data.dirk.prj.unittest.media.pylibs.media">
|
||||
<package branch-rate="0.9667" complexity="0" line-rate="0.9775" name=".user_data.data.dirk.prj.unittest.media.pylibs.media">
|
||||
<classes>
|
||||
<class branch-rate="0.9737" complexity="0" filename="/user_data/data/dirk/prj/unittest/media/pylibs/media/__init__.py" line-rate="0.9924" name="__init__.py">
|
||||
<class branch-rate="0.9773" complexity="0" filename="/user_data/data/dirk/prj/unittest/media/pylibs/media/__init__.py" line-rate="0.9934" name="__init__.py">
|
||||
<methods/>
|
||||
<lines>
|
||||
<line hits="1" number="4"/>
|
||||
<line hits="1" number="25"/>
|
||||
<line hits="1" number="27"/>
|
||||
<line hits="1" number="28"/>
|
||||
<line hits="1" number="30"/>
|
||||
<line hits="1" number="29"/>
|
||||
<line hits="1" number="31"/>
|
||||
<line hits="1" number="34"/>
|
||||
<line hits="1" number="37"/>
|
||||
<line hits="1" number="41"/>
|
||||
<line hits="1" number="32"/>
|
||||
<line hits="1" number="35"/>
|
||||
<line hits="1" number="38"/>
|
||||
<line hits="1" number="42"/>
|
||||
<line hits="1" number="43"/>
|
||||
<line hits="1" number="44"/>
|
||||
@ -40,106 +40,126 @@
|
||||
<line hits="1" number="61"/>
|
||||
<line hits="1" number="62"/>
|
||||
<line hits="1" number="63"/>
|
||||
<line hits="1" number="66"/>
|
||||
<line hits="1" number="64"/>
|
||||
<line hits="1" number="67"/>
|
||||
<line hits="1" number="68"/>
|
||||
<line hits="1" number="70"/>
|
||||
<line branch="true" condition-coverage="100% (2/2)" hits="1" number="72"/>
|
||||
<line hits="1" number="73"/>
|
||||
<line branch="true" condition-coverage="100% (2/2)" hits="1" number="74"/>
|
||||
<line hits="1" number="75"/>
|
||||
<line branch="true" condition-coverage="100% (2/2)" hits="1" number="76"/>
|
||||
<line hits="1" number="77"/>
|
||||
<line hits="1" number="79"/>
|
||||
<line hits="1" number="82"/>
|
||||
<line hits="1" number="69"/>
|
||||
<line hits="1" number="71"/>
|
||||
<line branch="true" condition-coverage="100% (2/2)" hits="1" number="73"/>
|
||||
<line hits="1" number="74"/>
|
||||
<line branch="true" condition-coverage="100% (2/2)" hits="1" number="75"/>
|
||||
<line hits="1" number="76"/>
|
||||
<line branch="true" condition-coverage="100% (2/2)" hits="1" number="77"/>
|
||||
<line hits="1" number="78"/>
|
||||
<line hits="1" number="80"/>
|
||||
<line hits="1" number="83"/>
|
||||
<line hits="1" number="84"/>
|
||||
<line hits="1" number="85"/>
|
||||
<line hits="1" number="86"/>
|
||||
<line hits="1" number="87"/>
|
||||
<line hits="1" number="89"/>
|
||||
<line hits="1" number="88"/>
|
||||
<line hits="1" number="90"/>
|
||||
<line hits="1" number="91"/>
|
||||
<line hits="1" number="92"/>
|
||||
<line hits="1" number="93"/>
|
||||
<line hits="1" number="96"/>
|
||||
<line hits="1" number="94"/>
|
||||
<line hits="1" number="97"/>
|
||||
<line branch="true" condition-coverage="100% (2/2)" hits="1" number="98"/>
|
||||
<line hits="1" number="99"/>
|
||||
<line hits="1" number="101"/>
|
||||
<line hits="1" number="103"/>
|
||||
<line hits="1" number="98"/>
|
||||
<line branch="true" condition-coverage="100% (2/2)" hits="1" number="99"/>
|
||||
<line hits="1" number="100"/>
|
||||
<line hits="1" number="102"/>
|
||||
<line hits="1" number="104"/>
|
||||
<line hits="1" number="106"/>
|
||||
<line branch="true" condition-coverage="100% (2/2)" hits="1" number="107"/>
|
||||
<line hits="1" number="108"/>
|
||||
<line hits="1" number="105"/>
|
||||
<line hits="1" number="107"/>
|
||||
<line branch="true" condition-coverage="100% (2/2)" hits="1" number="108"/>
|
||||
<line hits="1" number="109"/>
|
||||
<line hits="1" number="110"/>
|
||||
<line hits="1" number="111"/>
|
||||
<line branch="true" condition-coverage="100% (2/2)" hits="1" number="112"/>
|
||||
<line hits="1" number="112"/>
|
||||
<line hits="1" number="113"/>
|
||||
<line hits="1" number="114"/>
|
||||
<line branch="true" condition-coverage="100% (2/2)" hits="1" number="114"/>
|
||||
<line hits="1" number="115"/>
|
||||
<line hits="1" number="116"/>
|
||||
<line hits="1" number="117"/>
|
||||
<line hits="1" number="118"/>
|
||||
<line hits="1" number="119"/>
|
||||
<line hits="1" number="120"/>
|
||||
<line branch="true" condition-coverage="100% (2/2)" hits="1" number="120"/>
|
||||
<line hits="1" number="121"/>
|
||||
<line hits="1" number="122"/>
|
||||
<line branch="true" condition-coverage="100% (2/2)" hits="1" number="123"/>
|
||||
<line hits="1" number="124"/>
|
||||
<line hits="1" number="125"/>
|
||||
<line hits="1" number="126"/>
|
||||
<line hits="1" number="127"/>
|
||||
<line hits="1" number="128"/>
|
||||
<line hits="1" number="129"/>
|
||||
<line hits="1" number="130"/>
|
||||
<line hits="1" number="131"/>
|
||||
<line hits="1" number="132"/>
|
||||
<line hits="1" number="133"/>
|
||||
<line branch="true" condition-coverage="100% (2/2)" hits="1" number="134"/>
|
||||
<line hits="1" number="135"/>
|
||||
<line hits="1" number="134"/>
|
||||
<line hits="1" number="136"/>
|
||||
<line branch="true" condition-coverage="100% (2/2)" hits="1" number="138"/>
|
||||
<line branch="true" condition-coverage="100% (2/2)" hits="1" number="137"/>
|
||||
<line hits="1" number="138"/>
|
||||
<line hits="1" number="139"/>
|
||||
<line branch="true" condition-coverage="100% (2/2)" hits="1" number="140"/>
|
||||
<line hits="1" number="141"/>
|
||||
<line branch="true" condition-coverage="100% (2/2)" hits="1" number="142"/>
|
||||
<line hits="1" number="142"/>
|
||||
<line hits="1" number="143"/>
|
||||
<line hits="1" number="144"/>
|
||||
<line hits="1" number="145"/>
|
||||
<line hits="1" number="146"/>
|
||||
<line hits="1" number="147"/>
|
||||
<line hits="1" number="148"/>
|
||||
<line branch="true" condition-coverage="100% (2/2)" hits="1" number="148"/>
|
||||
<line hits="1" number="149"/>
|
||||
<line hits="1" number="151"/>
|
||||
<line hits="1" number="152"/>
|
||||
<line hits="1" number="150"/>
|
||||
<line branch="true" condition-coverage="100% (2/2)" hits="1" number="152"/>
|
||||
<line branch="true" condition-coverage="100% (2/2)" hits="1" number="153"/>
|
||||
<line hits="1" number="154"/>
|
||||
<line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="158" number="155"/>
|
||||
<line hits="1" number="155"/>
|
||||
<line hits="1" number="156"/>
|
||||
<line hits="0" number="158"/>
|
||||
<line hits="1" number="157"/>
|
||||
<line hits="1" number="158"/>
|
||||
<line branch="true" condition-coverage="100% (2/2)" hits="1" number="160"/>
|
||||
<line hits="1" number="161"/>
|
||||
<line hits="1" number="162"/>
|
||||
<line branch="true" condition-coverage="100% (2/2)" hits="1" number="162"/>
|
||||
<line hits="1" number="163"/>
|
||||
<line branch="true" condition-coverage="100% (2/2)" hits="1" number="164"/>
|
||||
<line hits="1" number="165"/>
|
||||
<line branch="true" condition-coverage="100% (2/2)" hits="1" number="166"/>
|
||||
<line hits="1" number="167"/>
|
||||
<line hits="1" number="168"/>
|
||||
<line hits="1" number="169"/>
|
||||
<line hits="1" number="170"/>
|
||||
<line hits="1" number="172"/>
|
||||
<line hits="1" number="171"/>
|
||||
<line hits="1" number="173"/>
|
||||
<line hits="1" number="174"/>
|
||||
<line hits="1" number="176"/>
|
||||
<line hits="1" number="179"/>
|
||||
<line branch="true" condition-coverage="100% (2/2)" hits="1" number="181"/>
|
||||
<line hits="1" number="182"/>
|
||||
<line branch="true" condition-coverage="100% (2/2)" hits="1" number="183"/>
|
||||
<line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="180" number="177"/>
|
||||
<line hits="1" number="178"/>
|
||||
<line hits="0" number="180"/>
|
||||
<line branch="true" condition-coverage="100% (2/2)" hits="1" number="182"/>
|
||||
<line hits="1" number="183"/>
|
||||
<line hits="1" number="184"/>
|
||||
<line branch="true" condition-coverage="100% (2/2)" hits="1" number="185"/>
|
||||
<line hits="1" number="186"/>
|
||||
<line branch="true" condition-coverage="100% (2/2)" hits="1" number="187"/>
|
||||
<line hits="1" number="188"/>
|
||||
<line branch="true" condition-coverage="100% (2/2)" hits="1" number="189"/>
|
||||
<line hits="1" number="187"/>
|
||||
<line branch="true" condition-coverage="100% (2/2)" hits="1" number="188"/>
|
||||
<line hits="1" number="189"/>
|
||||
<line hits="1" number="190"/>
|
||||
<line hits="1" number="192"/>
|
||||
<line hits="1" number="193"/>
|
||||
<line hits="1" number="194"/>
|
||||
<line hits="1" number="195"/>
|
||||
<line hits="1" number="196"/>
|
||||
<line hits="1" number="198"/>
|
||||
<line hits="1" number="201"/>
|
||||
<line branch="true" condition-coverage="100% (2/2)" hits="1" number="203"/>
|
||||
<line hits="1" number="204"/>
|
||||
<line branch="true" condition-coverage="100% (2/2)" hits="1" number="205"/>
|
||||
<line hits="1" number="206"/>
|
||||
<line branch="true" condition-coverage="100% (2/2)" hits="1" number="207"/>
|
||||
<line hits="1" number="208"/>
|
||||
<line branch="true" condition-coverage="100% (2/2)" hits="1" number="209"/>
|
||||
<line hits="1" number="210"/>
|
||||
<line branch="true" condition-coverage="100% (2/2)" hits="1" number="211"/>
|
||||
<line hits="1" number="212"/>
|
||||
<line hits="1" number="214"/>
|
||||
<line hits="1" number="215"/>
|
||||
<line hits="1" number="217"/>
|
||||
<line hits="1" number="218"/>
|
||||
<line hits="1" number="220"/>
|
||||
</lines>
|
||||
</class>
|
||||
<class branch-rate="1" complexity="0" filename="/user_data/data/dirk/prj/unittest/media/pylibs/media/common.py" line-rate="1" name="common.py">
|
||||
@ -197,7 +217,7 @@
|
||||
<line hits="1" number="35"/>
|
||||
</lines>
|
||||
</class>
|
||||
<class branch-rate="0.9667" complexity="0" filename="/user_data/data/dirk/prj/unittest/media/pylibs/media/metadata.py" line-rate="0.9808" name="metadata.py">
|
||||
<class branch-rate="0.9667" complexity="0" filename="/user_data/data/dirk/prj/unittest/media/pylibs/media/metadata.py" line-rate="0.9811" name="metadata.py">
|
||||
<methods/>
|
||||
<lines>
|
||||
<line hits="1" number="1"/>
|
||||
@ -334,28 +354,31 @@
|
||||
<line branch="true" condition-coverage="100% (2/2)" hits="1" number="194"/>
|
||||
<line hits="1" number="195"/>
|
||||
<line hits="1" number="196"/>
|
||||
<line hits="1" number="197"/>
|
||||
<line hits="1" number="198"/>
|
||||
<line hits="1" number="199"/>
|
||||
<line hits="1" number="200"/>
|
||||
<line hits="1" number="201"/>
|
||||
<line hits="1" number="202"/>
|
||||
<line hits="1" number="203"/>
|
||||
<line hits="1" number="204"/>
|
||||
<line hits="1" number="205"/>
|
||||
<line hits="1" number="206"/>
|
||||
<line hits="1" number="207"/>
|
||||
<line branch="true" condition-coverage="100% (2/2)" hits="1" number="208"/>
|
||||
<line hits="1" number="208"/>
|
||||
<line hits="1" number="209"/>
|
||||
<line hits="1" number="210"/>
|
||||
<line hits="1" number="211"/>
|
||||
<line branch="true" condition-coverage="100% (2/2)" hits="1" number="211"/>
|
||||
<line hits="1" number="212"/>
|
||||
<line hits="1" number="213"/>
|
||||
<line hits="1" number="214"/>
|
||||
<line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="exit" number="215"/>
|
||||
<line hits="1" number="215"/>
|
||||
<line hits="1" number="216"/>
|
||||
<line hits="1" number="217"/>
|
||||
<line hits="1" number="218"/>
|
||||
<line branch="true" condition-coverage="50% (1/2)" hits="1" missing-branches="exit" number="218"/>
|
||||
<line hits="1" number="219"/>
|
||||
<line hits="1" number="220"/>
|
||||
<line hits="1" number="221"/>
|
||||
<line hits="1" number="222"/>
|
||||
<line hits="1" number="223"/>
|
||||
<line hits="1" number="224"/>
|
||||
<line hits="1" number="225"/>
|
||||
<line hits="1" number="226"/>
|
||||
<line hits="1" number="227"/>
|
||||
</lines>
|
||||
</class>
|
||||
</classes>
|
||||
|
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@ -14,7 +14,7 @@ def get_pil_image(media_instance):
|
||||
if type(media_instance) == str:
|
||||
ft = common.get_filetype(media_instance)
|
||||
if ft == common.FILETYPE_IMAGE:
|
||||
return Image.open(media_instance).copy()
|
||||
return Image.open(media_instance)
|
||||
elif ft == common.FILETYPE_VIDEO:
|
||||
if platform.system() == 'Linux':
|
||||
cmd = 'ffmpeg -ss 0.5 -i "' + media_instance + '" -vframes 1 -f image2pipe pipe:1 2> /dev/null'
|
||||
|
@ -193,7 +193,10 @@ def __int_conv__(value):
|
||||
p = value.find(c)
|
||||
if p >= 0:
|
||||
value = value[:p]
|
||||
return int(value)
|
||||
try:
|
||||
return int(value)
|
||||
except ValueError:
|
||||
return None
|
||||
|
||||
|
||||
def __num_denum_conv__(data):
|
||||
|
Loading…
x
Reference in New Issue
Block a user