vk.comには素晴らしいプレイリストがあるだけではありません。 最近では、音楽をダウンロードしてオフラインで聴く方法に戸惑いました。 すぐに便利なサービスSaveFrom.netが見つかりました。 そして、すべてがうまくいくだろうが、彼はすぐにすべての音楽を吐き出すことはできません。 彼は私たちにヴァリナータを提供します:
1.たくさんのURLを与えて、DownloadManagerなどのダウンロードマネージャーにすべてを貼り付けます
2. URLを再生するプレイリストをm3u / plsに保存します
最初の場合、ファイル名は3ee56ab0933e.mp3になります。 ID3タグは配置されます( UPDはすべての曲に正しいID3Tagがあるわけではありません)が、認める必要があります。各曲を開いて内容を確認するのは不便です
2番目の場合-プレイリストには純粋にURLがありますが、曲のタイトルはすぐにわかります。
3ee56ab0933e.mp3という形式のファイルを見たくないし、これらすべてを手動で名前を付けたくなかったので、10の接続でplsプレイリストを読み取り、音楽をダウンロードできるツールをひざの上でスケッチしました。
バイナリ+ソース
コンパイルされた実行可能ファイル+ソースコード(Delphi)はここにあります使い方
1. VKontakteプレイリストを一番下までスクロールして、SaveFrom.netが完全なplsを取得できるようにします2.プレイリストのダウンロードを選択します。
3.表示されるウィンドウで、plsプレイリストをクリップボードにコピーします。
4.このプレイリストを、「ユーティリティPLSテキストをここに挿入」フィールドに挿入します。
5. [ダウンロード]ボタンをクリックして、音楽のダウンロードが開始される様子を確認します。
6.必要に応じて、プログラムの作業ディレクトリにVKMusicフォルダーが作成されます。 フォルダーの名前は変更できます。
パスは絶対パスです。
[ファイルのスキップを許可する]にDawがある場合、プログラムはダウンロードする前にディスクに同じ名前のファイルがあるかどうかを確認し、ダウンロードしません。
ソースコードへの非常に短い脱線
私は主に自分でコードを変更したい人のために書いています。プログラムは、 仮想ツリービューとインディを使用します。
untPLSparser.pas-PLSファイルのパーサー。 モジュールインターフェイスには1つの機能があります。
function Parse(const text: string): TPLSItems;
入力-PLSプレイリストでは、オーディオレコーディングを説明する構造体の配列を返します(タイトル+ URL +トラックの長さ)
この全体が、untDownloadList.pasに記述されている別のTMusicList配列に変換されます。
TMusicListはTMusicItemで構成され、ダウンロードステータスに関する情報と発生したエラーを保存するために必要です。
次に、ダウンロードプロセスが開始されます。 untDownloadThread.pasに実装されている10個の事前作成TDLThreadスレッドは、曲のダウンロードを開始します。
ダウンロードは、untMain.pasのTfrmMain.RunFreeDownloadを介して起動されます。
まず、TfrmMain.GetFreeItemメソッドを使用して、ダウンロードする必要があるレコードのインデックスを取得します。 次に、ファイルをスキップするDawがあるかどうかを確認し、そのようなファイルがあるかどうかを確認し、ある場合はスキップします。
コールバックへのダウンロード中
TMusicItemの情報を実際に更新したり、新しいダウンロードを開始したり、エラーを報告したりするイベントが到着します。DLProgress, DLError, DLComplete, DLTerminate
ダウンロードストリームは次のように機能します。
作成後、スレッドはループでダウンロードタスクを待機します。
while (Url = '') do begin if Terminated then Exit; FInWork := False; Sleep(1); end;
ダウンロードするURLがあるとすぐに-ダウンロードを開始します。 Indyはブロッキングソケットのライブラリであるため、ダウンロードを停止するメカニズムが必要です。 TidHTTP.OnWorkBegin、TidHTTP.OnWork、TidHTTP.OnWorkEndコールバックで特別なEStopTask例外を使用します。これにより、いつでもダウンロードを実際に中止できます。
何かがうまくいかなかったが、それを正しく処理し、作業を続けることができる場合、処理を行い、不完全なファイルを打ち負かします。 処理できないスレッド(AVなど)で例外が発生した場合、標準のメカニズムに従って、スレッドが釘付けになり、例外オブジェクトがFatalExceptionになります。 したがって、untMain.pasでOnTerminateを処理し、スレッドの例外オブジェクトを確認し、存在する場合は、メインスレッドで既に例外をスローします。
結論として
以上で、読んでくれてありがとう。 私の「松葉杖」が突然あなたにとって便利になったことが嬉しいです。