]> git.sesse.net Git - vlc/commitdiff
http-interface: - changed logic so playlist is only downloaded initially and on modif...
authorMark Hassman <mark@hassman.org>
Wed, 28 Jul 2010 17:08:53 +0000 (13:08 -0400)
committerIlkka Ollakka <ileoo@videolan.org>
Wed, 28 Jul 2010 18:00:28 +0000 (21:00 +0300)
no longer re-downloads playlist on each item change (this was causing
significant delays (>10sec) in the http service with large playlists).. now,
the playlist UI is updated locally based on information returned from
status.xml

Signed-off-by: Ilkka Ollakka <ileoo@videolan.org>
share/http/js/functions.js

index f259542987f850146ec394491a490da4129794fe..9ecce150de2d5ce60033d8305ea071c9c711c66a 100644 (file)
@@ -279,6 +279,14 @@ function clear_children( elt )
         while( elt.hasChildNodes() )
             elt.removeChild( elt.firstChild );
 }
+function playlist_populated()
+{
+    if( document.getElementById( 'playtree' ) != null && document.getElementById( 'playtree' ).childElementCount > 0 )
+    {
+        return true;
+    }
+    return false;
+}
 
 /**********************************************************************
  * Interface actions
@@ -332,22 +340,22 @@ function pl_previous()
 function pl_delete( id )
 {
     loadXMLDoc( 'requests/status.xml?command=pl_delete&id='+id, parse_status );
-    setTimeout( 'update_playlist()', 1000 );
+    setTimeout( 'update_playlist(true)', 1000 );
 }
 function pl_empty()
 {
     loadXMLDoc( 'requests/status.xml?command=pl_empty', parse_status );
-    setTimeout( 'update_playlist()', 1000 );
+    setTimeout( 'update_playlist(true)', 1000 );
 }
 function pl_sort( sort, order )
 {
     loadXMLDoc( 'requests/status.xml?command=pl_sort&id='+order+'&val='+sort, parse_status );
-    setTimeout( 'update_playlist()', 1000 );
+    setTimeout( 'update_playlist(true)', 1000 );
 }
 function pl_shuffle()
 {
     loadXMLDoc( 'requests/status.xml?command=pl_random', parse_status );
-    setTimeout( 'update_playlist()', 1000 );
+    setTimeout( 'update_playlist(true)', 1000 );
 }
 function pl_loop()
 {
@@ -395,9 +403,16 @@ function update_status()
         loadXMLDoc( 'requests/status.xml', parse_status );
     }
 }
-function update_playlist()
+function update_playlist(force_refresh)
 {
-    loadXMLDoc( 'requests/playlist.xml', parse_playlist );
+    if( force_refresh || !playlist_populated() )
+    {
+        loadXMLDoc( 'requests/playlist.xml', parse_playlist );
+    }
+    else
+    {
+        loadXMLDoc( 'requests/status.xml', update_playlist_view );
+    }
 }
 
 /**********************************************************************
@@ -598,7 +613,7 @@ function parse_playlist()
                         var nowplaying = document.getElementById( 'nowplaying' );
                         clear_children( nowplaying );
                         nowplaying.appendChild( document.createTextNode( elt.getAttribute( 'name' ) ) );
-                        pl.appendChild( document.createTextNode( '* '));
+                        pl.appendChild( document.createTextNode( '));
                         pl_cur_id = elt.getAttribute( 'id' );
                     }
                     pl.setAttribute( 'title', elt.getAttribute( 'uri' ));
@@ -704,6 +719,65 @@ function parse_browse_dir( )
     }
 }
 
+/* updates playlist to display active entry */
+function update_playlist_view ()
+{
+    if( req.readyState == 4 ) {
+        if( req.status == 200 ) {
+            var status = req.responseXML.documentElement;
+            var title = status.getElementsByTagName( 'title' );
+            if( title.length > 0 ) {
+                title = title[0].firstChild.data;
+
+                //update now-playing..
+                var nowplaying = document.getElementById( 'nowplaying' );
+                clear_children( nowplaying );
+                nowplaying.appendChild( document.createTextNode( title ) );
+
+                //update playlist..
+                var playtree = document.getElementById( 'playtree' );
+                if( playtree.hasChildNodes() )
+                {
+                    var root = playtree.firstChild;  //root div
+                    if( root.hasChildNodes() )
+                    {
+                        for( var i = 0; i < root.childNodes.length - 1; i++ )
+                        {
+                            if ( root.childNodes[i].className == "pl_node" && root.childNodes[i].hasChildNodes() )
+                            {
+                                var node = root.childNodes[i];  //pl_node
+                                if( node.className == "pl_node" && node.hasChildNodes() )
+                                {
+                                    for( var j = 0; j < node.childNodes.length - 1; j++ )
+                                    {
+                                        if( node.childNodes[j].className == "pl_leaf" )
+                                        {
+                                            var leaf = node.childNodes[j];  //pl_leaf
+                                            var pl_title = leaf.textContent.substring( 0, leaf.textContent.length - leaf.text.length )
+                                            //if( leaf.style.fontWeight == "bold" && pl_title.substring(0, 2) == "* " )  //handle leaf currently identified as playing..
+                                            //{
+                                            //    pl_title = pl_title.substring(2);
+                                            //}
+                                            if( pl_title == title )
+                                            {
+                                                leaf.style.fontWeight = "bold";
+                                            }
+                                            else
+                                            {
+                                                leaf.style.fontWeight = "";
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
+
 /**********************************************************************
  * Input dialog functions
  *********************************************************************/