As per usual, the installer is available from my website. Let me know what you think!
Code: Select all
'
' MediaMonkey Script
'
' NAME: RecreateM3U 2.4
'
' AUTHOR: trixmoto (http://trixmoto.net)
' DATE : 25/10/2010
'
' INSTALL: Copy to Scripts directory and add the following to Scripts.ini
' Don't forget to remove comments (') and set the order appropriately
'
' [RecreateM3U]
' FileName=RecreateM3U.vbs
' ProcName=RecreateM3U
' Order=100
' DisplayName=&Recreate M3U
' Description=Recreate broken M3U playlist
' Language=VBScript
' ScriptType=0
'
' FIXES: Fixed "component named RecreateM3UList already exists" error
' Added debug mode to log sql commands
' Added options to include artist and album fields
' Added option to include fuzzy matching logic
'
Option Explicit
Dim Debug : Debug = False
Dim ShowMode : ShowMode = 1 'Show confirmation screen: 0=Never 1=Default 2=Always 3=Automatic
Dim ShowRows : ShowRows = 20 'Number of tracks on confirmation screen
Dim Playlist : Playlist = False 'Create a playlist?
Dim UseComms : UseComms = True 'Use comments as well?
Dim DefTrack : DefTrack = 0 'Select track: 0=First 1=Bitrate 2=DateAdded 3=PlayCounter 4=Rating
Dim NoneMode : NoneMode = 0 'Action if no matches: 0=Skip 1=Create 2=List
Dim CheckLib : CheckLib = False 'Check library for file path first?
Dim CheckArt : CheckArt = True 'Include artist name
Dim CheckAlb : CheckAlb = True 'Include album name
Dim UseFuzzy : UseFuzzy = False 'Use fuzzy matching logic?
Sub RecreateM3U
'default settings
Dim ini : Set ini = SDB.IniFile
If ini.ValueExists("RecreateM3U","ShowMode") Then
ShowMode = ini.IntValue("RecreateM3U","ShowMode")
End If
If ini.ValueExists("RecreateM3U","ShowRows") Then
ShowRows = ini.IntValue("RecreateM3U","ShowRows")
End If
If ini.ValueExists("RecreateM3U","Playlist") Then
Playlist = ini.BoolValue("RecreateM3U","Playlist")
End If
If ini.ValueExists("RecreateM3U","UseComms") Then
UseComms = ini.BoolValue("RecreateM3U","UseComms")
End If
If ini.ValueExists("RecreateM3U","DefTrack") Then
DefTrack = ini.IntValue("RecreateM3U","DefTrack")
End If
If ini.ValueExists("RecreateM3U","UseFuzzy") Then
UseFuzzy = ini.BoolValue("RecreateM3U","UseFuzzy")
End If
If ini.ValueExists("RecreateM3U","NoneMode") Then
NoneMode = ini.IntValue("RecreateM3U","NoneMode")
End If
If ini.ValueExists("RecreateM3U","CheckLib") Then
CheckLib = ini.BoolValue("RecreateM3U","CheckLib")
End If
If ini.ValueExists("RecreateM3U","CheckArt") Then
CheckArt = ini.BoolValue("RecreateM3U","CheckArt")
End If
If ini.ValueExists("RecreateM3U","CheckAlb") Then
CheckAlb = ini.BoolValue("RecreateM3U","CheckAlb")
End If
'*******************************************************************'
'* Form produced by MMVBS Form Creator (http://trixmoto.net/mmvbs) *'
'*******************************************************************'
Dim Form1 : Set Form1 = SDB.UI.NewForm
Form1.BorderStyle = 3
Form1.Caption = "Recreate M3U"
Form1.FormPosition = 4
Form1.StayOnTop = True
Form1.Common.SetRect 0,0,445,270
Form1.Common.ControlName = "RecreateM3UOpts"
Dim Label3 : Set Label3 = SDB.UI.NewLabel(Form1)
Label3.Common.SetRect 10,10,65,17
Label3.Caption = "Playlist to be fixed:"
Dim Edit1 : Set Edit1 = SDB.UI.NewEdit(Form1)
Edit1.Common.SetRect 150,7,250,21
Edit1.Common.ControlName = "Filename"
If ini.ValueExists("RecreateM3U","LastFile") Then
Edit1.Text = ini.StringValue("RecreateM3U","LastFile")
End If
Dim Button3 : Set Button3 = SDB.UI.NewButton(Form1)
Button3.Caption = "..."
Button3.UseScript = Script.ScriptPath
Button3.OnClickFunc = "BrowseClick"
Button3.Common.SetRect 405,6,21,21
Button3.Common.ControlName = "BrowseButt"
Dim Label1 : Set Label1 = SDB.UI.NewLabel(Form1)
Label1.Common.SetRect 10,35,65,17
Label1.Caption = "Show confirmation screen:"
Dim DropDown1 : Set DropDown1 = SDB.UI.NewDropDown(Form1)
DropDown1.AddItem("Never (skip if multiple)")
DropDown1.AddItem("Default (show if multiple)")
DropDown1.AddItem("Always show")
DropDown1.AddItem("Never (select if multiple)")
DropDown1.ItemIndex = ShowMode
DropDown1.Style = 2
DropDown1.Common.SetRect 150,32,160,21
DropDown1.Common.ControlName = "ShowMode"
Dim Label2 : Set Label2 = SDB.UI.NewLabel(Form1)
Label2.Common.SetRect 10,60,65,17
Label2.Caption = "Maximum rows on screen:"
Dim SpinEdit1 : Set SpinEdit1 = SDB.UI.NewSpinEdit(Form1)
SpinEdit1.MaxValue = 99
SpinEdit1.MinValue = 1
SpinEdit1.Value = ShowRows
SpinEdit1.Common.SetRect 150,57,40,21
SpinEdit1.Common.ControlName = "ShowRows"
Dim Label4 : Set Label4 = SDB.UI.NewLabel(Form1)
Label4.Common.SetRect 10,85,65,17
Label4.Caption = "Create playlist in library?"
Dim CheckBox1 : Set CheckBox1 = SDB.UI.NewCheckBox(Form1)
CheckBox1.Common.SetRect 150,82,98,20
CheckBox1.Common.ControlName = "Playlist"
CheckBox1.Checked = Playlist
Dim Label5 : Set Label5 = SDB.UI.NewLabel(Form1)
Label5.Common.SetRect 10,110,65,17
Label5.Caption = "Use comments as well?"
Dim CheckBox2 : Set CheckBox2 = SDB.UI.NewCheckBox(Form1)
CheckBox2.Common.SetRect 150,107,98,20
CheckBox2.Common.ControlName = "UseComms"
CheckBox2.Checked = UseComms
Dim Label6 : Set Label6 = SDB.UI.NewLabel(Form1)
Label6.Common.SetRect 10,135,65,17
Label6.Caption = "Select default track by:"
Dim DropDown2 : Set DropDown2 = SDB.UI.NewDropDown(Form1)
DropDown2.AddItem("First in list")
DropDown2.AddItem("Highest bitrate")
DropDown2.AddItem("Latest added")
DropDown2.AddItem("Most played")
DropDown2.AddItem("Highest rated")
DropDown2.ItemIndex = DefTrack
DropDown2.Style = 2
DropDown2.Common.SetRect 150,132,121,21
DropDown2.Common.ControlName = "DefTrack"
Dim Label8 : Set Label8 = SDB.UI.NewLabel(Form1)
Label8.Common.SetRect 10,160,65,17
Label8.Caption = "Action if no matches:"
Dim DropDown3 : Set DropDown3 = SDB.UI.NewDropDown(Form1)
DropDown3.AddItem("Skip track")
DropDown3.AddItem("Create track")
DropDown3.AddItem("Add to summary")
DropDown3.ItemIndex = NoneMode
DropDown3.Style = 2
DropDown3.Common.SetRect 150,157,121,21
DropDown3.Common.ControlName = "NoneMode"
Dim Label9 : Set Label9 = SDB.UI.NewLabel(Form1)
Label9.Common.SetRect 10,185,65,17
Label9.Caption = "Check library for file path?"
Dim CheckBox4 : Set CheckBox4 = SDB.UI.NewCheckBox(Form1)
CheckBox4.Common.SetRect 150,182,98,20
CheckBox4.Common.ControlName = "CheckLib"
CheckBox4.Checked = CheckLib
Dim Label7 : Set Label7 = SDB.UI.NewLabel(Form1)
Label7.Common.SetRect 10,210,65,17
Label7.Caption = "Use fuzzy matching logic?"
Dim CheckBox3 : Set CheckBox3 = SDB.UI.NewCheckBox(Form1)
CheckBox3.Common.SetRect 150,207,98,20
CheckBox3.Common.ControlName = "UseFuzzy"
CheckBox3.Checked = UseFuzzy
Dim Panel : Set Panel = SDB.UI.NewPanel(Form1)
Panel.Common.SetRect 330, 80, 95, 70
Dim PanLab1 : Set PanLab1 = SDB.UI.NewLabel(Panel)
PanLab1.Common.SetRect 10, 5, 150, 20
PanLab1.Caption = "Check fields:"
Dim PanChk1 : Set PanChk1 = SDB.UI.NewCheckbox(Panel)
PanChk1.Common.SetRect 10, 23, 200, 20
PanChk1.Caption = "Artist name"
PanChk1.Checked = CheckArt
Dim PanChk2 : Set PanChk2 = SDB.UI.NewCheckbox(Panel)
PanChk2.Common.SetRect 10, 41, 200, 20
PanChk2.Caption = "Album name"
PanChk2.Checked = CheckAlb
Dim Button1 : Set Button1 = SDB.UI.NewButton(Form1)
Button1.Cancel = True
Button1.Caption = "Cancel"
Button1.ModalResult = 2
Button1.Common.SetRect Form1.Common.Width-95,Form1.Common.Height-60,75,25
Button1.Common.Anchors = 12
Dim Button2 : Set Button2 = SDB.UI.NewButton(Form1)
Button2.Default = True
Button2.Caption = "Ok"
Button2.ModalResult = 1
Button2.Common.SetRect Button1.Common.Left-85,Button1.Common.Top,75,25
Button2.Common.Anchors = 12
'*******************************************************************'
'* End of form Richard Lewis (c) 2007 *'
'*******************************************************************'
If Form1.ShowModal = 2 Then
Exit Sub
End If
'save settings
ShowMode = Dropdown1.ItemIndex
ini.IntValue("RecreateM3U","ShowMode") = ShowMode
ShowRows = SpinEdit1.Value
ini.IntValue("RecreateM3U","ShowRows") = ShowRows
Playlist = Checkbox1.Checked
ini.BoolValue("RecreateM3U","Playlist") = Playlist
UseComms = Checkbox2.Checked
ini.BoolValue("RecreateM3U","UseComms") = UseComms
DefTrack = Dropdown2.ItemIndex
ini.IntValue("RecreateM3U","DefTrack") = DefTrack
UseFuzzy = Checkbox3.Checked
ini.BoolValue("RecreateM3U","UseFuzzy") = UseFuzzy
NoneMode = Dropdown3.ItemIndex
ini.IntValue("RecreateM3U","NoneMode") = NoneMode
CheckLib = Checkbox4.Checked
ini.BoolValue("RecreateM3U","CheckLib") = CheckLib
CheckArt = PanChk1.Checked
ini.BoolValue("RecreateM3U","CheckArt") = CheckArt
CheckAlb = PanChk2.Checked
ini.BoolValue("RecreateM3U","CheckAlb") = CheckAlb
'check new playlist
Dim nam : nam = Left(Edit1.Text,Len(Edit1.Text)-4)&"_fixed.m3u"
Dim fso : Set fso = CreateObject("Scripting.FileSystemObject")
If fso.FileExists(Edit1.Text) Then
If fso.FileExists(nam) Then
If Not (mrYes = SDB.MessageBox("RecreateM3U: This playlist has already been fixed, do you wish to overwrite?",mtError,Array(mbYes,mbNo))) Then
Exit Sub
End If
End If
Else
Call SDB.MessageBox("RecreateM3U: This playlist does not exist!",mtError,Array(mbOk))
Exit Sub
End If
ini.StringValue("RecreateM3U","LastFile") = Edit1.Text
'read playlist
Dim prog : Set prog = SDB.Progress
prog.Value = 0
prog.MaxValue = 1
prog.Text = "RecreateM3U: Reading playlist..."
Dim dic : Set dic = CreateObject("Scripting.Dictionary")
Dim m3u : Set m3u = fso.OpenTextFile(Edit1.Text,1,False,-2)
Dim str : str = ""
Dim com : com = ""
While Not (m3u.AtEndOfStream)
str = m3u.ReadLine
If Left(str,1) = "#" Then
If Left(str,8) = "#EXTINF:" Then
com = Mid(str,9)
End If
Else
While dic.Exists(str)
str = str&"*"
WEnd
Call dic.Add(str,com)
com = ""
End If
prog.MaxValue = prog.MaxValue + 1
prog.Value = prog.Value + 1
WEnd
Call m3u.Close()
If dic.Count = 0 Then
Call SDB.MessageBox("RecreateM3U: This playlist cannot be fixed because it is empty.",mtError,Array(mbOk))
Exit Sub
End If
'create debug logfile
If Debug Then
Call clear()
End If
'find tracks
Dim i : i = 0
Dim j : j = 0
Dim arr : arr = dic.Keys
Dim res : Set res = CreateObject("Scripting.Dictionary")
prog.Text = "RecreateM3U: Processing tracks..."
prog.MaxValue = dic.Count
For i = 0 To UBound(arr)
prog.Value = i
prog.Text = "RecreateM3U: Processing track "&(i+1)&"/"&(dic.Count)&"..."
str = "#"&Replace(arr(i),"*","")
com = dic.Item(arr(i))
If Not (com = "") Then
prog.Text = prog.Text&"'"&com&"'..."
End If
If UseComms Then
Dim c : c = Replace(com,".","_")
c = Replace(c,"\","_")
str = str&":||:"&c
End If
Call FindTrack(str)
If (str = "~#EXIT#~") Or (prog.Terminate) Then
Exit Sub
End If
If Left(str,1) = "#" Then
If NoneMode = 1 Then
Dim itm : Set itm = SDB.NewSongData
If InStr(str,":||:") > 1 Then
itm.Path = Mid(str,2,InStrRev(str,":||:")-2)
Else
itm.Path = Mid(str,2)
End If
Call itm.MetadataFromFilename()
Call itm.UpdateDB()
End If
Else
j = j + 1
End If
While res.Exists(str)
str = str&"*"
WEnd
Call res.Add(str,com)
Next
'create MM playlist
Dim cur,pnam,tmp,ply,par,sql
If Playlist Then
cur = 1
pnam = Mid(nam,InStrRev(nam,"\")+1)
pnam = Left(pnam,InStrRev(pnam,"_")-1)
tmp = pnam
Set ply = SDB.PlaylistByTitle(tmp)
While Not (ply.Title = "")
cur = cur + 1
tmp = pnam&"_"&cur
Set ply = SDB.PlaylistByTitle(tmp)
WEnd
If SDB.MessageBox("RecreateM3U: Do you wish to create playlist '"&tmp&"'?",mtConfirmation,Array(mbYes,mbNo)) = mrYes Then
Set ply = SDB.PlaylistByTitle("").CreateChildPlaylist(tmp)
Else
Playlist = False
End If
End If
'create no-match list
If NoneMode = 2 Then
Dim Form3 : Set Form3 = SDB.UI.NewForm
Form3.BorderStyle = 2
Form3.Caption = "Recreate M3U"
Form3.FormPosition = 4
Form3.StayOnTop = True
Form3.Common.SetRect 0,0,590,350
Set SDB.Objects("RecreateM3UForm") = Form3
Dim WB : Set WB = SDB.UI.NewActiveX(Form3,"Shell.Explorer")
WB.Common.Align = 5
WB.Common.ControlName = "WB"
Dim doc : Set doc = WB.Interf.Document
Dim Foot : Set Foot = SDB.UI.NewPanel(Form3)
Foot.Common.Align = 2
Foot.Common.Height = 35
Dim Btn : Set Btn = SDB.UI.NewButton(Foot)
Btn.Caption = SDB.Localize("&OK")
Btn.Default = True
Btn.Common.SetRect Foot.Common.Width-95, 9, 85, 24
Btn.Common.Anchors = 12
Btn.UseScript = Script.ScriptPath
Btn.OnClickFunc = "OkClick"
Dim sty : sty = False
doc.write "<!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.0 Transitional//EN"">"&vbcrlf
doc.write "<html>"&vbcrlf
doc.write " <head>"&vbcrlf
doc.write " <title>Recreate M3U</title>"&vbcrlf
doc.write " <style type='text/css'>"&vbcrlf
doc.write " body{font-family:'Verdana',sans-serif; background-color:#FFFFFF; font-size:9pt; color:#000000;}"&vbcrlf
doc.write " H1{font-family:'Verdana',sans-serif; font-size:10pt; color:#AAAAAA; text-align:left}"&vbcrlf
doc.write " P{font-family:'Verdana',sans-serif; font-size:8pt; color:#000000;}"&vbcrlf
doc.write " TH{font-family:'Verdana',sans-serif; font-size:9pt; font-weight:bold; color:#000000; border-color:#000000; border-style: solid; border-left-width:0px; border-right-width:0px; border-top-width:0px; border-bottom-width:3px;}"&vbcrlf
doc.write " TD{font-family:'Verdana',sans-serif; font-size:8pt; color:#000000; border-color:#000000; border-style: solid; border-left-width:0px; border-right-width:0px; border-top-width:0px; border-bottom-width:1px;}"&vbcrlf
doc.write " TR.dark{background-color:#EEEEEE}"&vbcrlf
doc.write " TR.aleft TH{text-align:left}"&vbcrlf
doc.write " </style>"&vbcrlf
doc.write " </head>"&vbcrlf
doc.write " <body>"&vbcrlf
doc.write " <h1>Playlist successfully recreated as '"&nam&"'. "&j&" of "&dic.Count&" tracks were found ("&((j*100)\dic.Count)&"%). Tracks not found...</h1>"&vbcrlf
doc.write " <table border=""0"" cellspacing=""0"" cellpadding=""4"" width=""100%"">"&vbcrlf
doc.write " <tr class=""aleft"">"&vbcrlf
doc.write " <th>Comment</th>"&vbcrlf
doc.write " <th>Filename</th>"&vbcrlf
doc.write " </tr>"&vbcrlf
End If
'create M3U playlist
Set m3u = fso.CreateTextFile(nam,True,True)
Call m3u.WriteLine("#EXTM3U")
arr = res.Keys
prog.Text = "RecreateM3U: Writing playlist..."
prog.MaxValue = res.Count
For i = 0 To UBound(arr)
prog.Value = i
com = res.Item(arr(i))
If Not (com = "") Then
Call m3u.WriteLine("#EXTINF:"&com)
End If
str = Replace(arr(i),"*","")
If InStr(str,":||:") > 1 Then
str = Left(str,InStrRev(str,":||:")-1)
End If
Call m3u.WriteLine(str)
If Left(str,1) = "#" Then
If NoneMode = 2 Then
If sty Then
doc.write " <tr class='Dark'>"&vbcrlf
sty = False
Else
doc.write " <tr>"&vbcrlf
sty = True
End If
doc.write " <td>"&Mid(com,2)&" </td>"&vbcrlf
doc.write " <td>"&Mid(str,2)&" </td>"&vbcrlf
doc.write " </tr>"&vbcrlf
End If
Else
If Playlist Then
com = Mid(Replace(str,"'","''"),2)
sql = "SELECT Id FROM Songs WHERE SongPath = '"&com&"'"
If Debug Then
Call out("#"&sql)
End If
Dim qit : Set qit = SDB.Database.OpenSQL(sql)
If Not (qit.EOF) Then
Call ply.AddTrackById(qit.StringByIndex(0))
End If
End If
End If
Next
Call m3u.Close()
'confirmation
prog.Value = prog.MaxValue
str = "All"
i = 100
If Not (j = dic.Count) Then
str = j&" of "&dic.Count
i = (j*100)\dic.Count
End If
If (NoneMode = 2) And (i < 100) Then
doc.write " </table>"&vbcrlf
doc.write " </body>"&vbcrlf
doc.write "</html>"&vbcrlf
doc.Close
Form3.Common.Visible = True
Else
Call SDB.MessageBox("RecreateM3U: Playlist successfully recreated as '"&nam&"'."&Chr(13)&str&" tracks were found ("&i&"%).",mtInformation,Array(mbOk))
End If
End Sub
Sub OkClick(Control)
Dim Form : Set Form = SDB.Objects("RecreateM3UForm")
Form.Common.ControlName = ""
Form.Common.Visible = False
Set SDB.Objects("RecreateM3UForm") = Nothing
End Sub
Sub BrowseClick(Control)
Dim edt : Set edt = Control.Common.TopParent.Common.ChildControl("Filename")
Dim dlg : Set dlg = SDB.CommonDialog
dlg.DefaultExt = ".m3u"
dlg.Filter = "Playlist (*.m3u)|*.m3u|Textfile (*.txt)|*.txt"
dlg.Flags = cdlOFNOverwritePrompt + cdlOFNHideReadOnly + cdlOFNNoChangeDir
dlg.InitDir = edt.Text
dlg.ShowOpen
If (dlg.Ok = False) Or (dlg.FileName = "") Then
Exit Sub
End If
edt.Text = dlg.FileName
End Sub
Sub FindTrack(str)
'initialise
UseComms = SDB.IniFile.BoolValue("RecreateM3U","UseComms")
ShowMode = SDB.IniFile.IntValue("RecreateM3U","ShowMode")
CheckLib = SDB.IniFile.BoolValue("RecreateM3U","CheckLib")
CheckArt = SDB.IniFile.BoolValue("RecreateM3U","CheckArt")
CheckAlb = SDB.IniFile.BoolValue("RecreateM3U","CheckAlb")
UseFuzzy = SDB.IniFile.BoolValue("RecreateM3U","UseFuzzy")
Dim dic : Set dic = CreateObject("Scripting.Dictionary")
Dim tmp : tmp = ""
Dim sql : sql = ""
Dim c : c = ""
Dim i : i = 0
Dim j : j = InStrRev(str,"\")+1
Dim k : k = InStrRev(str,".")-1
If (k = 0) Or (k < j) Then
k = Len(str)
End If
'check library
Dim dit : Set dit = Nothing
If CheckLib Then
If InStr(str,":||:") > 1 Then
c = Replace(Mid(str,3,InStrRev(str,":||:")-3),"'","''")
Else
c = Replace(Mid(str,3),"'","''")
End If
sql = "SELECT Id FROM Songs WHERE SongPath = '"&c&"'"
If Debug Then
Call out("#"&sql)
End If
Dim qit : Set qit = SDB.Database.OpenSQL(sql)
If Not (qit.EOF) Then
tmp = qit.StringByIndex(0)
If ShowMode = 2 Then
Call SelectOne(str,"*"&tmp)
Else
Set dit = SDB.Database.QuerySongs(" AND Songs.ID="&tmp)
If Not dit.EOF Then
str = dit.Item.Path
End If
End If
Exit Sub
End If
End If
'list words
For i = j To k
c = Mid(str,i,1)
If InStr("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ÅÄÂÃÁÀÆËÊÉÈÏÎÍÌÖÔÕÓÒØÜÛÚÙÝÇÐÑß",UCase(c)) > 0 Then
tmp = tmp&c
Else
If Not (tmp = "") Then
If Suitable(tmp) Then
dic.Item(tmp) = ""
End If
tmp = ""
End If
End If
Next
If Not (tmp = "") Then
dic.Item(tmp) = ""
End If
If Not UseComms Then
If dic.Count = 0 Then
Exit Sub
End If
End If
'use comments
If UseComms Then
tmp = ""
j = InStrRev(str,":||:")+4
k = Len(str)
For i = j To k
c = Mid(str,i,1)
If InStr("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ÅÄÂÃÁÀÆËÊÉÈÏÎÍÌÖÔÕÓÒØÜÛÚÙÝÇÐÑß",UCase(c)) > 0 Then
tmp = tmp&c
Else
If Not (tmp = "") Then
If Suitable(tmp) Then
dic.Item(tmp) = ""
End If
tmp = ""
End If
End If
Next
If Not (tmp = "") Then
dic.Item(tmp) = ""
End If
If dic.Count = 0 Then
Exit Sub
End If
End If
'sort by length
Dim a : a = dic.Keys
Dim b : b = False
Do
b = True
For i = 0 To UBound(a)-1
If Len(a(i+1)) > Len(a(i)) Then
b = False
tmp = a(i)
a(i) = a(i+1)
a(i+1) = tmp
End If
Next
Loop Until b
'add folder names
Dim d : d = Split(str,"\")
Call dic.RemoveAll()
For i = UBound(d)-1 To 1 Step -1
tmp = ""
For j = 1 To Len(d(i))
c = Mid(d(i),j,1)
If InStr("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ÅÄÂÃÁÀÆËÊÉÈÏÎÍÌÖÔÕÓÒØÜÛÚÙÝÇÐÑß",UCase(c)) > 0 Then
tmp = tmp&c
Else
If Not (tmp = "") Then
If Suitable(tmp) And NotInArray(tmp,a) Then
dic.Item(tmp) = ""
End if
tmp = ""
End If
End If
Next
If Not (tmp = "") Then
dic.Item(tmp) = ""
End If
Next
tmp = Join(a," ")&" "&Join(dic.Keys," ")
a = Split(tmp," ")
'initial search
tmp = fixsql(a(0))
sql = "SELECT DISTINCT Songs.ID FROM Songs"
If CheckArt Then
sql = sql&",Artists,ArtistsSongs"
End IF
If CheckAlb Then
sql = sql&",Albums"
End If
sql = sql&" WHERE Songs.ID > 0"
If CheckArt Then
sql = sql&" AND Songs.ID = ArtistsSongs.IDSong AND ArtistsSongs.IDArtist = Artists.ID"
End If
If CheckAlb Then
sql = sql&" AND Songs.IDAlbum = Albums.ID"
End If
sql = sql&" AND ("
If CheckArt Then
If UseFuzzy Then
sql = sql&"SOUNDEX(Artists.Artist) = SOUNDEX('"&Replace(a(0),"'","''")&"') OR "
End If
sql = sql&"Artists.Artist LIKE '%"&tmp&"%' OR "
End If
If CheckAlb Then
If UseFuzzy Then
sql = sql&"SOUNDEX(Albums.Album) = SOUNDEX('"&Replace(a(0),"'","''")&"') OR "
End If
sql = sql&"Albums.Album LIKE '%"&tmp&"%' OR "
End If
If UseFuzzy Then
sql = sql&"SOUNDEX(Songs.SongTitle) = SOUNDEX('"&Replace(a(0),"'","''")&"') OR "
End If
sql = sql&"Songs.SongTitle LIKE '%"&tmp&"%')"
If Debug Then
Call out("#"&sql)
End If
Dim sit : Set sit = SDB.Database.OpenSQL(sql)
i = 0
tmp = ""
While Not sit.EOF
i = i + 1
If tmp = "" Then
tmp = sit.StringByIndex(0)
Else
tmp = tmp&","&sit.StringByIndex(0)
End If
sit.Next
WEnd
If i = 1 Then
If ShowMode = 2 Then
Call SelectOne(str,"*"&tmp)
Else
Set dit = SDB.Database.QuerySongs(" AND Songs.ID="&tmp)
If Not dit.EOF Then
str = dit.Item.Path
End If
End If
Exit Sub
End If
If i = 0 Then
Exit Sub
End If
'progressive searches
Dim pre : pre = ""
For i = 1 To UBound(a)
pre = sql
Dim tmp2 : tmp2 = fixsql(a(i))
sql = "SELECT DISTINCT Songs.ID FROM Songs"
If CheckArt Then
sql = sql&",Artists,ArtistsSongs"
End If
If CheckAlb Then
sql = sql&",Albums"
End If
sql = sql&" WHERE Songs.ID IN ("&tmp&")"
If CheckArt Then
sql = sql&" AND Songs.ID = ArtistsSongs.IDSong AND ArtistsSongs.IDArtist = Artists.ID"
End If
If CheckAlb Then
sql = sql&" AND Songs.IDAlbum = Albums.ID"
End If
sql = sql&" AND ("
If CheckArt Then
If UseFuzzy Then
sql = sql&"SOUNDEX(Artists.Artist) = SOUNDEX('"&Replace(a(i),"'","''")&"') OR "
End If
sql = sql&"Artists.Artist LIKE '%"&tmp2&"%' OR "
End If
If CheckAlb Then
If UseFuzzy Then
sql = sql&"SOUNDEX(Albums.Album) = SOUNDEX('"&Replace(a(i),"'","''")&"') OR "
End If
sql = sql&"Albums.Album LIKE '%"&tmp2&"%' OR "
End If
If UseFuzzy Then
sql = sql&"SOUNDEX(Songs.SongTitle) = SOUNDEX('"&Replace(a(i),"'","''")&"') OR "
End If
sql = sql&"Songs.SongTitle LIKE '%"&tmp2&"%')"
If Debug Then
Call out("#"&sql)
End If
Set sit = SDB.Database.OpenSQL(sql)
j = 0
tmp = ""
While Not sit.EOF
j = j + 1
If tmp = "" Then
tmp = sit.StringByIndex(0)
Else
tmp = tmp&","&sit.StringByIndex(0)
End If
sit.Next
WEnd
If j = 1 Then
If ShowMode = 2 Then
Call SelectOne(str,"*"&tmp)
Else
Set dit = SDB.Database.QuerySongs(" AND Songs.ID="&tmp)
If Not dit.EOF Then
str = dit.Item.Path
End If
End If
Exit Sub
End If
If j = 0 Then
'try track number
Dim all : all = tmp
tmp = ""
Call dic.RemoveAll()
For k = InStrRev(str,"\")+1 To InStrRev(str,".")-1
c = Mid(str,k,1)
If InStr("0123456789",c) > 0 Then
tmp = tmp&c
Else
If (Len(tmp) > 0) And (Len(tmp) < 4) Then
dic.Item(tmp) = ""
End If
tmp = ""
End If
Next
If Not (tmp = "") Then
dic.Item(tmp) = ""
End If
If dic.Count > 0 Then
a = dic.Keys
If dic.Count > 1 Then
Do
b = True
For k = 0 To UBound(a)-1
If Len(a(k+1)) > Len(a(k)) Then
b = False
tmp = a(k)
a(k) = a(k+1)
a(k+1) = tmp
End If
Next
Loop Until b
End If
For k = 0 To UBound(a)
sql = pre&" AND (CAST(TrackNumber AS INTEGER) = "&(Int(a(k)))&")"
If Debug Then
Call out("#"&sql)
End If
Set sit = SDB.Database.OpenSQL(sql)
j = 0
While Not sit.EOF
j = j + 1
tmp = sit.StringByIndex(0)
sit.Next
WEnd
If j = 1 Then
If ShowMode = 2 Then
Call SelectOne(str,"*"&tmp)
Else
Set dit = SDB.Database.QuerySongs(" AND Songs.ID="&tmp)
If Not dit.EOF Then
str = dit.Item.Path
End If
End If
Exit Sub
End If
Next
End If
Exit For
End If
Next
'possible results
Call SelectOne(str,pre)
End Sub
Sub SelectOne(str,pre)
If (str = "") Or (pre = "") Then
Exit Sub
End If
ShowMode = SDB.IniFile.IntValue("RecreateM3U","ShowMode")
If ShowMode = 0 Then
Exit Sub
End If
'list ids
Dim tmp : tmp = ""
Dim sit : Set sit = Nothing
If Left(pre,1) = "*" Then
tmp = Mid(pre,2)
Else
If Debug Then
Call out("#"&pre)
End If
Set sit = SDB.Database.OpenSQL(pre)
While Not sit.EOF
If tmp = "" Then
tmp = sit.StringByIndex(0)
Else
tmp = tmp&","&sit.StringByIndex(0)
End If
sit.Next
WEnd
End If
If (ShowMode < 2) And (InStr(tmp,",") = 0) Then
Exit Sub
End If
'check rows
ShowRows = SDB.IniFile.IntValue("RecreateM3U","ShowRows")
Dim i : i = 0
Dim l : Set l = SDB.NewSongList
Dim a : a = Split(tmp,",")
If UBound(a)+1 > ShowRows Then
Exit Sub
End If
'********************************************************************'
'* Form produced by MMVBS Form Creator (http://trixmoto.net/mmvbs) *'
'********************************************************************'
Dim Form1 : Set Form1 = SDB.UI.NewForm
Form1.BorderStyle = 2
Form1.Caption = "Recreate M3U"
Form1.FormPosition = 4
Form1.StayOnTop = True
Form1.Common.ControlName = "RecreateM3UForm"
Form1.Common.SetRect 0,0,590,150
Form1.Common.MinWidth = 590
Form1.Common.MinHeight = 200
Call Script.RegisterEvent(Form1.Common,"OnResize","FormOnResize")
Dim Label1 : Set Label1 = SDB.UI.NewLabel(Form1)
Label1.Common.SetRect 10,10,65,17
Label1.Caption = "Please select the track which you want to include for file..."
Dim Label2 : Set Label2 = SDB.UI.NewLabel(Form1)
Label2.Common.SetRect 10,35,65,17
If InStr(str,":||:") > 1 Then
Label2.Caption = Mid(str,2,InStrRev(str,":||:")-2)
Else
Label2.Caption = Mid(str,2)
End If
Dim Label3 : Set Label3 = SDB.UI.NewLabel(Form1)
Label3.Common.SetRect 10,60,65,17
Label3.Caption = "Title"
Dim Label4 : Set Label4 = SDB.UI.NewLabel(Form1)
Label4.Common.SetRect 180,60,65,17
Label4.Caption = "Artist"
Dim Label5 : Set Label5 = SDB.UI.NewLabel(Form1)
Label5.Common.SetRect 305,60,65,17
Label5.Caption = "Album"
Dim ini : Set ini = SDB.IniFile
Dim ind : ind = 42
If ini.ValueExists("RecreateM3U","LastOther") Then
ind = ini.IntValue("RecreateM3U","LastOther")
End If
Dim DropDown1 : Set DropDown1 = SDB.UI.NewDropDown(Form1)
DropDown1.AddItem("Author")
DropDown1.AddItem("Band")
DropDown1.AddItem("Bitrate")
DropDown1.AddItem("BPM")
DropDown1.AddItem("Channels")
DropDown1.AddItem("Comment")
DropDown1.AddItem("Conductor")
DropDown1.AddItem("Custom1")
DropDown1.AddItem("Custom2")
DropDown1.AddItem("Custom3")
DropDown1.AddItem("Custom4")
DropDown1.AddItem("Custom5")
DropDown1.AddItem("DateAdded")
DropDown1.AddItem("DiscNumber")
DropDown1.AddItem("DiscNumberStr")
DropDown1.AddItem("Encoder")
DropDown1.AddItem("FileLength")
DropDown1.AddItem("FileModified")
DropDown1.AddItem("Genre")
DropDown1.AddItem("Grouping")
DropDown1.AddItem("InvolvedPeople")
DropDown1.AddItem("ISRC")
DropDown1.AddItem("LastPlayed")
DropDown1.AddItem("Lyricist")
DropDown1.AddItem("Lyrics")
DropDown1.AddItem("Mood")
DropDown1.AddItem("MusicComposer")
DropDown1.AddItem("Occasion")
DropDown1.AddItem("OriginalArtist")
DropDown1.AddItem("OriginalLyricist")
DropDown1.AddItem("OriginalTitle")
DropDown1.AddItem("OriginalYear")
DropDown1.AddItem("Path")
DropDown1.AddItem("PlayCounter")
DropDown1.AddItem("Publisher")
DropDown1.AddItem("Quality")
DropDown1.AddItem("Rating")
DropDown1.AddItem("RatingString")
DropDown1.AddItem("SampleRate")
DropDown1.AddItem("SongLength")
DropDown1.AddItem("SongLengthString")
DropDown1.AddItem("Tempo")
DropDown1.AddItem("TrackOrder")
DropDown1.AddItem("TrackOrderStr")
DropDown1.AddItem("VBR")
DropDown1.AddItem("Year")
DropDown1.ItemIndex = ind
DropDown1.Style = 2
DropDown1.UseScript = Script.ScriptPath
DropDown1.OnSelectFunc = "FillOther"
DropDown1.Common.SetRect 430,57,120,21
DropDown1.Common.Anchors = 6
'show choices
Dim val : val = 0
ind = 0
For i = 0 To UBound(a)
Set sit = SDB.Database.QuerySongs(" AND Songs.ID="&a(i))
If Not sit.EOF Then
Dim Edit1 : Set Edit1 = SDB.UI.NewEdit(Form1)
Edit1.Common.SetRect 10,(i*25)+85,165,21
Edit1.Text = sit.Item.Title
Dim Edit2 : Set Edit2 = SDB.UI.NewEdit(Form1)
Edit2.Common.SetRect 180,(i*25)+85,120,21
Edit2.Text = sit.Item.ArtistName
Dim Edit3 : Set Edit3 = SDB.UI.NewEdit(Form1)
Edit3.Common.SetRect 305,(i*25)+85,120,21
Edit3.Text = sit.Item.AlbumName
Dim Edit4 : Set Edit4 = SDB.UI.NewEdit(Form1)
Edit4.Common.SetRect 430,(i*25)+85,120,21
Edit4.Common.ControlName = "Other"&i
Execute("Edit4.Text = sit.Item."&DropDown1.Text)
Dim RadioButton1 : Set RadioButton1 = SDB.UI.NewRadioButton(Form1)
RadioButton1.Common.SetRect 555,(i*25)+86,20,20
RadioButton1.Common.ControlName = "Radio"&i
RadioButton1.Common.Anchors = 6
Select Case DefTrack
Case 1
If sit.Item.Bitrate > val Then
val = sit.Item.Bitrate
ind = i
End If
Case 2
If sit.Item.DateAdded > val Then
val = sit.Item.DateAdded
ind = i
End If
Case 3
If sit.Item.PlayCounter > val Then
val = sit.Item.PlayCounter
ind = i
End If
Case 4
If sit.Item.Rating > val Then
val = sit.Item.Rating
ind = i
End If
End Select
Form1.Common.Height = Form1.Common.Height + 25
Call l.Add(sit.Item)
End If
Next
If ShowMode = 3 Then
str = l.Item(ind).Path
Call Script.UnRegisterEvents(Form1.Common)
Exit Sub
End If
Form1.Common.ChildControl("Radio"&ind).Checked = True
Set SDB.Objects("RecreateM3USongList") = l
Dim Button1 : Set Button1 = SDB.UI.NewButton(Form1)
Button1.Cancel = True
Button1.Caption = "Exit"
Button1.ModalResult = 3
Button1.Common.SetRect Form1.Common.Width-95,Form1.Common.Height-60,75,25
Button1.Common.Anchors = 12
Dim Button2 : Set Button2 = SDB.UI.NewButton(Form1)
Button2.Caption = "Skip"
Button2.ModalResult = 2
Button2.Common.SetRect Button1.Common.Left-85,Button1.Common.Top,75,25
Button2.Common.Anchors = 12
Dim Button3 : Set Button3 = SDB.UI.NewButton(Form1)
Button3.Caption = "Ok"
Button3.Default = True
Button3.ModalResult = 1
Button3.Common.SetRect Button2.Common.Left-85,Button2.Common.Top,75,25
Button3.Common.Anchors = 12
'*******************************************************************'
'* End of form Richard Lewis (c) 2007 *'
'*******************************************************************'
Select Case Form1.ShowModal
Case 1 'ok
For i = 0 To l.Count-1
Dim rad : Set rad = Form1.Common.ChildControl("Radio"&i)
If Not (rad Is Nothing) Then
If rad.Checked Then
str = l.Item(i).Path
Exit For
End If
End If
Next
Case 2 'skip
'do nothing
Case 3 'cancel
str = "~#EXIT#~"
End Select
ini.IntValue("RecreateM3U","LastOther") = DropDown1.ItemIndex
Call Script.UnRegisterEvents(Form1.Common)
End Sub
Sub FormOnResize(Control)
Dim list : Set list = SDB.Objects("RecreateM3USongList")
If Not (list Is Nothing) Then
Dim i : i = 0
For i = 0 To list.Count-1
Dim edt : Set edt = Control.Common.TopParent.Common.ChildControl("Other"&i)
If Not (edt Is Nothing) Then
Dim rad : Set rad = Control.Common.TopParent.Common.ChildControl("Radio"&i)
If Not (rad Is Nothing) Then
edt.Common.Width = rad.Common.Left-edt.Common.Left-5
End If
End If
Next
End If
End Sub
Sub FillOther(Control)
Dim list : Set list = SDB.Objects("RecreateM3USongList")
If Not (list Is Nothing) Then
Dim i : i = 0
For i = 0 To list.Count-1
Dim edt : Set edt = Control.Common.TopParent.Common.ChildControl("Other"&i)
If Not (edt Is Nothing) Then
Execute("edt.Text = list.Item(i)."&Control.Text)
End If
Next
End If
End Sub
Function NotInArray(s,a)
NotInArray = False
Dim i : i = 0
For i = LBound(a) To UBound(a)
If a(i) = s Then
Exit Function
End If
Next
NotInArray = True
End Function
Function Suitable(s)
Suitable = False
If Len(s) = 1 Then
Exit Function
End If
If IsNumeric(s) Then
Exit Function
End if
Dim a : a = Split(SDB.IniFile.StringValue("Options","IgnoreTHEStrings"),",")
If Not (NotInArray(s,a)) Then
Exit Function
End If
Suitable = True
End Function
Function fixsql(name)
fixsql = Replace(name,"'","''")
fixsql = Replace(fixsql,"@","@@")
fixsql = Replace(fixsql,"_","@_")
fixsql = Replace(fixsql,"%","@%")
End Function
Sub Install()
Dim inip : inip = SDB.ApplicationPath&"Scripts\Scripts.ini"
Dim inif : Set inif = SDB.Tools.IniFileByPath(inip)
If Not (inif Is Nothing) Then
inif.StringValue("RecreateM3U","Filename") = "RecreateM3U.vbs"
inif.StringValue("RecreateM3U","Procname") = "RecreateM3U"
inif.StringValue("RecreateM3U","Order") = "100"
inif.StringValue("RecreateM3U","DisplayName") = "Recreate M3U"
inif.StringValue("RecreateM3U","Description") = "Recreate broken M3U playlist"
inif.StringValue("RecreateM3U","Language") = "VBScript"
inif.StringValue("RecreateM3U","ScriptType") = "0"
SDB.RefreshScriptItems
End If
End Sub
Sub clear()
Dim wsh : Set wsh = CreateObject("WScript.Shell")
Dim fso : Set fso = CreateObject("Scripting.FileSystemObject")
Dim loc : loc = wsh.ExpandEnvironmentStrings("%TEMP%")
If Right(loc,1) = "\" Then
loc = loc&"RecreateM3U.log"
Else
loc = loc&"\RecreateM3U.log"
End If
Dim logf : Set logf = fso.CreateTextFile(loc,True)
logf.Close
End Sub
Sub out(txt)
Dim wsh : Set wsh = CreateObject("WScript.Shell")
Dim fso : Set fso = CreateObject("Scripting.FileSystemObject")
Dim loc : loc = wsh.ExpandEnvironmentStrings("%TEMP%")
If Right(loc,1) = "\" Then
loc = loc&"RecreateM3U.log"
Else
loc = loc&"\RecreateM3U.log"
End If
Dim logf : Set logf = fso.OpenTextFile(loc,8,True)
logf.WriteLine(Time&" "&SDB.ToAscii(txt))
logf.Close
End Sub