Example #1
0
def convert_image(self, audiofile):
    path, ext = splitfilename(audiofile.filename)

    if audiofile.tags:
        for k in audiofile.tags:
            if k == "APIC:thumbnail":
                with open("{}.thumb2".format(path), "wb") as fout:
                    fout.write(audiofile.tags[k].data)

                pic = Image.open(path + ".thumb2")
                width = pic.size[0]
                height = pic.size[1]

                if width > height:
                    newwidth = 320
                    newheight = height * newwidth / width
                else:
                    newheight = 320
                    newwidth = width * newheight / height
                pic = pic.resize((newwidth, newheight), Image.ANTIALIAS)
                pic.save(path + ".thumb2", "jpeg")
                self.files.append(
                    File(path + ".thumb2", "presentation",
                         audiofile.tags[k].mime))
                break
Example #2
0
def makePresentationFormat(self, audiofile):
    path, ext = splitfilename(audiofile.filename)

    if audiofile.tags:
        for k in audiofile.tags:
            if k == "APIC:thumbnail":
                fout = open(path + ".thumb2", "wb")
                fout.write(audiofile.tags[k].data)
                fout.close()

                pic = Image.open(path + ".thumb2")
                width = pic.size[0]
                height = pic.size[1]

                if width > height:
                    newwidth = 320
                    newheight = height * newwidth / width
                else:
                    newheight = 320
                    newwidth = width * newheight / height
                pic = pic.resize((newwidth, newheight), Image.ANTIALIAS)
                pic.save(path + ".thumb2", "jpeg")
                self.addFile(
                    FileNode(name=path + ".thumb2",
                             type="presentation",
                             mimetype=audiofile.tags[k].mime))
                break
Example #3
0
def makeAudioThumb(self, audiofile):
    ret = None
    path, ext = splitfilename(audiofile.abspath)
    if not audiofile.abspath.endswith(".mp3"):
        ret = path + ".mp3"
        utils.process.call(("lame", "-V", "4", "-q", audiofile.abspath, ret))
    self.files.append(File(path + ".mp3", "mp3", "audio/mpeg"))
    return ret
Example #4
0
def makeAudioThumb(self, audiofile):
    ret = None
    path, ext = splitfilename(audiofile.abspath)
    if not audiofile.abspath.endswith(".mp3"):
        ret = path + ".mp3"
        utils.process.call(("lame", "-V", "4", "-q", audiofile.abspath, ret))
    self.files.append(File(path + ".mp3", "mp3", "audio/mpeg"))
    return ret
Example #5
0
def makeAudioThumb(self, audiofile):
    ret = None
    path, ext = splitfilename(audiofile.retrieveFile())
    if not audiofile.retrieveFile().endswith(".mp3"):
        os.system("lame -V 4 -q %s %s" % (audiofile.retrieveFile(), path + ".mp3"))
        ret = path + ".mp3"
    self.addFile(FileNode(name=path + ".mp3", type="mp3", mimetype="audio/mpeg"))
    return ret
Example #6
0
    def event_files_changed(self):
        for f in self.getFiles():
            if f.type in ["thumb", "presentation"]:
                self.removeFile(f)

        nodefiles = self.getFiles()
        if len(nodefiles) == 1 and nodefiles[0].mimetype == "video/quicktime":
            if nodefiles[0].retrieveFile().endswith('.mov'):  # handle mov -> flv
                flvname = "%sflv" % nodefiles[0].retrieveFile()[:-3]
                ret = os.system("ffmpeg -loglevel quiet -i %s -ar 44100 -ab 128 -f flv %s" % (nodefiles[0].retrieveFile(), flvname))
                if ret & 0xff00:
                    return
                self.addFile(FileNode(name=flvname, type="video", mimetype="video/x-flv"))

        #fetch tags to be omitted
        unwanted_attrs = self.unwanted_attributes()

        for f in self.getFiles():
            if f.type in["original", "video"]:
                if f.mimetype == "video/x-flv":
                    meta = FLVReader(f.retrieveFile())
                    for key in meta:
                        if any(tag in key for tag in unwanted_attrs):
                                continue
                        try:
                            self.set(key, int(meta[key]))
                        except:
                            self.set(key, meta[key])

                    self.set("vid-width", self.get("width"))
                    self.set("vid-height", self.get("height"))

                    tempname = os.path.join(config.get("paths.tempdir"), "tmp.gif")
                    try:
                        os.unlink(tempname)
                    except:
                        pass

                    try:
                        if self.get("system.thumbframe") != "":
                            cmd = "ffmpeg -loglevel quiet  -ss %s -i %s -vframes 1 -pix_fmt rgb24 %s" % (
                                self.get("system.thumbframe"), f.retrieveFile(), tempname)
                        else:
                            cmd = "ffmpeg -loglevel quiet -i %s -vframes 1 -pix_fmt rgb24 %s" % (f.retrieveFile(), tempname)
                        ret = os.system(cmd)
                        if ret & 0xff00:
                            return
                    except:
                        return
                    path, ext = splitfilename(f.retrieveFile())
                    thumbname = path + ".thumb"
                    thumbname2 = path + ".thumb2"
                    makeThumbNail(tempname, thumbname)
                    makePresentationFormat(tempname, thumbname2)
                    self.addFile(FileNode(name=thumbname, type="thumb", mimetype="image/jpeg"))
                    self.addFile(FileNode(name=thumbname2, type="presentation", mimetype="image/jpeg"))
Example #7
0
 def processMediaFile(self, dest):
     for nfile in self.files:
         if nfile.filetype == "video":
             filename = nfile.abspath
             path, ext = splitfilename(filename)
             try:
                 shutil.copy(filename, dest)
             except:
                 logg.exception("copying file")
     return 1
