gallery.py: Use -b:a and -b:v
[blog.git] / posts / gallery / gallery.py
index 110f383c8908708cc73925fa3f2f473c6e9e2a0c..4be733b60ecb8f9ea7138650e91fb996bdca7387 100755 (executable)
@@ -254,7 +254,7 @@ class CGIGalleryServer (object):
         try:
             try:
                 if url is None:
-                    self.index(stream=stream)
+                    self.index(stream=stream, page=page)
                 elif url.endswith('random'):
                     self.random(
                         url=url, stream=stream, max_width=500, max_height=500)
@@ -301,13 +301,15 @@ class CGIGalleryServer (object):
             return None
         return url[len(self._base_url):]
 
-    def _url(self, path):
+    def _url(self, path, query=None):
         relpath = _os_path.relpath(
             _os_path.join(self._base_path, path), self._base_path)
         if relpath == '.':
             relpath = ''
         elif path.endswith('/'):
             relpath += '/'
+        if query:
+            relpath = '{}?{}'.format(relpath, _urllib_parse.urlencode(query))
         return '{}{}'.format(self._base_url, relpath)
 
     def _label(self, path):
@@ -316,10 +318,11 @@ class CGIGalleryServer (object):
             dirname,base = _os_path.split(dirname)
         return base.replace('_', ' ').title()
 
-    def _link(self, path, text=None):
+    def _link(self, path, query=None, text=None):
         if text is None:
             text = self._label(path)
-        return '<a href="{}">{}</a>'.format(self._url(path), text)
+        return '<a href="{}">{}</a>'.format(
+            self._url(path=path, query=query), text)
 
     def _subdirs(self, path):
         try:
@@ -346,9 +349,9 @@ class CGIGalleryServer (object):
             if is_image(picture_path):
                 yield picture_path
 
-    def index(self, stream=None):
+    def index(self, page=0, stream=None):
         LOG.debug('index page')
-        return self._directory(self._base_path, stream=stream)
+        return self._directory(path=self._base_path, page=page, stream=stream)
 
     def _original_url(self, url):
         """Reverse thumbnail URL mapping
@@ -424,8 +427,8 @@ class CGIGalleryServer (object):
             or _os_path.getmtime(video) > _os_path.getmtime(mp4_path)):
             arg = ['ffmpeg', '-i', video, '-acodec', 'libfaac', '-aq', '200',
                    '-ac', '1', '-s', '640x480', '-vcodec', 'libx264',
-                   '-preset', 'slower', '-vpre', 'ipod640', '-b', '800k',
-                   '-bt', '800k', '-aspect', '640:480', '-threads', '0']
+                   '-preset', 'slower', '-vpre', 'ipod640', '-b:a', '128k',
+                   '-b:v', '800k', '-aspect', '640:480', '-threads', '0']
             arg.extend(args)
             arg.append(mp4_path)
             invoke(arg)
@@ -640,14 +643,14 @@ class CGIGalleryServer (object):
     def _directory_page_navigation(self, path, page, pages):
         if pages <= 1:
             return []
-        prev_page = path + '?pp={:d}'.format((page - 1) % pages + 1)
-        next_page = path + '?pp={:d}'.format((page + 1) % pages + 1)
+        prev_query = {'pp': (page - 1) % pages + 1}
+        next_query = {'pp': (page + 1) % pages + 1}
         return [
             '<div style="text-align: center;">',
             '<p>',
-            self._link(prev_page, 'previous'),
+            self._link(path=path, query=prev_query, text='previous'),
             '({:d} of {:d})'.format(page+1, pages),
-            self._link(next_page, 'next'),
+            self._link(path=path, query=next_query, text='next'),
             '</p>',
             '</div>', 
            ]
@@ -668,7 +671,7 @@ class CGIGalleryServer (object):
         for image in images:
             page = self._image_page(image)
             img = self._image(image, max_width=300, max_height=300)
-            link = self._link(page, img)
+            link = self._link(path=page, text=img)
             if column == 0:
                 content.append('  <tr>')
             content.extend([
@@ -717,7 +720,7 @@ class CGIGalleryServer (object):
         images_per_page = self._rows * self._columns
         i = images.index(path)
         page = i // images_per_page
-        gallery_page = '{}/?pp={:d}'.format(gallery, page + 1)
+        gallery_page = '{}/'.format(gallery)
         prev_page = self._image_page(images[i - 1])
         next_page = self._image_page(images[(i + 1) % len(images)])
         content = []
@@ -725,9 +728,10 @@ class CGIGalleryServer (object):
         content.extend([
                 '<div style="text-align: center;">',
                 '<p>',
-                self._link(prev_page, 'previous'),
-                self._link(gallery_page, 'all'),
-                self._link(next_page, 'next'),
+                self._link(path=prev_page, text='previous'),
+                self._link(
+                    path=gallery_page, query={'pp': page+1}, text='all'),
+                self._link(path=next_page, text='next'),
                 '</p>',
                 ])
         content.extend(self._captioned_video(path))
@@ -752,7 +756,10 @@ def serve_cgi(server):
         if isinstance(p, list):
             p = p[0]
         url = p.value
-    server.serve(url=url, page=page, stream=sys.stdout)
+    stream = sys.stdout  # Python 2
+    if hasattr(stream, 'buffer'):  # Python 3
+        stream = sys.stdout.buffer
+    server.serve(url=url, page=page, stream=stream)
 
 def serve_scgi(server, host='localhost', port=4000):
     import scgi