2011年08月21日

Windows Mobile(W-ZERO3 Advanced/es WS011SH)でPython2.5

 前稿のNTP参照を起動時実行させるだけのことで、Windows MobileというOSは難儀する。これを一気に解決する方法として、プログラム言語を実行出来る様にするのが一番である。mireの場合当然、言語選択はPythonとなる次第だ。

続きを読む
posted by Mire at 08:43 | Comment(0) | TrackBack(0) | Windows Mobile | このブログの読者になる | 更新情報をチェックする

W-ZERO3 Advanced/es WS011SHでNTPを起動時参照:strNTP

 「WILLCOM W-ZERO3 Advanced/es WS011SH中古機カスタマイズ」では初回の設定を書いた訳だが、その後の利用で色々と必要を感じ変更しているので、ここに書き留めておく。
 W-ZERO3の特徴として、作業中よくロックしてしまい、キーボート上のソフトリセットでは効かず、電池蓋内のハードリセットを余儀なくされることがある。W-ZERO3自体そんなにCPU能力が高くない上、元々重たいWindows OSを余り見直すことなく小手先で組み込んだWindows MobileというOSなので当然の帰結である。このロック、実際には固まっているのではなく、数分後に復帰することもあるので、単に重たいOSが裏で一生懸命動いていることも多いので、時間があるときは待つことが大切だろうが、バス等の公共交通機関の運行状況を見ようとしているときになってしまうと待ち切れずリセットすることが多く、実用上のロックが頻発するのが現実なのである。

 そんなときに、我らがWILLCOM W-ZERO3は、ハードリセット後、止まっていた時間分だけOSでカウントしていた時間が停止して、電源立上げ後にその分だけ時計が遅れてしまうのだ。PC上のOSの様にPCハードウエアのクロックを参照することはない。
 まあ、そんなことで、先日夜にリセットしたのに時計を合わせることを忘れていることを忘れていて、なんと20分遅れた状態にしてしまっていて、朝の始動が遅れてしまった。携帯を持つことで時計を持たなくなった弊害で、そんな携帯の時計を信用する奴が悪いと改めてMSに教えて頂いた次第である。いつもご親切に有難う。取敢えずGood Jobとでも言っておこう。

 でも、そんなことで諦めていても仕方がないので失敗を教訓に対策だ。結局、時計を合わせる仕組みが手動であるから、それを忘れると起きることなので、Windows Mobile起動時に自動で実行すれば済むのである。
 そこで、先ずは、以前使っていた「SimpleHTTPntp」の捜索とインストールを行なった。SimpleHTTPntpは結構軽く「HttpAjustClock(簡易時計合わせ)」よりなじみがあり何とか出来そうに思ったからである。ところが、Googleで探して試るとわかることだが、既に作者の方が、サポートを終了されている様でHPのURL自体が全く別のものに流用されてしまっていてインストールパッケージの入手が出来ないのである。そこで、取敢えず苦肉の策として、壊れた前機のインストール位置にあったexeファイルを手動でコピペしての変則インストールで動作確認が出来たので、早速そのショートカットを「Windows\スタートアップ」以下にコピーしてハードリセットして試た。結果はOUT!、同じく「Windows\スタートアップ」で起動させている「AutoConnect3」が自動ダイヤルアップを組込完了する時間より早く実行されてしまう為、期待通りに時計合せをすることが出来なかった。
 それで、ここで普通のWindowsならbatファイルに先実行の「AutoConnect3」の後にsleep時間を置いて、SimpleHTTPntpが実行される様に組込む訳だが、素のWindows Mobileは、batファイル自体が認識されないので、仕方がない。たぶん、cmd.exeをInstallし、batファイルと関連付けすれば行けるかと思うがその方法が判らなかったので、今回は、七転八倒したした次第である。

 取敢えず、最新のSimpleHTTPntpを引続き探して試た所、2ch情報から

「SimpleHTTPntp」の配布サイトにアクセスできないんですが、今は公開してないんですか?
みなさんどんなNTPクライアントお使いです?


という取っ掛りを掴み、

>>218
親切な誰かが数日前にあっぷしてくれてるよ
w-zero3.org/uploader/src/up0367.zip


と言うことでお陰様で、http://w-zero3.org/uploader/src/up0367.zip から完全なcabファイルのインストーラを入手出来、オプションをテストしたが、遅延実行はないので使えないことがほぼ確定した次第だ。

 元々、「SimpleHTTPntp」や「HttpAjustClock(簡易時計合わせ)」は、Willcomのダイヤルアップネットで、NTPのポート番号123を閉じていたから作られた回避ツールである。駄目元で、引続きntpをキーワードとして検索していると偶然、遅延実行出来るNTPツールが見付かった。

 それが、本日紹介する「strNTP」である。詳細は 作者strさん公開ページ で確認頂けるし、結構細かくオプション設定が可能だか、そのオプション設定用のexeファイルも同梱されているので設定で悩むことはないだろう。こちらは真の Good Job! である。

続きを読む
posted by Mire at 01:56 | Comment(0) | TrackBack(0) | Windows Mobile | このブログの読者になる | 更新情報をチェックする

2011年08月17日

DVD_Label0.0.24 リリース(管理機能付)

 色々あって、間を開けてしまったが、管理機能付の最初の正式版としてDVD_Label0.0.24を先程リリースした。既にお使いの方は、今後はこちらをご利用をお奨めする。恐らく、文字化け等の基本動作面でも漸次修正が加えられて来ているし、何よりもSQLite3形式のDBファイルに、タイトル情報を記録蓄積し、検索やTSVファイル書出し機能により、他のアプリでのデータ活用が可能になっているからだ。

 ダウンロードは、従前通り「DVD-VIDEO TITLES LABELER - DVD_Label」の使い方(導入編)を玄関とし、Download Pageからである。ドキュメント修正は追い付いていないが、今後少しずつ手を入れて行くつもりでいるので、お待ち頂きたい。
続きを読む
タグ:dvd_label DVD-VR
posted by Mire at 01:11 | Comment(0) | TrackBack(0) | 動画環境 | このブログの読者になる | 更新情報をチェックする

2011年08月07日

Google Voice が日本上陸している

 Google mailを見ようとして気付いたことだが、 「Google Voice」が日本でもサービス開始された。通信なので、最低でもネットに繋がることが前提だが、Win/Mac/Linux機にInstallしイヤホンマイクさえあれば、固定電話や携帯電話にもかけることが出来る。まぁ、これだけなら普通のインターネット電話とあまり変わらない。
 でも、料金を見るとちょいと心が動く、料金は円建てはない様なので日本では実質ドル建てでの徴収となるのだろうが、税別ながら1分間、固定電話が$0.02,携帯電話が$0.11とのこと、ざっくり1ドル80円として2円/分とか9円/分と言う程度でかけることが出来る次第だ。

 通話帯域を確保可能なインターネット接続は別途必要なのでネットの基本料金相当額が必要なこととアクセスポイントの近くにあることが前提とは言え、出先でも格安通話が可能となのである。当方の生活圏では、それ程連続していないが、例えばFonのアクセスポイントであれば、自宅のネット料金のみで接続出来るのでグンと固定費も圧縮出来るので、今後、スマホ契約も必ずしも通話契約が必須とも言えなくなって着た様に思う。英語の頁ながらMobile用もある様なので、電話利用が主目的出ないのであればSIMフリーのAndroid端末でも充分なのかもしれない。

 駄目とは思いつつ、Linux上のAndroid SDKのエミュレータでアクセスして試ると、「あんたん国じゃ未だなのよ」と英語のメッセージだったが、日本国内のAndroid等のスマホでも可能になるのも、そう遠くはないことだろう。

 当方の現在の携帯はPHSなので、Androidに乗り換えたくても同番移行の蚊帳の外で、踏ん切りがつかなかったが、固定費を上げずに移行する道が見えた気がするし、今の日本国内の通信事業者もこれ迄通りとは行かなくなったのではないだろうか。