Example #8
0
 def processMediaFile(self, dest):
     for nfile in self.files:
         if nfile.filetype == "video":
             filename = nfile.abspath
             path, ext = splitfilename(filename)
             try:
                 shutil.copy(filename, dest)
             except:
                 logg.exception("copying file")
     return 1
Example #9
0
def makeAudioThumb(self, audiofile):
    ret = None
    path, ext = splitfilename(audiofile.retrieveFile())
    if not audiofile.retrieveFile().endswith(".mp3"):
        os.system("lame -V 4 -q %s %s" %
                  (audiofile.retrieveFile(), path + ".mp3"))
        ret = path + ".mp3"
    self.addFile(
        FileNode(name=path + ".mp3", type="mp3", mimetype="audio/mpeg"))
    return ret
Example #10
0
 def processMediaFile(self, dest):
     for file in self.files:
         if file.getType() == "audio":
             filename = file.abspath
             path, ext = splitfilename(filename)
             try:
                 shutil.copy(filename, dest)
             except:
                 logg.exception("file copy")
     return 1
Example #11
0
 def processMediaFile(self, dest):
     for file in self.files:
         if file.getType() == "audio":
             filename = file.abspath
             path, ext = splitfilename(filename)
             try:
                 shutil.copy(filename, dest)
             except:
                 logg.exception("file copy")
     return 1
Example #12
0
 def processMediaFile(self, dest):
     for file in self.getFiles():
         if file.getType() == "audio":
             filename = file.retrieveFile()
             path, ext = splitfilename(filename)
             if os.sep == '/':
                 ret = os.system("cp %s %s" % (filename, dest))
             else:
                 cmd = "copy %s %s%s.%s" % (filename, dest, self.id, ext)
                 ret = os.system(cmd.replace('/', '\\'))
     return 1
Example #13
0
 def processMediaFile(self, dest):
     for file in self.getFiles():
         if file.getType() == "audio":
             filename = file.retrieveFile()
             path, ext = splitfilename(filename)
             if os.sep == '/':
                 ret = os.system("cp %s %s" % (filename, dest))
             else:
                 cmd = "copy %s %s%s.%s" % (filename, dest, self.id, ext)
                 ret = os.system(cmd.replace('/', '\\'))
     return 1
Example #14
0
    def event_metafield_changed(self, node, field):
        if "image" in node.type:
            items = node.items()
            # check if there is an original file and modify it in case
            for f in node.getFiles():
                if f.type == "original":
                    path, ext = splitfilename(f.retrieveFile())
                    pngname = path + "_wm.jpg"

                    for file in node.getFiles():
                        if file.getType() == "original_wm":
                            node.removeFile(file)
                            break
                    self.watermark(f.retrieveFile(), pngname, node.get(field.getName()), 0.6)
                    node.addFile(FileNode(name=pngname, type="original_wm", mimetype="image/jpeg"))
                    print "watermark created for original file"
Example #15
0
    def event_metafield_changed(self, node, field):
        if "image" in node.type:
            items = node.attrs.items()
            # check if there is an original file and modify it in case
            for f in node.getFiles():
                if f.type == "original":
                    path, ext = splitfilename(f.abspath)
                    pngname = path + "_wm.jpg"

                    for file in node.getFiles():
                        if file.getType() == "original_wm":
                            node.files.remove(file)
                            break
                    self.watermark(f.abspath, pngname, node.get(field.getName()), 0.6)
                    node.files.append(File(pngname, "original_wm", "image/jpeg"))
                    db.session.commit()
                    logg.info("watermark created for original file")
Example #16
0
    def event_metafield_changed(self, node, field):
        if "image" in node.type:
            items = node.items()
            # check if there is an original file and modify it in case
            for f in node.getFiles():
                if f.type == "original":
                    path, ext = splitfilename(f.retrieveFile())
                    pngname = path + "_wm.jpg"

                    for file in node.getFiles():
                        if file.getType() == "original_wm":
                            node.removeFile(file)
                            break
                    self.watermark(f.retrieveFile(), pngname,
                                   node.get(field.getName()), 0.6)
                    node.addFile(
                        FileNode(name=pngname,
                                 type="original_wm",
                                 mimetype="image/jpeg"))
                    print "watermark created for original file"
Example #17
0
def makeThumbNail(self, audiofile):
    path, ext = splitfilename(audiofile.filename)

    if audiofile.tags:
        for k in audiofile.tags:
            if k == "APIC:thumbnail":
                fout = open(path + ".thumb", "wb")
                fout.write(audiofile.tags[k].data)
                fout.close()

                pic = Image.open(path + ".thumb2")
                width = pic.size[0]
                height = pic.size[1]

                if width > height:
                    newwidth = 128
                    newheight = height * newwidth / width
                else:
                    newheight = 128
                    newwidth = width * newheight / height
                pic = pic.resize((newwidth, newheight), Image.ANTIALIAS)
                pic.save(path + ".thumb", "jpeg")
                pic = pic.resize((newwidth, newheight), Image.ANTIALIAS)
                im = Image.new(pic.mode, (128, 128), (255, 255, 255))

                x = (128 - newwidth) / 2
                y = (128 - newheight) / 2
                im.paste(pic, (x, y, x + newwidth, y + newheight))

                draw = ImageDraw.ImageDraw(im)
                draw.line([(0, 0), (127, 0), (127, 127), (0, 127), (0, 0)],
                          (128, 128, 128))

                im = im.convert("RGB")
                im.save(path + ".thumb", "jpeg")

                self.addFile(
                    FileNode(name=path + ".thumb",
                             type="thumb",
                             mimetype=audiofile.tags[k].mime))
                break
