Legato-Dev / Legato

AIMP4 Remote API Wrapper Library for .NET
https://www.nuget.org/packages/Legato/
MIT License
10 stars 2 forks source link

曲データのタグ情報からアルバムアートを取得する(ID3タグ) #32

Closed marihachi closed 6 years ago

Asteriskx commented 7 years ago

ID3 タグは v1, v2 等、複数種類に分かれているので、 要検討

Asteriskx commented 7 years ago

v1 が旧規格

Asteriskx commented 7 years ago

TagInfo クラスみたいな感じで 共通定義できる部分は纏めたい

Asteriskx commented 7 years ago

骨組みは作成済み

marihachi commented 7 years ago

ID3のそれぞれのバージョンのクラスを共通化も含めて作成した上で、それらを使ったIAlbumArtExtractorを実装するクラス(MP3AlbumArtExtractor等)を作っていく必要があると思う

https://github.com/Legato-Dev/Legato/blob/master/Legato.AlbumArtExtraction/IAlbumArtExtractor.cs

Asteriskx commented 7 years ago

今指摘されたインターフェイス使って、実装してるよ

marihachi commented 7 years ago

ワーイ

Asteriskx commented 7 years ago
v2.2 v2.3 v2.4 内容
CRA AENC AENC バイナリ ( 説明付き ) オーディオの暗号化形式
-- -- -- -- --
CRM     独自複合形式 暗号化メタフレーム
PIC APIC APIC 画像 ジャケット画像
    ASPI バイナリ ( 独自形式 ) オーディオ シーケンス ポイント インデックス
COM COMM COMM テキスト ( 文字コード、言語、説明付き ) コメント
  COMR COMR 独自複合形式 コマーシャル フレーム
  ENCR ENCR バイナリ ( 説明付き ) 暗号化の手法
EQU EQUA EQU2 バイナリ ( 独自形式 ) イコライザー情報
ETC ETCO ETCO バイナリ ( 独自形式 ) イベント タイム コード
GEO GEOB GEOB 独自複合形式 パッケージ化された一般的なオブジェクト
  GRID GRID バイナリ ( 説明付き ) グループ識別子
IPL IPLS   テキスト ( 文字コード指定 ) 協力者
LNK LINK LINK LINK 形式 リンク情報
MCI MCDI MCDI 純バイナリ 音楽CD識別子
MLL MLLT MLLT バイナリ ( 独自形式 ) MPEG ロケーション ルックアップ テーブル
  OWNE OWNE バイナリ ( 独自形式 ) 所有権フレーム
  PRIV PRIV バイナリ ( 説明付き ) プライベート フレーム
CNT PCNT PCNT 純バイナリ 再生回数
POP POPM POPM バイナリ ( 説明付き ) 人気 ( 1 ~ 255 の数値で表す評価 )
  POSS POSS バイナリ ( 独自形式 ) 同期位置フレーム
BUF RBUF RBUF バイナリ ( 独自形式 ) 推奨バッファ サイズ
RVA RVAD RVA2 バイナリ ( 独自形式 ) 相対ボリューム
REV RVRB RVRB バイナリ ( 独自形式 ) リバーブ量
    SEEK サイズ指定バイナリ シーク フレーム
    SIGN バイナリ ( 独自形式 ) 署名フレーム
SLT SYLT SYLT 独自複合形式 タイムラインを持つ歌詞情報
STC SYTC SYTC バイナリ ( 独自形式 ) タイムラインを持つテンポ ( Bit Per Minute ) 情報
TAL TALB TALB テキスト ( 文字コード指定 ) 曲の属するアルバム、映画、劇などの名前
TBP TBPM TBPM テキスト ( 文字コード指定 ) テンポ ( Bit Per Minute )
TCM TCOM TCOM テキスト ( 文字コード指定 ) 作曲者
TCO TCON TCON テキスト ( 文字コード指定 ) ジャンル
TCR TCOP TCOP テキスト ( 文字コード指定 ) 著作権情報
TDA TDAT   テキスト ( 文字コード指定 ) 日付
    TDEN テキスト ( 文字コード指定 ) エンコード日時
TDY TDLY TDLY テキスト ( 文字コード指定 ) プレイリスト遅延時間 ( 曲間の無音時間をスキップするための情報 )
TOR TORY TDOR テキスト ( 文字コード指定 ) 原曲のリリース年、日時
TRD TRDA TDRC テキスト ( 文字コード指定 ) 録音日時
TYE TYER TDRL テキスト ( 文字コード指定 ) リリース年、日時
    TDTG テキスト ( 文字コード指定 ) タグ付け日時
TEN TENC TENC テキスト ( 文字コード指定 ) ファイルのエンコードをおこなった個人または組織
TXT TEXT TEXT テキスト ( 文字コード指定 ) 作詞家
TFT TFLT TFLT テキスト ( 文字コード指定 ) オーディオ ファイルの形式
    TIPL テキスト ( 文字コード指定 ) 関わった人々の一覧
TIM TIME   テキスト ( 文字コード指定 ) レコーディングに要した時間 ( 形式は HHMM、計 4 桁の文字列 )
TT1 TIT1 TIT1 テキスト ( 文字コード指定 ) グループの説明
TT2 TIT2 TIT2 テキスト ( 文字コード指定 ) タイトル
TT3 TIT3 TIT3 テキスト ( 文字コード指定 ) 副題やタイトルの補足説明
TKE TKEY TKEY テキスト ( 文字コード指定 ) 曲頭のキー ( C、Am、F♯ といった調の文字列 )
TLA TLAN TLAN テキスト ( 文字コード指定 ) 言語 ( ISO-639-2 として定義された 3 文字の文字列 )
TLE TLEN TLEN テキスト ( 文字コード指定 ) 演奏時間 ( ミリ秒単位 )
    TMCL テキスト ( 文字コード指定 ) ミュージシャン クレジット リスト