posted by Mire at 00:55 | Comment(0) | TrackBack(0) | Google Voice | このブログの読者になる | 更新情報をチェックする

2011年08月02日

DVD_Label0.0.22 リリース

 昨日予告のDVD_Labelの改善版をリリースします。DVD_Label0.0.21同様、RC扱いです。データ管理機能以外では、1年前の版よりは昨日掲載のdiffを見ると安定させて来ている様なので、その範囲であれば、前版をUpdateしても特段問題はないと思うが、今後継続的に使う場合、DB設計に変更が伴なった場合に、移行という課題を抱える可能性がある点が、RCとしている理由なので、試用と言う観点でご利用頂き、問題があればコメント頂ければ有難い。

DVD_Label 0.0.22 build 2011-08-02_21.07JST データ管理機能付

 今回の変更は、コマンドプロンプトから、他のディレクトリをカレントディレクトリとして実行した場合に、データベースファイルの位置が、そのカレントディレクトリになってしまう課題に対する対処として、既定として、ツールをインストールしたディレクトリに固定的に作成利用される様にしたので、それでほぼ、この課題はFixed出来たと思う。
 しかし、例えば「C:\」や「C:\Program Files」直下だった場合の書込権限不足となる場所にインストールした場合には、エラーとなって返って来るので、dvd_label.confで設定出来る様にした。
 でもその場合にも、実在しないフォルダを設定した場合にもエラーとなるってしまう。そこで、エラー発生時には、その旨メッセージを表示し対処を促す様にした。


続きを読む
posted by Mire at 22:53 | Comment(0) | TrackBack(0) | 動画環境 | このブログの読者になる | 更新情報をチェックする

2011年08月01日

DVD_Label0.0.21 データ管理機能付のdiff掲載

よくよく見て試ると、前公開バージョンから1年も放置していたことが判った。流石に久しぶりに修正を試ようと、結構忘れてしまっていて、てめーのコードを読み理解するのに苦労してしまった。そこで、今回のコードには改変していない所にもコメントを追加修正したり、不要なコードの除去を行なったので、この際、前公開の版との間の差分ファイルをここに掲載し、変更箇所の履歴としておこうと思う。
 尚、既に判っていることなので、ここに書いておくが、この版迄は、コマンドプロンプトでdvd_label.exeやdvd_label.pyを別ディレクトリをカレントとして実行すると、データベースファイルがそのカレントディレクトリに作成されてしまう。この仕様は作成者にとってテストには良いが、配布されたユーザにとっては嵌まると嫌なものなので明日、修正版を出す予定でいる。その旨ご承知置き願いたい。

 さて、以下が、そのdiffコマンドで作成した差分ファイルであるが、今後の為、適宜、註記を追記して行く予定でいる。見たことがない人は、'diff -du 前ファイル 現ファイル'の様に叩いて頂けば同じものが得られるが、Windowsには標準ではないので、別途入手導入が必要でとなる。見方は、マイナスは前ファイルのみにある行、プラスは現ファイルのみにある行として読んで行けばよい。共通の前後行が位置情報として書出されているのでdiffファイルだけでも概ね変更内容を把握出来るが必要により人は前ファイル と 現ファイル参照することもある。



--- DVD_Label_0.0.17_2009-07-28b_23.58JST\dvd_label.py Mon Aug 01 11:11:04 2011
+++ DVD_Label_0.0.21_2011-07-31_21.52JST\dvd_label.py Sun Jul 31 21:43:04 2011
@@ -1,28 +1,44 @@
-#!c:\\Python26\\/python.exe
+#!c:\\Python26\\python.exe
# -*- coding: UTF8 -*-
# ※ Windows の場合1行目はdummyです。

-
#####################################################################
#表示系個別関数
def dsp_adv():
- from sys import stdout
- from codecs import getwriter
- stdout = getwriter('utf_8')(stdout)
- print u"\n########################################################################"
- print u"# System NAME : DVD-VIDEO TITLES LABELER Ver.0.0.17 2009-07-28b #"
- print u"# Copyright : 2009- Mire(まあいいやあ) http://pythonlife.seesaa.net/ #"
- #print u"# Licence : GPLに基づく利用と再配布をお願いします。 #"
- #print u"# Requirement : Python2.6 or later 但しWondows,Shift_JISでの決打ちあり #"
- #print u"# HowToRun : Type 'python dvd_label.py' on windows command prompt. #"
- print u"########################################################################"
+ print u"\n######################################################################"
+ print u"# System NAME: DVD-VIDEO TITLES LABELER Ver.0.0.21alpha 2011-07-31 #"
+ print u"# Copyright : 2009- Mire(まあいいやあ) in Japan #"
+ print u"# Contact : http://pythonlife.seesaa.net/article/124770100.html #"
+# print u"# Licence : GPLv3(意味:そのままの利用再配布自由+ソース公開義務) #"
+# print u"# http://www.gnu.org/copyleft/gpl.html #"
+# print u"# http://www.opensource.jp/gpl/gpl.ja.html #"
+# print u"# http://www.gnu.org/licenses/rms-why-gplv3.ja.html #"
+# print u"# Requirement: Python2.6 or later 但しWondows,Shift_JISでの決打ちあり#"
+# print u"# HowToRun : Type 'python dvd_label.py' on windows command prompt. #"
+ print u"######################################################################"
+
+
+__author__ = "Mire in Japan"
+__version__ = '0.0.21alpha'
+__copyright__ = 'Copyright (c) 2011 Mire'
+__license__ = 'GPL'
+__url__ = 'http://pythonlife.up.seesaa.net/download/DVD_LABEL.html'


