Chandan Pitta wrote:
> Looks right. Hopefully we are done here...

Me too, I had detected your frustration :)

Duncan
> 
> 
> On 1/3/07, Duncan Webb <[EMAIL PROTECTED]> wrote:
>> Chandan Pitta wrote:
>>> Ok I made the changes just apply the patch and it should make use of
>>> the fileops.py now.
>>>
>>> However I am having doubts regarding the scaling using imlib2. Look at
>>> snapshot4.png and you will see that the images seem to be stretched
>>> out.
>>> I am using imlib2 v1.3 and giflib v4.1.4 with
>>> WWW_IMAGE_THUMBNAIL_SIZE = (200, 100)
>>>
>>> If I use
>>> WWW_IMAGE_THUMBNAIL_SIZE = (200, 200)
>>> then I get what you see in snapshot5.png. Are you sure that the scale
>>> maintains aspect?
>> I agree, it doesn't look like it is. This is really a problem to be
>> solved in kaa.imlib2, or in the worst case in cache_www_image. Don't
>> worry, your code won't be lost just moved to where is should really go.
>>
>> The size that is returned from cache_www_image is not used and so I've
>> done some changes to use the size that is returned and added a function
>> cache_www_image_size for this.
>>
>>   scaled_image_path = util.cache_www_thumbnail_path(item)
>>   if not os.path.exists(scaled_image_path):
>>     size = util.cache_www_image(item)
>>   else:
>>     size = util.cache_www_image_size(item)
>>   image_link = self.convert_dir(filepath)
>>
>> Let me know if this is incorrect; Jason should fix kaa.imlib2.
>>
>> Cheers,
>> Duncan
>>
>>> Chandan
>>>
>>>
>>>
>>> On 1/3/07, Duncan Webb <[EMAIL PROTECTED]> wrote:
>>>> Chandan Pitta wrote:
>>>>> Code reuse is always good. But once again the question arises, how
>>>>> does freevo handle changes to WWW_IMAGE_THUMBNAIL_SIZE if images are
>>>>> already cached. I am guessing we may need another function in
>>>>> fileops.py like
>>>> freevo cache --rebuild should do it. It may not work until I've done the
>>>> code to delete files from the cache.
>>>>
>>>>> def is_image_cached(scaled_image_path):
>>>>>     new_size = config.WWW_IMAGE_THUMBNAIL_SIZE
>>>>>     new_size = self.get_fit_to_rectangle_size(size, new_size)
>>>>>     create_scaled_image = False
>>>>>     if os.path.exists(scaled_image_path):
>>>>>         # if the scaled image already exists then make sure it is
>>>>> scaled to the correct size
>>>>>         new_image = imlib2.open(scaled_image_path)
>>>>>         if new_image.width != new_size[0] or new_image.height !=
>>>> new_size[1]:
>>>>>             os.remove(scaled_image_path)
>>>>>             create_scaled_image = True
>>>>>     else:
>>>>>         create_scaled_image = True
>>>>>     return !create_scaled_image
>>>>>
>>>>> You will also want to add the timestamp check in the above function.
>>>>> And this is what we need to do both with freevo cache and webserver
>>>>>
>>>>> thumb_filename = util.cache_www_thumbnail_path(filename)
>>>>> if not util.is_image_cached(thumb_filename):
>>>>>     util.cache_www_image(filename)
>>>>>
>>>>> But if I were to do it, I would actually drag the checking for
>>>>> accuracy of the thumbnail into cache_www_image(filename). That way
>>>>> cache_www_thumbnail_path() is called only once and the main program
>>>>> will only have to do
>>>> Doesn't matter it's upto kaa.imlib2 to do this, less work for the
>>>> webserver.
>>>>
>>>>> util.cache_www_image(filename)
>>>>>
>>>>> And the function will cache if there is no cached image or original
>>>>> image has changed or WWW_IMAGE_THUMBNAIL_SIZE has changed. It will do
>>>>> nothing otherwise. The caller will never have to know. Or we can add a
>>>>> return which tells the caller if a cached image is created or not. Let
>>>>> me know what you think
>>>> Lets not try to change the design of cache, it would lead to too many
>>>> changes. Cache only works on time stamps and the version of the cache
>>>> generators.
>>>>
>>>> I don't expect people to change WWW_IMAGE_THUMBNAIL_SIZE much if at all.
>>>> so a cache rebuild is fine.
>>>>
>>>> Duncan
>>>>
>>>>> On 1/2/07, Duncan Webb <[EMAIL PROTECTED]> wrote:
>>>>>> Chandan Pitta wrote:
>>>>>>> Try this patch.
>>>>>> Patch worked fine now in svn rel-1 at r8917
>>>>>>
>>>>>> I have these functions in util.fileops.py which is now updated from
>>>> the
>>>>>> patch you have sent. They is called when "freevo cache" is run.
>>>>>>
>>>>>> def cache_www_thumbnail_path(filename):
>>>>>>     '''returns the path to the thumbnail image for a given filename
>>>>>>     '''
>>>>>>     file_ext_index = filename.rindex(".")
>>>>>>     file_ext = filename[file_ext_index:].lower()
>>>>>>     if file_ext == ".gif":
>>>>>>         file_ext += ".jpg"
>>>>>>     imagepath = filename[:file_ext_index].replace("/", "_") + file_ext
>>>>>>     thumb_path = os.path.join(www_image_cachedir(), imagepath)
>>>>>>     return thumb_path
>>>>>>
>>>>>> def cache_www_image(filename):
>>>>>>     '''creates a webserver thumbnail image and returns its size.
>>>>>>     '''
>>>>>>     thumb_path = www_cache_thumbnail_path(filename)
>>>>>>     image = imlib2.open(filename)
>>>>>>     thumb =
>>>> image.scale_preserve_aspect(config.WWW_IMAGE_THUMBNAIL_SIZE)
>>>>>>     thumb.save(thumb_path)
>>>>>>     return thumb.size
>>>>>>
>>>>>> What this means is that we're not quite finished yet :( sorry. Cache
>>>>>> needs to cache every image, size doesn't matter it's determined by the
>>>>>> timestamp between the original item and the cached item.
>>>>>>
>>>>>> The functions is called like this:
>>>>>>         sinfo = os.stat(filename)
>>>>>>         thumb = util.cache_www_thumbnail_path(filename)
>>>>>>         try:
>>>>>>             if os.stat(thumb)[stat.ST_MTIME] > sinfo[stat.ST_MTIME]:
>>>>>>                 files.remove(filename)
>>>>>>         except OSError:
>>>>>>             pass
>>>>>>
>>>>> I am assuming this is a code you came up with and did not actually
>>>>> commit to svn? Seems like you are checking to see if the thumbnail
>>>>> timestamp > original image TS then you delete the original file? The
>>>>> condition should be reversed and the thumnail image has to be deleted
>>>>> not the original right?
>>>>>
>>>>> Frankly I do not mind doing the code over as long as it is cleaner and
>>>>> more maintainable.
>>>>>
>>>>> Regards
>>>>> Chandan
>>>>>
>>>>>
>>>>>> All this means it that it makes this code simpler, you don't need to
>>>>>> worry about threshold sizes or aspect ratios, the helper functions in
>>>>>> util.fileops does this for you.
>>>>>>
>>>>>> So the library.rpy only needs to check if the
>>>>>> cache_www_thumbnail_path(path) exist and if not call
>>>>>> cache_www_image(thumb_path).
>>>>>>
>>>>>> This will be much cleaner and easier to maintain. When you get some
>>>> time
>>>>>> could you do the changes.
>>>>>>
>>>>>> Many thanks
>>>>>> Duncan
>>>>>>
>>>>>>
>>>>>>> On 1/2/07, Duncan Webb <[EMAIL PROTECTED]> wrote:
>>>>>>>> Chandan Pitta wrote:
>>>>>>>>> Sorry attached the wrong diff file. See this one
>>>>>>>> I can't apply this patch, says that it has been previously detected.
>>>>>>>>
>>>>>>>> Will you try an svn update, I applied Wout's patch at 8912 and your
>>>>>>>> one-liner after.
>>>>>>>>
>>>>>>>> Thanks
>>>>>>>> Duncan
>>>>>>
>>>>>>
>>>> -------------------------------------------------------------------------
>>>>>> Take Surveys. Earn Cash. Influence the Future of IT
>>>>>> Join SourceForge.net's Techsay panel and you'll get the chance to
>>>> share your
>>>>>> opinions on IT & business topics through brief surveys - and earn cash
>>>>>>
>>>> http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
>>>>>> _______________________________________________
>>>>>> Freevo-devel mailing list
>>>>>> [email protected]
>>>>>> https://lists.sourceforge.net/lists/listinfo/freevo-devel
>>>>>>
>>>>>
>>>> -------------------------------------------------------------------------
>>>>> Take Surveys. Earn Cash. Influence the Future of IT
>>>>> Join SourceForge.net's Techsay panel and you'll get the chance to
>>>> share your
>>>>> opinions on IT & business topics through brief surveys - and earn cash
>>>>>
>>>> http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
>>>>> _______________________________________________
>>>>> Freevo-devel mailing list
>>>>> [email protected]
>>>>> https://lists.sourceforge.net/lists/listinfo/freevo-devel
>>>>>
>>>>
>>>>
>>>> -------------------------------------------------------------------------
>>>> Take Surveys. Earn Cash. Influence the Future of IT
>>>> Join SourceForge.net's Techsay panel and you'll get the chance to
>>>> share your
>>>> opinions on IT & business topics through brief surveys - and earn cash
>>>> http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
>>>> _______________________________________________
>>>> Freevo-devel mailing list
>>>> [email protected]
>>>> https://lists.sourceforge.net/lists/listinfo/freevo-devel
>>>>
>>> ------------------------------------------------------------------------
>>>
>>> Index: src/www/htdocs/library.rpy
>>> ===================================================================
>>> --- src/www/htdocs/library.rpy  (revision 8922)
>>> +++ src/www/htdocs/library.rpy  (working copy)
>>> @@ -478,11 +478,13 @@
>>>                      ### show image
>>>                      if action_mediatype == "images":
>>>                          size = (info['width'], info['height'])
>>> -                        (scaled_image, new_size) = 
>>> self.get_scaled_image_and_size(item, size)
>>> +                        scaled_image_path = 
>>> util.fileops.cache_www_thumbnail_path(item)
>>> +                        if not os.path.exists(scaled_image_path):
>>> +                            util.fileops.cache_www_image(item)
>>>                          image_link = self.convert_dir(filepath)
>>> +                        scaled_image_link = 
>>> self.convert_dir(scaled_image_path)
>>>                          fv.tableCell('<div class="image"><a 
>>> href="javascript:openfoto(\''+image_link+'\','+str(size[0])+','+str(size[1])+')">'\
>>> -                            +'<img src="'+scaled_image+'" 
>>> height="'+str(new_size[1])+'px" width="'+str(new_size[0])+'px" />'\
>>> -                            +'<br />'+Unicode(title)+'</a></div>', 
>>> 'class="'+status+'" colspan="1"')
>>> +                            +'<img src="'+scaled_image_link+'" /><br 
>>> />'+Unicode(title)+'</a></div>', 'class="'+status+'" colspan="1"')
>>>                      ### show movie
>>>                      elif action_mediatype == "movies":
>>>                          if os.path.exists(jpg_file):
>>> @@ -635,61 +637,6 @@
>>>              new_height = 200
>>>          return (int(new_width), int(new_height + 0.5))
>>>
>>> -    def get_fit_to_rectangle_size(self, size, new_size):
>>> -        print 'get_fit_to_rectangle_size(self, size=%s, new_size=%s)' % 
>>> (str(size), str(new_size))
>>> -        try:
>>> -            scaled_width = new_size[0]
>>> -            scaled_height = new_size[1]
>>> -            ### if actual image aspect ratio > scaled image aspect ratio 
>>> then scale height
>>> -            if float(size[0]) / size[1] > float(scaled_width) / 
>>> scaled_height:
>>> -                scaled_height = scaled_width * size[1] / size[0]
>>> -            ### else scale width
>>> -            else:
>>> -                scaled_width = scaled_height * size[0] / size[1]
>>> -        except ZeroDivisionError:
>>> -            pass
>>> -        return (scaled_width, scaled_height)
>>> -
>>> -    def get_scaled_image_and_size(self, filepath, size):
>>> -        '''
>>> -        Returns the location of a scaled image and size of the scaled image
>>> -        as a 2-tuple. Eg. ("/var/cache/freevo/test.jpg", (200, 150)).
>>> -        The image will be scaled only if it larger than the threshold size
>>> -        in config.WWW_IMAGE_THRESHOLD_SIZE. The scaled size will be limited
>>> -        to the boundaries of config.WWW_IMAGE_THUMBNAIL_SIZE
>>> -        '''
>>> -        print 'get_scaled_image_and_size(self, filepath=%r, size=%s)' % 
>>> (filepath, str(size))
>>> -        threshold_size = config.WWW_IMAGE_THRESHOLD_SIZE
>>> -        new_size = config.WWW_IMAGE_THUMBNAIL_SIZE
>>> -        new_size = self.get_fit_to_rectangle_size(size, new_size)
>>> -        file_ext_index = filepath.rindex(".")
>>> -        file_ext = filepath[file_ext_index:].lower()
>>> -        if file_ext.lower() == ".gif":
>>> -            file_ext += ".jpg"
>>> -        scaled_image_path = self.cache_dir + 
>>> filepath[:file_ext_index].replace("/", "_") + file_ext
>>> -
>>> -        # if the size of image falls below threshold size then use 
>>> original image
>>> -        if size[0] < threshold_size[0] and size[1] < threshold_size[1]:
>>> -            scaled_image_path = filepath
>>> -        else:
>>> -            create_scaled_image = False
>>> -            if os.path.exists(scaled_image_path):
>>> -                # if the scaled image already exists then make sure it is 
>>> scaled to the correct size
>>> -                new_image = imlib2.open(scaled_image_path)
>>> -                if new_image.width != new_size[0] or new_image.height != 
>>> new_size[1]:
>>> -                    os.remove(scaled_image_path)
>>> -                    create_scaled_image = True
>>> -            else:
>>> -                create_scaled_image = True
>>> -
>>> -            if create_scaled_image:
>>> -                image = imlib2.open(filepath)
>>> -                new_image = image.scale(new_size)
>>> -                new_image.save(scaled_image_path)
>>> -
>>> -        scaled_image_path = self.convert_dir(scaled_image_path)
>>> -        return (scaled_image_path, new_size)
>>> -
>>>      def get_fxd_title(self, fxd_file):
>>>          print 'get_fxd_title(self, fxd_file=%r)', (fxd_file)
>>>          fxd_info = ""
>>>
>>>
>>>
>>> ------------------------------------------------------------------------
>>>
>>>
>>> ------------------------------------------------------------------------
>>>
>>>
>>> ------------------------------------------------------------------------
>>>
>>> -------------------------------------------------------------------------
>>> Take Surveys. Earn Cash. Influence the Future of IT
>>> Join SourceForge.net's Techsay panel and you'll get the chance to share your
>>> opinions on IT & business topics through brief surveys - and earn cash
>>> http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
>>>
>>>
>>> ------------------------------------------------------------------------
>>>
>>> _______________________________________________
>>> Freevo-devel mailing list
>>> [email protected]
>>> https://lists.sourceforge.net/lists/listinfo/freevo-devel
>>
>>
>> -------------------------------------------------------------------------
>> Take Surveys. Earn Cash. Influence the Future of IT
>> Join SourceForge.net's Techsay panel and you'll get the chance to share your
>> opinions on IT & business topics through brief surveys - and earn cash
>> http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
>> _______________________________________________
>> Freevo-devel mailing list
>> [email protected]
>> https://lists.sourceforge.net/lists/listinfo/freevo-devel
>>
> 
> -------------------------------------------------------------------------
> Take Surveys. Earn Cash. Influence the Future of IT
> Join SourceForge.net's Techsay panel and you'll get the chance to share your
> opinions on IT & business topics through brief surveys - and earn cash
> http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
> _______________________________________________
> Freevo-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/freevo-devel
> 



-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Freevo-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freevo-devel

Reply via email to