Пример #1
0
        public async Task <ActionResult> OnPlaybackStart(
            [FromRoute] Guid userId,
            [FromRoute] Guid itemId,
            [FromQuery] string?mediaSourceId,
            [FromQuery] int?audioStreamIndex,
            [FromQuery] int?subtitleStreamIndex,
            [FromQuery] PlayMethod playMethod,
            [FromQuery] string?liveStreamId,
            [FromQuery] string playSessionId,
            [FromQuery] bool canSeek = false)
        {
            var playbackStartInfo = new PlaybackStartInfo
            {
                CanSeek             = canSeek,
                ItemId              = itemId,
                MediaSourceId       = mediaSourceId,
                AudioStreamIndex    = audioStreamIndex,
                SubtitleStreamIndex = subtitleStreamIndex,
                PlayMethod          = playMethod,
                PlaySessionId       = playSessionId,
                LiveStreamId        = liveStreamId
            };

            playbackStartInfo.PlayMethod = ValidatePlayMethod(playbackStartInfo.PlayMethod, playbackStartInfo.PlaySessionId);
            playbackStartInfo.SessionId  = RequestHelpers.GetSession(_sessionManager, _authContext, Request).Id;
            await _sessionManager.OnPlaybackStart(playbackStartInfo).ConfigureAwait(false);

            return(NoContent());
        }
Пример #2
0
        public void SetMascot(Mascot Mascot)
        {
            Menu.Items.Clear();
            foreach (Voice v in Mascot.Voices)
            {
                MenuItem mi = new MenuItem()
                {
                    Header = v.Message
                };
                mi.Click += (sender, e) =>
                {
                    PlayMethod?.Invoke(v);
                };
                Menu.Items.Add(mi);
            }
            Menu.Items.Add(new Separator());

            Menu.Items.Add(FollowItem);
            Menu.Items.Add(WalkItem);
            Menu.Items.Add(StayItem);

            Menu.Items.Add(new Separator());

            Menu.Items.Add(LockMascotItem);
            Menu.Items.Add(CloseWindowItem);
        }
Пример #3
0
        private PlayMethod ValidatePlayMethod(PlayMethod method, string playSessionId)
        {
            if (method == PlayMethod.Transcode)
            {
                var job = string.IsNullOrWhiteSpace(playSessionId) ? null : _transcodingJobHelper.GetTranscodingJob(playSessionId);
                if (job == null)
                {
                    return(PlayMethod.DirectPlay);
                }
            }

            return(method);
        }
Пример #4
0
        private PlayMethod ValidatePlayMethod(PlayMethod method, string playSessionId)
        {
            if (method == PlayMethod.Transcode)
            {
                var job = string.IsNullOrWhiteSpace(playSessionId) ? null : ApiEntryPoint.Instance.GetTranscodingJob(playSessionId);
                if (job == null)
                {
                    return PlayMethod.DirectPlay;
                }
            }

            return method;
        }
Пример #5
0
        public FormMain()
        {
            InitializeComponent();

            // 起動後即座に初期化処理でnewされるけど初期化処理前に使用されるケースが残っているためここでインスタンスを作っておく
            musicList = new MusicList();

            // 初期化処理
            Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
            Log.setting     = setting = new Setting();
            musicController = new MusicController();
            comparison      = CompareFileName;
            playMethod      = PlaySelected;
            MachineLocked  += FormMain_MachineLocked;
        }
Пример #6
0
        private bool IsEligibleForDirectPlay(MediaSourceInfo item,
                                             int?maxBitrate,
                                             MediaStream subtitleStream,
                                             VideoOptions options,
                                             PlayMethod playMethod)
        {
            if (subtitleStream != null)
            {
                SubtitleProfile subtitleProfile = GetSubtitleProfile(subtitleStream, options.Profile.SubtitleProfiles, playMethod);

                if (subtitleProfile.Method != SubtitleDeliveryMethod.External && subtitleProfile.Method != SubtitleDeliveryMethod.Embed)
                {
                    _logger.Info("Not eligible for {0} due to unsupported subtitles", playMethod);
                    return(false);
                }
            }

            return(IsAudioEligibleForDirectPlay(item, maxBitrate));
        }