def dsp_history():
print u"\n####################### HISTORY OF THE SOFTWARE #######################"
print u"# #"
+ print u"# 0.0.21 2011-07-31 「R」でDB登録に、ソースのCleanupとコメント付記 #"
+ print u"# 登録済番組には右端にディスク番号を追記表示 #"
+ print u"# #"
+ print u"# 0.0.20 2011-02-08 dsp_disks()でディスクタイトルの一覧表示を暫定追加#"
+ print u"# #"
+ print u"# 0.0.19 2011-02-08 items.has_key(item)をitem in items:に置換Py3対策 #"
+ print u"# #"
+ print u"# 0.0.18 2009-08-26 SQLiteでDB検索機能追加開始 #"
+ print u"# #"
print u"# 0.0.17 2009-07-28b 記載をsjisからutf8に変更し、文字化け対策 #"
- print u"# タイトル長Shiftとカッコ文字対策の干渉調整#"
+ print u"# 番組名長Shiftとカッコ文字対策の干渉調整#"
print u"# 0.0.16 2009-07-28 規定値をdvd_label.confで設定可能に #"
print u"# toolフォルダのpathを返すtool_path()を汎用化#"
print u"# 0.0.15 2009-07-27 操作の?:簡易説明の追加 操作変更等 #"
@@ -62,11 +78,16 @@
def dsp_bug():
print u"\n############################# TODO & BUGS #############################"
print u"# 既知の課題 2009-07-25 #"
+ print u"# 0.0.21 「R」でデータ登録する仕様に変更。複数回実行すると2回書込む #"
+ print u"# 0.0.19 操作性(ユーザインターフェイス)が今一つすっきりしない #"
+ print u"# 0.0.19 日付と録画時間が正しく抽出出来ないことがある #"
+ print u"# 0.0.19 検索等の活用ではまだTITLESテーブルしか使っていない #"
+ print u"# 0.0.19 複数回処理するとDBに複数回書込むいい加減な仕様になっている #"
+ print u"# 0.0.18 SQLiteでDB検索機能追加開始 init_db():DBファイル有無で初期化 #"
print u"# 0.0.17 そろそろPython3との互換を考えて書かないとな #"
print u"# 0.0.17 詳細の操作方法説明が未完成だぞ #"
print u"# 0.0.17 DB検索もするなら、そろそろGUIに移行したいな #"
- print u"# 0.0.17 DB検索との連携が出来るといいな #"
- print u"# 0.0.17 UTF8記述としたが、中身はShift_JIS想定のコードのまま #"
+ print u"# 0.0.17 DB検索との連携が出来るといいな(0.0.18移行で対応) #"
print u"# 0.0.14 Internationalization #"
print u"# 0.0.14 DVD-VR以外のFormat分も作りたい。でもFormatが判らない #"
print u"# 0.0.14 全項目を取得出来る様にしたい(ex. Chapter) #"
@@ -77,47 +98,139 @@
def howto():
print u"\n############################# MINI HOW TO #############################"
print u"# #"
+ print u"# * 改行 : DVD-VIDEO IFO内の番組名情報を表示 #"
print u"# #"
- print u"# * 改行 : 現設定で繰返実行しDVD-VIDEOのIFO内のタイトル情報を表示 #"
+ print u"# * Q : このツールを終了 #"
print u"# #"
- print u"# * ±n : メインタイトル文字列長をbite数分増減します。 #"
- print u"# +2 : メインタイトル文字列長が2bite増え、 #"
- print u"# 個別のタイトルがその分短くなります。 #"
- print u"# -1 : メインタイトル文字列長が1bite減り、 #"
- print u"# 個別のタイトルがその分長くなります。 #"
+ print u"# * ±n : メイン番組名(ディスク名)文字列長をbite数分増減します。 #"
+ print u"# +2 : メイン番組名文字列長が2文字増え、 #"
+ print u"# 個別の番組名がその分短くなります。 #"
+ print u"# -1 : メイン番組名文字列長が1文字減り、 #"
+ print u"# 個別の番組名がその分長くなります。 #"
+ print u"# #"
+ print u"# * R : 簡単な検索処理を目的としたデータベースに登録します。 #"
+ print u"# #"
+ print u"# * S : 登録済の番組名の検索モードに移行します。 #"
print u"# #"
+ print u"# * T : 検索データをタブ区切りのテキストデータに変換して、 #"
+ print u"# 「DVD_Label_tab.TSV」の名でファイル出力します。 #"
+ print u"# #"
+ print u"# * D : ディスク名管理データを表示します。(暫定機能) #"
+ print u"# #"
+ print u"# * ? : この「MINI HOW TO」を表示します。 #"
print u"# * 〜: : ドライブ文字を指定して変更 ex. E: F: G: #"
print u"# or /〜 Linux系の場合は'/'で始まるpath指定 #"
print u"# (初期値はdvd_label.confで変更可能) #"
print u"# #"
- print u"# * Q : このツールを終了 #"
- print u"# #"
print u"# * DOC : READMEsjis.txtを表示 #"
print u"# #"
print u"# * BUG : このツールの抱える課題とBUGを表示 #"
print u"# #"
print u"# * HIST : このツールの開発履歴を表示 #"
+# print u"# #"
+# print u"# * HELP : HowTo.txtを表示(未対応) #"
+# print u"# #"
+# print u"# * F=〜 : 項目記号を指定し表示項目を変更(未対応) #"
+# print u"# 【項目記号】 #"
+# print u"# N : 連番 00〜99迄の数字 #"
+# print u"# T : 番組名 メイン番組名分をカットした番組名 #"
+# print u"# D : 日付 月/日の様式 ex. 1/ 1 〜 12/31 #"
+# print u"# H : 録画開始時 時:分:秒 ex. 0: 0: 0 〜 23:59:59 #"
+# print u"# M : 収録時間 時h分'秒" ex. 0' 1 〜 7h59'59" #"
+# print u"# ※ 現時点では、各項目は固定書式です。 #"
print u"# #"
- #print u"# * HELP : HowTo.txtを表示(未対応) #"
- #print u"# #"
- #print u"# * F=〜 : 項目記号を指定し表示項目を変更(未対応) #"
- #print u"# 【項目記号】 #"
- #print u"# N : 連番 00〜99迄の数字 #"
- #print u"# T : タイトル名 メインタイトルをカットしたタイトル名 #"
- #print u"# D : 日付 月/日の様式 ex. 1/ 1 〜 12/31 #"
- #print u"# H : 録画開始時 時:分:秒 ex. 0: 0: 0 〜 23:59:59 #"
- #print u"# M : 収録時間 時h分'秒" ex. 0' 1 〜 7h59'59" #"
- #print u"# ※ 現時点では、各項目は固定書式です。 #"
- #print u"# #"
- print u"# * ? : 操作の簡易説明(これ)を表示します。 #"
+ print u"#######################################################################"
+
+
+def howto_srch():
+ print u"\n########################## MINI HOW TO SEARCH #########################"
+ print u"# . : ピリオド1つだけを指定すると、検索モードから抜けます。 #"
+ print u"# 改行 : キーワードを指定せず改行すると全登録済データを表示します。 #"
+ print u"# ? : ?のみを指定することで、この検索モード操作説明を表示します。 #"
print u"# #"
+ print u"# キーワードの指定方法 #"
+ print u"# * 半角スペースを挟むことで複数のキーワード指定が可能です。 #"
+ print u"# * 複数キーワード指定の場合はその全てを含む番組名を表示します。 #"
+ print u"# * 現時点では番組名に対する検索のみに対応しています。 #"
print u"# #"
print u"#######################################################################"