TMT TMED TMED テキスト ( 文字コード指定 ) メディア種別 ( 音楽 CD、レコード、…etc )
    TMOO テキスト ( 文字コード指定 ) ムード
TOT TOAL TOAL テキスト ( 文字コード指定 ) オリジナルのアルバム/映画/ショーのタイトル
TOF TOFN TOFN テキスト ( 文字コード指定 ) 元のファイル名
TOL TOLY TOLY テキスト ( 文字コード指定 ) 原曲の作詞者
TOA TOPE TOPE テキスト ( 文字コード指定 ) 原曲のアーティスト
  TOWN TOWN テキスト ( 文字コード指定 ) ファイルの所有者・ライセンシー
TP1 TPE1 TPE1 テキスト ( 文字コード指定 ) 主なアーティスト、演奏者など
TP2 TPE2 TPE2 テキスト ( 文字コード指定 ) レコーディングをおこなった演奏者
TP3 TPE3 TPE3 テキスト ( 文字コード指定 ) 指揮者
TP4 TPE4 TPE4 テキスト ( 文字コード指定 ) リミックスや編曲の担当者
TPA TPOS TPOS テキスト ( 文字コード指定 ) 曲の属するグループ内の番号 ( スラッシュ区切りの文字列 )。複数枚や複数の組曲で構成されるアルバムの場合、それらの総数と何番目に位置するかを表す。例えば 3 枚組のアルバムにおいて、2 枚目に属する曲ならば “2/3” となる。
    TPRO テキスト ( 文字コード指定 ) 制作予告
TPB TPUB TPUB テキスト ( 文字コード指定 ) 曲の発行元 ( レーベル )
TRK TRCK TRCK テキスト ( 文字コード指定 ) トラック番号 ( 書式は “番号/総数” )
  TRSN TRSN テキスト ( 文字コード指定 ) インターネットラジオ局の名前
  TRSO TRSO テキスト ( 文字コード指定 ) インターネットラジオ局の所有者
    TSOA テキスト ( 文字コード指定 ) アルバムのソートオーダー
    TSOP テキスト ( 文字コード指定 ) 演奏者のソートオーダー
    TSOT テキスト ( 文字コード指定 ) タイトルのソートオーダー
TSI TSIZ   テキスト ( 文字コード指定 ) サイズ
TRC TSRC TSRC テキスト ( 文字コード指定 ) 国際標準レコーディングコード( International Standard Recording Code )
TSS TSSE TSSE テキスト ( 文字コード指定 ) エンコード設定
    TSST テキスト ( 文字コード指定 ) セットのサブタイトル
TXX TXXX TXXX テキスト ( 文字コード、説明付き ) ユーザー定義文字情報フレーム
UFI UFID UFID バイナリ ( 説明付き ) ファイルの一意な識別子
  USER USER テキスト ( 文字コード、言語 ) 使用条件
ULT USLT USLT テキスト ( 文字コード、言語、説明付き ) 歌詞
WCM WCOM WCOM URL 販売サイト
WCP WCOP WCOP URL 著作情報サイト
WAF WOAF WOAF URL オーディオファイルの公式サイト
WAR WOAR WOAR URL アーティストの公式サイト
WAS WOAS WAOS URL 音源の公式サイト
  WORS WORS URL インターネットラジオ局の公式サイト
  WPAY WPAY URL 支払い方法
WPB WPUB WPUB URL レーベルの公式サイト
WXX WXXX WXXX テキスト ( 文字コード、説明付き ) ユーザー定義リンクフレーム
Asteriskx commented 7 years ago

非常にめんどいwww

marihachi commented 7 years ago

なにこれ??

Asteriskx commented 7 years ago

ID3 v2 タグの詳細情報 バイナリと格闘するための前準備

marihachi commented 7 years ago

やばい

Asteriskx commented 7 years ago

参考サイト http://norte.coron.jp/sound/mp3_01.html http://akabeko.me/blog/memo/mp3/

Asteriskx commented 7 years ago

ID3v2 タグにおいては各バイトは 7bit のみが有効であるケースが多い。 読み込み処理の例

marihachi commented 7 years ago

ふむ

marihachi commented 7 years ago

ID3 v1系はアルバムアートはもはやサポートされてないっぽいね

marihachi commented 7 years ago

ひとつ分かったことがあって、それは現在使われてるID3のバージョンはほぼv2.3だということです (というか自分の環境ではv2.3のmp3しか見つからなかった) だから、v2.3だけに対応して、それ以外はサポートしないというのはどうかな?

marihachi commented 7 years ago

:zap: :zap:

using System.Drawing;
using System.IO;

namespace Legato.AlbumArtExtraction
{
    public class ID3v23AlbumArtExtractor : IAlbumArtExtractor
    {
        public bool CheckType(string filePath)
        {
            using (var file = new FileStream(filePath, FileMode.Open, FileAccess.Read))
                return (Helper.ReadAsAsciiString(file, 3) == "ID3" && Helper.ReadAsUShort(file) == 0x0300U);
        }

        public Image Extract(string filePath) => null; // TODO
    }
}
Asteriskx commented 7 years ago

でいいかな?

marihachi commented 7 years ago

そっちの環境でもv2.3以外見つからなければそれでいいと思う ごく稀なフォーマットまで対応する必要はない

Asteriskx commented 7 years ago

結論、v2.2〜2.4 まで対応しまつ(・∀・)