Пример #7
0
        public async Task <ActionResult> OnPlaybackProgress(
            [FromRoute] Guid userId,
            [FromRoute] Guid itemId,
            [FromQuery] string?mediaSourceId,
            [FromQuery] long?positionTicks,
            [FromQuery] int?audioStreamIndex,
            [FromQuery] int?subtitleStreamIndex,
            [FromQuery] int?volumeLevel,
            [FromQuery] PlayMethod playMethod,
            [FromQuery] string?liveStreamId,
            [FromQuery] string playSessionId,
            [FromQuery] RepeatMode repeatMode,
            [FromQuery] bool isPaused = false,
            [FromQuery] bool isMuted  = false)
        {
            var playbackProgressInfo = new PlaybackProgressInfo
            {
                ItemId              = itemId,
                PositionTicks       = positionTicks,
                IsMuted             = isMuted,
                IsPaused            = isPaused,
                MediaSourceId       = mediaSourceId,
                AudioStreamIndex    = audioStreamIndex,
                SubtitleStreamIndex = subtitleStreamIndex,
                VolumeLevel         = volumeLevel,
                PlayMethod          = playMethod,
                PlaySessionId       = playSessionId,
                LiveStreamId        = liveStreamId,
                RepeatMode          = repeatMode
            };

            playbackProgressInfo.PlayMethod = ValidatePlayMethod(playbackProgressInfo.PlayMethod, playbackProgressInfo.PlaySessionId);
            playbackProgressInfo.SessionId  = RequestHelpers.GetSession(_sessionManager, _authContext, Request).Id;
            await _sessionManager.OnPlaybackProgress(playbackProgressInfo).ConfigureAwait(false);

            return(NoContent());
        }
Пример #8
0
        private void SetFinishAction(FinishAction finishAction)
        {
            finishActionStopToolStripMenuItem.Checked                   =
                finishActionReplayToolStripMenuItem.Checked             =
                    finishActionNextToolStripMenuItem.Checked           =
                        finishActionPreviousToolStripMenuItem.Checked   =
                            finishActionRandomToolStripMenuItem.Checked = false;
            switch (finishAction)
            {
            case FinishAction.Replay:
                playMethod = PlaySelected;
                finishActionReplayToolStripMenuItem.Checked = true;
                break;

            case FinishAction.Next:
                playMethod = PlayNext;
                finishActionNextToolStripMenuItem.Checked = true;
                break;

            case FinishAction.Previous:
                playMethod = PlayPrevious;
                finishActionPreviousToolStripMenuItem.Checked = true;
                break;

            case FinishAction.Random:
                playMethod = PlayRandom;
                finishActionRandomToolStripMenuItem.Checked = true;
                break;

            default:
                playMethod = PlayStop;
                finishActionStopToolStripMenuItem.Checked = true;
                break;
            }
            setting.FinishAction = finishAction;
        }
Пример #9
0
        private static SubtitleProfile GetExternalSubtitleProfile(MediaStream subtitleStream, SubtitleProfile[] subtitleProfiles, PlayMethod playMethod, bool allowConversion)
        {
            foreach (SubtitleProfile profile in subtitleProfiles)
            {
                if (profile.Method != SubtitleDeliveryMethod.External && profile.Method != SubtitleDeliveryMethod.Hls)
                {
                    continue;
                }

                if (profile.Method == SubtitleDeliveryMethod.Hls && playMethod != PlayMethod.Transcode)
                {
                    continue;
                }

                if (!profile.SupportsLanguage(subtitleStream.Language))
                {
                    continue;
                }

                if ((profile.Method == SubtitleDeliveryMethod.External && subtitleStream.IsTextSubtitleStream == MediaStream.IsTextFormat(profile.Format)) ||
                    (profile.Method == SubtitleDeliveryMethod.Hls && subtitleStream.IsTextSubtitleStream))
                {
                    bool requiresConversion = !StringHelper.EqualsIgnoreCase(subtitleStream.Codec, profile.Format);

                    if (!requiresConversion)
                    {
                        return(profile);
                    }

                    if (!allowConversion)
                    {
                        continue;
                    }

                    if (subtitleStream.IsTextSubtitleStream && subtitleStream.SupportsExternalStream && subtitleStream.SupportsSubtitleConversionTo(profile.Format))
                    {
                        return(profile);
                    }
                }
            }

            return(null);
        }