#####################################################################
+#ネットからの拾いもの
+####################################################################################
+## unicode下のprint書式で全半角幅の区別がなく桁揃えが出来ない不具合に対処 ##
+#「RubyとPythonで全角文字を半角文字2文字として数える」(hush_puppy氏)より勝手に拝借 #
+# http://d.hatena.ne.jp/hush_puppy/20090226/1235661269 #
+# NICEですね。ソース公開されているhush_puppyさんに心より御礼申上げます。 #
+def ljust_kana(str, size, pad = " "): #関数0:指定幅の左寄せの #
+ space = size - width_kana(str) #関数1で定義 等幅文字列を返す #
+ if space > 0: #
+ str += pad * space #
+ return str #
+def width_kana(str): #関数1:半角換算の文字幅を返す #
+ all = len(str) # 全文字数 #
+ zenkaku = count_zen(str) # 全角文字数 #関数2で定義 #
+ hankaku = all - zenkaku # 半角文字数 #
+ return zenkaku * 2 + hankaku #
+def count_zen(str): #関数2:全角文字数をカウント #
+ from unicodedata import east_asian_width #
+ n = 0 #
+ for c in str: #
+ wide_chars = u"WFA" #
+ eaw = east_asian_width(c) #
+ if wide_chars.find(eaw) > -1: #
+ n += 1 #
+ return n #
+#  もうひとつの解としてはUTF8をShift_JISに変換後print書式を通し再度UTF8に変換する #
+# とこも考えられるがUTF8=>Shift_JISがうまくいかないんだな。それに頻繁なコード変換は#
+# 文字化け等の不具合発生の機会を増やすのでhush_puppyさんのアプローチが安全。ただ #
+# 出来るなら、print書式そのものを全角対応にしたいのが本音だ。 #
+## unicode下のprint書式で全半角幅の区別がなく桁揃えが出来ない不具合に対処 ##
+####################################################################################
+
+
+#####################################################################
#システム固有
-def dsp_titles(pa_dic={}): #元々、main()としていたものを改称。
+def init_db(db_file='DVD_Label.DB'):
+ """
+ db_file が存在しない場合に、DBとTABLEをCREATEする。
+ データのINSERT前なら、DBファイルを消して再実行で可。
+ データのINSERT後のTABLE変更は別途ALTER TABLEで実施。
+
+ """
+ from sqlite3 import connect
+ from os.path import exists,getsize
+ if exists(db_file): # db_file があり
+ if getsize(db_file)>0: # そのファイルが空でなかったら
+ return 0 # そのまま立去る
+ conn=connect(db_file) # DB作成と接続
+ cur=conn.cursor() # カーソル作成
+ sql=" CREATE TABLE if not exists DISKS(\n\
+ M_TITLE TEXT DEFAULT '' NOT NULL,\n\
+ D_DATE TEXT DEFAULT '' NOT NULL,\n\
+ TITLES INTEGER DEFAULT 0 NOT NULL,\n\
+ D_NO INTEGER DEFAULT 0 NOT NULL,\n\
+ PLACE TEXT DEFAULT '' NOT NULL,\n\
+ SHELF TEXT DEFAULT '' NOT NULL,\n\
+ BOX TEXT DEFAULT '' NOT NULL,\n\
+ D_DEL TEXT DEFAULT '' NOT NULL,\n\
+ PRIMARY KEY(M_TITLE,D_DATE,TITLES));"
+ cur.execute(sql) # SQL実行
+ sql=""" CREATE TABLE if not exists TITLES (
+ D_NO INTEGER DEFAULT 0 NOT NULL,
+ T_NO INTEGER DEFAULT 0 NOT NULL,
+ T_NAME TEXT DEFAULT '' NOT NULL,
+ T_DATE TEXT DEFAULT '' NOT NULL,
+ T_TIME TEXT DEFAULT '' NOT NULL,
+ D_DEL TEXT DEFAULT '' NOT NULL,\n\
+ PRIMARY KEY(D_NO,T_NO,T_NAME));"""
+ cur.execute(sql) # SQL実行
+ conn.commit() # 変更内容を保存
+ conn.close() # DBを閉じる

+
+
+def dsp_titles(pa_dic={},conf={},db_file='', regist=False): #表示と登録用関数
"""
ここで、他の関数を実行し結果をコンソール出力します
コマンドラインで引数を受付ける様に改造001
@@ -125,32 +238,28 @@
"""
from os.path import exists,join
from sys import argv
- from sys import stdout,stdin
- from codecs import getwriter,getreader
- stdout = getwriter('utf_8')(stdout)
- stdin = getreader('Shift_JIS')(stdin)
+ #from sys import stdout,stdin
+ #from codecs import getwriter,getreader
+ DISKs_DIC = {}
+ TITLEs = []
+ stdout_charset= conf["stdout_charset"]
+ stdin_charset= conf["stdin_charset"]
+ vr_charset= conf["vr_charset"]
+# stdout = getwriter(stdout_charset)(stdout)
+# stdin = getreader(stdin_charset)(stdin)

- hikisuu=argv #コマンドの引数を取得。ここでは+または-を伴なうShiftを取得
+ hikisuu=argv #コマンドの引数を取得。ここでは+または-を伴なうShiftを取得
shift=0
- if len(hikisuu)>=2:
- for h in hikisuu[1:]:
- if len(h)>=2 and len(h)<=3 and (h[0]=="+" or h[0]=="-") and h[1:]>='0' and h[1:]<="64":
- shift=int(h)
- break
if pa_dic.has_key("shift"): #操作入力のShift値が優先します。
shift=shift+pa_dic["shift"]

- ##DVD DRIVE文字を設定
- conf=conf_dic(tool_path(),"dvd_label.conf")
if conf.has_key("dvd_drive"): #DVDドライブ文字の規定値をdvd_label.confから取得
drive=conf["dvd_drive"]
- else:
- drive='E' #規定値はE
- if pa_dic.has_key("drive"): #操作入力のDVDドライブ文字をセット
+ if pa_dic.has_key("drive"): #操作入力のDVDドライブ文字をセット
drive=pa_dic["drive"]
if drive[1]==":":
drive="%s" % (drive[:1].upper())
- else: #コマンドラインの引数でDVDドライブ文字を指定可能にした。
+ else: #コマンドラインの引数でDVDドライブ文字を指定可能に
hikisuu=argv
if len(hikisuu)>=2:
for h in hikisuu:
@@ -163,28 +272,169 @@
if not exists("%s:\\DVD_RTAV\\VR_MANGR.IFO" % (drive)):
print u'%sドライブにはDVD-VIDEOの情報形式のディスクが入っていません。' % (drive)
return -1
- ymdhmss=ymdhms(drive) #A.Clipデータより録画日時リストを取得
- title_names=titles(drive) #B.Title名リストを取得
- main_ttl= de_kakko(main_title(title_names,pa_dic=pa_dic)) #C.メインTitle(番組名)の文字列を取得
+ ymdhmss=ymdhms(drive) #A.Clipデータより録画日時LISTを取得
+ title_names=titles(drive,vr_charset) #B.Title名リストを取得
+ main_ttl= de_kakko(main_title(title_names
+ ,pa_dic=pa_dic)) #C.メインTitle(番組名)の文字列を取得

