IronPython」タグアーカイブ

Windows 7 FLV and MP4 From Opera Cache

Windows 7 は本当に Aspire Timeline 1410 で十二分に快適である。
すっかり気に入って Bluetooth のマウスまで買ってしまった。
Youtube 等の Flash アクセラレーションが効くのが Ubuntu 9.04 より素敵。

Ubuntu 9.10 リリース – スラッシュドット・ジャパン

9.10 は評判悪いな、512MB 超のファイルで破損する可能性って怖すぎる。
デスクトップの Linux は明後日以降にアレが出るまで放置てか様子見。

と思っていたけどやはり Linux ばかり使っていると Windows が少し不便だ。
端末操作がどうのは文化が違うのでどうとか言わない。
だけどスクリプトで定形作業を簡単に済ませるとかをやりたいじゃない。。

ぱぇぽぃ2 ? Blog Archive ? FLV and MP4 From Opera Cache

コレができないとか、Windows で GnomeVSF を呼び出せるはずが無いし。
よし、コレと同じことができる IronPython スクリプトを作ってみよう。
IronPython は Windows SDK 等をインストールせずに .NET が使えるから素晴らしい。

ちなみに 7 及び Vista での Opera10 キャッシュは以下にある。

C:\Users\(UserName)\AppData\Local\Opera\Opera\cache\

とりあえず GnomeVFS がどうやって FLV や MPEG-4 を見分けているか調べる。
ま、FLV は先頭バイナリ 3 バイトが FLV で始まっていると解っているけど。

/usr/share/mime

を開いて video/mp4 な Mime Types を探す。
nano から開けば普通にテキストとして確認できるようだ。

mpeg4bin

んーイマイチ解らないので GHex でも MPEG-4 ファイルを開いて確認。
とにかく 5 バイト目以降に ftypisom か ftypmp42 が続いていれば MPEG-4 ってことね。
それならこうしてみよう。

#-*- coding:utf-8 -*-

"""
    opera_youtube.py
    flv and mp4 Copy from Opera Cache
"""

from System import *
from System.IO import *

FLV  = Text.Encoding.UTF8.GetBytes("FLV")
MP41 = Text.Encoding.UTF8.GetBytes("ftypisom")
MP42 = Text.Encoding.UTF8.GetBytes("ftypmp42")

# Cache Directory Name
local_dir = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)
cache_dir = local_dir + r"\Opera\Opera\cache"

# Copy Directory is Other
copy_dir = r"C:\Users\sasakima-nao\Documents\_temp"

def array_equals(a, b):
    """
        System.Array valus Equals Check Function
    """
    result = True
    n = len(a)
    for i in range(n):
        if a[i] != b[i]:
            result = False
            break
    return result

# Get Opera Cache FileNames
files = Directory.GetFiles(cache_dir)
# roop
for f in files:
    fs = FileStream(f, FileMode.Open)
    # FLV Check
    barray = Array.CreateInstance(Byte, 3)
    fs.Read(barray, 0, 3)
    #if FLV.Equals(barray) is no!
    if array_equals(FLV, barray):
        newfile = "%s\\%s.flv" % (copy_dir, Path.GetFileName(f))
        File.Copy(f, newfile)
    # MPEG-4 Check
    fs.Seek(4, SeekOrigin.Begin)
    barray2 = Array.CreateInstance(Byte, 8)
    fs.Read(barray2, 0, 8)
    if array_equals(MP41, barray2) or array_equals(MP42, barray2):
        newfile = "%s\\%s.mp4" % (copy_dir, Path.GetFileName(f))
        File.Copy(f, newfile)
    fs.Close()

get_cache_file

たったこれだけのスクリプトで 6 時間も掛かった、やっぱり .NET は面倒くさい。
まず IronPython で System.Byte[] を作成する方法を見つけるのに苦労した。
それに System.Byte[] は内容を Equal で比較できない、かなり悩んだ。
Nautilus のように Explorer から呼び出しできれば更にイイんだが無理。

てか普通の Python で作ったほうが楽だったかな?

もっと効率が良いコードがありそうだけど動いたからいいや。
正規表現なんかを使って少し改造すれば色々と応用も効くかも。

xml:lang

ぱぇぽぃ2 ? Blog Archive ? SeeMe is to IronPython

で XAML から読み込んだ menu が文字化けしていた件がやっと解決。
XAML に xml:lang=”ja-JP” を追記すればよい。

#-*- coding:utf-8 -*-

menu_str = """<Menu
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xml:lang="ja-JP">
    <MenuItem Header="ファイル(_F)" TabIndex="1">
        <MenuItem Header="保存(_S)" Name="save" InputGestureText="Ctrl+S" />
        <MenuItem Header="読み直し(_R)" Name="reload" />
        <Separator />
        ...

xml_lang

2009-10-29 – 当面C#と.NETな記録 # WPF のカルチャー

これを見てカルチャー指定を IronPython でやってみたけど化けたまま。
というか元である C# SeeMe はこんな処理していないけど文字化けしていない。
動的読み込みだからなのだろうか?
IronPython で WPF は全部コードで作ったほうが面倒が無いかも。

Identify the x64 Windows for IronPython

そういえば Opera のインストール先を得る必要があったんだ。
結局 x86 か x64 かをコードで見分ける必要があるのだってことだね。

チャチャっと探してみると WMI を使えば簡単だと解った。

C# WMI
WMIを使ってOSの情報を取得する: .NET Tips: C#, VB.NET, Visual Studio

ここらを見ると .NET 経由でも WMI から様々な情報が得られるようで。
私はとりあえず x64 かどうかさえ見分けられればいいので下記のように。

#-*- coding:utf-8 -*-

"""
    cpu_check.py
    Check Windows Architecture
