2020-09-27 18:38:33 +00:00
|
|
|
/*
|
|
|
|
Sailfin: a Jellyfin client written using Qt
|
|
|
|
Copyright (C) 2020 Chris Josten
|
|
|
|
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
|
|
modify it under the terms of the GNU Lesser General Public
|
|
|
|
License as published by the Free Software Foundation; either
|
|
|
|
version 2.1 of the License, or (at your option) any later version.
|
|
|
|
|
|
|
|
This library is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
Lesser General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
|
|
License along with this library; if not, write to the Free Software
|
|
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
|
*/
|
|
|
|
|
2020-09-15 14:53:13 +00:00
|
|
|
import QtQuick 2.0
|
|
|
|
import Sailfish.Silica 1.0
|
2020-09-25 12:46:39 +00:00
|
|
|
import QtMultimedia 5.6
|
2020-09-15 14:53:13 +00:00
|
|
|
import nl.netsoj.chris.Jellyfin 1.0
|
2020-09-27 18:51:07 +00:00
|
|
|
|
2020-09-15 14:53:13 +00:00
|
|
|
import Nemo.Notifications 1.0
|
2020-09-27 18:51:07 +00:00
|
|
|
import Nemo.KeepAlive 1.2
|
2020-09-15 14:53:13 +00:00
|
|
|
|
|
|
|
import "components"
|
|
|
|
import "pages"
|
|
|
|
|
|
|
|
ApplicationWindow {
|
2020-09-26 22:48:13 +00:00
|
|
|
id: appWindow
|
2020-09-15 14:53:13 +00:00
|
|
|
property bool _hasInitialized: false
|
2020-09-25 13:21:08 +00:00
|
|
|
// The global mediaPlayer instance
|
2020-09-25 12:46:39 +00:00
|
|
|
readonly property MediaPlayer mediaPlayer: _mediaPlayer
|
2021-02-14 12:29:30 +00:00
|
|
|
readonly property PlaybackManager playbackManager: _playbackManager
|
2020-09-27 14:54:45 +00:00
|
|
|
|
2020-09-25 13:21:08 +00:00
|
|
|
// Data of the currently selected item. For use on the cover.
|
2021-02-13 20:42:57 +00:00
|
|
|
property JellyfinItem itemData
|
2020-09-27 14:54:45 +00:00
|
|
|
// Id of the collection currently browsing. For use on the cover.
|
|
|
|
property string collectionId
|
2020-09-26 22:48:13 +00:00
|
|
|
|
2021-02-14 12:29:30 +00:00
|
|
|
// Bad way to implement settings, but it'll do for now.
|
|
|
|
property bool showDebugInfo: false
|
|
|
|
|
2021-02-14 17:40:46 +00:00
|
|
|
property bool _hidePlaybackBar: false
|
|
|
|
|
|
|
|
bottomMargin: playbackBar.visibleSize
|
|
|
|
|
2021-02-16 16:25:11 +00:00
|
|
|
|
2020-09-15 14:53:13 +00:00
|
|
|
|
2020-09-26 22:48:13 +00:00
|
|
|
initialPage: Component {
|
|
|
|
MainPage {
|
|
|
|
Connections {
|
|
|
|
target: ApiClient
|
2020-09-25 13:21:08 +00:00
|
|
|
// Replace the MainPage if no server was set up.
|
2020-09-26 22:42:20 +00:00
|
|
|
|
2020-09-26 22:48:13 +00:00
|
|
|
}
|
|
|
|
onStatusChanged: {
|
2020-09-15 14:53:13 +00:00
|
|
|
if (status == PageStatus.Active && !_hasInitialized) {
|
|
|
|
_hasInitialized = true;
|
2020-09-25 12:46:39 +00:00
|
|
|
ApiClient.restoreSavedSession();
|
2020-09-26 22:48:13 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-09-25 12:46:39 +00:00
|
|
|
cover: {
|
|
|
|
if ([MediaPlayer.NoMedia, MediaPlayer.InvalidMedia, MediaPlayer.UnknownStatus].indexOf(mediaPlayer.status) >= 0) {
|
|
|
|
if (itemData) {
|
|
|
|
return Qt.resolvedUrl("cover/PosterCover.qml")
|
|
|
|
} else {
|
|
|
|
return Qt.resolvedUrl("cover/CoverPage.qml")
|
|
|
|
}
|
|
|
|
} else if (mediaPlayer.hasVideo){
|
|
|
|
return Qt.resolvedUrl("cover/VideoCover.qml")
|
|
|
|
}
|
|
|
|
}
|
2020-09-26 22:48:13 +00:00
|
|
|
|
|
|
|
Notification {
|
|
|
|
id: errorNotification
|
|
|
|
previewSummary: "foo"
|
|
|
|
isTransient: true
|
|
|
|
|
|
|
|
function show(data) {
|
|
|
|
previewSummary = data;
|
|
|
|
publish();
|
|
|
|
}
|
|
|
|
}
|
2020-09-27 18:51:07 +00:00
|
|
|
|
|
|
|
MediaPlayer {
|
|
|
|
id: _mediaPlayer
|
|
|
|
autoPlay: true
|
|
|
|
}
|
|
|
|
|
2021-02-14 12:29:30 +00:00
|
|
|
PlaybackManager {
|
|
|
|
id: _playbackManager
|
|
|
|
apiClient: ApiClient
|
|
|
|
mediaPlayer: _mediaPlayer
|
|
|
|
audioIndex: 0
|
|
|
|
autoOpen: true
|
|
|
|
}
|
|
|
|
|
2020-09-27 18:51:07 +00:00
|
|
|
// Keep the sytem alive while playing media
|
|
|
|
KeepAlive {
|
|
|
|
enabled: _mediaPlayer.playbackState == MediaPlayer.PlayingState
|
|
|
|
}
|
|
|
|
|
|
|
|
DisplayBlanking {
|
|
|
|
preventBlanking: _mediaPlayer.playbackState == MediaPlayer.PlayingState && _mediaPlayer.hasVideo
|
|
|
|
}
|
2021-02-13 20:42:57 +00:00
|
|
|
|
2021-02-14 17:40:46 +00:00
|
|
|
PlaybackBar {
|
|
|
|
id: playbackBar
|
|
|
|
manager: _playbackManager
|
2021-02-16 16:25:11 +00:00
|
|
|
state: "hidden"
|
|
|
|
// CTMBWSIU: Code That Might Break When Silica Is Updated
|
|
|
|
Component.onCompleted: playbackBar.parent = __silica_applicationwindow_instance._rotatingItem
|
|
|
|
}
|
|
|
|
|
|
|
|
//FIXME: proper error handling
|
|
|
|
Connections {
|
|
|
|
target: ApiClient
|
|
|
|
onNetworkError: errorNotification.show("Network error: " + error)
|
|
|
|
onConnectionFailed: errorNotification.show("Connect error: " + error)
|
|
|
|
//onConnectionSuccess: errorNotification.show("Success: " + loginMessage)
|
|
|
|
onSetupRequired: {
|
|
|
|
var isInSetup = pageStack.find(function (page) { return typeof page._isSetupPage !== "undefined" }) !== null
|
|
|
|
console.log("Is in setup: " + isInSetup)
|
|
|
|
if (!isInSetup) {
|
|
|
|
pageStack.replace(Qt.resolvedUrl("pages/setup/AddServerPage.qml"), {"backNavigation": false});
|
|
|
|
}
|
|
|
|
}
|
2021-02-13 20:42:57 +00:00
|
|
|
}
|
2020-09-15 14:53:13 +00:00
|
|
|
}
|