private HttpResponse QueueContentsResponse()
        {
            var queue = new QueueTracks();
            var track = Player.CurrentTrack;

            if (track != null)
            {
                var container = Player.ActivePlaylist ?? Player.MediaLibrary;

                var canp = new CanpData
                {
                    DatabaseId      = id,
                    ContainerId     = container.Id,
                    ContainerItemId = track.Id,
                    TrackId         = track.Id
                };

                queue.Add(new QueueTrack()
                {
                    TrackSpecs  = canp.Data,
                    AlbumId     = (track.Album != null) ? track.Album.PersistentId : 0,
                    Album       = track.AlbumName,
                    AlbumArtist = (track.AlbumArtist != null) ? track.AlbumArtist.Id : 0,
                    Artist      = track.ArtistName,
                    Title       = track.Title,
                    Genre       = track.GenreName,
                    MediaKind   = 1,
                    QueueIndex  = 1,
                    Upcoming    = false
                });
            }

            return(new DmapResponse(new
            {
                ceQR = new
                {
                    mstt = 200,
                    muty = (byte)0,
                    ceQu = true, // update???
                    mlcl = queue,
                    apsm = false,
                    aprm = (byte)0
                }
            }));
        }
        private HttpResponse QueueContentsResponse()
        {
            var queue = new QueueTracks();
            var track = Player.CurrentTrack;
            if (track != null)
            {
                var container = Player.ActivePlaylist ?? Player.MediaLibrary;

                var canp = new CanpData
                {
                    DatabaseId = id,
                    ContainerId = container.Id,
                    ContainerItemId = track.Id,
                    TrackId = track.Id
                };

                queue.Add(new QueueTrack()
                {
                    TrackSpecs = canp.Data,
                    AlbumId = (track.Album != null) ? track.Album.PersistentId : 0,
                    Album = track.AlbumName,
                    AlbumArtist = (track.AlbumArtist != null) ? track.AlbumArtist.Id : 0,
                    Artist = track.ArtistName,
                    Title = track.Title,
                    Genre = track.GenreName,
                    MediaKind = 1,
                    QueueIndex = 1,
                    Upcoming = false
                });
            }

            return new DmapResponse(new
            {
                ceQR = new
                {
                    mstt = 200,
                    muty = (byte)0,
                    ceQu = true, // update???
                    mlcl = queue,
                    apsm = false,
                    aprm = (byte)0
                }
            });
        }
