File List in Numeric Order

よく見たら TreeView にファイルリスト配置までに物凄く無駄が多かった。
os.listdir でファイルリストを作成し更に隠しファイルを取っ払って新たに作成。
ディレクトリ名までリストに含めたソートを行い配置直前にディレクトリを弾く。

なんだこの非効率さは、実用上では問題ない速度とはいえ流石に書き換えたいわ。
当時は os.listdir 以外でファイルリストを作る手段を知らなかったわけで。

今なら Gio を利用して自力でファイルリストを作れる。
ディレクトリと隠しファイルを除き、数値優先ソートまで終わったリストを戻す関数を作ればいいかな。

#! /usr/bin/env python
# -*- coding: UTF-8 -*-

from gi.repository import GLib, Gio

def get_file_numsort_list(dirname):
    """
        param dirname: Directory Full Path Name
        return: List in Numeric Order
    """
    files = []
    d = Gio.file_new_for_path(dirname)
    enum = d.enumerate_children(
            Gio.FILE_ATTRIBUTE_STANDARD_TYPE,
            Gio.FileQueryInfoFlags.NONE,
            None )
    for info in enum:
        if info.get_file_type() == Gio.FileType.REGULAR:
            s = info.get_name()
            if not s.startswith("."):
                if not s.endswith("~"):
                    files.append(s)
    files.sort(lambda x, y : cmp(GLib.utf8_collate_key_for_filename(x, -1), GLib.utf8_collate_key_for_filename(y, -1)))
    return files

イマイチな気もするけど予定していた動作にはなった。
G_FILE_TYPE_REGULAR 判定ならディレクトリではないと解る。
隠しファイルは自力判定、not を使うと or の動作がおかしかったので階層に。

体感速度は、全然変わらないなやっぱり。

それと。
Gstreamer の Volume 調節は何故か valadoc で見つけた。

Gst.Audio.stream_volume_convert_volume ? gstreamer-audio-1.0

Namespace: Gst.Audio ということだが Gst のアトリビュートには無い。
Python では GstAudio を gir から import すれば使えるようだ。

from gi.repository import Gtk, Gst, GstAudio

class Prayer(Gtk.Window):
    ###
    # etc...
    ###
    def set_volume(self, value):
        if self.player.get_volume(GstAudio.StreamVolumeFormat.CUBIC) != value:
            self.player.set_volume(GstAudio.StreamVolumeFormat.CUBIC, value)

    def on_volume_value_changed(self, widget, event=None):
        self.set_volume(widget.get_value() / 100.0)

get_volume, set_volume は引数に GstStreamVolumeFormat が必要。
PyGtk, gst-0.10 では LINEAR からの変換が必要だったけど直でイケる。

Vala も少し勉強していて良かった!
というか、こんなにドキュメントが充実しているなら Vala で作ったほうがいいのかな。

初回再生時に上下が少し潰れる現象で現在詰まっている。
一度リサイズすれば直るのだが、0.3.9 と同じ処理をしているのに。
GtkAspectFrame ではなく自力でアスペクト比と配置調節をしたほうがいいのかな?

他細々、ということでココまでのバックアップ。
現状では Fedora 18 で Gst デコーダーを揃えた環境しか動かせないけど。
y901x-0.99.1.tar.gz

追記 @ 2013.04.24
多分コレで日本語環境なら当面は問題無いと思う、けど次 Ubuntu 公開まで様子見しますんで。
もっと弄くりたいこともあるにはあるけどメジャー更新は安定させるのが最優先なので。
GTK3, GStreamer 1.0 環境以外は弾くようにしました。
y901x-0.99.2.tar.gz
追記終わり

ついでに。

#!/usr/bin/env python
#-*- coding:utf-8 -*-

from gi.repository import GLib

s = "/home/oyaji/エロ画像/乳.png"

# ディレクトリ名
print GLib.path_get_dirname(s)
# ファイル名のみ
print GLib.path_get_basename(s)
# 絶対パスチェック
print GLib.path_is_absolute(s)
# URI に変換
u = GLib.filename_to_uri(s, None)
print u
# パス名に戻す
print GLib.filename_from_uri(u, None)
# フルパス作成(区切り文字の有無を自動調節)
print GLib.build_filenamev(["/home/oyaji/", "/エロ画像", "尻.png"])

なんだ GLib で日本語ファイル名もイケるんだ、os.path は使わなくていいじゃないの。
特に os.path.join と同じように使える g_build_filenamev は素晴らしい。
日本人の Python 屋って標準モジュールで止まっている人が多すぎだから少し違ったことをすると通っぽく見えて素敵かもよ。