diff --git a/QuickLook.Plugin/QuickLook.Plugin.VideoViewer/Converters.cs b/QuickLook.Plugin/QuickLook.Plugin.VideoViewer/Converters.cs index 046e5eb..7ada61e 100644 --- a/QuickLook.Plugin/QuickLook.Plugin.VideoViewer/Converters.cs +++ b/QuickLook.Plugin/QuickLook.Plugin.VideoViewer/Converters.cs @@ -67,7 +67,7 @@ namespace QuickLook.Plugin.VideoViewer var v = (bool) value; - return v ? Visibility.Visible : Visibility.Hidden; + return v ? Visibility.Visible : Visibility.Collapsed; } object IValueConverter.ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) @@ -81,11 +81,11 @@ namespace QuickLook.Plugin.VideoViewer public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { if (value == null) - return Visibility.Hidden; + return Visibility.Collapsed; var v = (bool) value; - return v ? Visibility.Hidden : Visibility.Visible; + return v ? Visibility.Collapsed : Visibility.Visible; } object IValueConverter.ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) diff --git a/QuickLook.Plugin/QuickLook.Plugin.VideoViewer/Plugin.cs b/QuickLook.Plugin/QuickLook.Plugin.VideoViewer/Plugin.cs index 2812e30..c776c65 100644 --- a/QuickLook.Plugin/QuickLook.Plugin.VideoViewer/Plugin.cs +++ b/QuickLook.Plugin/QuickLook.Plugin.VideoViewer/Plugin.cs @@ -28,7 +28,7 @@ namespace QuickLook.Plugin.VideoViewer { public class Plugin : IViewer { - private Size _mediaSize; + private FFprobe _probe; private ViewerPanel _vp; public int Priority => int.MaxValue; @@ -46,24 +46,28 @@ namespace QuickLook.Plugin.VideoViewer if (Directory.Exists(path)) return false; - var blacklist = new[] - { - ".txt", ".jpg", ".bmp" - }; + var blacklist = new[] {".txt", ".jpg", ".bmp", ".tiff"}; if (blacklist.Contains(Path.GetExtension(path).ToLower())) return false; - return new FFprobe(path).CanDecode(); + var probe = new FFprobe(path); + + // check if it is a APNG image + if (Path.GetExtension(path).ToLower() == ".png" && probe.GetFormatName().ToLower() != "apng") + return false; + + return probe.CanDecode(); } public void Prepare(string path, ContextObject context) { var def = new Size(450, 450); - _mediaSize = new FFprobe(path).GetViewSize(); + _probe = new FFprobe(path); + var mediaSize = _probe.GetViewSize(); - var windowSize = _mediaSize == Size.Empty ? def : _mediaSize; + var windowSize = mediaSize == Size.Empty ? def : mediaSize; windowSize.Width = Math.Max(def.Width, windowSize.Width); windowSize.Height = Math.Max(def.Height, windowSize.Height); @@ -75,14 +79,13 @@ namespace QuickLook.Plugin.VideoViewer _vp = new ViewerPanel(context); context.ViewerContent = _vp; - - Debug.WriteLine("ViewerContent done"); + _vp.LoadAndPlay(path); - Debug.WriteLine("LoadAndPlay done"); _vp.mediaElement.MediaOpened += (sender, e) => context.IsBusy = false; - var info = _mediaSize == Size.Empty ? "Audio" : $"{_mediaSize.Width}×{_mediaSize.Height}"; + var mediaSize = _probe.GetViewSize(); + var info = mediaSize == Size.Empty ? "Audio" : $"{mediaSize.Width}×{mediaSize.Height}"; context.Title = $"{Path.GetFileName(path)} ({info})"; @@ -90,6 +93,8 @@ namespace QuickLook.Plugin.VideoViewer public void Cleanup() { + _probe = null; + _vp?.Dispose(); _vp = null; } diff --git a/QuickLook.Plugin/QuickLook.Plugin.VideoViewer/ViewerPanel.xaml b/QuickLook.Plugin/QuickLook.Plugin.VideoViewer/ViewerPanel.xaml index dddf676..45c1b88 100644 --- a/QuickLook.Plugin/QuickLook.Plugin.VideoViewer/ViewerPanel.xaml +++ b/QuickLook.Plugin/QuickLook.Plugin.VideoViewer/ViewerPanel.xaml @@ -44,8 +44,8 @@ - + + @@ -90,10 +90,10 @@ @@ -103,6 +103,7 @@ @@ -119,7 +120,7 @@ - @@ -157,9 +158,11 @@ Orientation="Horizontal" Margin="0,0,10,0"> - + + Text="{Binding NaturalDuration, StringFormat=hh\\:mm\\:ss, ElementName=mediaElement, Converter={StaticResource DurationToTimeSpanConverter}}" + Visibility="{Binding NaturalDuration.HasTimeSpan, ElementName=mediaElement, Converter={StaticResource BooleanToVisibilityVisibleConverter}}" /> diff --git a/QuickLook.Plugin/QuickLook.Plugin.VideoViewer/ViewerPanel.xaml.cs b/QuickLook.Plugin/QuickLook.Plugin.VideoViewer/ViewerPanel.xaml.cs index bd31b87..c086dbe 100644 --- a/QuickLook.Plugin/QuickLook.Plugin.VideoViewer/ViewerPanel.xaml.cs +++ b/QuickLook.Plugin/QuickLook.Plugin.VideoViewer/ViewerPanel.xaml.cs @@ -46,8 +46,8 @@ namespace QuickLook.Plugin.VideoViewer //}; buttonMute.MouseLeftButtonUp += (sender, e) => mediaElement.IsMuted = !mediaElement.IsMuted; buttonStop.MouseLeftButtonUp += (sender, e) => mediaElement.Stop(); - buttonBackward.MouseLeftButtonUp += (sender, e) => SeekBackward(); - buttonForward.MouseLeftButtonUp += (sender, e) => SeekForward(); + buttonBackward.MouseLeftButtonUp += (sender, e) => Seek(TimeSpan.FromSeconds(-10)); + buttonForward.MouseLeftButtonUp += (sender, e) => Seek(TimeSpan.FromSeconds(10)); sliderProgress.PreviewMouseDown += (sender, e) => { @@ -60,52 +60,44 @@ namespace QuickLook.Plugin.VideoViewer }; mediaElement.MediaFailed += ShowErrorNotification; - mediaElement.MediaEnded += (s, e) => + /*mediaElement.MediaEnded += (s, e) => { - if (!mediaElement.NaturalDuration.HasTimeSpan) - { - mediaElement.Stop(); - mediaElement.Play(); - } - }; + if (mediaElement.IsOpen) + if (!mediaElement.NaturalDuration.HasTimeSpan) + { + mediaElement.Stop(); + mediaElement.Play(); + } + };*/ + + PreviewMouseWheel += (sender, e) => ChangeVolume((double) e.Delta / 120 / 50); } public void Dispose() { - mediaElement?.Stop(); - mediaElement?.Dispose(); + try + { + mediaElement?.Stop(); + mediaElement?.Dispose(); + } + catch (Exception e) + { + Debug.WriteLine(e); + } mediaElement = null; - Debug.WriteLine("dispose done"); } - private void ResumePlaying() + private void ChangeVolume(double delta) { - _wasPlaying = mediaElement.IsPlaying; + mediaElement.Volume += delta; } - private void SeekBackward() + private void Seek(TimeSpan delta) { _wasPlaying = mediaElement.IsPlaying; mediaElement.Pause(); - var pos = mediaElement.Position; - var delta = TimeSpan.FromSeconds(15); - - mediaElement.Position = pos < pos - delta ? TimeSpan.Zero : pos - delta; - - if (_wasPlaying) mediaElement.Play(); - } - - private void SeekForward() - { - _wasPlaying = mediaElement.IsPlaying; - mediaElement.Pause(); - - var pos = mediaElement.Position; - var len = mediaElement.NaturalDuration.TimeSpan; - var delta = TimeSpan.FromSeconds(15); - - mediaElement.Position = pos + delta > len ? len : pos + delta; + mediaElement.Position = mediaElement.Position + delta; if (_wasPlaying) mediaElement.Play(); } @@ -113,9 +105,15 @@ namespace QuickLook.Plugin.VideoViewer private void TogglePlayPause(object sender, MouseButtonEventArgs e) { if (mediaElement.IsPlaying) + { mediaElement.Pause(); + } else + { + if (mediaElement.HasMediaEnded) + mediaElement.Stop(); mediaElement.Play(); + } } [DebuggerNonUserCode] @@ -133,7 +131,7 @@ namespace QuickLook.Plugin.VideoViewer public void LoadAndPlay(string path) { mediaElement.Source = new Uri(path); - mediaElement.MediaOpened += (sender, e) => mediaElement.IsMuted = true; + mediaElement.MediaOpened += (sender, e) => mediaElement.Volume = 0.2; } ~ViewerPanel() diff --git a/QuickLook.Plugin/QuickLook.Plugin.VideoViewer/ffme/ffme.dll b/QuickLook.Plugin/QuickLook.Plugin.VideoViewer/ffme/ffme.dll index 56aac74..fe15412 100644 Binary files a/QuickLook.Plugin/QuickLook.Plugin.VideoViewer/ffme/ffme.dll and b/QuickLook.Plugin/QuickLook.Plugin.VideoViewer/ffme/ffme.dll differ diff --git a/QuickLook.Plugin/QuickLook.Plugin.VideoViewer/ffme/ffme.pdb b/QuickLook.Plugin/QuickLook.Plugin.VideoViewer/ffme/ffme.pdb new file mode 100644 index 0000000..24179dd Binary files /dev/null and b/QuickLook.Plugin/QuickLook.Plugin.VideoViewer/ffme/ffme.pdb differ diff --git a/QuickLook.Plugin/QuickLook.Plugin.VideoViewer/ffme/ffmpeg.dll b/QuickLook.Plugin/QuickLook.Plugin.VideoViewer/ffme/ffmpeg.dll index d849110..9216e7d 100644 Binary files a/QuickLook.Plugin/QuickLook.Plugin.VideoViewer/ffme/ffmpeg.dll and b/QuickLook.Plugin/QuickLook.Plugin.VideoViewer/ffme/ffmpeg.dll differ diff --git a/QuickLook.Plugin/QuickLook.Plugin.VideoViewer/ffme/ffmpeg.pdb b/QuickLook.Plugin/QuickLook.Plugin.VideoViewer/ffme/ffmpeg.pdb new file mode 100644 index 0000000..14c44d7 Binary files /dev/null and b/QuickLook.Plugin/QuickLook.Plugin.VideoViewer/ffme/ffmpeg.pdb differ