--- Title: '[ todo ] player' Author: yamasyuh68 Web: https://mimemo.io/m/XpEgPoANdklmkjW --- @[TOC](項目) # mp3のエンコーダ確認したい # 不具合 1. 不具合 watchDog を呼んだときに、ログが無いと落ちる 処理はきちんと書いていて、VScodeからだと落ちない こういうのは直すの難しいなあ 違うデバッガ使えば良いのかな?? 2. 起動時の前回演奏局選択 常に最下行なのでスクロールしたい -------- # デレゲートいろいろ ## painter.setFont(QFont('Times', 30)) ## about delegate 1 def paint(self, painter, option, index): option.rect ---> rect to draw option.state ---> QStyle.State_MouseOver QStyle.State_Selected QStyle Class Reference [ PyQt5.QtWidgets ] ## about delegate 2 DropIndicator ``` my_style = _style() treeview.setStyle(my_style) class _style( QStyle ) : def drawPrimitive(self, element, option, painter, widget): if element == QStyle.PE_IndicatorItemViewItemDrop: pen = QPen(Qt.red) pen.setWidth(2) painter.setPen(pen) if not option.rect.isNull(): painter.drawRect(option.rect) return # ?? super().drawPrimitive(element, option, painter, widget) ``` https://qiita.com/pashango2/items/c368f07bdce4b780124c QStyle.drawPrimitive (self, PrimitiveElement pe, QStyleOption opt, QPainter p, QWidget widget = None) QStyle.PE_IndicatorItemViewItemDrop An indicator that is drawn to show where an item in an item view is about to be dropped during a drag-and-drop operation in an item view. --- ## ドロップインジケータ ①選択行に挿入(=上に挿入) ②インジケータは常に上に表示させる 選択行の下には表示せずに常に上 ③rectが返ってくるから、上辺にだけラインを描画すれば良い できればこんな >---< ④ドラッグ中の role を調べよう ⑤選択行が-1で、インジケータが3なら一番下だけど??? --- - リストからの検索、ファイル名だけにする - リロード時もファイル名検索だけにする アーティスト、アルバムを選択している場合は子供の最初のファイル名で検索する仕様にするか ------------ ------- # リストの更新 ・タグを書き換えても自動では反映されない仕様なので、手動で実装してみる ・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キーに対応してるから増やすだけで良いような? - コンテキスト 曲をタグエディタに直接渡す - スライダー ・キー対応 ------------- # タグ無しの場合にファイル名をタイトルとする件 DBからタイトルが?のものを削除 sqllite3 のコンソールで出来そう そのあと普通に更新 --- - watchdog に対象ファイルを加えて実行したらどうだろう? あるいは一回削除してゴミ箱から戻すとか - 変更コードはこんな感じ スクリプトは二つあるから両方ね - もし変更日が同じで何もしてくれなかったら、 削除→更新 戻す→更新 - **削除のログも出したい** 削除前にカウント掛けるか?? ``` try: title += m['title'][0] except: title='?' ``` ここの部分を ``` try: title += m['title'][0] except: title=os.path.split(p[0][1] # ここ ``` こう変えるだけでいいような? タイトルだけ変えても意味ないのかな? 意味はあるよな ----- ---------- # 音量について 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をリストに書き出したら保存できるだろう 各種設定も辞書化すれば保存できると、思う やってみるか?? ---- # 再生のエンジンは他にもあった BASS.dll https://www.un4seen.com/ Un4Seen BASS Audio Library for Python https://mediarealm.com.au/articles/un4seen-bass-audio-library-python/ - usage http://bass.radio42.com/help/html/8f455613-bc52-0829-5d87-aedf2f8d99f5.htm [DllImportAttribute("bass")] public static bool BASS_ChannelPause( int handle ) [DllImportAttribute("bass")] public static bool BASS_ChannelStop( int handle ) public static long BASS_ChannelGetLength( # return long int handle ) public static long BASS_ChannelGetPosition( int handle ) ---- → [戻る pythonでfoobarのalternativeを作る](https://mimemo.io/m/3kyw8o3neWG6Lrg)