binding: media: remove binding from source tree
[apps/mediaplayer.git] / app / api / LightMediaScanner.qml
index 1fe2f25..112cb98 100644 (file)
@@ -24,8 +24,9 @@ WebSocket {
     url: bindingAddress
 
     property string statusString: "waiting..."
-    property string apiString: "media-manager"
+    property string apiString: "mediascanner"
     property var verbs: []
+    property var items: []
     property string payloadLength: "9999"
 
     readonly property var msgid: {
@@ -35,6 +36,16 @@ WebSocket {
         "event": 5
     }
 
+    function validateItem(media) {
+        for (var i = 0; i < media.length; i++) {
+            var item = media[i]
+            if (root.items.indexOf(item) < 0) {
+                playlist.addItem(item)
+                root.items.push(item)
+            }
+        }
+    }
+
     onTextMessageReceived: {
         var json = JSON.parse(message)
         console.debug("Raw response: " + message)
@@ -43,21 +54,37 @@ WebSocket {
         console.debug("response: " + JSON.stringify(response))
         switch (json[0]) {
             case msgid.call:
-            break
+                break
             case msgid.retok:
-            root.statusString = request.status
-            var verb = verbs.shift()
-            if (verb == "media_added") {
-                console.debug("Media is inserted")
-            } else if (verb == "media_removed") {
-                console.debug("Media is removed")
-            }
-            break
+                root.statusString = request.status
+                var verb = verbs.shift()
+                if (verb == "media_result") {
+                    console.debug("Media result returned")
+                    validateItem(response.Media)
+                }
+                break
             case msgid.reterr:
-            root.statusString = "Bad return value, binding probably not installed"
-            break
+                root.statusString = "Bad return value, binding probably not installed"
+                break
             case msgid.event:
-            break
+                var payload = JSON.parse(JSON.stringify(json[2]))
+                var event = payload.event
+                if (event == "mediascanner/media_added") {
+                    console.debug("Media is inserted")
+                    validateItem(json[2].data.Media)
+                } else if (event == "mediascanner/media_removed") {
+                    var removed = 0
+                    console.debug("Media is removed")
+                    player.stop()
+
+                    for (var i = 0; i < root.items.length; i++) {
+                        if (root.items[i].startsWith(json[2].data.Path)) {
+                            playlist.removeItem(i - removed++)
+                        }
+                    }
+                    root.items = root.items.filter(function (item) { return !item.startsWith(json[2].data.Path) })
+                }
+                break
         }
     }
 
@@ -65,6 +92,9 @@ WebSocket {
         switch (status) {
             case WebSocket.Open:
             console.debug("onStatusChanged: Open")
+            sendSocketMessage("subscribe", { value: "media_added" })
+            sendSocketMessage("subscribe", { value: "media_removed" })
+            root.populateMediaPlaylist()
             break
             case WebSocket.Error:
             root.statusString = "WebSocket error: " + root.errorString
@@ -79,4 +109,8 @@ WebSocket {
         verbs.push(verb)
         sendTextMessage(JSON.stringify(requestJson))
     }
+
+    function populateMediaPlaylist() {
+        sendSocketMessage("media_result", 'None')
+    }
 }