├── icon.ico
├── screenshots
├── screenshot.0.8.0.png
├── screenshot.0.9.0.png
└── screenshot.0.9.4.png
├── Properties
├── launchSettings.json
├── Settings.settings
├── Resources.Designer.cs
├── Settings.Designer.cs
└── Resources.resx
├── App.xaml.cs
├── AssemblyInfo.cs
├── Icons
├── Stop_16x.xaml
├── Run_16x.xaml
├── DeleteAllRows_16x.xaml
├── Save_16x.xaml
├── Refresh_16x.xaml
├── SaveTable_16x.xaml
├── Exit_16x.xaml
├── OpenFolder_16x.xaml
├── CopyToClipboard_16x.xaml
├── NewFileCollection_16x.xaml
├── SaveAs_16x.xaml
├── DeleteTableRow_16x.xaml
├── OpenFile_16x.xaml
├── CleanData_16x.xaml
├── CopyTheme_16x.xaml
└── ImportTheme_16x.xaml
├── BindingProxy.cs
├── UserControls
├── MediaInfoBox.xaml.cs
└── MediaInfoBox.xaml
├── Json.cs
├── LICENSE.txt
├── FFBitrateViewer.sln
├── App.config
├── ProgramInfo.cs
├── Utilities.cs
├── RelayCommand.cs
├── Global.cs
├── DataDictionary.cs
├── Log.cs
├── Bindable.cs
├── Windows
├── AboutWindow.xaml.cs
└── AboutWindow.xaml
├── App.xaml
├── OverallProgress.cs
├── CommandLine.cs
├── .gitattributes
├── FFBitrateViewer.csproj
├── README.md
├── ProgramConfig.cs
├── Logger.cs
├── FileItem.cs
├── .gitignore
├── Execute.cs
├── ProgramOptions.cs
├── Helpers.cs
├── FFProbe.cs
├── MyPlotModel.cs
├── MainWindow.xaml.cs
└── Frames.cs
/icon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fifonik/FFBitrateViewer/HEAD/icon.ico
--------------------------------------------------------------------------------
/screenshots/screenshot.0.8.0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fifonik/FFBitrateViewer/HEAD/screenshots/screenshot.0.8.0.png
--------------------------------------------------------------------------------
/screenshots/screenshot.0.9.0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fifonik/FFBitrateViewer/HEAD/screenshots/screenshot.0.9.0.png
--------------------------------------------------------------------------------
/screenshots/screenshot.0.9.4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fifonik/FFBitrateViewer/HEAD/screenshots/screenshot.0.9.4.png
--------------------------------------------------------------------------------
/Properties/launchSettings.json:
--------------------------------------------------------------------------------
1 | {
2 | "profiles": {
3 | "FFBitrateViewer": {
4 | "commandName": "Project",
5 | "commandLineArgs": "--log-level=debug"
6 | }
7 | }
8 | }
--------------------------------------------------------------------------------
/App.xaml.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Configuration;
4 | using System.Data;
5 | using System.Linq;
6 | using System.Threading.Tasks;
7 | using System.Windows;
8 |
9 | namespace FFBitrateViewer
10 | {
11 | ///
12 | /// Interaction logic for App.xaml
13 | ///
14 | public partial class App : Application
15 | {
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Windows;
2 |
3 | [assembly: ThemeInfo(
4 | ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
5 | //(used if a resource is not found in the page,
6 | // or application resource dictionaries)
7 | ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
8 | //(used if a resource is not found in the page,
9 | // app, or any theme specific resource dictionaries)
10 | )]
11 |
--------------------------------------------------------------------------------
/Icons/Stop_16x.xaml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/Properties/Settings.settings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 | False
10 |
11 |
12 | True
13 |
14 |
15 | frame
16 |
17 |
18 |
--------------------------------------------------------------------------------
/Icons/Run_16x.xaml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/BindingProxy.cs:
--------------------------------------------------------------------------------
1 | using System.Windows;
2 |
3 |
4 | namespace FFBitrateViewer
5 | {
6 | // Cannot bind to VM from within GridView so use this technique
7 | // https://stackoverflow.com/questions/15494226/cannot-find-source-for-binding-with-reference-relativesource-findancestor
8 | public class BindingProxy : Freezable
9 | {
10 | protected override Freezable CreateInstanceCore()
11 | {
12 | return new BindingProxy();
13 | }
14 |
15 | public object Data
16 | {
17 | get { return (object)GetValue(DataProperty); }
18 | set { SetValue(DataProperty, value); }
19 | }
20 |
21 | // Using a DependencyProperty as the backing store for Data.
22 | // This enables animation, styling, binding, etc...
23 | public static readonly DependencyProperty DataProperty = DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null));
24 |
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/Icons/DeleteAllRows_16x.xaml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/UserControls/MediaInfoBox.xaml.cs:
--------------------------------------------------------------------------------
1 | using System.Windows;
2 | using System.Windows.Controls;
3 |
4 |
5 | namespace FFBitrateViewer.UserControls
6 | {
7 | public partial class MediaInfoBox : UserControl
8 | {
9 | public MediaInfo MediaInfo
10 | {
11 | get { return (MediaInfo)GetValue(InfoProperty); }
12 | set { SetValue(InfoProperty, value); }
13 | }
14 | public Frames Frames
15 | {
16 | get { return (Frames)GetValue(FramesProperty); }
17 | set { SetValue(FramesProperty, value); }
18 | }
19 | public static readonly DependencyProperty InfoProperty = DependencyProperty.Register("MediaInfo", typeof(MediaInfo), typeof(MediaInfoBox));
20 | public static readonly DependencyProperty FramesProperty = DependencyProperty.Register("Frames", typeof(Frames), typeof(MediaInfoBox));
21 |
22 | public MediaInfoBox()
23 | {
24 | InitializeComponent();
25 | }
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/Json.cs:
--------------------------------------------------------------------------------
1 | using System.IO;
2 | using Newtonsoft.Json;
3 |
4 |
5 | namespace FFBitrateViewer
6 | {
7 | public class Json
8 | {
9 | public static T? FileRead(string fs)
10 | {
11 | // todo@ read from stream (as in IsValid)
12 | string? text = File.ReadAllText(fs);
13 | return JsonConvert.DeserializeObject(text); // todo@ add options
14 | }
15 |
16 |
17 | public static void FileWrite(string fs, T obj)
18 | {
19 | File.WriteAllText(fs, JsonConvert.SerializeObject(obj, Formatting.Indented));
20 | }
21 |
22 |
23 | public static bool IsValid(string fs)
24 | {
25 | try
26 | {
27 | using StreamReader file = File.OpenText(fs);
28 | var serializer = new JsonSerializer();
29 | var data = (T?)serializer.Deserialize(file, typeof(T?));
30 | return data != null;
31 | } catch
32 | {
33 | // just catch any error
34 | }
35 | return false;
36 | }
37 | }
38 | }
--------------------------------------------------------------------------------
/LICENSE.txt:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2023 Fifonik
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/Icons/Save_16x.xaml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/FFBitrateViewer.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio Version 17
4 | VisualStudioVersion = 17.4.33110.190
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FFBitrateViewer", "FFBitrateViewer.csproj", "{8D618B0D-D9F3-4F33-966A-1C648020CD3A}"
7 | EndProject
8 | Global
9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
10 | Debug|Any CPU = Debug|Any CPU
11 | Release|Any CPU = Release|Any CPU
12 | EndGlobalSection
13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
14 | {8D618B0D-D9F3-4F33-966A-1C648020CD3A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
15 | {8D618B0D-D9F3-4F33-966A-1C648020CD3A}.Debug|Any CPU.Build.0 = Debug|Any CPU
16 | {8D618B0D-D9F3-4F33-966A-1C648020CD3A}.Release|Any CPU.ActiveCfg = Release|Any CPU
17 | {8D618B0D-D9F3-4F33-966A-1C648020CD3A}.Release|Any CPU.Build.0 = Release|Any CPU
18 | EndGlobalSection
19 | GlobalSection(SolutionProperties) = preSolution
20 | HideSolutionNode = FALSE
21 | EndGlobalSection
22 | GlobalSection(ExtensibilityGlobals) = postSolution
23 | SolutionGuid = {991EF20F-1DA0-4C87-9DEE-198031A244A8}
24 | EndGlobalSection
25 | EndGlobal
26 |
--------------------------------------------------------------------------------
/App.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 | False
15 |
16 |
17 | True
18 |
19 |
20 | frame
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/ProgramInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Diagnostics;
2 | using System.Globalization;
3 | using System.Reflection;
4 |
5 |
6 |
7 | namespace FFBitrateViewer
8 | {
9 | public static class ProgramInfo
10 | {
11 | public static string? Name { get; private set; }
12 | public static string? Version { get; private set; }
13 | public static FileVersionInfo? VersionInfo { get; private set; }
14 |
15 |
16 | static ProgramInfo()
17 | {
18 | var assembly = Assembly.GetExecutingAssembly();
19 | Name = assembly.GetName().Name;
20 |
21 | var VersionInfo = FileVersionInfo.GetVersionInfo(assembly.Location);
22 | Version = string.Format(CultureInfo.InvariantCulture, @"{0}.{1}", VersionInfo.ProductMajorPart, VersionInfo.ProductMinorPart);
23 | if (VersionInfo.ProductBuildPart > 0) Version += "." + VersionInfo.ProductBuildPart.ToString(CultureInfo.InvariantCulture);
24 | if (VersionInfo.ProductPrivatePart > 0)
25 | {
26 | Version += "b";
27 | if (VersionInfo.ProductPrivatePart > 1) Version += VersionInfo.ProductPrivatePart.ToString(CultureInfo.InvariantCulture);
28 | }
29 | }
30 |
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/Icons/Refresh_16x.xaml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/Utilities.cs:
--------------------------------------------------------------------------------
1 | using System.Windows;
2 |
3 | namespace Utilities
4 | {
5 |
6 | public class DragDropHighlighter
7 | {
8 | public static readonly DependencyProperty IsDroppingAboveProperty = DependencyProperty.RegisterAttached("IsDroppingAbove", typeof(bool), typeof(DragDropHighlighter), new UIPropertyMetadata(false));
9 | public static readonly DependencyProperty IsDroppingBelowProperty = DependencyProperty.RegisterAttached("IsDroppingBelow", typeof(bool), typeof(DragDropHighlighter), new UIPropertyMetadata(false));
10 |
11 |
12 | public static bool GetIsDroppingAbove(DependencyObject source)
13 | {
14 | return (bool)source.GetValue(IsDroppingAboveProperty);
15 | }
16 |
17 |
18 | public static void SetIsDroppingAbove(DependencyObject target, bool value)
19 | {
20 | target.SetValue(IsDroppingAboveProperty, value);
21 | }
22 |
23 |
24 | public static bool GetIsDroppingBelow(DependencyObject source)
25 | {
26 | return (bool)source.GetValue(IsDroppingBelowProperty);
27 | }
28 |
29 |
30 | public static void SetIsDroppingBelow(DependencyObject target, bool value)
31 | {
32 | target.SetValue(IsDroppingBelowProperty, value);
33 | }
34 | }
35 |
36 | }
37 |
--------------------------------------------------------------------------------
/RelayCommand.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Diagnostics;
3 | using System.Windows.Input;
4 |
5 |
6 | namespace FFBitrateViewer
7 | {
8 | // Source: https://docs.microsoft.com/en-us/archive/msdn-magazine/2009/february/patterns-wpf-apps-with-the-model-view-viewmodel-design-pattern#id0090030
9 | public class RelayCommand : ICommand
10 | {
11 | readonly Action