Example #3
0
        private HttpResponse PlayStatusUpdateResponse()
        {
            var  revisionStr    = Request.QueryString["revision-number"];
            uint revisionNumber = 0;

            if (!string.IsNullOrEmpty(revisionStr) && uint.TryParse(revisionStr, out revisionNumber))
            {
                if (Session.CtrlIntRevision > 0)
                {
                    while (revisionNumber > Session.CtrlIntRevision)
                    {
                        Thread.Sleep(50);
                        if (!Request.IsClientConnected)
                        {
                            using (Player.BeginRead())
                                return(new DmapResponse(new
                                {
                                    cmst = new
                                    {
                                        mstt = 200,
                                        cmsr = 0,
                                        caps = (byte)2,                                     // play status
                                        cash = (byte)Player.CurrentShuffleMode,             // shuffle status
                                        carp = (byte)Player.CurrentRepeatMode,              // repeat status
                                        cavc = true,                                        //
                                        caas = (int)Player.AvailableShuffleModes << 1,
                                            caar = (int)Player.AvailableRepeatModes << 1,
                                            casu = false,
                                            //ceQu = false,
                                            //ceMQ = true,
                                            //ceNQ = 0
                                    }
                                }));
                        }
                    }
                }
                else
                {
                    Session.CtrlIntRevision = 1;
                }
            }

            using (Player.BeginRead())
            {
                var state = new Dictionary <string, object>()
                {
                    { "mstt", 200 },
                    { "cmsr", Session.CtrlIntRevision + 1 },
                    { "caps", (byte)Player.CurrentState },
                    { "cash", (byte)Player.CurrentShuffleMode },
                    { "carp", (byte)Player.CurrentRepeatMode },
                    { "cavc", true }, // volume controllable
                    { "caas", (int)Player.AvailableShuffleModes << 1 },
                    { "caar", (int)Player.AvailableRepeatModes << 1 },
                    { "casu", false },
                    { "ceGS", false },

                    /*
                     * { "cavs", false },
                     * { "cafs", false },
                     * { "cafe", false },
                     * { "cave", false }*/
                };

                var track = Player.CurrentTrack;

                if (track != null)
                {
                    var liveTrack = track as ILiveTrack;
                    var isLive    = liveTrack != null && liveTrack.IsLiveStream;

                    var container = Player.ActivePlaylist ?? Player.MediaLibrary;

                    /*var containerItemId = container.Id;
                     * var trackList = container.Tracks as IList<ITrack>;
                     * if (trackList != null)
                     *  containerItemId = container.Id + 1 + trackList.IndexOf(track);*/

                    state["cmmk"] = 1;

                    state["canp"] = new CanpData
                    {
                        DatabaseId      = id,
                        ContainerId     = container.Id,
                        ContainerItemId = track.Id,
                        TrackId         = track.Id
                    }.Data;

                    if (track.Album != null)
                    {
                        state["asai"] = track.Album.PersistentId;
                    }

                    if (!isLive)
                    {
                        state["cann"] = track.Title;
                        state["cana"] = track.ArtistName;
                        state["canl"] = track.AlbumName;
                        state["cang"] = track.GenreName;
                        state["cast"] = (uint)Math.Round(track.Duration.TotalMilliseconds);
                        state["cant"] = (uint)Math.Round((track.Duration - Player.CurrentPosition).TotalMilliseconds);
                    }
                    else
                    {
                        state["cann"] = track.Title;
                        state["cana"] = track.ArtistName;
                        state["canl"] = track.AlbumName;
                        state["cang"] = track.GenreName;
                        state["cant"] = uint.MaxValue;
                    }


                    state["casu"] = true;
                    //state["ceMQ"] = false;
                    //state["ceNQ"] = 0;
                }
                state["ceQu"] = false;

                return(new DmapResponse(new
                {
                    cmst = state
                }));
            }
        }
        private HttpResponse PlayStatusUpdateResponse()
        {
            var revisionStr = Request.QueryString["revision-number"];
            uint revisionNumber = 0;
            if (!string.IsNullOrEmpty(revisionStr) && uint.TryParse(revisionStr, out revisionNumber))
            {
                if (Session.CtrlIntRevision > 0)
                {
                    while (revisionNumber > Session.CtrlIntRevision)
                    {
                        Thread.Sleep(50);
                        if (!Request.IsClientConnected)
                        {
                            using (Player.BeginRead())
                                return new DmapResponse(new
                                {
                                    cmst = new
                                    {
                                        mstt = 200,
                                        cmsr = 0,
                                        caps = (byte)2,                                     // play status
                                        cash = (byte)Player.CurrentShuffleMode,             // shuffle status
                                        carp = (byte)Player.CurrentRepeatMode,              // repeat status
                                        cavc = true,                                        //
                                        caas = (int)Player.AvailableShuffleModes << 1,
                                        caar = (int)Player.AvailableRepeatModes << 1,
                                        casu = false,
                                        //ceQu = false,
                                        //ceMQ = true,
                                        //ceNQ = 0
                                    }
                                });
                        }
                    }
                }
                else
                    Session.CtrlIntRevision = 1;
            }

            using (Player.BeginRead())
            {
                var state = new Dictionary<string, object>()
                {
                    { "mstt", 200 },
                    { "cmsr", Session.CtrlIntRevision + 1 },
                    { "caps", (byte)Player.CurrentState },
                    { "cash", (byte)Player.CurrentShuffleMode },
                    { "carp", (byte)Player.CurrentRepeatMode },
                    { "cavc", true }, // volume controllable
                    { "caas", (int)Player.AvailableShuffleModes << 1 },
                    { "caar", (int)Player.AvailableRepeatModes << 1 },
                    { "casu", false },
                    { "ceGS", false },
                    /*
                    { "cavs", false },
                    { "cafs", false },
                    { "cafe", false },
                    { "cave", false }*/
                };

                var track = Player.CurrentTrack;

                if (track != null)
                {
                    var liveTrack = track as ILiveTrack;
                    var isLive = liveTrack != null && liveTrack.IsLiveStream;

                    var container = Player.ActivePlaylist ?? Player.MediaLibrary;

                    /*var containerItemId = container.Id;
                    var trackList = container.Tracks as IList<ITrack>;
                    if (trackList != null)
                        containerItemId = container.Id + 1 + trackList.IndexOf(track);*/

                    state["cmmk"] = 1;

                    state["canp"] = new CanpData
                    {
                        DatabaseId = id,
                        ContainerId = container.Id,
                        ContainerItemId = track.Id,
                        TrackId = track.Id
                    }.Data;

                    if (track.Album != null)
                        state["asai"] = track.Album.PersistentId;

                    if (!isLive)
                    {
                        state["cann"] = track.Title;
                        state["cana"] = track.ArtistName;
                        state["canl"] = track.AlbumName;
                        state["cang"] = track.GenreName;
                        state["cast"] = (uint)Math.Round(track.Duration.TotalMilliseconds);
                        state["cant"] = (uint)Math.Round((track.Duration - Player.CurrentPosition).TotalMilliseconds);
                    }
                    else
                    {
                        state["cann"] = track.Title;
                        state["cana"] = track.ArtistName;
                        state["canl"] = track.AlbumName;
                        state["cang"] = track.GenreName;
                        state["cant"] = uint.MaxValue;
                    }

                    state["casu"] = true;
                    //state["ceMQ"] = false;
                    //state["ceNQ"] = 0;
                }
                state["ceQu"] = false;

                return new DmapResponse(new
                {
                    cmst = state
                });
            }
        }
        /// <summary>
        /// Answers the /ctrl-int/dbid/getproperty request
        ///
        /// Query string arguments are:
        /// session-id: id of the remote session;
        /// properties: comma-separated list of properties to get. Remote seems using only 'volume'.
        /// </summary>
        /// <returns>
        /// cmgt --+
        ///     mstt 4 200 (status)
        ///     cmvo 4 100 (volume, 0-100)
        /// </returns>
        private HttpResponse GetPropertyResponse()
        {
            var allProps = Request.QueryString["properties"];

            var values = new Dictionary <string, object>();

            values["mstt"] = 200;

            if (!string.IsNullOrEmpty(allProps))
            {
                var props = allProps.Split(',');

                using (Player.BeginRead())
                {
                    var track = Player.CurrentTrack;

                    var liveTrack = track as ILiveTrack;
                    var isLive    = liveTrack != null && liveTrack.IsLiveStream;

                    foreach (var prop in props)
                    {
                        switch (prop)
                        {
                        case "dmcp.volume":
                            values["cmvo"] = Player.CurrentVolume;
                            break;

                        case "dacp.playerstate":
                            values["caps"] = (byte)Player.CurrentState;
                            break;

                        case "dacp.nowplaying":
                            if (track != null)
                            {
                                var container = Player.ActivePlaylist ?? Player.MediaLibrary;

                                /*var containerItemId = container.Id;
                                 * var trackList = container.Tracks as IList<ITrack>;
                                 * if (trackList != null)
                                 *  containerItemId = container.Id + 1 + trackList.IndexOf(track);*/

                                values["canp"] = new CanpData
                                {
                                    DatabaseId      = id,
                                    ContainerId     = container.Id,
                                    ContainerItemId = track.Id,
                                    TrackId         = track.Id
                                }.Data;

                                if (!isLive)
                                {
                                    values["cann"] = track.Title;
                                    values["cana"] = track.ArtistName;
                                    values["canl"] = track.AlbumName;
                                    values["cang"] = track.GenreName;
                                }
                                else
                                {
                                    values["cann"] = liveTrack.LiveTitle;
                                    values["cana"] = liveTrack.LiveArtistName;
                                    values["canl"] = liveTrack.LiveAlbumName;
                                    values["cang"] = liveTrack.LiveGenreName;
                                }

                                if (track.Album != null)
                                {
                                    values["asai"] = track.Album.PersistentId;
                                }

                                values["cmmk"] = 1;
                            }
                            break;

                        case "dacp.playingtime":
                            if (track != null)
                            {
                                if (!isLive)
                                {
                                    values["cast"] = (uint)Math.Round(track.Duration.TotalMilliseconds);
                                    values["cant"] = (uint)Math.Round((track.Duration - Player.CurrentPosition).TotalMilliseconds);
                                }
                                else
                                {
                                    values["cant"] = uint.MaxValue;
                                }
                            }
                            break;

                        case "dacp.volumecontrollable":
                            values["cavc"] = true;
                            break;

                        case "dacp.availableshufflestates":
                            values["caas"] = (int)Player.AvailableShuffleModes << 1;
                            break;

                        case "dacp.availablerepeatstates":
                            values["caar"] = (int)Player.AvailableRepeatModes << 1;
                            break;

                        case "dacp.shufflestate":
                            values["cash"] = (byte)Player.CurrentShuffleMode;
                            break;

                        case "dacp.repeatstate":
                            values["carp"] = (byte)Player.CurrentRepeatMode;
                            break;

                        case "dacp.fullscreenenabled":
                            values["cafe"] = false;
                            break;

                        case "dacp.fullscreen":
                            values["cafs"] = (byte)0;
                            break;

                        case "dacp.visualizerenabled":
                            values["cave"] = false;
                            break;

                        case "dacp.visualizer":
                            values["cavs"] = (byte)0;
                            break;
                        }
                    }
                }
            }

            return(new DmapResponse(new { cmgt = values }));
        }
        /// <summary>
        /// Answers the /ctrl-int/dbid/getproperty request
        /// 
        /// Query string arguments are:
        /// session-id: id of the remote session;
        /// properties: comma-separated list of properties to get. Remote seems using only 'volume'.
        /// </summary>
        /// <returns>
        /// cmgt --+
        ///     mstt 4 200 (status)
        ///     cmvo 4 100 (volume, 0-100)
        /// </returns>
        private HttpResponse GetPropertyResponse()
        {
            var allProps = Request.QueryString["properties"];

            var values = new Dictionary<string, object>();
            values["mstt"] = 200;

            if (!string.IsNullOrEmpty(allProps))
            {
                var props = allProps.Split(',');

                using (Player.BeginRead())
                {

                    var track = Player.CurrentTrack;

                    var liveTrack = track as ILiveTrack;
                    var isLive = liveTrack != null && liveTrack.IsLiveStream;

                    foreach (var prop in props)
                        switch (prop)
                        {
                            case "dmcp.volume":
                                values["cmvo"] = Player.CurrentVolume;
                                break;
                            case "dacp.playerstate":
                                values["caps"] = (byte)Player.CurrentState;
                                break;
                            case "dacp.nowplaying":
                                if (track != null)
                                {
                                    var container = Player.ActivePlaylist ?? Player.MediaLibrary;

                                    /*var containerItemId = container.Id;
                                    var trackList = container.Tracks as IList<ITrack>;
                                    if (trackList != null)
                                        containerItemId = container.Id + 1 + trackList.IndexOf(track);*/

                                    values["canp"] = new CanpData
                                    {
                                        DatabaseId = id,
                                        ContainerId = container.Id,
                                        ContainerItemId = track.Id,
                                        TrackId = track.Id
                                    }.Data;

                                    if (!isLive)
                                    {
                                        values["cann"] = track.Title;
                                        values["cana"] = track.ArtistName;
                                        values["canl"] = track.AlbumName;
                                        values["cang"] = track.GenreName;
                                    }
                                    else
                                    {
                                        values["cann"] = liveTrack.LiveTitle;
                                        values["cana"] = liveTrack.LiveArtistName;
                                        values["canl"] = liveTrack.LiveAlbumName;
                                        values["cang"] = liveTrack.LiveGenreName;
                                    }

                                    if (track.Album != null)
                                        values["asai"] = track.Album.PersistentId;

                                    values["cmmk"] = 1;
                                }
                                break;
                            case "dacp.playingtime":
                                if (track != null)
                                {
                                    if (!isLive)
                                    {
                                        values["cast"] = (uint)Math.Round(track.Duration.TotalMilliseconds);
                                        values["cant"] = (uint)Math.Round((track.Duration - Player.CurrentPosition).TotalMilliseconds);
                                    }
                                    else
                                    {
                                        values["cant"] = uint.MaxValue;
                                    }
                                }
                                break;
                            case "dacp.volumecontrollable":
                                values["cavc"] = true;
                                break;
                            case "dacp.availableshufflestates":
                                values["caas"] = (int)Player.AvailableShuffleModes << 1;
                                break;
                            case "dacp.availablerepeatstates":
                                values["caar"] = (int)Player.AvailableRepeatModes << 1;
                                break;
                            case "dacp.shufflestate":
                                values["cash"] = (byte)Player.CurrentShuffleMode;
                                break;
                            case "dacp.repeatstate":
                                values["carp"] = (byte)Player.CurrentRepeatMode;
                                break;
                            case "dacp.fullscreenenabled":
                                values["cafe"] = false;
                                break;
                            case "dacp.fullscreen":
                                values["cafs"] = (byte)0;
                                break;
                            case "dacp.visualizerenabled":
                                values["cave"] = false;
                                break;
                            case "dacp.visualizer":
                                values["cavs"] = (byte)0;
                                break;
                        }
                }
            }

            return new DmapResponse(new { cmgt = values });
        }