- #print main_ttl
main_ttl_len=len(main_ttl)+shift
- #print ymdhmss[0]
- dt=u"'%0d.%d.%d %02d:%02d" % tuple(ymdhmss[0][0][0:5]) # リストをタプル化し必要な5要素を日付文字列化
- print
+ dt=u"'%0d.%d.%d %02d:%02d" % tuple(ymdhmss[0][0][0:5]) # リストをタプル化必要な
+ print # 5要素を日付文字列化
#print main_ttl.rstrip(),dt,u"〜"
- print title_names[0][:main_ttl_len],dt,u"〜\n"
+ DISKs_DIC['M_TITLE'] = title_names[0][:main_ttl_len]
+ DISKs_DIC['D_DATE'] = u"%4d-%02d-%02d %02d:%02d:%02d" % tuple(ymdhmss[0][0][0:6]) #11-02-12:月日2文字に
+ DISKs_DIC['TITLES'] = len(title_names)
+ sql="SELECT MAX(D_NO) FROM DISKS;" #最大Disk番号を取得するSQL文
+ n = db_query(sql=sql,db_file=db_file)[0][0] #そのを実行で最大DiskNo取得
+ if n is None: #無い時は、
+ n=0 # 0に
+ d_no = n+1 #新Disk番号を決め
+ DISKs_DIC['D_NO'] = d_no #それを代入
+ #M_TITLE = title_names[0][:main_ttl_len] #DB INSRT用
+ #D_DATE = dt #DB INSRT用
+ #TITLES = len(title_names) #DB INSRT用
+ #D_NO = db_query(sql=sql,db_file=db_file)[0][0]+1 #DB INSRT用
+ print title_names[0][:main_ttl_len],dt,u"〜"
+ print u"No. 番組名",
+ s=u" "
+ print s[width_kana(title_names[0][:main_ttl_len]):],
+ print u"月/日時h分\'秒\" DiskNo"
#print "\n%s %s〜\n" % (main_ttl,dt) #ここで、メインTitleを表示
#print u"\n%s %s-\n" % (main_ttl,dt) #ここで、メインTitleを表示
+ sql_exists = """SELECT D_NO FROM TITLES WHERE T_NO='%s' and T_NAME='%s'
+ and T_DATE='%s' and T_TIME='%s'"""
i=0
for t in title_names:
+ TITLEs_DIC = {}
+ TITLEs_DIC['D_NO'] = d_no
d="%2d/%2d" % tuple(ymdhmss[i][0][1:3])
if ymdhmss[i][1][0]>0:
- tm="%2dh%2d\'%02d\"" % (ymdhmss[i][1][0],ymdhmss[i][1][1],ymdhmss[i][1][2])
+ tm= "%1dh%02d\'%02d\"" % (ymdhmss[i][1][0],ymdhmss[i][1][1],ymdhmss[i][1][2])
+ tmd="%1dh%02d\'\'%02d\"" % (ymdhmss[i][1][0],ymdhmss[i][1][1],ymdhmss[i][1][2])
+ # sqliteのSQL文のデータに「'」を含めるときには「''」で表記
else:
- tm=" %2d\'%02d\"" % (ymdhmss[i][1][1],ymdhmss[i][1][2])
- print u"%02d. %s %s %s" % (i+1,t[main_ttl_len:],d,tm) # 個別のTitleを2桁連番と月日付で表示
+ tm=" %2d\'%02d\"" % (ymdhmss[i][1][1],ymdhmss[i][1][2])
+ tmd=" %2d\'\'%02d\"" % (ymdhmss[i][1][1],ymdhmss[i][1][2])
+ TITLEs_DIC['T_NO'] = i+1
+ TITLEs_DIC['T_NAME'] = t
+ TITLEs_DIC['T_DATE'] = u"%4d-%02d-%02d %02d:%02d:%02d" % tuple(ymdhmss[i][0][0:6])
+ TITLEs_DIC['T_TIME'] = tmd
+ dnos = db_query(sql_exists % (TITLEs_DIC['T_NO'], TITLEs_DIC['T_NAME']
+ , TITLEs_DIC['T_DATE'], TITLEs_DIC['T_TIME']), db_file=db_file)
+ if len(dnos)>0:
+ dno_s=[]
+ for n in dnos:
+ dno_s.append('%3d' % (n[0]))
+ existsDB = u' ◎' + ','.join(dno_s)
+ else:
+ existsDB = u''
+ print u"%02d. %s %s %s%s" % (i+1,t[main_ttl_len:],d,tm,existsDB) # 個別のTitleを2桁連番

+ TITLEs.append(TITLEs_DIC) # と月日付で表示
+ i=i+1
+ if regist: #登録指定「R」時
+ ##DB INSERT
+ db_insert( fields=DISKs_DIC,table='DISKS', db_file=db_file) #tableのprimaryキー
+ heres=db_inserts(fields=TITLEs, table='TITLES',db_file=db_file)
+ if len(heres)==len(TITLEs):
+ print u'(全番組名登録済)',
+ elif len(heres)>0:
+ print u'登録済: ',
+ for here in heres:
+ print u'%02d' % (here+1),
+ else:
+ print u'新規に登録しました',
+
+
+##sqliteのDBへの汎用データ挿入関数
+def db_insert(fields={},table='',db_file='',here=-1):
+ """
+ sqliteのDBへの汎用データ挿入関数
+ 利用前に列名:値の形式の辞書を作りfieldsに渡します
+ here は、キー違反により書込が出来なかった場所を返す様にする為の引数
+ 利用は任意だが、DB管理上は必須でしょう。これはdb_inserts()でも活用。
+ """
+ from sqlite3 import connect,IntegrityError
+ from types import IntType,StringType,FloatType,UnicodeType
+ keys=fields.keys()
+ vals=[]
+ for k in keys:
+ if type(fields[k]) is StringType or type(fields[k]) is UnicodeType:
+ vals.append("'%s'" % fields[k])
+ elif type(fields[k]) is IntType:
+ vals.append('%d' % fields[k])
+ elif type(fields[k]) is FloatType:
+ vals.append('%lf' % fields[k])
+ else:
+ vals.append("%s" % fields[k])
+ sql="INSERT INTO %s(%s) VALUES(%s);" % (table,','.join(keys),','.join(vals))
+ conn=connect(db_file)
+ cur=conn.cursor()
+ try:
+ cur.execute(sql)
+ conn.commit()
+ f=here
+ except IntegrityError, (errno): # strerror
+ #print "sqlite3.IntegrityError(%s): %s" % (errno, strerror)
+ #print u'登録済',
+ f=here
+ finally:
+ conn.close()
+ return f
+
+
+def db_inserts(fields=[],table='',db_file=''):
+ """
+ 複数の辞書形式データのリストを連続して1つずつデータ挿入する汎用関数
+ fsはキー違反が発生した位置を配列で返すもの、違反がない場合は[]を返す
+ """
+ fs=[]
+ i=0
+ for f in fields:
+ f=db_insert(fields=f,table=table,db_file=db_file,here=i) #sqliteのDBへの
+ if f >=0: #汎用Data挿入関数
+ fs.append(f)
i=i+1
+ return fs
+
+
+def db_query(sql,db_file):
+ """
+ sqlite3汎用クエリ関数、タプルでデータを返す
+ """
+ from sqlite3 import connect
+ conn=connect(db_file)
+ cur=conn.cursor()
+ conn.commit();
+ cur.execute(sql)
+ datas=cur.fetchall()
+ conn.close()
+ return datas
+
+
+def dsp_disks(db_file):
+ """
+ DISKsテーブル活用に当ってのただ表示するだけの暫定関数
+ """
+ sql="SELECT M_TITLE, TITLES, D_DATE, D_NO, PLACE, SHELF, BOX, D_DEL \n\
+ FROM DISKS\n\
+ ORDER BY M_TITLE, D_DATE, D_NO, D_NO;"
+ datas=db_query(sql,db_file)
+ l=u"+----+--------------------+"
+ l=l+u"----------------------------------------------------------------+---++++"
+ t=u"|通番| date |"
+ t=t+u" disk title | 数||||"
+ print l
+ print t
+ print l
+
+ for line in datas:
+ m_title=ljust_kana(line[0], 64, pad = " ")
+ titles='%3d' % (line[1])
+ d_date=ljust_kana(line[2], 20, pad = " ")
+ d_no='%4d' % (line[3])
+ print u'|%s|%s|%s|%s|%s|%s|%s|%s' % (d_no, d_date, m_title, titles, line[4]
+ , line[5], line[6], line[7])
+ print l


