Exemplo n.º 1
0
        public byte[] GetThumbnail(
            string originalPath,
            string ffmpegFolder,
            MediaClassification mediaClassification,
            long originalLastChanged,
            out bool foundInCache)
        {
            Log.Logger.Debug($"Getting thumbnail: {originalPath}");

            byte[] result = _databaseService.GetThumbnailFromCache(originalPath, originalLastChanged);
            if (result != null)
            {
                Log.Logger.Verbose("Found thumbnail in cache");
                foundInCache = true;
                return(result);
            }

            try
            {
                result = GenerateThumbnail(originalPath, ffmpegFolder, mediaClassification);
                if (result != null)
                {
                    _databaseService.AddThumbnailToCache(originalPath, originalLastChanged, result);
                }
            }
            catch (Exception ex)
            {
                Log.Logger.Error(ex, $"Could not get a thumbnail for {originalPath}");
                result = _standardUnknownThumbnail.Value;
            }

            foundInCache = false;
            return(result);
        }
        public Task Play(Uri mediaPath, MediaClassification mediaClassification)
        {
            _currentMediaClassification = mediaClassification;

            if (_currentMediaClassification == MediaClassification.Audio)
            {
                if (!IsPaused)
                {
                    _audioPlayer.Value.Open(mediaPath);
                }

                IsPaused = false;
                _audioPlayer.Value.Play();
            }
            else
            {
                IsPaused = false;

                if (_mediaElement.Source != mediaPath)
                {
                    _mediaElement.Source = mediaPath;
                }

                _mediaElement.Play();
            }

            _timer.Start();

            return(Task.CompletedTask);
        }
Exemplo n.º 3
0
        private byte[] GenerateThumbnail(
            string originalPath,
            string ffmpegFolder,
            MediaClassification mediaClassification)
        {
            Log.Logger.Debug("Generating thumbnail");

            switch (mediaClassification)
            {
            case MediaClassification.Image:
                return(GraphicsUtils.CreateThumbnailOfImage(originalPath, MaxPixelDimension, ImageFormat.Jpeg));

            case MediaClassification.Video:
                var tempFile = GraphicsUtils.CreateThumbnailForVideo(
                    originalPath,
                    ffmpegFolder,
                    _optionsService.Options.EmbeddedThumbnails);

                if (string.IsNullOrEmpty(tempFile))
                {
                    return(null);
                }

                return(File.ReadAllBytes(tempFile));

            case MediaClassification.Audio:
                return(_standardAudioThumbnail.Value);

            case MediaClassification.Slideshow:
                return(GetSlideshowThumbnail(originalPath));

            default:
                return(null);
            }
        }
Exemplo n.º 4
0
        public MediaMetaData GetMetaData(string mediaItemFilePath, MediaClassification mediaType)
        {
            MediaMetaData result = null;

            try
            {
                using (var tf = TagLib.File.Create(mediaItemFilePath))
                {
                    tf.Mode = TagLib.File.AccessMode.Read;

                    result = new MediaMetaData
                    {
                        Title    = StripNewLines(tf.Tag?.Title),
                        Duration = tf.Properties.Duration
                    };
                }
            }
            catch (System.IO.IOException)
            {
                Log.Logger.Error($"Could not get metadata from file: {mediaItemFilePath} (in use)");
            }
            catch (Exception ex)
            {
                Log.Logger.Error(ex, $"Could not get metadata from file: {mediaItemFilePath}");
            }

            return(result);
        }
Exemplo n.º 5
0
        private MediaEventArgs CreateMediaEventArgs(Guid id, MediaClassification mediaClassification, MediaChange change)
        {
            if (id == Guid.Empty)
            {
                return(null);
            }

            return(new MediaEventArgs
            {
                MediaItemId = id,
                Classification = mediaClassification,
                Change = change
            });
        }
Exemplo n.º 6
0
        private void UnplaceImage(
            Guid mediaItemId,
            MediaClassification mediaClassification,
            ImageFadeType fadeType,
            Action <Guid, MediaClassification> stopping,
            Action <Guid, MediaClassification> stopped)
        {
            var fadeTime = _optionsService.Options.ImageFadeSpeed.GetFadeSpeedSeconds();

            stopping?.Invoke(mediaItemId, mediaClassification);

            if (_image1MediaItemId == mediaItemId)
            {
                if ((int)_image1.GetValue(Panel.ZIndexProperty) == 1)
                {
                    HideImageInControl(
                        _image1,
                        fadeType,
                        fadeTime,
                        () =>
                    {
                        stopped?.Invoke(mediaItemId, mediaClassification);
                        _image1MediaItemId    = Guid.Empty;
                        _mediaClassification1 = MediaClassification.Unknown;
                    });
                }
            }

            if (_image2MediaItemId == mediaItemId)
            {
                if ((int)_image2.GetValue(Panel.ZIndexProperty) == 1)
                {
                    HideImageInControl(
                        _image2,
                        fadeType,
                        fadeTime,
                        () =>
                    {
                        stopped?.Invoke(mediaItemId, mediaClassification);
                        _image2MediaItemId    = Guid.Empty;
                        _mediaClassification2 = MediaClassification.Unknown;
                    });
                }
            }
        }