Пример #10
0
        public static SubtitleProfile GetSubtitleProfile(MediaStream subtitleStream, SubtitleProfile[] subtitleProfiles, PlayMethod playMethod)
        {
            if (playMethod != PlayMethod.Transcode && !subtitleStream.IsExternal)
            {
                // Look for supported embedded subs
                foreach (SubtitleProfile profile in subtitleProfiles)
                {
                    if (!profile.SupportsLanguage(subtitleStream.Language))
                    {
                        continue;
                    }

                    if (profile.Method != SubtitleDeliveryMethod.Embed)
                    {
                        continue;
                    }

                    if (subtitleStream.IsTextSubtitleStream == MediaStream.IsTextFormat(profile.Format) && StringHelper.EqualsIgnoreCase(profile.Format, subtitleStream.Codec))
                    {
                        return(profile);
                    }
                }
            }

            // Look for an external or hls profile that matches the stream type (text/graphical) and doesn't require conversion
            return(GetExternalSubtitleProfile(subtitleStream, subtitleProfiles, playMethod, false) ?? GetExternalSubtitleProfile(subtitleStream, subtitleProfiles, playMethod, true) ?? new SubtitleProfile
            {
                Method = SubtitleDeliveryMethod.Encode,
                Format = subtitleStream.Codec
            });
        }
Пример #11
0
        public static SubtitleProfile GetSubtitleProfile(MediaStream subtitleStream, SubtitleProfile[] subtitleProfiles, EncodingContext context, PlayMethod playMethod)
        {
            if (playMethod != PlayMethod.Transcode)
            {
                // Look for supported embedded subs
                foreach (SubtitleProfile profile in subtitleProfiles)
                {
                    if (!profile.SupportsLanguage(subtitleStream.Language))
                    {
                        continue;
                    }

                    if (profile.Method != SubtitleDeliveryMethod.Embed)
                    {
                        continue;
                    }

                    if (subtitleStream.IsTextSubtitleStream == MediaStream.IsTextFormat(profile.Format) && StringHelper.EqualsIgnoreCase(profile.Format, subtitleStream.Codec))
                    {
                        return(profile);
                    }
                }
            }

            // Look for an external profile that matches the stream type (text/graphical)
            foreach (SubtitleProfile profile in subtitleProfiles)
            {
                bool requiresConversion = !StringHelper.EqualsIgnoreCase(subtitleStream.Codec, profile.Format);

                if (!profile.SupportsLanguage(subtitleStream.Language))
                {
                    continue;
                }

                if (profile.Method == SubtitleDeliveryMethod.External && subtitleStream.IsTextSubtitleStream == MediaStream.IsTextFormat(profile.Format))
                {
                    if (!requiresConversion)
                    {
                        return(profile);
                    }

                    if (subtitleStream.SupportsExternalStream)
                    {
                        return(profile);
                    }

                    // For sync we can handle the longer extraction times
                    if (context == EncodingContext.Static && subtitleStream.IsTextSubtitleStream)
                    {
                        return(profile);
                    }
                }
            }

            return(new SubtitleProfile
            {
                Method = SubtitleDeliveryMethod.Encode,
                Format = subtitleStream.Codec
            });
        }
Пример #12
0
        public static SubtitleProfile GetSubtitleProfile(MediaStream subtitleStream, SubtitleProfile[] subtitleProfiles, EncodingContext context, PlayMethod playMethod)
        {
            if (playMethod != PlayMethod.Transcode)
            {
                // Look for supported embedded subs
                foreach (SubtitleProfile profile in subtitleProfiles)
                {
                    if (!profile.SupportsLanguage(subtitleStream.Language))
                    {
                        continue;
                    }

                    if (profile.Method != SubtitleDeliveryMethod.Embed)
                    {
                        continue;
                    }

                    if (subtitleStream.IsTextSubtitleStream == MediaStream.IsTextFormat(profile.Format) && StringHelper.EqualsIgnoreCase(profile.Format, subtitleStream.Codec))
                    {
                        return profile;
                    }
                }
            }

            // Look for an external profile that matches the stream type (text/graphical)
            foreach (SubtitleProfile profile in subtitleProfiles)
            {
                bool requiresConversion = !StringHelper.EqualsIgnoreCase(subtitleStream.Codec, profile.Format);

                if (!profile.SupportsLanguage(subtitleStream.Language))
                {
                    continue;
                }

                if (profile.Method == SubtitleDeliveryMethod.External && subtitleStream.IsTextSubtitleStream == MediaStream.IsTextFormat(profile.Format))
                {
                    if (!requiresConversion)
                    {
                        return profile;
                    }

                    if (subtitleStream.SupportsExternalStream)
                    {
                        return profile;
                    }

                    // For sync we can handle the longer extraction times
                    if (context == EncodingContext.Static && subtitleStream.IsTextSubtitleStream)
                    {
                        return profile;
                    }
                }
            }

            return new SubtitleProfile
            {
                Method = SubtitleDeliveryMethod.Encode,
                Format = subtitleStream.Codec
            };
        }