"""

import clr

clr.AddReference("System.Management")

from System import *
from System.Management import *

# Create ManagementClass
mc = ManagementClass("Win32_Processor")
# Get ManagementObjectCollection
moc = mc.GetInstances()
# mo is ManagementObject
for mo in moc:
    bit = mo["AddressWidth"]
    if bit == 32:
        print "x86 Windows"
    elif bit == 64:
        print "x64 Windows"
    else:
        print "Unknown Windows"

何故か IronPython コード、だってコンパイルするのが面倒くさい。
Win32_Processor 指定で x64 も判別できるようだ。
以下私の環境でテスト。

My 32bit Windows Vista
check_x86

My 64bit Windows 7
check_x64

これで見分けは簡単に行えそうだ。
でももっと簡単な方法がありそうな…

Mandriva 2009.1 on mono and IronPython

mono イラネェ…だけれど、もはや GNOME の一部みたいなものだし。
よく見ると GNOME Mandriva に入っている mono のバージョンが 2.2 だ。
これって IronPython 2.0 が普通に動くんでね?
サイトに行くと IronPython 2.6 が RC になっていた、2.6 正式版は近いようだ。

IronPython – Home

せっかくなので 2.0.2 と 2.6 RC を落として使ってみる。
2.6 RC はダメだった、2.0.2 は普通に動くでないの。

999

本家からのやつだから以前手に入れたものと違い日本語も通るようだ。
ぱぇぽぃ2 ? Blog Archive ? IronEditor

しかし矢印キーでカーソル位置を変更できない、 Windows 用キーバインドは効かない。
Linux で動かす場合は Ctrl+D で終了にしてくれよ、Ctrl+Z じゃ間違える。
GNOME 端末で使うのはちょっと簡便してくれという感じ。

つーか「ソフトウェアの管理」に 2.0.1 があるじゃないの。

mandriva_ipy

ASP.net で利用すると思われるライブラリがコレデモカ!というくらい付属。
2010.0 ではもっと増えそう、てか mono と IronPython のバージョンは何になる?
イラネ…利用するにしても本体だけを本家から落として使うと思う。

しかしローケルが UTF-8 である Linux のほうが StreamReader 等が使い易いのはこれいかに。
Encoding 指定しなければ BOM 無し UTF-8 で読み書きだものね。
Windows も過去の資産なんかどうでもいいからとっとと UTF-8 になってくれよ。

それより mono で動かしたほうが早いんだが…
標準 Python のほうが圧倒的に早いけどね。

WPF Hyperlink class for IronPython

SeeMe for Windows v4 beta2 のソースにコッソリ書いているが、
Hyperlink クラスをコードで作る方法が解らなかった。

Hyperlink クラス (System.Windows.Documents)

なんだよ、MSDN に普通に書いてあるや、どこを探していたのやら。
つまり Bold とかと同じように使えばいいということねん。

ぱぇぽぃ2 ? Blog Archive ? 初心者同然

よし、これで Linux 版の GtkAboutDialog と同じレイアウトにしてみる。
Windows 自体というか WPF だけでも専用ダイアログを用意してほしいんだが。

class AboutDlg(Window):
    """
        SeeMe About class
    """
    def __init__(self, owner, path):
        """
            Hyperlink, Run
            from System.Windows.Documents import *
        """
        self.Owner = owner
        self.path = path
        self.WindowStartupLocation = WindowStartupLocation.CenterOwner
        self.Title = "About SeeMe for Windows"
        self.SizeToContent = SizeToContent.WidthAndHeight
        self.ResizeMode = ResizeMode.NoResize
        self.Icon = BitmapFrame.Create(Uri(self.path + "\\img\\seeme.ico"))
        # StackPanel
        panel = StackPanel()
        # Dialog Icon and Image
        img = Image()
        img.Source = BitmapImage(Uri(self.path + "\\img\\seeme.ico"))
        img.Width = 32
        img.Height = 32
        panel.Children.Add(img)
        # Create TextBlock List
        v = []
        for i in range(5):
            b = TextBlock()
            panel.Children.Add(b)
            v.append(b)
        v[0].Inlines.Add(Bold(Run("SeeMe for Windows 5.0.0\n")))
        v[1].Text = "Windows Version ( %s )" % Environment.OSVersion.Version
        v[2].Text = sys.version + "\n"
        v[3].Text = "Copyright(c)2003-2009 by sasakima-nao"
        url = Hyperlink(Run("http://palepoli.skr.jp/"))
        url.Click += self.on_url
        v[4].Inlines.Add(url)
        # Align Right button
        btn = Button()
        btn.Content = "Close"
        btn.Click += self.on_exit
        DockPanel.SetDock(btn, Dock.Right)
        dp = DockPanel()
        dp.LastChildFill = False
        dp.Children.Add(btn)
        panel.Children.Add(dp)
        # Append
        self.Content = panel

    def on_url(self, sender, e):
        Diagnostics.Process.Start("http://palepoli.skr.jp/")

    def on_exit(self, sender, e):
        self.Close()

コレを Show() でオーナーウインドウから呼び出す

def on_about(self, sender, e):
    about = AboutDlg(self, self.path)
    about.Show()

about_dialog

ちょっとデザインが違うけど Windows ではこういう感じのほうが好まれそう。
WPF 使っているのに .NET 2.0 がどうのと出るのが少しだけ気に入らない。
つーかまだアルファにも達していないので自身のバージョン表記が滅茶苦茶だ。

とりあえず Hyperlink クラスの使い方はこれでオケのようだ。
たったコレだけのコードで About 完成、XAML ってマジで無駄だと思った。

今日はココしかやっていないのでバックアップはヤメとこう。