Exemplo n.º 7
0
        public async Task ShowVideoOrPlayAudio(
            string mediaItemFilePath,
            ScreenPosition screenPosition,
            Guid mediaItemId,
            MediaClassification mediaClassification,
            TimeSpan startOffset,
            bool startFromPaused)
        {
            _mediaItemId       = mediaItemId;
            _mediaItemFilePath = mediaItemFilePath;

            Log.Debug($"ShowVideoOrPlayAudio - Media Id = {_mediaItemId}");

            _mediaClassification = mediaClassification;
            _startPosition       = startOffset;
            _lastPosition        = TimeSpan.Zero;

            ScreenPositionHelper.SetScreenPosition(_mediaElement.FrameworkElement, screenPosition);
            ScreenPositionHelper.SetSubtitleBlockScreenPosition(_subtitleBlock, screenPosition);

            _mediaElement.MediaItemId = mediaItemId;

            if (startFromPaused)
            {
                _mediaElement.Position = _startPosition;
                await _mediaElement.Play(new Uri(mediaItemFilePath), _mediaClassification);

                OnMediaChangeEvent(CreateMediaEventArgs(_mediaItemId, MediaChange.Started));

                await CreateSubtitleProvider(mediaItemFilePath, startOffset);
            }
            else
            {
                Log.Debug($"Firing Started - Media Id = {_mediaItemId}");

                await CreateSubtitleFile(mediaItemFilePath);

                await _mediaElement.Play(new Uri(mediaItemFilePath), _mediaClassification).ConfigureAwait(true);

                OnMediaChangeEvent(CreateMediaEventArgs(_mediaItemId, MediaChange.Starting));
            }
        }
        public MediaElementMediaFoundation(
            MediaElement mediaElement,
            IOptionsService optionsService)
        {
            _currentMediaClassification = MediaClassification.Unknown;

            _optionsService = optionsService;

            _audioPlayer = new Lazy <MediaPlayer>(MediaPlayerFactory);

            _mediaElement        = mediaElement;
            _mediaElement.Volume = 1.0;

            _mediaElement.ScrubbingEnabled = optionsService.AllowVideoScrubbing;

            _mediaElement.MediaOpened += HandleMediaOpened;
            _mediaElement.MediaEnded  += HandleMediaEnded;
            _mediaElement.MediaFailed += HandleMediaFailed;

            _timer = new DispatcherTimer {
                Interval = TimeSpan.FromMilliseconds(60)
            };
            _timer.Tick += TimerFire;
        }
Exemplo n.º 9
0
 public void Add(Guid mediaItemId, MediaClassification classification)
 {
     _currentMedia[mediaItemId] = classification;
 }
Exemplo n.º 10
0
        private void PlaceImage(
            Guid mediaItemId,
            MediaClassification mediaClassification,
            string imageFilePath,
            bool isBlankScreenImage,
            ImageFadeType fadeType,
            Action <Guid, MediaClassification> onStarting,
            Action <Guid, MediaClassification> onStopping,
            Action <Guid, MediaClassification> onStopped,
            Action <Guid, MediaClassification> onStarted)
        {
            var fadeTime = _optionsService.Options.ImageFadeSpeed.GetFadeSpeedSeconds();

            onStarting?.Invoke(mediaItemId, mediaClassification);

            if (!Image1Populated)
            {
                onStopping?.Invoke(_image2MediaItemId, _mediaClassification2);

                ShowImageInternal(
                    isBlankScreenImage,
                    _optionsService.Options.ImageScreenPosition,
                    imageFilePath,
                    _image1,
                    _image2,
                    fadeType,
                    fadeTime,
                    () =>
                {
                    onStopped?.Invoke(_image2MediaItemId, _mediaClassification2);
                    _image2MediaItemId    = Guid.Empty;
                    _mediaClassification2 = MediaClassification.Unknown;
                },
                    () =>
                {
                    _image1MediaItemId    = mediaItemId;
                    _mediaClassification1 = mediaClassification;
                    onStarted?.Invoke(_image1MediaItemId, _mediaClassification1);
                });
            }
            else if (!Image2Populated)
            {
                onStopping?.Invoke(_image1MediaItemId, _mediaClassification1);

                ShowImageInternal(
                    isBlankScreenImage,
                    _optionsService.Options.ImageScreenPosition,
                    imageFilePath,
                    _image2,
                    _image1,
                    fadeType,
                    fadeTime,
                    () =>
                {
                    onStopped?.Invoke(_image1MediaItemId, _mediaClassification1);
                    _image1MediaItemId    = Guid.Empty;
                    _mediaClassification1 = MediaClassification.Unknown;
                },
                    () =>
                {
                    _image2MediaItemId    = mediaItemId;
                    _mediaClassification2 = mediaClassification;
                    onStarted?.Invoke(_image2MediaItemId, _mediaClassification2);
                });
            }
        }