def refresh_media():
    """
    Scan media upload folder and add any missing gallery items.
    """

    itemized = map(lambda o: o.file.path, MediaModel.objects.all())

    my_root = os.path.join(settings.MEDIA_ROOT, PHOTOLOGUE_DIR)
    for root, dirs, files in os.walk(my_root, followlinks=True):
        # First filter out cache and poster directories
        try:
            dirs.remove('cache')
            dirs.remove('poster')
        except:
            pass
        # Go througth files
        for fn in files:
            full = os.path.join(root, fn)
            if full in itemized:
                continue
            date_taken = datetime.fromtimestamp(os.path.getmtime(full))
            if not is_aware(date_taken):
                date_taken = make_aware(date_taken, get_current_timezone())

            # Next part is taken from process_zipfile
            filetype = False
            # Is it an image?
            try:
                trial_image = Image.open(full)
                trial_image.load()
                trial_image = Image.open(full)
                trial_image.verify()
                filetype = 'image'
            except Exception, e:
                pass
            # Is it a video?
            if not filetype:
                try:
                    sizes = video_info(full)
                    # Here comes a problem. If it is a jpeg image, it is
                    # detected as mjpeg movie...check if it least at least 1s long
                    if sizes[3] >= 1:
                        filetype = 'video'
                except Exception, e:
                    pass
            if not filetype:
                continue

            namebase, ext = os.path.splitext(fn)
            count = 0
            while 1:
                if count:
                    title = ''.join([namebase, '_'+str(count), ext])
                else:
                    title = fn
                slug = slugify(title)
                try:
                    p = GalleryItemBase.objects.get(title_slug=slug)
                except GalleryItemBase.DoesNotExist:
                    if filetype == 'image':
                        item = Photo(title=title,
                                  title_slug=slug)
                    elif filetype == 'video':
                        item = Video(title=title,
                                  title_slug=slug)
                    else:
                        raise Exception("Unknown file type")

                    # This will just update path in file entry 
                    move_file(item, full, full)
                    item.save()

                    if abs(item.date_taken - item.date_added) < timedelta(seconds=3):
                        item.date_taken = date_taken
                        item.save()
                    print "Added ", item.title, " - ", item.date_taken
                    break
                count = count + 1
Exemple #2
0
    def save(self, *args, **kwargs):
        if not self.date_taken and dateutil:
            # We have no access to any date information as
            # video files usually don't bundle it
            # all we can do is to try to get the date from filename
            date = None
            name = os.path.basename(self.file.path)
            name = name.rpartition('.')[0]
            # Try just whole name without extention
            try:
                date = parser.parse(name)
            except:
                pass
            # Try stripping the non-numeric start
            if not date:
                try:
                    for i in xrange(len(name)):
                        if name[i] in "0123456789":
                            name = name[i:]
                            break
                    date = parser.parse(name)
                except:
                    pass
            # We may have added _X, for some X as sequencial number, strip it
            if not date:
                try:
                    name = name.rpartition('_')[0]
                    date = parser.parse(name)
                except:
                    pass
            # Check is the date is sane
            if date and date > datetime.datetime(2000, 1, 1):
                # Win
                if not is_aware(date):
                    date = make_aware(date, get_current_timezone())
                self.date_taken = date
        # Add attribute if missing - we need it here
        prevent_cache_clear = getattr(self, 'prevent_cache_clear', False)
        # Do we have original?
        if not self._get_pk_val():
            orig = False
        else:
            try:
                orig = VideoModel.objects.get(id=self.videomodel_ptr_id)
            except VideoModel.DoesNotExist:
                orig = False

        # Have we changed the file?
        if orig and orig.file == self.file:
            self.prevent_cache_clear = True
        elif not prevent_cache_clear:
            if self.poster and not poster_unconverted(self.poster):
                # Change the file path
                self.poster.file = DEFAULT_POSTER_PATH
                # Save poster - this will delete old poster and clear cache
                self.poster.save()
            # Get the basic informations about the video
            info = video_info(self.file.path)
            self.width = info[0]
            self.height = info[1]
            self.duration = info[3]
            self.view_count = 0
        # Do we have poster?
        if not self.poster:
            poster = ImageModel(file=DEFAULT_POSTER_PATH)
            poster.save()
            self.poster = poster
        super(VideoModel, self).save(*args, **kwargs)
Exemple #3
0
        trial_image.verify()
        # Ok, It is an image
        filetype = 'image'
    except Exception, e:
        # if a "bad" file is found we just leave it.
        pass
    # Is it a video?
    if not filetype:
        try:
            if type(content) == str:
                inp = NamedTemporaryFile()
                inp.write(content)
            else:
                inp = content
            # Try to open this file as video and get sizes
            info = video_info(inp.name)
            # Ok, it is a video
            filetype = 'video'

            # Check for special camera files
            if original_name.lower().endswith(".mod") and retrieve_another:
                # Translate D -> I and d -> i
                moi_file = original_name[:-1] + chr(ord(original_name[-1]) + 5)
                # This may fail, but it is OK, we will just upload original MOD file
                moi_data = retrieve_another(moi_file)
                details = get_moi_details(moi_data)
                date_taken = make_aware(details['datetime'], get_current_timezone())
                if name == original_name:
                    name = "MOV-%s.MPG" % date_taken.strftime("%Y%m%d-%H%M%S")
                else:
                    namebase, ext = os.path.splitext(name)