Eigene (Meta-) Daten im Swipe-Down-Menü in tvOS anzeigen

Man sollte sich immer neuen Dingen offen gegenüber zeigen. Aus diesem Grund habe ich vor wenigen Tagen mir fest vorgenommen in meiner Freizeit an einer kleinen App für den neuen AppleTV mit tvOS zu arbeiten. Um alles möglichst simpel zuhalten ist diese im Grunde nur eine auf zwei Views basierende Anwendung zum Aussuchen und Betrachten von Videos.

Gerade bei so kleinen „Ausprobiert“-Projekten stolpert man immer mal wieder über kleine Features die man hätte die sich in der Realisierung dann doch in die länge ziehen. Macht ja nix, ist ja Freizeit.

Swipe down Apple TV

Einer der beiden Views ist, wie sollte es auch anders sein, ein Video Player im Vollbild. Genauer gesagt ein AVPlayer (Referenz) samt hierzu passenden AVPlayerViewController (Referenz).

Auf der letztjährigen WWDC wurde das Feature des „zusätzliche Informationen“-Menüs des Apple TVs gezeigt. Hierzu wischt man, meist im Vollbild eines Videos, auf der Fernsteuerung von oben nach unten. In der gleichen Bewegung erscheint hierbei eine halb transparentes, graue Fläche mit fest definierten Werten. Im Standardfall sind dies „Info“ und „Audio“. Diese Bereiche werden aus den Metadaten des Videos gespeist.

An dieser Stelle eines vorne weg: Große Kudos an den Stackoverflow Post Jeff Bowen zur Aufarbeitung dieses Themas! Falls ihr noch nach simplen Code für dieses Problem sucht folgt dem Link zu Stackoverflow.

Nun gibt es Fälle wo das Video diese Metadaten nicht besitzt oder mann diese gern Ändern möchte. Um dies zu tun muss man dem AVPlayerItem (Referenz) des aktiven AVPlayers eine Liste von AVMutableMetadataItem (Referenz) mitgeben.

Ein solches AVMutableMetadataItem benötigt zwingend vier Werte ohne dieses es zwar fehlerfrei baut und deployed jedoch nicht dargestellt wird. So ist neben der Locale auch der keySpace (Übersicht) und der key für das entsprechend Metadatenschlüsselwort (Übersicht) nötig. Als viertes wird in String-Form noch der eigentliche Wert benötigt.

Schlussendlich stopft man also die Metadaten in ein PlayerItem, dieses in einen AVPlayer und dieser steckt in seinem AVPlayerViewController. Apple könnte hier ruhig einmal an ihrer Dokumentation arbeiten.

Dank der tollen Sprachfeatures von Swift kann man jedoch vieles von diesem Boilerplate-Code in eine schöne Extension packen. Somit wart man die Übersichtlichkeit.

Aus all diesem ergibt sich nun bei mir der folgende Code

Extension

extension AVMutableMetadataItem
{
    /// Creates a meta data item for the swipe-down-menu of tvOS's information view
    ///
    /// - parameter avMetadataCommonKey: AVMetadataCommonKey identifier string
    /// - parameter value: String value for the key
    /// - return: Created and defined AVMutableMetadataItem object
    class func createItemWith(AVMetadataCommonKey avMetadataCommonKey: String, value: String) -> AVMutableMetadataItem
    {
        let item        = AVMutableMetadataItem()
        item.locale     = NSLocale.currentLocale()
        item.keySpace   = AVMetadataKeySpaceCommon
        item.key        = avMetadataCommonKey
        item.value      = value

        return item
    }
}

Benutzung

        let playerItem  = AVPlayerItem(URL: videoUrl)
        let titleItem   = AVMutableMetadataItem.createItemWith(AVMetadataCommonKey: AVMetadataCommonKeyTitle, value: videoTitle)

        playerItem.externalMetadata.append(titleItem)
        let playerViewController = AVPlayerViewController()
        playerViewController.player = AVPlayer(playerItem: playerItem)

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s