diff --git a/harbour-sailfin.pro b/harbour-sailfin.pro
index 917c7fc..8363b91 100644
--- a/harbour-sailfin.pro
+++ b/harbour-sailfin.pro
@@ -48,6 +48,7 @@ DISTFILES += \
qml/components/itemdetails/SeriesDetails.qml \
qml/components/itemdetails/UnsupportedDetails.qml \
qml/components/itemdetails/VideoTrackSelector.qml \
+ qml/components/videoplayer/VideoError.qml \
qml/components/videoplayer/VideoHud.qml \
qml/cover/CoverPage.qml \
qml/cover/PosterCover.qml \
diff --git a/qml/components/VideoPlayer.qml b/qml/components/VideoPlayer.qml
index 73d8f30..59ec599 100644
--- a/qml/components/VideoPlayer.qml
+++ b/qml/components/VideoPlayer.qml
@@ -17,7 +17,7 @@ SilicaItem {
property int progress
readonly property bool landscape: videoOutput.contentRect.width > videoOutput.contentRect.height
property MediaPlayer player
- readonly property bool hudVisible: !hud.hidden
+ readonly property bool hudVisible: !hud.hidden || player.error !== MediaPlayer.NoError
property alias audioTrack: mediaSource.audioIndex
property alias subtitleTrack: mediaSource.subtitleIndex
@@ -74,6 +74,11 @@ SilicaItem {
}
}
+ VideoError {
+ anchors.fill: videoOutput
+ player: playerRoot.player
+ }
+
function stop() {
player.stop()
player.source = ""
diff --git a/qml/components/videoplayer/VideoError.qml b/qml/components/videoplayer/VideoError.qml
new file mode 100644
index 0000000..346945f
--- /dev/null
+++ b/qml/components/videoplayer/VideoError.qml
@@ -0,0 +1,69 @@
+import QtQuick 2.6
+import Sailfish.Silica 1.0
+import QtMultimedia 5.6
+
+Rectangle {
+ id: videoError
+ property MediaPlayer player
+ color: pal.palette.overlayBackgroundColor
+ opacity: player.error === MediaPlayer.NoError ? 0.0 : 1.0
+ Behavior on opacity { FadeAnimator {} }
+
+ SilicaItem {
+ id: pal
+ }
+
+ Column {
+ anchors.centerIn: parent
+ anchors.margins: Theme.horizontalPageMargin
+
+ Label {
+ anchors.horizontalCenter: parent.horizontalCenter
+ font.pixelSize: Theme.fontSizeExtraLarge
+ color: Theme.errorColor
+ text: {
+ switch(player.error) {
+ case MediaPlayer.ResourceError:
+ //: Video playback error: out of resources
+ qsTr("Resource allocation error")
+ break;
+ case MediaPlayer.FormatError:
+ //: Video playback error: unsupported format/codec
+ qsTr("Video format unsupported")
+ break;
+ case MediaPlayer.NetworkError:
+ //: Video playback error: network error
+ qsTr("Network error")
+ break;
+ case MediaPlayer.AccessDenied:
+ //: Video playback error: access denied
+ qsTr("Access denied")
+ break;
+ case MediaPlayer.ServiceMissing:
+ //: Video playback error: the media cannot be played because the media service could not be instantiated.
+ qsTr("Media service missing")
+ break;
+ }
+ }
+ }
+
+ Label {
+ wrapMode: Text.WordWrap
+ text: player.errorString
+ color: Theme.errorColor
+ width: videoError.width - Theme.horizontalPageMargin * 2
+ horizontalAlignment: Text.AlignHCenter
+ }
+
+ Item { width: 1; height: Theme.paddingLarge; }
+
+ ButtonLayout {
+ Button {
+ //: Button to retry loading a video after a failure
+ text: qsTr("Retry")
+ onClicked: player.play()
+ }
+ }
+ }
+
+}
diff --git a/translations/harbour-sailfin.ts b/translations/harbour-sailfin.ts
index 50ce80e..ade2e76 100644
--- a/translations/harbour-sailfin.ts
+++ b/translations/harbour-sailfin.ts
@@ -267,6 +267,34 @@
+
+ VideoError
+
+
+ Video playback error: out of resources
+
+
+
+
+ Video playback error: unsupported format/codec
+
+
+
+
+ Video playback error: network error
+
+
+
+
+ Video playback error: access denied
+
+
+
+
+ Video playback error: the media cannot be played because the media service could not be instantiated.
+
+
+
VideoTrackSelector