Example #18
0
def make_thumbnail_image(self, audiofile):
    path, ext = splitfilename(audiofile.filename)

    if audiofile.tags:
        for k in audiofile.tags:
            if k == "APIC:thumbnail":
                with open("{}.thumb".format(path), "wb") as fout:
                    fout.write(audiofile.tags[k].data)

                pic = Image.open(path + ".thumb2")
                width = pic.size[0]
                height = pic.size[1]

                if width > height:
                    newwidth = 128
                    newheight = height * newwidth / width
                else:
                    newheight = 128
                    newwidth = width * newheight / height
                pic = pic.resize((newwidth, newheight), Image.ANTIALIAS)
                pic.save(path + ".thumb", "jpeg")
                pic = pic.resize((newwidth, newheight), Image.ANTIALIAS)
                im = Image.new(pic.mode, (128, 128), (255, 255, 255))

                x = (128 - newwidth) / 2
                y = (128 - newheight) / 2
                im.paste(pic, (x, y, x + newwidth, y + newheight))

                draw = ImageDraw.ImageDraw(im)
                draw.line([(0, 0), (127, 0), (127, 127), (0, 127), (0, 0)],
                          (128, 128, 128))

                im = im.convert("RGB")
                im.save(path + ".thumb", "jpeg")

                self.files.append(
                    File(path + ".thumb", "thumb", audiofile.tags[k].mime))
                break
Example #19
0
def convert_image(self, audiofile):
    path, ext = splitfilename(audiofile.filename)

    if audiofile.tags:
        for k in audiofile.tags:
            if k == "APIC:thumbnail":
                with open("{}.thumb2".format(path), "wb") as fout:
                    fout.write(audiofile.tags[k].data)

                pic = Image.open(path + ".thumb2")
                width = pic.size[0]
                height = pic.size[1]

                if width > height:
                    newwidth = 320
                    newheight = height * newwidth / width
                else:
                    newheight = 320
                    newwidth = width * newheight / height
                pic = pic.resize((newwidth, newheight), Image.ANTIALIAS)
                pic.save(path + ".thumb2", "jpeg")
                self.files.append(File(path + ".thumb2", "presentation", audiofile.tags[k].mime))
                break
Example #20
0
def makeThumbNail(self, audiofile):
    path, ext = splitfilename(audiofile.filename)

    if audiofile.tags:
        for k in audiofile.tags:
            if k == "APIC:thumbnail":
                fout = open(path + ".thumb", "wb")
                fout.write(audiofile.tags[k].data)
                fout.close()

                pic = Image.open(path + ".thumb2")
                width = pic.size[0]
                height = pic.size[1]

                if width > height:
                    newwidth = 128
                    newheight = height * newwidth / width
                else:
                    newheight = 128
                    newwidth = width * newheight / height
                pic = pic.resize((newwidth, newheight), Image.ANTIALIAS)
                pic.save(path + ".thumb", "jpeg")
                pic = pic.resize((newwidth, newheight), Image.ANTIALIAS)
                im = Image.new(pic.mode, (128, 128), (255, 255, 255))

                x = (128 - newwidth) / 2
                y = (128 - newheight) / 2
                im.paste(pic, (x, y, x + newwidth, y + newheight))

                draw = ImageDraw.ImageDraw(im)
                draw.line([(0, 0), (127, 0), (127, 127), (0, 127), (0, 0)], (128, 128, 128))

                im = im.convert("RGB")
                im.save(path + ".thumb", "jpeg")

                self.addFile(FileNode(name=path + ".thumb", type="thumb", mimetype=audiofile.tags[k].mime))
                break
Example #21
0
def makePresentationFormat(self, audiofile):
    path, ext = splitfilename(audiofile.filename)

    if audiofile.tags:
        for k in audiofile.tags:
            if k == "APIC:thumbnail":
                fout = open(path + ".thumb2", "wb")
                fout.write(audiofile.tags[k].data)
                fout.close()

                pic = Image.open(path + ".thumb2")
                width = pic.size[0]
                height = pic.size[1]

                if width > height:
                    newwidth = 320
                    newheight = height * newwidth / width
                else:
                    newheight = 320
                    newwidth = width * newheight / height
                pic = pic.resize((newwidth, newheight), Image.ANTIALIAS)
                pic.save(path + ".thumb2", "jpeg")
                self.addFile(FileNode(name=path + ".thumb2", type="presentation", mimetype=audiofile.tags[k].mime))
                break
Example #22
0
def make_thumbnail_image(self, audiofile):
    path, ext = splitfilename(audiofile.filename)

    if audiofile.tags:
        for k in audiofile.tags:
            if k == "APIC:thumbnail":
                with open("{}.thumb".format(path), "wb") as fout:
                    fout.write(audiofile.tags[k].data)

                pic = Image.open(path + ".thumb2")
                width = pic.size[0]
                height = pic.size[1]

                if width > height:
                    newwidth = 128
                    newheight = height * newwidth / width
                else:
                    newheight = 128
                    newwidth = width * newheight / height
                pic = pic.resize((newwidth, newheight), Image.ANTIALIAS)
                pic.save(path + ".thumb", "jpeg")
                pic = pic.resize((newwidth, newheight), Image.ANTIALIAS)
                im = Image.new(pic.mode, (128, 128), (255, 255, 255))

                x = (128 - newwidth) / 2
                y = (128 - newheight) / 2
                im.paste(pic, (x, y, x + newwidth, y + newheight))

                draw = ImageDraw.ImageDraw(im)
                draw.line([(0, 0), (127, 0), (127, 127), (0, 127), (0, 0)], (128, 128, 128))

                im = im.convert("RGB")
                im.save(path + ".thumb", "jpeg")

                self.files.append(File(path + ".thumb", "thumb", audiofile.tags[k].mime))
                break