def ymdhms(drive): #A.Titleの録画日時リストを取得
@@ -215,7 +465,12 @@
1. DVD-RAMのIFOファイル: http://www28.atwiki.jp/jennychan/pages/19.html by jennychan さん
2. RD-X4のIFOファイル : http://www28.atwiki.jp/jennychan/pages/20.html by jennychan さん
3. タイトルとチャプタ : http://www28.atwiki.jp/jennychan/pages/18.html by jennychan さん
- jennychanさんのDVD-VR IFOファイル解析がなければ作成は困難でした。心より感謝申上げます。
+ ※ jennychanさんのDVD-VR IFOファイル解析がなければ作成は困難でした。心より感謝申上げます。
+ 4. DVDコピーとIFOファイルのヘッダ
+ http://www005.upp.so-net.ne.jp/neko-note/index.files/3rd/cd-dvd/dcd-ifo.html
+ Video ManaGer(VMG)IFOとVideo Title Set(VTS)IFOファイルのヘッダ
+ http://page.freett.com/bombaya/neta/ifo.html
+ 2009-08-03memo for nextstep
"""
ymdhms_list=[]
addr_crip_list=int('0100', 16) #0100を10進数整数化
@@ -226,22 +481,20 @@
addr_crip_list_no=fpi.read(4) #a. ヘッダブロックにあるClipブロック位置を読取る
koko=koko+4
nums=bites2int(addr_crip_list_no) #バイト表記の整数を10進数整数に
- #print u"Clipブロックデータ位置: %10ld" % (nums)
- crip_list_addr10_0=nums
+ crip_list_addr10_0=nums #Clipブロックデータ位置

fpi.read(nums-koko) #Clipブロックデータ位置迄を読み飛ばす
koko=nums
flag=fpi.read(4) #この4バイトの違いでデータ記載位置が変わる
- #print [flag]
- koko=koko+4
+ koko=koko+4 # どちらに記述されたものかを「:」「.」で表記
if flag=='\x00\x00\x01\x02': # 詳細: http://www28.atwiki.jp/jennychan/pages/20.html
- print u"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n" # どちらで記述されたものかを表記
+ print u"::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n"
crip_info_addr="0080"
elif flag=='\x00\x00\x01\x01': # 詳細: http://www28.atwiki.jp/jennychan/pages/19.html
- print u"........................................................................\n"
+ print u"......................................................................\n"
crip_info_addr="0044"
- else: # 今のところ2つ以外は存在しないとは思われる。
- print u"||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\n"
+ else: # 今のところ2つ以外は存在しないとは思われる。
+ print u"||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\n"
crip_info_addr="0044"
#「Clipリスト」内「Clip数」を取得
addr_crip_su=int(crip_info_addr, 16)#0100を10進数整数化
@@ -249,15 +502,13 @@
koko=koko+addr_crip_su-4
suu=fpi.read(2) #Clip数の読込
koko=koko+2
- crip_su=bites2int(suu)
- #print u"Clip数:",crip_su
+ crip_su=bites2int(suu) #print u"Clip数:",crip_su
addr10_crips=[]
no=1
while no<=crip_su:
addr_crip=fpi.read(4)
koko=koko+4
addr10_crip=bites2int(addr_crip) #Clipの相対アドレスを10進数化
- #print addr10_crip,hex(addr10_crip),hex(crip_list_addr10_0+addr10_crip)
addr10_crips.append(addr10_crip)
no=no+1
p=0
@@ -269,10 +520,8 @@
koko=koko+2
ymdhms5=fpi.read(5) #録画年月日5biteデータの読込み
koko=koko+5
- ymdhms10=bites2int(ymdhms5)
- #print hex(ymdhms10)
+ ymdhms10=bites2int(ymdhms5) #print hex(ymdhms10)
mdhms2=format(ymdhms10,"b") #5biteを2進数文字列化 Python2.6 or laterで対応の関数
- #print mdhms2
year = int(mdhms2[:11], 2) #年11桁 2047年で折返し?
month = int(mdhms2[11:11+4],2) #月 4桁
day = int(mdhms2[15:15+5],2) #日 5桁
@@ -297,7 +546,7 @@
return ymdhms_list ##Clipの[録画年月日,収録時間]のリストを返す


-def titles(drive): #B.Title名リストを取得
+def titles(drive,vr_charset): #B.Title名リストを取得
"""
VR_MANGR.IFOを読んでTitle名を取得
header info
@@ -312,13 +561,10 @@
fpi=open("%s:\\DVD_RTAV\\VR_MANGR.IFO" % (drive),"rb")
koko=koko+addr_title_list
fpi.read(addr_title_list) #Titleブロック位置データ記載位置迄を読み飛ばす
-# print addr_title_list
addr_title_list_no=fpi.read(4) #ヘッダブロックにあるTitleブロック位置を読取る
koko=koko+4
nums=bites2int(addr_title_list_no) #バイト表記の整数を10進数整数に
-# print u"Titleブロックデータ位置: %10ld" % (nums)
fpi.read(nums-koko) #Titleブロックデータ位置迄を読み飛ばす
- ttl=[]
suu=fpi.read(2) ##Title数を読取り
title_su=bites2int(suu) #Title数を10進数化 2009-07-22 10進整数関数に置換え
print u"Title数:",title_su
@@ -327,7 +573,6 @@
t_name=""
while no<=title_su: #Title名を読取り、リスト格納
t=fpi.read(142) #Titleデータを読込む
- #ttl.append(t) #Title情報全部をリストへ格納: ttlは現在未活用
tn=t[68:68+64] #Title名データ全幅を取得
#バイナリデータ独特のヌルバイトx00をスペース文字に置換え。
i=-1
@@ -337,17 +582,17 @@
while tn[i]==chr(0): #bugが潜在:尻尾からx00を探し無条件でスペース化
t_name="%-64s" % (tn[:i]) # x00で終わるマルチバイト文字では要らぬお節介
i=i-1 #の可能性あり。でも、今の規格ではないかな
- t_name= "%-64s" % (t_name.rstrip()) #Shift_JISのままで半角スペース埋めの文字列を作ってから
- title_names.append(unicode(t_name,'Shift_JIS')) #UTF8に変換したTitle名をリスト格納
+ t_name= "%-64s" % (t_name.rstrip()) #Shift_JISのままで半角スペース埋めの文字列を作ってから
+ title_names.append(unicode(t_name,vr_charset)) #UTF8に変換したTitle名をリスト格納
no=no+1
fpi.close()
return title_names #Title名リストを返す


