質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

2400閲覧

Swift 再生中の曲の「年」の取り出し方

mitci

総合スコア37

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

1クリップ

投稿2017/12/31 11:51

編集2017/12/31 11:57

###前提・実現したいこと
再生中の曲の情報を表示するアプリを作っています。
MPMediaItemを参照して、タイトル(.title)やアーティスト名など大概のデータは取得できるのですが、iTunesの「曲のプロパティ(windows)」「情報を見る(Mac)」で書き換えることができる「年」という部分を表示することができません・・・
これです↓
これ
iPadでいうところのこれです↓
これこれ

###試したこと
MPMediaItem.releaseDateプロパティというのを見つけて、データフォーマットのインスタンスを宣言したりして色々やってみたのですが、表示させようとするとクラッシュしてしまいました・・・
また、調べてみると英語のstackoverflowでやはり年を取得しようとしている方がいて、MPMediaQueryを使っていたようなのですが(ベストアンサーなしのまま数年が経ってましたが)、オリジナルclassを作ってMPMediaQueryから引っ張ってこないといけないなんて回りくどすぎると思ってしまいました。

###質問
iTunesで設定する「年」という項目は、.releaseDateと同義でしょうか?
また、「年」を取得するには、どうしたらいいのでしょうか?
yearLabel.text = /*ここがわかりません*/
よろしくお願いします。

###補足情報(言語/FW/ツール等のバージョンなど)
xcode8 swift3

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

テスト環境

  • MacOS Sierra 10.12.6
  • Xcode 9.2 Build version 9C40b
  • Apple Swift version 4.0.3 (swiftlang-900.0.74.1 clang-900.0.39.2)

ソース

iTunesでは年が表示されているのに、
releaseDatevalue(forProperty: MPMediaItemPropertyReleaseDate)
nilを返すケースがありますね。Open Radar では不具合とされています。
そのケースでも、value(forProperty: "year")で値が取得できました。そちらも利用してみてください。

swift

1import AVFoundation 2import MediaPlayer 3import UIKit 4 5class ViewController: UIViewController { 6 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 // Do any additional setup after loading the view, typically from a nib. 10 11 let albumsQuery = MPMediaQuery.albums() 12 guard let albums: [MPMediaItemCollection] = albumsQuery.collections else { 13 print("error") 14 return 15 } 16 17 for album in albums { 18 19 let title = album.representativeItem?.albumTitle ?? "" 20 let artist = album.representativeItem?.albumArtist ?? "" 21 let releaseDate = album.representativeItem?.releaseDate 22 let propertyReleaseDate = album.representativeItem?.value(forProperty: MPMediaItemPropertyReleaseDate) 23 let year = album.representativeItem?.value(forProperty: "year") 24 25 print("title: (title)") 26 print("artist: (artist)") 27 print("releaseDate: (releaseDate)") 28 print("propertyReleaseDate: (propertyReleaseDate)") 29 print("year: (year)\n") 30 31 for single in (album.items) { 32 33 let singleTitle = single.value(forProperty: MPMediaItemPropertyTitle) ?? "" 34 let singleArtist = single.value(forProperty: MPMediaItemPropertyArtist) ?? "" 35 let singleReleaseDate = single.releaseDate 36 let singlePropertyReleaseDate = single.value(forProperty: MPMediaItemPropertyReleaseDate) 37 let singleYear = single.value(forProperty: "year") 38 39 print("singleTitle: (singleTitle)") 40 print("singleArtist: (singleArtist)") 41 print("singleReleaseDate: (singleReleaseDate)") 42 print("singlePropertyReleaseDate: (singlePropertyReleaseDate)") 43 print("singleYear: (singleYear)\n") 44 } 45 } 46 47 } 48 49 override func didReceiveMemoryWarning() { 50 super.didReceiveMemoryWarning() 51 // Dispose of any resources that can be recreated. 52 } 53 54 55} 56 57

サンプル

title: GOLDEN☆BEST 村下孝蔵ベスト・セレクト・ソングズ artist: 村下孝蔵 releaseDate: nil propertyReleaseDate: nil year: Optional(2013) singleTitle: 初恋 singleArtist: 村下孝蔵 singleReleaseDate: nil singlePropertyReleaseDate: nil singleYear: Optional(2013) ---略--- title: Songs of Innocence artist: U2 releaseDate: Optional(2014-09-09 07:00:00 +0000) propertyReleaseDate: Optional(2014-09-09 07:00:00 +0000) year: Optional(2014) singleTitle: The Miracle (Of Joey Ramone) singleArtist: U2 singleReleaseDate: Optional(2014-09-09 07:00:00 +0000) singlePropertyReleaseDate: Optional(2014-09-09 07:00:00 +0000) singleYear: Optional(2014)

releaseDatevalue(forProperty: "year")が一致しないケースもありました。
iTunesで表示されているのは1981です。

title: グレイテスト・ヒッツ artist: クイーン releaseDate: Optional(1981-10-26 08:00:00 +0000) propertyReleaseDate: Optional(1981-10-26 08:00:00 +0000) year: Optional(2011) singleTitle: Bohemian Rhapsody (2011 Remaster) singleArtist: クイーン singleReleaseDate: Optional(1981-10-26 08:00:00 +0000) singlePropertyReleaseDate: Optional(1981-10-26 08:00:00 +0000) singleYear: Optional(2011)

参考

ios - Release Date of MPMediaItem returning Nil (Swift 4) - Stack Overflow
rdar://21765993: MPMediaItemPropertyReleaseDate returns nil although Music app shows year

投稿2018/01/01 22:54

izkn

総合スコア1698

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mitci

2018/01/02 13:05

できました! iTunesのそれぞれの項目って、結構雑な作りになってますよね・・・「歌詞」が消えるとかどのiOSバージョンでも必ず起こる現象ですし・・・ ちなみに、single.value(forProperty: "year")の取得に体感で4秒くらいかかるのですが、これはタイミングが悪いのでしょうか?(「曲の詳細を見る」というボタンのaction func内でMediaQueryを宣言していちいちyearを取得しているのですが)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問