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
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)
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)