//
        // Player
        protected ActionResult CreatePlayer(IWebStreamingService streamControl, PlayerViewModel model, List<StreamTarget> targets, WebTranscoderProfile profile, bool album)
        {
            // save stream request
            if (!PlayerOpenedBy.Contains(Request.UserHostAddress))
            {
                PlayerOpenedBy.Add(Request.UserHostAddress);
            }

            // get view properties
            VideoPlayer player = targets.First(x => profile.Targets.Contains(x.Name)).Player;
            string viewName = Enum.GetName(typeof(VideoPlayer), player) + (album ? "Album" : "") + "Player";

            // generate view
            var supportedTargets = Configuration.StreamingPlatforms.GetValidTargetsForUserAgent(Request.UserAgent).Intersect(targets.Select(x => x.Name));
            model.Transcoders = ProfileModel.GetProfilesForTargets(streamControl, supportedTargets).Select(x => x.Name);
            model.Transcoder = profile.Name;
            model.TranscoderProfile = profile;
            model.Player = player;
            model.PlayerViewName = viewName;
            Log.Debug("Created player with size={0} view={1} transcoder={2} url={3}", model.Size, viewName, profile.Name, model.URL);
            return PartialView("Player", model);
        }
        //
        // Player
        protected ActionResult CreatePlayer(IWebStreamingService streamControl, PlayerViewModel model, List<StreamTarget> targets, WebTranscoderProfile profile, bool album)
        {
            // save stream request
            if (!PlayerOpenedBy.Contains(Request.UserHostAddress))
            {
                PlayerOpenedBy.Add(Request.UserHostAddress);
            }

            // get all transcoder profiles
            List<string> profiles = new List<string>();
            foreach (StreamTarget target in targets)
            {
                if (target.ValidForRequest(Request))
                    profiles = profiles.Concat(streamControl.GetTranscoderProfilesForTarget(target.Name).Select(x => x.Name)).Distinct().ToList();
            }

            // get view properties
            VideoPlayer player = targets.First(x => profile.Targets.Contains(x.Name)).Player;
            string viewName = Enum.GetName(typeof(VideoPlayer), player) + (album ? "Album" : "") + "Player";

            // generate view
            model.Transcoders = profiles;
            model.Transcoder = profile.Name;
            model.TranscoderProfile = profile;
            model.Player = player;
            model.PlayerViewName = viewName;
            Log.Debug("Created player with size={0} view={1} transcoder={2} url={3}", model.Size, viewName, profile.Name, model.URL);
            return PartialView("Player", model);
        }
        public ActionResult Player(WebMediaType type, string itemId, int fileindex = 0)
        {
            PlayerViewModel model = new PlayerViewModel();
            model.MediaType = type;
            model.MediaId = itemId;
            model.ContinuationId = randomGenerator.Next(100000, 999999).ToString();

            // get profile
            var profile = GetProfile(GetStreamControl(type), GetDefaultProfile(type));

            // get size
            if (type == WebMediaType.TV)
            {
                // TODO: we should start the timeshifting through an AJAX call, and then load the player based upon the results
                // from that call. Also avoids timeouts of the player when initiating the timeshifting takes a long time.
                // HACK: currently there is no method in WSS to get the aspect ratio for streams with a fixed aspect ratio.
                model.Size = GetStreamControl(type).GetStreamSize(type, null, "", 0, profile.Name);
            }
            else if (!StreamTarget.GetAllTargets().First(t => profile.Targets.Contains(t.Name)).HasVideo)
            {
                model.Size = new WebResolution() { Width = 600, Height = 100 };
            }
            else
            {
                model.Size = GetStreamControl(type).GetStreamSize(type, GetProvider(type), itemId, 0, profile.Name);
            }

            // generate url
            RouteValueDictionary parameters = new RouteValueDictionary();
            parameters["item"] = itemId;
            parameters["fileindex"] = fileindex;
            parameters["transcoder"] = profile.Name;
            parameters["continuationId"] = model.ContinuationId;
            model.URL = Url.Action(Enum.GetName(typeof(WebMediaType), type), parameters);

            // generic part
            var targets = type == WebMediaType.MusicTrack ? StreamTarget.GetAllTargets() : StreamTarget.GetVideoTargets();
            return CreatePlayer(GetStreamControl(type), model, targets, profile, false);
        }
        public ActionResult Player(WebStreamMediaType type, string itemId)
        {
            PlayerViewModel model = new PlayerViewModel();
            model.MediaType = type;
            model.MediaId = itemId;

            // get profile
            var defaultProfile = type == WebStreamMediaType.TV || type == WebStreamMediaType.Recording ?
                Settings.ActiveSettings.DefaultTVProfile :
                Settings.ActiveSettings.DefaultMediaProfile;
            var profile = GetProfile(GetStreamControl(type), defaultProfile);

            // get size
            if(type == WebStreamMediaType.TV)
            {
                // TODO: we should start the timeshifting through an AJAX call, and then load the player based upon the results
                // from that call. Also avoids timeouts of the player when initiating the timeshifting takes a long time.
                // HACK: currently there is no method in WSS to get the aspect ratio for streams with a fixed aspect ratio.
                model.Size = GetStreamControl(type).GetStreamSize(type, null, "", profile.Name);
            }
            else
            {
                model.Size = GetStreamControl(type).GetStreamSize(type, GetProvider(type), itemId, profile.Name);
            }

            // generate url
            RouteValueDictionary parameters = new RouteValueDictionary();
            parameters["item"] = itemId;
            parameters["transcoder"] = profile.Name;
            parameters["continuationId"] = randomGenerator.Next(10000, 99999);
            model.URL = Url.Action(Enum.GetName(typeof(WebStreamMediaType), type), parameters);

            // generic part
            return CreatePlayer(GetStreamControl(type), model, StreamTarget.GetVideoTargets(), profile);
        }