Example #23
0
    def event_files_changed(self):
        logg.debug("Postprocessing node %s", self.id)

        thumb = 0
        fulltext = 0
        doc = None
        present = 0
        fileinfo = 0
        for f in self.files:
            if f.type == "thumb":
                thumb = 1
            elif f.type.startswith("present"):
                present = 1
            elif f.type == "fulltext":
                fulltext = 1
            elif f.type == "fileinfo":
                fileinfo = 1
            elif f.type == "document":
                doc = f
        if not doc:
            for f in self.files:
                if f.type == "thumb":
                    self.files.remove(f)
                elif f.type.startswith("present"):
                    self.files.remove(f)
                elif f.type == "fileinfo":
                    self.files.remove(f)
                elif f.type == "fulltext":
                    self.files.remove(f)

        #fetch unwanted tags to be omitted
        unwanted_attrs = self.get_unwanted_exif_attributes()

        if doc:
            path, ext = splitfilename(doc.abspath)

            if not (thumb and present and fulltext and fileinfo):
                thumbname = path + ".thumb"
                thumb2name = path + ".thumb2"
                fulltextname = path + ".txt"
                infoname = path + ".info"
                tempdir = config.get("paths.tempdir")

                try:
                    pdfdata = parsepdf.parsePDFExternal(doc.abspath, tempdir)
                except parsepdf.PDFException as ex:
                    if ex.value == 'error:document encrypted':
                        # allow upload of encrypted document
                        db.session.commit()
                        return
                    raise OperationException(ex.value)
                with codecs.open(infoname, "rb", encoding='utf8') as fi:
                    for line in fi.readlines():
                        i = line.find(':')
                        if i > 0:
                            if any(tag in line[0:i].strip().lower() for tag in unwanted_attrs):
                                continue
                            self.set("pdf_" + line[0:i].strip().lower(), utf8_decode_escape(line[i + 1:].strip()))

                self.files.append(File(thumbname, "thumb", "image/jpeg"))
                self.files.append(File(thumb2name, "presentation", "image/jpeg"))
                self.files.append(File(fulltextname, "fulltext", "text/plain"))
                self.files.append(File(infoname, "fileinfo", "text/plain"))

        if doc:
            import_node_fulltext(self, overwrite=True)

        db.session.commit()
Example #24
0
    def event_files_changed(self):
        print "Postprocessing node", self.id
        if "image" in self.type:
            for f in self.getFiles():
                if f.getName().lower().endswith('svg'):
                    self.svg_to_png(f.retrieveFile(), f.retrieveFile()[:-4] + ".png")
                    self.removeFile(f)
                    self.addFile(FileNode(name=f.retrieveFile(), type="original", mimetype=f.mimetype))
                    self.addFile(FileNode(name=f.retrieveFile(), type="image", mimetype=f.mimetype))
                    self.addFile(FileNode(name=f.retrieveFile()[:-4] + ".png", type="tmppng", mimetype="image/png"))
                    break
            orig = 0
            thumb = 0
            for f in self.getFiles():
                if f.type == "original":
                    orig = 1
                if f.type == "thumb":
                    thumb = 1

            if orig == 0:
                for f in self.getFiles():
                    if f.type == "image":

                        if f.mimetype == "image/tiff" or ((f.mimetype is None or f.mimetype == "application/x-download")
                                                          and (f.getName().lower().endswith("tif") or f.getName().lower().endswith("tiff"))):

                            # move old file to "original", create a new png to be used as "image"
                            self.removeFile(f)

                            path, ext = splitfilename(f.retrieveFile())
                            pngname = path + ".png"

                            if not os.path.isfile(pngname):
                                makeOriginalFormat(f.retrieveFile(), pngname)

                                width, height = getImageDimensions(pngname)
                                self.set("width", width)
                                self.set("height", height)

                            else:
                                width, height = getImageDimensions(pngname)
                                self.set("width", width)
                                self.set("height", height)

                            print 'png name/path: ', pngname

                            self.addFile(FileNode(name=pngname, type="image", mimetype="image/png"))
                            self.addFile(FileNode(name=f.retrieveFile(), type="original", mimetype="image/tiff"))
                            break
                        else:
                            self.addFile(FileNode(name=f.retrieveFile(), type="original", mimetype=f.mimetype))

            # retrieve technical metadata.
            for f in self.getFiles():
                if (f.type == "image" and not f.getName().lower().endswith("svg")) or f.type == "tmppng":
                    width, height = getImageDimensions(f.retrieveFile())
                    self.set("origwidth", width)
                    self.set("origheight", height)
                    self.set("origsize", f.getSize())

                    if f.mimetype == "image/jpeg":
                        self.set("jpg_comment", iso2utf8(getJpegSection(f.retrieveFile(), 0xFE).strip()))

            if thumb == 0:
                for f in self.getFiles():
                    if (f.type == "image" and not f.getName().lower().endswith("svg")) or f.type == "tmppng":
                        path, ext = splitfilename(f.retrieveFile())
                        basename = hashlib.md5(str(random.random())).hexdigest()[0:8]

                        # path = os.path.join(getImportDir(),os.path.basename(path))
                        path = os.path.join(getImportDir(), basename)

                        thumbname = path + ".thumb"
                        thumbname2 = path + ".thumb2"

                        print 'tumb: ', thumbname
                        print 'presentation: ', thumbname2

                        assert not os.path.isfile(thumbname)
                        assert not os.path.isfile(thumbname2)
                        width, height = getImageDimensions(f.retrieveFile())
                        makeThumbNail(f.retrieveFile(), thumbname)
                        makePresentationFormat(f.retrieveFile(), thumbname2)
                        if f.mimetype is None:
                            if f.getName().lower().endswith("jpg"):
                                f.mimetype = "image/jpeg"
                            else:
                                f.mimetype = "image/tiff"
                        self.addFile(FileNode(name=thumbname, type="thumb", mimetype="image/jpeg"))
                        self.addFile(FileNode(name=thumbname2, type="presentation", mimetype="image/jpeg"))
                        self.set("width", width)
                        self.set("height", height)

            #fetch unwanted tags to be omitted
            unwanted_attrs = self.unwanted_attributes()

            # Exif
            try:
                from lib.Exif import EXIF
                files = self.getFiles()

                for file in files:
                    if file.type == "original":
                        f = open(file.retrieveFile(), 'rb')
                        tags = EXIF.process_file(f)
                        tags.keys().sort()

                        for k in tags.keys():
                            # don't set unwanted exif attributes
                            if any(tag in k for tag in unwanted_attrs):
                                continue
                            if tags[k] != "" and k != "JPEGThumbnail":
                                self.set("exif_" + k.replace(" ", "_"),
                                         utf8_decode_escape(str(tags[k])))
                            elif k == "JPEGThumbnail":
                                if tags[k] != "":
                                    self.set("Thumbnail", "True")
                                else:
                                    self.set("Thumbnail", "False")

            except:
                None

            if dozoom(self) == 1:
                tileok = 0
                for f in self.getFiles():
                    if f.type.startswith("tile"):
                        tileok = 1
                if not tileok and self.get("width") and self.get("height"):
                    zoom.getImage(self.id, 1)

            # iptc
            try:
                from lib.iptc import IPTC
                files = self.getFiles()

                for file in files:
                    if file.type == "original":
                        tags = IPTC.getIPTCValues(file.retrieveFile())
                        tags.keys().sort()
                        for k in tags.keys():
                            # skip unknown iptc tags
                            if 'IPTC_' in k:
                                continue
                            if any(tag in k for tag in unwanted_attrs):
                                continue
                            if isinstance(tags[k], list):
                                tags[k] = ', '.join(tags[k])
                            if tags[k] != "":
                                self.set("iptc_" + k.replace(" ", "_"),
                                         utf8_decode_escape(str(tags[k])))
            except:
                None

            for f in self.getFiles():
                if f.getName().lower().endswith("png") and f.type == "tmppng":
                    self.removeFile(f)
                    break