-def de_kakko(title_name): #「『(≪〈の様な括弧の開くで終わる場合にはそれを除く
- if (len(title_name)>=2 and (title_name[-1:]==u"「" or title_name[-1:]==u"(" or title_name[-1:]==u"『"
- or title_name[-1:]==u"≪" or title_name[-1:]==u"〈" or title_name[-1:]==u"“" or title_name[-1:]==u"‘"
- or title_name[-1:]==u"【")):
+def de_kakko(title_name): #「『(≪〈の様な括弧の開くで終わる場合にはそれを除く
+ if (len(title_name)>=2 and (title_name[-1:]==u"「" or title_name[-1:]==u"("
+ or title_name[-1:]==u"『" or title_name[-1:]==u"≪" or title_name[-1:]==u"〈"
+ or title_name[-1:]==u"“" or title_name[-1:]==u"‘" or title_name[-1:]==u"【")):
return title_name[:-1]
else:
return title_name
@@ -360,51 +605,13 @@
Shift_JISコードの第一バイトの場合: http://ja.wikipedia.org/wiki/Shift_JIS
現在、Shift_JISであることが前提の決め打ち。
"""
- from sys import argv
- shift=0
- hikisuu=argv #コマンドの引数を取得
- if len(hikisuu)>=2:
- for h in hikisuu[1:]:
- if len(h)>=2 and len(h)<=3 and (h[0]=="+" or h[0]=="-") and h[1:]>='0' and h[1:]<="64":
- shift=int(h)
- break
- else:
- pass #引数がないのでシフトは既定通りしません。
- if pa_dic.has_key("shift"):
- shift=shift+pa_dic["shift"]
- shift=0
p=0
- #print title_names
pt=title_names[0].rstrip()
m_ttl="%s" % (pt)
- #print u"pt=\"%s\"" % (pt)
for s in pt:
- ##print "s",s
for ttl in title_names[1:]:
- ##print "ttl",ttl
- #if ((0x81 <= ord(ttl[p]) and ord(ttl[p])<= 0x9f)
- # or (0xE0 <= ord(ttl[p]) and ord(ttl[p])<= 0xFC)):
- # print u"sjis1",
- #if (((0x81 <= ord(ttl[p]) and ord(ttl[p])<= 0x9f)
- # or (0xE0 <= ord(ttl[p]) and ord(ttl[p])<= 0xFC))
- # and ((0x40 <= ord(ttl[p+1]) and ord(ttl[p+1])<= 0x7E)
- # or (0x80 <= ord(ttl[p+1]) and ord(ttl[p+1])<= 0xFC))):
- # print u"SJIS",
- #if ttl[p].isalpha():
- # print u"isalpha",
- #print u"*",p,hex(ord(ttl[p])),ttl[p:]
if not ttl[:p]==pt[:p]:#pバイト分を比較して一致しない様になったら
- #return pt[:p-1+shift] #shiftは表示側で適用
return pt[:p-1]
- #if (((0x81 <= ord(ttl[p]) and ord(ttl[p])<= 0x9f) #Shift_JISでないので、
- # or (0xE0 <= ord(ttl[p]) and ord(ttl[p])<= 0xFC)) #この処理は要らない。
- # and ((0x40 <= ord(ttl[p+1]) and ord(ttl[p+1])<= 0x7E) #でも文字コード間互換
- # or (0x80 <= ord(ttl[p+1]) and ord(ttl[p+1])<= 0xFC))): #での課題発生も背負う
- # # 第一バイトの時は一つ前迄をメインTitleとし、文字化け回避 #ことになる。
- # #print u"_",p,hex(ord(ttl[p])),ttl[p:],"sjis1",ttl[:p] #恐らくDVD-VR規格上ては
- # return ttl[:p-2+shift] #実害はないとは思う。
- #else: #2009-07-28 COMMENT化
- # return ttl[:p-1+shift] #次回リリース時に消去
p=p+1
return pt #2009-07-15 add All Error when titles are same name.

@@ -419,8 +626,7 @@
def bites2int(bites):
i=0
for bite in bites:
- i=i*256+ord(bite)
-# print hex(ord(bite)),int(hex(ord(bite)),16)
+ i=i*256+ord(bite) # print hex(ord(bite)),int(hex(ord(bite)),16)
return i

#### 実行toolフォルダのpathを返す #### 2009-07-28 作成
@@ -466,66 +672,146 @@
return conf


-def main_loop(): #元々、実行ブロックだったものをそのまま関数化
+def conf_dvd_label(file_path="",file_name="",missing_message=""):
+ """
+ dvd_labelで利用するdvd_label.conf内で指定可能なもので
+ 設定がないものに既定値を与えkeyerrorの発生を抑える
+ 新たなパラメータを設定したときには必ずここに既定値登録
+ その後に、confへ記入
+ """
+ from locale import getdefaultlocale
+ conf=conf_dic(file_path=file_path, file_name=file_name
+ , missing_message=missing_message)
+ if not "dvd_drive" in conf:
+ conf["dvd_drive"] = "E"
+ if not "vr_charset" in conf:
+ conf["vr_charset"] = getdefaultlocale()[1] #Charset既定値
+ if not "stdin_charset" in conf:
+ conf["stdin_charset"] = getdefaultlocale()[1] #Charset既定値
+ if not "stdout_charset" in conf:
+ conf["stdout_charset"] = "UTF8"
+ if not "format" in conf:
+ conf["format"] = '"N T D H"'
+ return conf
+
+
+def search_title(db_file='',conf=[],op=0):
+ """
+ ラベル作成によりDB登録した番組名をキーワード検索
+ """
+ from sys import stdout,stdin
+ from codecs import getwriter,getreader
+ import codecs
+ ans=""
+ stdout_charset =conf["stdout_charset"]
+ stdin_charset =conf["stdin_charset"]
+
+ stdout = getwriter(stdout_charset)(stdout) #不要っぽい
+ stdin = getreader(stdin_charset)(stdin) #不要っぽい
+ while not (ans.strip().upper() == "."): #ピリオド時のみ終了しmain_loopへ戻る
+ print u'検索[.:終了, 改行:全表示, ?:簡易説明](複数キーワード指定は半角スペース区切り):',
+ ans = unicode(raw_input(),stdin_charset) # 文字列表示でUnicodeEncodeError: 'ascii' codec
+ if ans.upper()=='?': # can't encode characters in position 0-1:
+ howto_srch() # ordinal not in range(128)
+ else:
+ ss=ans.split(' ')
+ likes=[]
+ for s in ss:
+ likes.append("T_NAME LIKE '%%%s%%'" % (s.strip()))
+ sql=u"SELECT D_NO,T_NO,T_NAME,T_DATE,T_TIME FROM TITLES WHERE %s" % (' AND '.join(likes))
+ datas=db_query(sql,db_file)
+ for d in datas:
+ print u"%5d %2d %s %s %8s" % (d[0],d[1],ljust_kana(d[2],64),d[3],d[4])
+ if op==1:
+ try: # *.TSV Tab-Separated Value MIME type: text/tab-separated-values
+ print db_file.split('.')[0]+'_tab.TSV', u"書出し",
+ fpo=codecs.open(db_file.split('.')[0]+'_tab.TSV','w',stdin_charset) #
+ #只のopen()は因縁点けて通さず:UnicodeEncodeError: 'ascii' codec
+ #can't encode characters in position 0-29:ordinal not in range(128)
+ for d in datas:
+ fpo.write(u"%5d\t%2d\t%s\t%s\t%8s\r\n" % (d[0],d[1]
+ ,ljust_kana(d[2],64),d[3],d[4]))
+ fpo.close()
+ print u"完了"
+ return
+ except IOError, (errno, msg):
+ print errno, msg
+ print u"TSVファイルの書出しに失敗しました。"
+ print u"以前作ったファイルが使用中ではありませんか?"
+ print u"Excel等で読込んでいるなら、それを終了してから"
+ print u"再実行して試て下さい。"

+
+def main_loop(db_file=''): #元々、実行ブロックだったものをそのまま関数化
+ """
+ メインメニューを表示し入力を待つ
+ """
from sys import stdout,stdin
from codecs import getwriter,getreader
- stdout = getwriter('utf_8')(stdout)
- stdin = getreader('Shift_JIS')(stdin)
- dsp_adv()
cur_path=tool_path()
- conf=conf_dic(cur_path,"dvd_label.conf")
+ conf=conf_dvd_label(cur_path,"dvd_label.conf")
+ stdout_charset =conf["stdout_charset"]
+ stdin_charset =conf["stdin_charset"]
+ stdout = getwriter(stdout_charset)(stdout) #不要っぽい
+ stdin = getreader(stdin_charset)(stdin) #不要っぽい
+ dsp_adv()
+ init_db(db_file=db_file)
ans=""
drv=""
pa_dic={}
- while not (ans.upper() == "Q" or ans.upper() == "QUIT"): #Qだけの時は終了 2009-07-27 Change E to Q.
+ while not (ans.strip().upper()=="Q" or ans.upper()=="QUIT"): #Qで終了 09-07-27 Change E to Q.
params=ans.split(" ") #操作入力をスペース区切りで項目を取得
for p in params:
if len(p)>=2 and ((p[0].isalpha() and p[1]==":")
- or (p[0]=="/" and p[1].isascii())): #DVDドライブ指定があったなら
+ or (p[0]=="/" and p[1].isascii())): #DVDドライブ指定があったなら
drv="%s" % (p)
pa_dic["drive"]=drv #ドライブ指定変更
- dsp_titles(pa_dic=pa_dic)
- if len(p)>=2 and len(p)<=3 and (p[0]=="+" or p[0]=="-") and p[1:]>='0' and p[1:]<="64":
- shift=int(p)
- pa_dic["shift"]=int(p) #メインTitleのbite長の増減を辞書オブジェクトに"shift"として
- dsp_titles(pa_dic=pa_dic) #登録後、それを渡して、システム本体を実行。
- if p.upper()=="HELP": #ヘルプを表示
- dsp_textfile(cur_path,"HELP_SJIS.txt","現在準備中です。リリースをお待ちください。Mire")
- if p.upper()=="DOC": #READMEを表示
+ dsp_titles(pa_dic=pa_dic,conf=conf,db_file=db_file) ####
+ if (len(p)>=2 and len(p)<=3 and (p[0]=="+" or p[0]=="-") #Main Titleの
+ and p[1:]>='0' and p[1:]<="64"): #文字数を増減
+ shift=int(p) #メインTitleの文字列長の増減を辞書に
+ pa_dic["shift"]=int(p) #"shift"として登録後それを渡してシステム
+ dsp_titles(pa_dic=pa_dic,conf=conf,db_file=db_file) #本体を実行 ####
+ if p.upper()=="HELP": #ヘルプを表示(コンテンツ未作成)
+ dsp_textfile(cur_path,"HELP_SJIS.txt"
+ ,"現在準備中です。リリースをお待ちください。Mire")
+ if p.upper()=="DOC": #READMEを表示 DOC
dsp_textfile(cur_path,"README_SJIS.txt")
- if p.upper()=="BUG": #BUG課題を表示
+ if p.upper()=="BUG": #BUG課題を表示 BUG
dsp_bug()
- if p.upper()=="HIST": #更新履歴を表示
+ if p.upper()=="HIST": #更新履歴を表示 HIST
dsp_history()
- if p=="?": #操作説明表示
+ if p=="?": #操作説明表示 ?
howto()
- if p=="": #改行だけのときは、システム本体をそのまま実行
- dsp_titles(pa_dic=pa_dic)
+ if p.upper()=="R": #データ登録へ R
+ dsp_titles(pa_dic=pa_dic,conf=conf,db_file=db_file,regist=True)
+ if p.upper()=="S": #検索操作へ S
+ search_title(db_file=db_file,conf=conf)
+ if p.upper()=="T": #書出操作へ T
+ search_title(db_file=db_file,conf=conf,op=1)
+ if p.upper()=="D": #DISKsテーブルデータの表示 D
+ dsp_disks(db_file=db_file)
+ if p=="": #改行だけのときはシステム本体をそのまま実行
+ dsp_titles(pa_dic=pa_dic,conf=conf,db_file=db_file) ####

print u"\n"
if not drv=="": #現在のドライブ指定を表示
dsp_drv="(%s)" % (drv)
else:
dsp_drv=""
-# print u"",
- if pa_dic.has_key("shift"): #メインTitle名長の増減を表示
+ if pa_dic.has_key("shift"): #メイン番組名長の増減を表示
if pa_dic["shift"]<0:
- shift_str=u"%d" % (pa_dic["shift"])
- #print pa_dic["shift"]
+ shift_str=u"%d" % (pa_dic["shift"]) #print pa_dic["shift"]
elif pa_dic["shift"]==0:
- shift_str=u"±n"
- #print u"±n"
+ shift_str=u"±n" #print u"±n"
else:
shift_str=u"+%d" % (pa_dic["shift"])
else:
shift_str=u"±n"
-# print shift_str,
- print u'操作[改行:実行, Q:終了, %s:タイトル長増減, ?:簡易説明]%s:' % (shift_str,dsp_drv),
- ans = raw_input() # 文字列表示でUnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
-
-
+ m=u'操作[改行:実行, Q:終了, %s:番組名長増減, R:登録, S:検索, T:書出, ?:How?]%s:';
+ print m % (shift_str, dsp_drv),
+ ans = raw_input() # 文字列表示でUnicodeEncodeError: 'ascii' codec can't
+ # encode characters in position 0-1: ordinal not in range(128)
#####################################################################
#実行ブロック
-try:
- main_loop()
-except:
- pass
+if __name__ == "__main__":
+ db_file='DVD_Label.DB'
+ main_loop(db_file=db_file)
続きを読む
posted by Mire at 22:09 | Comment(0) | TrackBack(0) | 動画環境 | このブログの読者になる | 更新情報をチェックする
月額見放題1,000円開始キャンペーンバナー(画像ありver)
紺碧の艦隊 ルパン三世 GREAT CHASE クリックプロモーション
<< 2011年08月 >>
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
カテゴリ
タグクラウド
ファン
利用中のオープンソース
最近のコメント
最近の記事
過去ログ
QRコード
レガシーなアプリはいかが?
Dell 法人のお客様ページ
  • 【法人様向け】デル、お得なキャンペーン情報
  • 法人のお客様向け ストレージソリューション
  • 法人のお客様向け ネットワークソリューション
  • 【SOHO法人様向け】デル・オンライン広告限定ページ
  • デル-個人のお客様ページ
  • 【個人のお客様向け】デル・オンライン広告限定ページ
  • オンライン広告限定キャンペーンページ
  • ソフトウェア&周辺機器 パソコン工房
    ツートップインターネットショップ(twotop.co.jp) マウスコンピューター/G-Tune
  • ×

    この広告は1年以上新しい記事の投稿がないブログに表示されております。