[ todo ] player version 122
[ todo ] player todo
@[TOC](目次)
# インデクスを使った検索
```
index = self.ui.treeView.model().createIndex(0,0,0)
print('index' , index.data() )
# QModelIndex QAbstractItemModel.createIndex (self, int row, int column, object object = 0)
#これで何が返るか動作確認
#・none ならルート
#・一番上なら??
# parent() を求めてそれをindexにする
#index = index.parent()
#ルートに対して
child = index.child(0,0) # 最初の子供(トップレベルのトップ)
print('child' , child.data() )
child = index.child(1,0) # 二番目の子供(トップレベルのトップ)
print('child' , child.data() )
# QModelIndex QModelIndex.child (self, int arow, int acolumn)
#で確認、これがアーティストのはず
# indexがルートとして、トップレベルの子供の数は
print( self.ui.treeView.model().rowCount( index )
# で返るはず、これでforを回す
```
==========
上でうまくいったらこれで実験
最初の子供(トップ)に対してさらに子供を求める、これがアルバム
そのさらに子供がタイトルで、その第二カラムにフルパス
```
def searchmodeldate(self,index , target): # 再帰的に書きたいよね
for l1 in range(len(self.ui.treeView.model().rowCount( index )))
child = index.child( l1 ,0) # 最初の子供(トップレベルのトップ)
if child.data() == target :
self.ui.treeView.setCurrentIndex( child )
return
for l2 in range(len(self.ui.treeView.model().rowCount( chld )))
child_2 = index.child( l2 ,0) # アルバム名
if child_2.data() == target :
self.ui.treeView.setCurrentIndex( child_2 )
return
for l3 in range(len(self.ui.treeView.model().rowCount( chld_2 )))
child_3 = index.child( l3 ,0) # タイトル名
if child_3.data() == target :
self.ui.treeView.setCurrentIndex( child_3 )
return
child_3_f = index.child( l3 ,1) # フルパス
if child_3_f.data() == target :
self.ui.treeView.setCurrentIndex( child_3_f )
return
```
http://www7a.biglobe.ne.jp/~thor/novel/column/11.html
PyQtでお手軽GUI開発♪―――は可能だったか? 第8回 モデル&ビュー敗北編
------------
# リストの更新
・タグを書き換えても自動では反映されない仕様なので、手動で実装してみる
・DBとはもともと独立してるから、mtagenでスキャンして再設定することになる
・変更するのはタイトルとアルバム行だけだから簡単かな??
・まずはタイトル行だけならすごく簡単だ、DB作成ルーチンをそのまま持ってくれば良いような?
・リストのアルバム行を選択してコンテキストで実行させよう
----------
# リロードルーチン修正
- pyファイル保存してからにしよう
最初に検索を呼ぶ方が良いけど、制御自体はそのあとのDBリロードが完了しないと戻らないから結局は同じ
DBリロードを別スレッドにするなら意味がある
ここら辺結構ややこしいんだよなあ
検索ボックスのチェックルーチンを作る
英数一文字なら何もしない
```
def isSearchBox(): # true if need search
ヌルか英数一文字なら false
def makeModel():
# self.modelが既にあれば削除してからDBをロードしてself.model作成する
# isSearchBox()がfalseならモデルにセットする
# スレッド化して呼ぶ
# initからも呼ぶ
def reloadModel():
# watchDogした後に呼ぶ想定
# isSearchBox()ならsearch()する
# そのあとでmakeModel()をスレッドで呼ぶ
```
# thread
クラスの中でメソッドをスレッドで呼ぶ
import threading
class jikkenn():
def hogeta(self):
print('2')
def gothread(self):
thread = threading.Thread( target= self.hogeta )
thread.start()
jikkenn().gothread()
----
# もろもろ
- コンテキストメニューは別ファイルにしたいなあ
- リストを作成するときに親を渡して記憶させておくか
- winの再生キーを取得したい
グローバルな感じだが??
- リストへの外部ファイルドロップ
・DDを受け付けること
・対象ファイルをmutagenしてタイトル行とアルバム行を作ればOK
・別にしたリストの派生クラスファイルに実装するか
_
- リストのコンテキスト
フォルダを開く、**treeで表示**
- リストのキー受け付け up down
keypresevent に対して行選択を変更するだけ
今はdellキーに対応してるから増やすだけで良いような?
- コンテキスト
曲をタグエディタに直接渡す
- スライダー
・キー対応
-------------
# タグ無しの場合にファイル名をタイトルとする件
書くのは簡単だと思うけど、根本部分の書き直しだとまた10分くらいかかるな
①コードを書き直し
②DBからタイトルが?のものを削除
③更新を実行
これで少し早くできるか??
まず件数をcontしてみるか
-----
----------
# 音量について
foobarで低めに設定したデータをvlcで演奏に生かせるのか?
# cueシート
どう対応して良いのやら全然わからない
曲の再生は出来るが問題は
・tree表示 cueを解析してtreeに加える事は出来るな
・リスト表示はtree情報を表示するだけだよな
あとは再生か
スライダーを曲単位に設定
曲情報をどこに置くか
vlcにcueを直接渡したらどうなるんだろう?
# リプレイゲイン
この機能が無いとやはり効きづらい
そうなってしまったんだなあ
ReplayGain(リプレイゲイン)と、その対応ソフト
http://reika788.blog.fc2.com/blog-entry-11.html
こうなってるけど対応してなさそうなんだけど??
_
_
_
https://www.olivieraubert.net/vlc/python-ctypes/doc/
タグだから読み込んで自分でボリューム設定してやれば良いの?
libvlc_audio_set_volume(p_mi, i_volume)
メインボリュームを記録しておいて、それにゲインを加味して曲毎に設定してやれば良い
**のか???**
# Python データの保存 pickle
pickleってのを知ったので使ってみたいんだけど使えない
丁度foobarのaternativeを作っていてプレイリストにQstandardItemModelを使ってるのでpickleしてみたらエラーで怒られた┐('д')┌
foobarのライブラリを実現するためにsqlも使い出したので、sqlで保存したら簡単にイケた
しかし特にデータベースとしての利用は無い保存だけの目的でsqlを利用するのってどうなんだろう?
単にテキストとかcsvで書き出すのとどう違うんだろう?
sqlにしておけばCSVへは変換できたな
プレイリストが複数になって曲も大量になるようだとsqlの安心感が出てくるんだけど
もろもろの設定もsqlのデータベースに保存してしまおうかと思う
ソフトの位置、最後の曲、プレイリストの数など
プレイリストとテーブルは分けるにしても項目に対してデータが一つだけだとsqlじゃないな
こういうのはiniが普通だと思うけど、iniとDBを分けるのも・・・
仕方ないのかな
やはりpickleを使いたい
pickleなら全て一つで保存できそうな
プレイリストに関してはQstandardItemModelをリストに書き出したら保存できるだろう
各種設定も辞書化すれば保存できると、思う
やってみるか??
----
→ [pythonでfoobarのalternativeを作る 目次](https://mimemo.io/m/3kyw8o3neWG6Lrg)
目次インデクスを使った検索リストの更新リロードルーチン修正threadもろもろタグ無しの場合にファイル名をタイトルとする件音量についてcueシートリプレイゲインPython データの保存 pickle
インデクスを使った検索
index = self.ui.treeView.model().createIndex(0,0,0)
print('index' , index.data() )
# QModelIndex QAbstractItemModel.createIndex (self, int row, int column, object object = 0)
#これで何が返るか動作確認
#・none ならルート
#・一番上なら??
# parent() を求めてそれをindexにする
#index = index.parent()
#ルートに対して
child = index.child(0,0) # 最初の子供(トップレベルのトップ)
print('child' , child.data() )
child = index.child(1,0) # 二番目の子供(トップレベルのトップ)
print('child' , child.data() )
# QModelIndex QModelIndex.child (self, int arow, int acolumn)
#で確認、これがアーティストのはず
# indexがルートとして、トップレベルの子供の数は
print( self.ui.treeView.model().rowCount( index )
# で返るはず、これでforを回す
==========
上でうまくいったらこれで実験
最初の子供(トップ)に対してさらに子供を求める、これがアルバム
そのさらに子供がタイトルで、その第二カラムにフルパス
def searchmodeldate(self,index , target): # 再帰的に書きたいよね
for l1 in range(len(self.ui.treeView.model().rowCount( index )))
child = index.child( l1 ,0) # 最初の子供(トップレベルのトップ)
if child.data() == target :
self.ui.treeView.setCurrentIndex( child )
return
for l2 in range(len(self.ui.treeView.model().rowCount( chld )))
child_2 = index.child( l2 ,0) # アルバム名
if child_2.data() == target :
self.ui.treeView.setCurrentIndex( child_2 )
return
for l3 in range(len(self.ui.treeView.model().rowCount( chld_2 )))
child_3 = index.child( l3 ,0) # タイトル名
if child_3.data() == target :
self.ui.treeView.setCurrentIndex( child_3 )
return
child_3_f = index.child( l3 ,1) # フルパス
if child_3_f.data() == target :
self.ui.treeView.setCurrentIndex( child_3_f )
return
http://www7a.biglobe.ne.jp/~thor/novel/column/11.html
PyQtでお手軽GUI開発♪―――は可能だったか? 第8回 モデル&ビュー敗北編
リストの更新
・タグを書き換えても自動では反映されない仕様なので、手動で実装してみる
・DBとはもともと独立してるから、mtagenでスキャンして再設定することになる
・変更するのはタイトルとアルバム行だけだから簡単かな??
・まずはタイトル行だけならすごく簡単だ、DB作成ルーチンをそのまま持ってくれば良いような?
・リストのアルバム行を選択してコンテキストで実行させよう
リロードルーチン修正
- pyファイル保存してからにしよう
最初に検索を呼ぶ方が良いけど、制御自体はそのあとのDBリロードが完了しないと戻らないから結局は同じ
DBリロードを別スレッドにするなら意味がある
ここら辺結構ややこしいんだよなあ
検索ボックスのチェックルーチンを作る
英数一文字なら何もしない
def isSearchBox(): # true if need search
ヌルか英数一文字なら false
def makeModel():
# self.modelが既にあれば削除してからDBをロードしてself.model作成する
# isSearchBox()がfalseならモデルにセットする
# スレッド化して呼ぶ
# initからも呼ぶ
def reloadModel():
# watchDogした後に呼ぶ想定
# isSearchBox()ならsearch()する
# そのあとでmakeModel()をスレッドで呼ぶ
thread
クラスの中でメソッドをスレッドで呼ぶ
import threading
class jikkenn():
def hogeta(self):
print('2')
def gothread(self):
thread = threading.Thread( target= self.hogeta )
thread.start()
jikkenn().gothread()
もろもろ
-
コンテキストメニューは別ファイルにしたいなあ
-
リストを作成するときに親を渡して記憶させておくか
-
winの再生キーを取得したい
グローバルな感じだが?? -
リストへの外部ファイルドロップ
・DDを受け付けること
・対象ファイルをmutagenしてタイトル行とアルバム行を作ればOK
・別にしたリストの派生クラスファイルに実装するか
_
-
リストのコンテキスト
フォルダを開く、treeで表示 -
リストのキー受け付け up down
keypresevent に対して行選択を変更するだけ
今はdellキーに対応してるから増やすだけで良いような? -
コンテキスト
曲をタグエディタに直接渡す -
スライダー
・キー対応
タグ無しの場合にファイル名をタイトルとする件
書くのは簡単だと思うけど、根本部分の書き直しだとまた10分くらいかかるな
①コードを書き直し
②DBからタイトルが?のものを削除
③更新を実行
これで少し早くできるか??
まず件数をcontしてみるか
音量について
foobarで低めに設定したデータをvlcで演奏に生かせるのか?
cueシート
どう対応して良いのやら全然わからない
曲の再生は出来るが問題は
・tree表示 cueを解析してtreeに加える事は出来るな
・リスト表示はtree情報を表示するだけだよな
あとは再生か
スライダーを曲単位に設定
曲情報をどこに置くか
vlcにcueを直接渡したらどうなるんだろう?
リプレイゲイン
この機能が無いとやはり効きづらい
そうなってしまったんだなあ
ReplayGain(リプレイゲイン)と、その対応ソフト
http://reika788.blog.fc2.com/blog-entry-11.html
こうなってるけど対応してなさそうなんだけど??
_
_
_
https://www.olivieraubert.net/vlc/python-ctypes/doc/
タグだから読み込んで自分でボリューム設定してやれば良いの?
libvlc_audio_set_volume(p_mi, i_volume)
メインボリュームを記録しておいて、それにゲインを加味して曲毎に設定してやれば良い
のか???
Python データの保存 pickle
pickleってのを知ったので使ってみたいんだけど使えない
丁度foobarのaternativeを作っていてプレイリストにQstandardItemModelを使ってるのでpickleしてみたらエラーで怒られた┐('д')┌
foobarのライブラリを実現するためにsqlも使い出したので、sqlで保存したら簡単にイケた
しかし特にデータベースとしての利用は無い保存だけの目的でsqlを利用するのってどうなんだろう?
単にテキストとかcsvで書き出すのとどう違うんだろう?
sqlにしておけばCSVへは変換できたな
プレイリストが複数になって曲も大量になるようだとsqlの安心感が出てくるんだけど
もろもろの設定もsqlのデータベースに保存してしまおうかと思う
ソフトの位置、最後の曲、プレイリストの数など
プレイリストとテーブルは分けるにしても項目に対してデータが一つだけだとsqlじゃないな
こういうのはiniが普通だと思うけど、iniとDBを分けるのも・・・
仕方ないのかな
やはりpickleを使いたい
pickleなら全て一つで保存できそうな
プレイリストに関してはQstandardItemModelをリストに書き出したら保存できるだろう
各種設定も辞書化すれば保存できると、思う
やってみるか??