Example #25
0
    def event_files_changed(self):
        print "Postprocessing node", self.id
        if "image" in self.type:
            for f in self.getFiles():
                if f.getName().lower().endswith('svg'):
                    self.svg_to_png(f.retrieveFile(),
                                    f.retrieveFile()[:-4] + ".png")
                    self.removeFile(f)
                    self.addFile(
                        FileNode(name=f.retrieveFile(),
                                 type="original",
                                 mimetype=f.mimetype))
                    self.addFile(
                        FileNode(name=f.retrieveFile(),
                                 type="image",
                                 mimetype=f.mimetype))
                    self.addFile(
                        FileNode(name=f.retrieveFile()[:-4] + ".png",
                                 type="tmppng",
                                 mimetype="image/png"))
                    break
            orig = 0
            thumb = 0
            for f in self.getFiles():
                if f.type == "original":
                    orig = 1
                if f.type == "thumb":
                    thumb = 1
            if orig == 0:
                for f in self.getFiles():
                    if f.type == "image":
                        if f.mimetype == "image/tiff" or (
                            (f.mimetype is None
                             or f.mimetype == "application/x-download") and
                            (f.getName().lower().endswith("tif")
                             or f.getName().lower().endswith("tiff"))):
                            # move old file to "original", create a new png to be used as "image"
                            self.removeFile(f)

                            path, ext = splitfilename(f.retrieveFile())
                            pngname = path + ".png"
                            if not os.path.isfile(pngname):
                                makeOriginalFormat(f.retrieveFile(), pngname)

                                width, height = getImageDimensions(pngname)
                                self.set("width", width)
                                self.set("height", height)

                            else:
                                width, height = getImageDimensions(pngname)
                                self.set("width", width)
                                self.set("height", height)

                            self.addFile(
                                FileNode(name=pngname,
                                         type="image",
                                         mimetype="image/png"))
                            self.addFile(
                                FileNode(name=f.retrieveFile(),
                                         type="original",
                                         mimetype="image/tiff"))
                            break
                        else:
                            self.addFile(
                                FileNode(name=f.retrieveFile(),
                                         type="original",
                                         mimetype=f.mimetype))

            # retrieve technical metadata.
            for f in self.getFiles():
                if (f.type == "image"
                        and not f.getName().lower().endswith("svg")
                    ) or f.type == "tmppng":
                    width, height = getImageDimensions(f.retrieveFile())
                    self.set("origwidth", width)
                    self.set("origheight", height)
                    self.set("origsize", f.getSize())

                    if f.mimetype == "image/jpeg":
                        self.set(
                            "jpg_comment",
                            iso2utf8(
                                getJpegSection(f.retrieveFile(),
                                               0xFE).strip()))

            if thumb == 0:
                for f in self.getFiles():
                    if (f.type == "image"
                            and not f.getName().lower().endswith("svg")
                        ) or f.type == "tmppng":
                        path, ext = splitfilename(f.retrieveFile())
                        basename = hashlib.md5(str(
                            random.random())).hexdigest()[0:8]

                        #path = os.path.join(getImportDir(),os.path.basename(path))
                        path = os.path.join(getImportDir(), basename)

                        thumbname = path + ".thumb"
                        thumbname2 = path + ".thumb2"

                        assert not os.path.isfile(thumbname)
                        assert not os.path.isfile(thumbname2)
                        width, height = getImageDimensions(f.retrieveFile())
                        makeThumbNail(f.retrieveFile(), thumbname)
                        makePresentationFormat(f.retrieveFile(), thumbname2)
                        if f.mimetype is None:
                            if f.getName().lower().endswith("jpg"):
                                f.mimetype = "image/jpeg"
                            else:
                                f.mimetype = "image/tiff"
                        self.addFile(
                            FileNode(name=thumbname,
                                     type="thumb",
                                     mimetype="image/jpeg"))
                        self.addFile(
                            FileNode(name=thumbname2,
                                     type="presentation",
                                     mimetype="image/jpeg"))
                        self.set("width", width)
                        self.set("height", height)

            #fetch unwanted tags to be omitted
            unwanted_attrs = self.unwanted_attributes()

            # Exif
            try:
                from lib.Exif import EXIF
                files = self.getFiles()

                for file in files:
                    if file.type == "original":
                        f = open(file.retrieveFile(), 'rb')
                        tags = EXIF.process_file(f)
                        tags.keys().sort()

                        for k in tags.keys():
                            # don't set unwanted exif attributes
                            if any(tag in k for tag in unwanted_attrs):
                                continue
                            if tags[k] != "" and k != "JPEGThumbnail":
                                self.set("exif_" + k.replace(" ", "_"),
                                         utf8_decode_escape(str(tags[k])))
                            elif k == "JPEGThumbnail":
                                if tags[k] != "":
                                    self.set("Thumbnail", "True")
                                else:
                                    self.set("Thumbnail", "False")

            except:
                None

            if dozoom(self) == 1:
                tileok = 0
                for f in self.getFiles():
                    if f.type.startswith("tile"):
                        tileok = 1
                if not tileok and self.get("width") and self.get("height"):
                    zoom.getImage(self.id, 1)

            # iptc
            try:
                from lib.iptc import IPTC
                files = self.getFiles()

                for file in files:
                    if file.type == "original":
                        tags = IPTC.getIPTCValues(file.retrieveFile())
                        tags.keys().sort()
                        for k in tags.keys():
                            # skip unknown iptc tags
                            if 'IPTC_' in k:
                                continue
                            if any(tag in k for tag in unwanted_attrs):
                                continue
                            if isinstance(tags[k], list):
                                tags[k] = ', '.join(tags[k])
                            if tags[k] != "":
                                self.set("iptc_" + k.replace(" ", "_"),
                                         utf8_decode_escape(str(tags[k])))
            except:
                None

            for f in self.getFiles():
                if f.getName().lower().endswith("png") and f.type == "tmppng":
                    self.removeFile(f)
                    break
