Imports System.IO
Imports System.Threading
Imports System.Runtime.InteropServices
Imports System.ComponentModel
Imports Ookii.Dialogs
Public Class Form1
#Region "Declarations"
' MediaInfo
Dim MI As MediaInfo
' Others
Dim NameOfDirectory As String = Nothing
Dim aFile As FileInfo
#End Region
#Region "Properties"
#End Region
#Region "Load / Close"
' Load
Public Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' MediaInfo Instance
MI = New MediaInfo
End Sub
#End Region
#Region "Get Total files Function"
#End Region
#Region "Option checkboxes"
#End Region
#Region "Folder buttons"
#End Region
#Region "Append text function"
' Append Text
Public Sub AppendText(box As RichTextBox, color As Color, text As String)
Control.CheckForIllegalCrossThreadCalls = False
Dim start As Integer = box.TextLength
box.AppendText(text)
Dim [end] As Integer = box.TextLength
' Textbox may transform chars, so (end-start) != text.Length
box.[Select](start, [end] - start)
If True Then
box.SelectionColor = color
' could set box.SelectionBackColor, box.SelectionFont too.
End If
box.SelectionLength = 0
' clear
End Sub
#End Region
#Region "Thread"
Public _WaitHandle_FirstThreadDone As New System.Threading.AutoResetEvent(False)
Public Sub ThreadProc(ByVal aDir As DirectoryInfo)
Dim aFile As FileInfo
For Each aFile In aDir.GetFiles()
If accepted_extensions.ToLower.Contains(aFile.Extension.ToLower) Then
' print output
AppendText(consolebox, Color.Yellow, "Processing: ")
AppendText(consolebox, Color.White, aFile.ToString() + vbNewLine)
consolebox.ScrollToCaret()
processedfiles += 1
totalfiles_label.Text = "Processed " + processedfiles.ToString() + " of " + totalfiles.ToString() + " total video files"
' Attributes
If attribs = True Then
aFile.Attributes = (aFile.Attributes And Not FileAttributes.ReadOnly And Not FileAttributes.Hidden And Not FileAttributes.System And Not FileAttributes.Archive)
End If
' Rename to Word-Case
If wordcase = True Then
Dim renamestr As String = StrConv(aFile.Name, VbStrConv.ProperCase)
My.Computer.FileSystem.RenameFile(aFile.FullName, renamestr + "_FILMEN")
My.Computer.FileSystem.RenameFile(aFile.FullName + "_FILMEN", renamestr)
End If
' Rename to Lower-Case
If lowercase = True Then
Dim renamestr As String = StrConv(aFile.Name, VbStrConv.Lowercase)
My.Computer.FileSystem.RenameFile(aFile.FullName, renamestr + "_FILMEN")
My.Computer.FileSystem.RenameFile(aFile.FullName + "_FILMEN", renamestr)
End If
' Playlists
If playlist = True Then
Using writer As StreamWriter = New StreamWriter(aFile.DirectoryName.ToString() & "\" & aDir.Name & ".m3u", True, System.Text.Encoding.UTF8)
writer.WriteLine(aFile.FullName.ToString())
End Using
End If
' MEDIAINFO: (ac3, dts, wav and multitrack)
If ac3 = True Or dts = True Or wav = True Or multitrack = True Then
MI.Open(aFile.FullName)
Dim Pos As Integer = 0
To_Display = Nothing
' multitrack
If multitrack = True Then
If MI.Count_Get(StreamKind.Audio) > 1 Then
results_box.AppendText("Multi Track: " + aFile.FullName.ToString() + vbNewLine)
results_box.SelectionStart = results_box.Text.Length
results_box.ScrollToCaret()
problems += 1
problems_label.Text = problems.ToString() + " problems found"
End If
End If
While Pos < MI.Count_Get(StreamKind.Audio)
' AC-3
If ac3 = True Then
If MI.Get_(StreamKind.Audio, Pos, "Format").ToString() = "AC-3" Then
results_box.AppendText("AC3 Track: " + aFile.FullName.ToString() + vbNewLine)
results_box.SelectionStart = results_box.Text.Length
results_box.ScrollToCaret()
problems += 1
problems_label.Text = problems.ToString() + " problems found"
End If
End If
' DTS
If dts = True Then
If MI.Get_(StreamKind.Audio, Pos, "Format").Contains("DTS") Then
results_box.AppendText("DTS Track: " + aFile.FullName.ToString() + vbNewLine)
results_box.SelectionStart = results_box.Text.Length
results_box.ScrollToCaret()
problems += 1
problems_label.Text = problems.ToString() + " problems found"
End If
End If
' WAV
If wav = True Then
If MI.Get_(StreamKind.Audio, Pos, "Format").Contains("PCM") Then
results_box.AppendText("WAV Track: " + aFile.FullName.ToString() + vbNewLine)
results_box.SelectionStart = results_box.Text.Length
results_box.ScrollToCaret()
problems += 1
problems_label.Text = problems.ToString() + " problems found"
End If
End If
System.Math.Max(System.Threading.Interlocked.Increment(Pos), Pos - 1)
End While
End If
If metadata = True Then
Dim ffmpeg_process As New Process()
Dim ffmpeg_startinfo As New ProcessStartInfo()
ffmpeg_startinfo.FileName = "cmd.exe "
ffmpeg_startinfo.Arguments = "/C ffmpeg.exe -y -i " & ControlChars.Quote & aFile.FullName.ToString() & ControlChars.Quote & " -f ffmetadata " & ControlChars.Quote & "%TEMP%\" & aFile.Name.ToString() & "_metadata.txt" & ControlChars.Quote & " >NUL 2>&1 && Type " & ControlChars.Quote & "%TEMP%\" & aFile.Name.ToString() & "_metadata.txt" & ControlChars.Quote & "| FINDSTR /I " & ControlChars.Quote & "^INAM ^title" & ControlChars.Quote & " >NUL && Echo FOUND && EXIT || Echo NOT FOUND && Exit"
ffmpeg_startinfo.UseShellExecute = False
ffmpeg_startinfo.CreateNoWindow = True
ffmpeg_startinfo.RedirectStandardOutput = True
ffmpeg_startinfo.RedirectStandardError = True
ffmpeg_process.EnableRaisingEvents = True
ffmpeg_process.StartInfo = ffmpeg_startinfo
ffmpeg_process.Start()
ffmpeg_process.WaitForExit()
Dim readerStdOut As IO.StreamReader = ffmpeg_process.StandardOutput
Dim FINDstdOut As String = ffmpeg_process.StandardOutput.ReadToEnd
If FINDstdOut.Contains("FOUND") Then
AppendText(consolebox, Color.Red, "TAGS FOUND! Removing tags, please wait..." & vbNewLine)
Dim relative_dir As String = aDir.FullName.ToString().Replace(aDir.Root.ToString(), "\")
Dim ffmpegconvert_process As New Process()
Dim ffmpegconvert_startinfo As New ProcessStartInfo()
ffmpegconvert_startinfo.FileName = "cmd.exe "
ffmpegconvert_startinfo.Arguments = "/C MKDIR " & ControlChars.Quote & userSelectedFolderPathmetadata & relative_dir & ControlChars.Quote & " 2>NUL & ffmpeg.exe -y -i " & ControlChars.Quote & aFile.FullName.ToString() & ControlChars.Quote & " -c copy -map_metadata -1 " & ControlChars.Quote & userSelectedFolderPathmetadata & relative_dir & "\" & aFile.Name.ToString() & ControlChars.Quote & " >NUL 2>&1 & Exit"
ffmpegconvert_startinfo.UseShellExecute = False
ffmpegconvert_startinfo.CreateNoWindow = True
ffmpegconvert_startinfo.RedirectStandardOutput = True
ffmpegconvert_startinfo.RedirectStandardError = True
ffmpegconvert_process.EnableRaisingEvents = True
ffmpegconvert_process.StartInfo = ffmpegconvert_startinfo
ffmpegconvert_process.Start()
ffmpegconvert_process.WaitForExit()
'Dim ffmpegconvertreaderStdOut As IO.StreamReader = ffmpegconvert_process.StandardOutput
End If
Do While readerStdOut.EndOfStream = False
consolebox.AppendText(readerStdOut.ReadLine() + vbNewLine)
consolebox.SelectionStart = consolebox.Text.Length
consolebox.ScrollToCaret()
Loop
End If
End If
Next
_WaitHandle_FirstThreadDone.Set()
End Sub
#End Region
#Region "Organize function"
Public Sub MediaInfo(Directory)
Dim MyDirectory As DirectoryInfo
MyDirectory = New DirectoryInfo(NameOfDirectory)
MediaInfoWorkWithDirectory(MyDirectory)
End Sub
Public Sub MediaInfoWorkWithDirectory(ByVal aDir As DirectoryInfo)
Dim nextDir As DirectoryInfo
Dim t As New Threading.Thread(AddressOf ThreadProc)
t.Start(aDir)
_WaitHandle_FirstThreadDone.WaitOne()
For Each nextDir In aDir.GetDirectories
If playlist = True Then
Using writer As StreamWriter = New StreamWriter(aDir.FullName & "\" & nextDir.Name & "\" & nextDir.Name & ".m3u", False, System.Text.Encoding.UTF8)
'overwrite existing playlist
End Using
End If
MediaInfoWorkWithDirectory(nextDir)
Next
End Sub
#End Region
#Region "Action buttons"
' start button
Public Sub Button2_Click(sender As Object, e As EventArgs) Handles start_button.Click
If metadata = True And metadatatextbox.Text = "Select a folder to save the converted videos without metadata..." Then
MsgBox("You must select a folder for the saved metadata videos...", , "Filmen v1.0")
Else
If ac3 = False And dts = False And wav = False And multitrack = False And playlist = False And attribs = False And wordcase = False And metadata = False And lowercase = False Then
MsgBox("You must select at least one option...", , "Filmen v1.0")
Else
consolebox.Clear()
' pause / cancel button ON
pause_button.Enabled = True
cancel_button.Enabled = True
' Total files label
processedfiles = 0
totalfiles_label.Text = totalfiles.ToString() + " Total video files"
' Problems label
problems = 0
problems_label.Text = "0 problems found"
' Organization process
NameOfDirectory = userSelectedFolderPath
MediaInfo(NameOfDirectory)
consolebox.AppendText(vbNewLine + "[+] Organization finalized!" + vbNewLine)
consolebox.Refresh()
consolebox.SelectionStart = consolebox.Text.Length
consolebox.ScrollToCaret()
' pause / cancel button OFF
pause_button.Enabled = False
cancel_button.Enabled = False
End If
End If
End Sub
#End Region
End Class