Пример #13
0
        private bool IsEligibleForDirectPlay(MediaSourceInfo item,
            int? maxBitrate,
            MediaStream subtitleStream,
            VideoOptions options,
            PlayMethod playMethod)
        {
            if (subtitleStream != null)
            {
                SubtitleProfile subtitleProfile = GetSubtitleProfile(subtitleStream, options.Profile.SubtitleProfiles, options.Context, playMethod);

                if (subtitleProfile.Method != SubtitleDeliveryMethod.External && subtitleProfile.Method != SubtitleDeliveryMethod.Embed)
                {
                    _logger.Debug("Not eligible for {0} due to unsupported subtitles", playMethod);
                    return false;
                }
            }

            return IsAudioEligibleForDirectPlay(item, maxBitrate);
        }
Пример #14
0
 public ExtensionRule(string extension, PlayMethod playMethod)
 {
     Extension  = extension;
     PlayMethod = playMethod;
 }
Пример #15
0
        private static SubtitleProfile GetExternalSubtitleProfile(MediaStream subtitleStream, SubtitleProfile[] subtitleProfiles, PlayMethod playMethod, bool allowConversion)
        {
            foreach (SubtitleProfile profile in subtitleProfiles)
            {
                if (profile.Method != SubtitleDeliveryMethod.External && profile.Method != SubtitleDeliveryMethod.Hls)
                {
                    continue;
                }

                if (profile.Method == SubtitleDeliveryMethod.Hls && playMethod != PlayMethod.Transcode)
                {
                    continue;
                }

                if (!profile.SupportsLanguage(subtitleStream.Language))
                {
                    continue;
                }

                if ((profile.Method == SubtitleDeliveryMethod.External && subtitleStream.IsTextSubtitleStream == MediaStream.IsTextFormat(profile.Format)) ||
                    (profile.Method == SubtitleDeliveryMethod.Hls && subtitleStream.IsTextSubtitleStream))
                {
                    bool requiresConversion = !StringHelper.EqualsIgnoreCase(subtitleStream.Codec, profile.Format);

                    if (!requiresConversion)
                    {
                        return profile;
                    }

                    if (!allowConversion)
                    {
                        continue;
                    }

                    if (subtitleStream.IsTextSubtitleStream && subtitleStream.SupportsExternalStream && subtitleStream.SupportsSubtitleConversionTo(profile.Format))
                    {
                        return profile;
                    }
                }
            }

            return null;
        }
Пример #16
0
        public static SubtitleProfile GetSubtitleProfile(MediaStream subtitleStream, SubtitleProfile[] subtitleProfiles, PlayMethod playMethod)
        {
            if (playMethod != PlayMethod.Transcode && !subtitleStream.IsExternal)
            {
                // Look for supported embedded subs
                foreach (SubtitleProfile profile in subtitleProfiles)
                {
                    if (!profile.SupportsLanguage(subtitleStream.Language))
                    {
                        continue;
                    }

                    if (profile.Method != SubtitleDeliveryMethod.Embed)
                    {
                        continue;
                    }

                    if (subtitleStream.IsTextSubtitleStream == MediaStream.IsTextFormat(profile.Format) && StringHelper.EqualsIgnoreCase(profile.Format, subtitleStream.Codec))
                    {
                        return profile;
                    }
                }
            }

            // Look for an external or hls profile that matches the stream type (text/graphical) and doesn't require conversion
            return GetExternalSubtitleProfile(subtitleStream, subtitleProfiles, playMethod, false) ?? GetExternalSubtitleProfile(subtitleStream, subtitleProfiles, playMethod, true) ?? new SubtitleProfile
            {
                Method = SubtitleDeliveryMethod.Encode,
                Format = subtitleStream.Codec
            };
        }