Example #26
0
    def event_files_changed(self):
        logg.debug("Postprocessing node %s", self.id)

        thumb = 0
        fulltext = 0
        doc = None
        present = 0
        fileinfo = 0
        for f in self.files:
            if f.type == "thumb":
                thumb = 1
            elif f.type.startswith("present"):
                present = 1
            elif f.type == "fulltext":
                fulltext = 1
            elif f.type == "fileinfo":
                fileinfo = 1
            elif f.type == "document":
                doc = f
        if not doc:
            for f in self.files:
                if f.type == "thumb":
                    self.files.remove(f)
                elif f.type.startswith("present"):
                    self.files.remove(f)
                elif f.type == "fileinfo":
                    self.files.remove(f)
                elif f.type == "fulltext":
                    self.files.remove(f)

        #fetch unwanted tags to be omitted
        unwanted_attrs = self.get_unwanted_exif_attributes()

        if doc:
            path, ext = splitfilename(doc.abspath)

            if not (thumb and present and fulltext and fileinfo):
                thumbname = path + ".thumb"
                thumb2name = path + ".thumb2"
                fulltextname = path + ".txt"
                infoname = path + ".info"
                tempdir = config.get("paths.tempdir")

                try:
                    pdfdata = parsepdf.parsePDFExternal(doc.abspath, tempdir)
                except parsepdf.PDFException as ex:
                    if ex.value == 'error:document encrypted':
                        # allow upload of encrypted document
                        db.session.commit()
                        return
                    raise OperationException(ex.value)
                with codecs.open(infoname, "rb", encoding='utf8') as fi:
                    for line in fi.readlines():
                        i = line.find(':')
                        if i > 0:
                            if any(tag in line[0:i].strip().lower()
                                   for tag in unwanted_attrs):
                                continue
                            self.set("pdf_" + line[0:i].strip().lower(),
                                     utf8_decode_escape(line[i + 1:].strip()))

                self.files.append(File(thumbname, "thumb", "image/jpeg"))
                self.files.append(
                    File(thumb2name, "presentation", "image/jpeg"))
                self.files.append(File(fulltextname, "fulltext", "text/plain"))
                self.files.append(File(infoname, "fileinfo", "text/plain"))

        if doc:
            import_node_fulltext(self, overwrite=True)

        db.session.commit()
Example #27
0
    def event_files_changed(self):
        print "Postprocessing node", self.id

        thumb = 0
        fulltext = 0
        doc = None
        present = 0
        fileinfo = 0
        for f in self.getFiles():
            if f.type == "thumb":
                thumb = 1
            elif f.type.startswith("present"):
                present = 1
            elif f.type == "fulltext":
                fulltext = 1
            elif f.type == "fileinfo":
                fileinfo = 1
            elif f.type == "doc":
                doc = f
            elif f.type == "document":
                doc = f
        if not doc:
            for f in self.getFiles():
                if f.type == "thumb":
                    self.removeFile(f)
                elif f.type.startswith("present"):
                    self.removeFile(f)
                elif f.type == "fileinfo":
                    self.removeFile(f)
                elif f.type == "fulltext":
                    self.removeFile(f)

        #fetch unwated tags to be omitted
        unwanted_attrs = self.unwanted_attributes()

        if doc:
            path, ext = splitfilename(doc.retrieveFile())

            if not (thumb and present and fulltext and fileinfo):
                thumbname = path + ".thumb"
                thumb2name = path + ".thumb2"
                fulltextname = path + ".txt"
                infoname = path + ".info"
                tempdir = config.get("paths.tempdir")

                try:
                    pdfdata = parsepdf.parsePDF2(doc.retrieveFile(), tempdir)
                except parsepdf.PDFException as ex:
                    raise OperationException(ex.value)
                fi = open(infoname, "rb")
                for line in fi.readlines():
                    i = line.find(':')
                    if i > 0:
                        if any(tag in line[0:i].strip().lower() for tag in unwanted_attrs):
                                continue
                        self.set("pdf_" + line[0:i].strip().lower(), utf8_decode_escape(line[i + 1:].strip()))
                fi.close()
                self.addFile(FileNode(name=thumbname, type="thumb", mimetype="image/jpeg"))
                self.addFile(FileNode(name=thumb2name, type="presentation", mimetype="image/jpeg"))
                self.addFile(FileNode(name=fulltextname, type="fulltext", mimetype="text/plain"))
                self.addFile(FileNode(name=infoname, type="fileinfo", mimetype="text/plain"))
