主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

スポンサーサイト

                
tags:
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Windows 10: ユニバーサルアプリを作ってみた その2

                
1507152230430.jpg

 Windows 10にはGroove Musicというオーディオファイル再生のためのアプリが入っているが、個人的には機能をそぎ落としたシンプルなものが使いたい。アルバムをクリックするたびにそのアルバムの詳細を表示する画面への遷移がいらない。遷移があると次のアルバムを選ぶために一覧へもどるという手間が増えて面倒。各曲の評価や時間の表示もいらない。聴きたい曲を流すだけなのでそんな情報は読まない。選んだアルバムのタイトル、アーティスト、収録曲がわかれば十分。というわけでユニバーサルアプリで自作してみる。機能をそぎ落としたものを作るので、標準搭載のアプリであるGroove Musicよりすごいものができるわけではない。簡単なものを作りつつ、ユニバーサルアプリ作成への理解を深めたかった。

 ユニバーサルアプリのパフォーマンスに関しては悪くないものになるようだ。.NET Nativeによってストアアプリのリリース設定版は中間言語ではなくネイティブコードにコンパイルされるとのこと。ユニバーサルアプリは公開時にMSのサーバにソリューションをアップロードして、ARM、x86、x64のそれぞれにコンパイルされて、ユーザがアプリをダウンロードするときに構成にあったものを落とさせるんだろう。

・オーディオファイル一覧とそのメタ情報の取得、各ファイルのアルバム単位への分割
 オーディオアプリということでまずはオーディオファイルとそのメタデータ収集。.NET Framework使用のアプリではDirectoryInfoなどからGetFilesで拡張子指定をかけてオーディオファイルを取ってこれた。
var files = new DirectoryInfo(uri)).GetFiles(".mp3", SearchOption.AllDirectories);
 これで集めたファイルをCOMのWMPLibにあるクラスに渡せばオーディオファイルのメタ情報を得られた。
var media = mediaInfo.wmpLib.newMedia(filePath);
var groupID = media.getItemInfo("WM/WMCollectionGroupID");
 このファイルアクセスやCOMの使用などのあたりは.NET Frameworkでやるのとユニバーサルアプリでは勝手が違う。そもそもユニバーサルアプリではファイルアクセスに制限がかかっているのもあるし。ただオーディオファイルのメタ情報を得たければ標準でFileStorageというオブジェクトから得る方法が準備されているところは助かった。
await KnownFolders.MusicLibrary.GetFoldersAsync(Windows.Storage.Search.CommonFolderQuery.GroupByAlbum);
上記のメソッドに渡しているクエリオプションによってどうフォルダを得るかを変えられる。GroupByAlbum以外にGroupuByArtist、GroupByAlbumArtistをはじめとしてジャンル別などわりといろいろ条件は準備されいる。アルバム一覧を表示するパネルにアーティストの名前順で表示したかったのでGroupByArtist、GroupByAlbumArtistなどを試してみたが、オーディオファイルがアルバム分けされずにアーティストの曲がごっちゃにまとまって返ってきた。なのでメタ情報取得後に改めてLINQなどでグルーピングしなおしたり。

・取得したオーディオファイルメタデータをデータベースへ
 オーディオファイルのメタデータを取得したら以降でその読み込みをとっとと行えるようにデータベースへつっこむ。簡単な構造でデータを保存するので柔軟性のあるドキュメント指向のデータベースが使いたかった。だがまだ対応したものはないらしいのでSQLiteを使用した。
http://www.codeproject.com/Articles/826602/Using-SQLite-as-local-database-with-Universal-Apps
 メタデータはアルバムごとにアルバムタイトル(string)、アーティスト名(string)、トラックタイトル(List)、ファイルパス(List)という具合にまとめたい。なるべく簡単にまとめたいので中間テーブルとか作りたくない(だからドキュメント指向データベースを使いたかった)。Listであるトラックタイトルとファイルパスがこのままじゃデータベースに保存できないけどどうするかなーと考えてみて、ListをJSONシリアライズすることで解決した。JSONのシリアライズ、デシリアライズもユニバーサルアプリでは新しいクラスが用意されていた。
https://msdn.microsoft.com/en-us/library/windows/apps/xaml/hh770289.aspx
[Table("Album")]
class Album
{
[PrimaryKey]
public string AlbumID { get; set; }
public string Title { get; set; }
public string Artist { get; set; }
public int Length { get; set; }
public string _TrackPaths { get; private set; }
public string _Titles { get; private set; }
public DateTime Added { get; set; }

[Ignore]
public List<string> TrackPaths
{
get
{
var ja = JsonArray.Parse(_TrackPaths);
return (from a in ja.GetArray()
select a.GetString()).ToList();
}
set
{
var ja = new JsonArray();
foreach (var a in value)
{
ja.Add(JsonValue.CreateStringValue(a));
}
_TrackPaths = ja.Stringify();
}
}

[Ignore]
public List<string> Titles
{
get
{
var ja = JsonArray.Parse(_Titles);
return (from a in ja.GetArray()
select a.GetString()).ToList();
}
set
{
var ja = new JsonArray();
foreach (var a in value)
{
ja.Add(JsonValue.CreateStringValue(a));
}
_Titles = ja.Stringify();
}
}
}


 完成物イメージはこの記事のトップにスクショで置いてある。もしストアで公開するならもうちょい、コントロールがなにと連動してるかなどをわかりやすくせねばならない。だがとりあえず自分で使うぐらいには困らないかつ快適なものができた。
https://github.com/hMatoba/PlaneAudioU/tree/master/PlaneAudioU
            

コメントの投稿

非公開コメント

プロフィール

hMatoba

Author:hMatoba
Github

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。