Example #28
0
    def event_files_changed(self):
        for f in self.getFiles():
            if f.type in ["thumb", "presentation"]:
                self.removeFile(f)

        nodefiles = self.getFiles()
        if len(nodefiles) == 1 and nodefiles[0].mimetype == "video/quicktime":
            if nodefiles[0].retrieveFile().endswith(
                    '.mov'):  # handle mov -> flv
                flvname = "%sflv" % nodefiles[0].retrieveFile()[:-3]
                ret = os.system(
                    "ffmpeg -loglevel quiet -i %s -ar 44100 -ab 128 -f flv %s"
                    % (nodefiles[0].retrieveFile(), flvname))
                if ret & 0xff00:
                    return
                self.addFile(
                    FileNode(name=flvname,
                             type="video",
                             mimetype="video/x-flv"))

        #fetch tags to be omitted
        unwanted_attrs = self.unwanted_attributes()

        for f in self.getFiles():
            if f.type in ["original", "video"]:
                if f.mimetype == "video/x-flv":
                    meta = FLVReader(f.retrieveFile())
                    for key in meta:
                        if any(tag in key for tag in unwanted_attrs):
                            continue
                        try:
                            self.set(key, int(meta[key]))
                        except:
                            self.set(key, meta[key])

                    self.set("vid-width", self.get("width"))
                    self.set("vid-height", self.get("height"))

                    tempname = os.path.join(config.get("paths.tempdir"),
                                            "tmp.gif")
                    try:
                        os.unlink(tempname)
                    except:
                        pass

                    try:
                        if self.get("system.thumbframe") != "":
                            cmd = "ffmpeg -loglevel quiet  -ss %s -i %s -vframes 1 -pix_fmt rgb24 %s" % (
                                self.get("system.thumbframe"),
                                f.retrieveFile(), tempname)
                        else:
                            cmd = "ffmpeg -loglevel quiet -i %s -vframes 1 -pix_fmt rgb24 %s" % (
                                f.retrieveFile(), tempname)
                        ret = os.system(cmd)
                        if ret & 0xff00:
                            return
                    except:
                        return
                    path, ext = splitfilename(f.retrieveFile())
                    thumbname = path + ".thumb"
                    thumbname2 = path + ".thumb2"
                    makeThumbNail(tempname, thumbname)
                    makePresentationFormat(tempname, thumbname2)
                    self.addFile(
                        FileNode(name=thumbname,
                                 type="thumb",
                                 mimetype="image/jpeg"))
                    self.addFile(
                        FileNode(name=thumbname2,
                                 type="presentation",
                                 mimetype="image/jpeg"))
Example #29
0
    def event_files_changed(self):
        print "Postprocessing node", self.id
        if "image" in self.type:
            for f in self.getFiles():
                if f.getName().lower().endswith('svg'):
                    self.svg_to_png(f.retrieveFile(), f.retrieveFile()[:-4] + ".png")
                    self.removeFile(f)
                    self.addFile(FileNode(name=f.retrieveFile(), type="original", mimetype=f.mimetype))
                    self.addFile(FileNode(name=f.retrieveFile(), type="image", mimetype=f.mimetype))
                    self.addFile(FileNode(name=f.retrieveFile()[:-4] + ".png", type="tmppng", mimetype="image/png"))
                    break
            orig = 0
            thumb = 0
            for f in self.getFiles():
                if f.type == "original":
                    orig = 1
                if f.type == "thumb":
                    thumb = 1

            if orig == 0:
                for f in self.getFiles():
                    if f.type == "image":
                        if f.mimetype == "image/tiff" or ((f.mimetype is None or f.mimetype == "application/x-download")
                                                          and (f.getName().lower().endswith("tif") or f.getName().lower().endswith("tiff"))):

                            # move old file to "original", create a new png to be used as "image"
                            self.removeFile(f)

                            path, ext = splitfilename(f.retrieveFile())
                            pngname = path + ".png"

                            if not os.path.isfile(pngname):
                                makeOriginalFormat(f.retrieveFile(), pngname)

                                width, height = getImageDimensions(pngname)
                                self.set("width", width)
                                self.set("height", height)

                            else:
                                width, height = getImageDimensions(pngname)
                                self.set("width", width)
                                self.set("height", height)

                            print 'png: ', pngname

                            self.addFile(FileNode(name=pngname, type="image", mimetype="image/png"))
                            self.addFile(FileNode(name=f.retrieveFile(), type="original", mimetype="image/tiff"))
                            break
                        else:
                            self.addFile(FileNode(name=f.retrieveFile(), type="original", mimetype=f.mimetype))

            # retrieve technical metadata.
            for f in self.getFiles():
                if (f.type == "image" and not f.getName().lower().endswith("svg")) or f.type == "tmppng":
                    width, height = getImageDimensions(f.retrieveFile())
                    self.set("origwidth", width)
                    self.set("origheight", height)
                    self.set("origsize", f.getSize())

                    if f.mimetype == "image/jpeg":
                        self.set("jpg_comment", iso2utf8(getJpegSection(f.retrieveFile(), 0xFE).strip()))

            if thumb == 0:
                for f in self.getFiles():
                    if (f.type == "image" and not f.getName().lower().endswith("svg")) or f.type == "tmppng":
                        basename = hashlib.md5(str(random.random())).hexdigest()[0:8]

                        path = os.path.join(getImportDir(), basename)

                        thumbname = path + ".thumb"
                        thumbname2 = path + ".thumb2"

                        print 'tumb: ', thumbname
                        print 'presentation: ', thumbname2

                        assert not os.path.isfile(thumbname)
                        assert not os.path.isfile(thumbname2)
                        width, height = getImageDimensions(f.retrieveFile())
                        makeThumbNail(f.retrieveFile(), thumbname)
                        makePresentationFormat(f.retrieveFile(), thumbname2)
                        if f.mimetype is None:
                            if f.getName().lower().endswith("jpg"):
                                f.mimetype = "image/jpeg"
                            else:
                                f.mimetype = "image/tiff"
                        self.addFile(FileNode(name=thumbname, type="thumb", mimetype="image/jpeg"))
                        self.addFile(FileNode(name=thumbname2, type="presentation", mimetype="image/jpeg"))
                        self.set("width", width)
                        self.set("height", height)

            # fetch unwanted tags to be omitted
            unwanted_attrs = self.unwanted_attributes()

            # Exif
            try:
                files = self.getFiles()

                for file in files:
                    if file.type == "original":
                        f = open(file.retrieveFile(), 'rb')
                        tags = EXIF.process_file(f)
                        tags.keys().sort()

                        for k in tags.keys():
                            # don't set unwanted exif attributes
                            if any(tag in k for tag in unwanted_attrs):
                                continue
                            if tags[k] != "" and k != "JPEGThumbnail":
                                self.set("exif_" + k.replace(" ", "_"),
                                         utf8_decode_escape(str(tags[k])))
                            elif k == "JPEGThumbnail":
                                if tags[k] != "":
                                    self.set("Thumbnail", "True")
                                else:
                                    self.set("Thumbnail", "False")
            except:
                None

            if dozoom(self) == 1:
                tileok = 0
                for f in self.getFiles():
                    if f.type.startswith("tile"):
                        tileok = 1
                if not tileok and self.get("width") and self.get("height"):
                    zoom.getImage(self.id, 1)

            for f in self.getFiles():
                if f.getType() == 'original':

                    wanted_tags = lib.iptc.IPTC.get_wanted_iptc_tags()

                    tags_in_upload = lib.iptc.IPTC.get_iptc_values(f.retrieveFile(), wanted_tags)

                    with_value = []
                    for field in getMetaType(self.getSchema()).getMetaFields():
                        if field.get('type') == "meta" and len(field.getValueList()) > 1:
                            value = self.get('iptc_{}'.format(field.getName()))

                            if len(value) > 0:
                                with_value.append(field.getName())

                    if tags_in_upload:
                        for key in tags_in_upload.keys():
                            if tags_in_upload[key] != '':

                                if key not in with_value:
                                    self.set('iptc_{}'.format(key.replace(' ', '_')),
                                             tags_in_upload[key])

            for f in self.getFiles():
                if f.getName().lower().endswith("png") and f.type == "tmppng":
                    self.removeFile(f)
                    break
Example #30
0
    def event_files_changed(self):
        print "Postprocessing node", self.id

        thumb = 0
        fulltext = 0
        doc = None
        present = 0
        fileinfo = 0
        for f in self.getFiles():
            if f.type == "thumb":
                thumb = 1
            elif f.type.startswith("present"):
                present = 1
            elif f.type == "fulltext":
                fulltext = 1
            elif f.type == "fileinfo":
                fileinfo = 1
            elif f.type == "doc":
                doc = f
            elif f.type == "document":
                doc = f
        if not doc:
            for f in self.getFiles():
                if f.type == "thumb":
                    self.removeFile(f)
                elif f.type.startswith("present"):
                    self.removeFile(f)
                elif f.type == "fileinfo":
                    self.removeFile(f)
                elif f.type == "fulltext":
                    self.removeFile(f)

        #fetch unwated tags to be omitted
        unwanted_attrs = self.unwanted_attributes()

        if doc:
            path, ext = splitfilename(doc.retrieveFile())

            if not (thumb and present and fulltext and fileinfo):
                thumbname = path + ".thumb"
                thumb2name = path + ".thumb2"
                fulltextname = path + ".txt"
                infoname = path + ".info"
                tempdir = config.get("paths.tempdir")

                try:
                    pdfdata = parsepdf.parsePDF2(doc.retrieveFile(), tempdir)
                except parsepdf.PDFException as ex:
                    raise OperationException(ex.value)
                fi = open(infoname, "rb")
                for line in fi.readlines():
                    i = line.find(':')
                    if i > 0:
                        if any(tag in line[0:i].strip().lower()
                               for tag in unwanted_attrs):
                            continue
                        self.set("pdf_" + line[0:i].strip().lower(),
                                 utf8_decode_escape(line[i + 1:].strip()))
                fi.close()
                self.addFile(
                    FileNode(name=thumbname,
                             type="thumb",
                             mimetype="image/jpeg"))
                self.addFile(
                    FileNode(name=thumb2name,
                             type="presentation",
                             mimetype="image/jpeg"))
                self.addFile(
                    FileNode(name=fulltextname,
                             type="fulltext",
                             mimetype="text/plain"))
                self.addFile(
                    FileNode(name=infoname,
                             type="fileinfo",
                             mimetype="text/plain"))