Disc Splitter 1.2 [MM2+3]

Download and get help for different MediaMonkey for Windows 4 Addons.

Moderators: Peke, Gurus

trixmoto
Posts: 10024
Joined: Fri Aug 26, 2005 3:28 am
Location: Hull, UK
Contact:

Disc Splitter 1.2 [MM2+3]

Post by trixmoto »

This is another script that has been designed by someone else and requested via my website. Firstly select a Location or My Computer node that you want to split into CD sized folders. Then select the script from the Tools menu and it will ask you to select the mode and size limit (song length in minutes or file length in megabytes). When you click "Ok" it will move the files into folders of the correct size.

The installer is available to download from my website! :)

Code: Select all

'
' MediaMonkey Script
'
' NAME: DiscSplitter 1.2
'
' AUTHOR: trixmoto (http://trixmoto.net)
' DATE : 22/01/2008
'
' INSTALL: Copy to Scripts directory and add the following to Scripts.ini 
'          Don't forget to remove comments (') and set the order appropriately 
'
' [DiscSplitter]
' FileName=DiscSplitter.vbs
' ProcName=DiscSplitter
' Order=100
' DisplayName=&Disc Splitter
' Description=Split tracks into groups of disc size
' Language=VBScript
' ScriptType=0 
'
' FIXES: Made compatible with MM3
'        Added option to split by physical size
'

Option Explicit

Dim DiskSize : DiskSize = 80  'Default CD size in minutes
Dim FileSize : FileSize = 700 'Default CD size in megabytes

Sub DiscSplitter
  'get current node
  Dim cur : Set cur = SDB.MainTree.CurrentNode
  If cur Is Nothing Then
    Call SDB.MessageBox("DiscSplitter: No node is selected.",mtError,Array(mbOk))
    Exit Sub
  End If
  
  'check node type
  Dim loc : loc = ""
  Select Case cur.NodeType
    Case 64
      loc = SDB.MainTree.CurrentNode.Path
    Case 62
      loc = Mid(SDB.MainTree.CurrentNode.Path,2)
    Case Else
      Call SDB.MessageBox("DiscSplitter: Selected node type ("&cur.NodeType&") is not suitable.",mtError,Array(mbOk))
      Exit Sub
  End Select
  
  'check track count
  Dim dit : Set dit = SDB.Database.OpenSQL("SELECT Count(*), Sum(Songs.SongLength), Sum(Songs.FileLength) FROM Songs WHERE Songs.SongPath LIKE '"&loc&"%'")
  Dim tot : tot = dit.ValueByIndex(0)
  If tot = 0 Then
    Call SDB.MessageBox("DiscSplitter: Selected node contains no tracks.",mtError,Array(mbOk))
    Exit Sub
  End If    
  
  'get options
  Dim ini : Set ini = SDB.IniFile
  Dim mode : mode = ini.IntValue("DiscSplitter","Mode")
  If Not (ini.StringValue("DiscSplitter","Disk") = "") Then
    DiskSize = ini.IntValue("DiscSplitter","Disk")
  End If
  If Not (ini.StringValue("DiscSplitter","File") = "") Then
    FileSize = ini.IntValue("DiscSplitter","File")
  End If  
  
  'create confirmation
  Dim Form1 : Set Form1 = SDB.UI.NewForm
  Form1.BorderStyle = 3
  Form1.Caption = "Disc Splitter"
  Form1.FormPosition = 4
  Form1.StayOnTop = True
  Form1.Common.ControlName = "DiscSplitterForm"
  Form1.Common.SetRect 0,0,200,150
  Dim Label1 : Set Label1 = SDB.UI.NewLabel(Form1)
  Label1.Common.SetRect 10,10,65,17
  Label1.Caption = "Please select options..."
  Dim Label2 : Set Label2 = SDB.UI.NewLabel(Form1)
  Label2.Common.SetRect 10,35,65,17
  Label2.Caption = "Mode:"
  Dim Label3 : Set Label3 = SDB.UI.NewLabel(Form1)
  Label3.Common.SetRect 10,60,65,17
  Label3.Caption = "Size:"
  Dim DropDown1 : Set DropDown1 = SDB.UI.NewDropDown(Form1)
  DropDown1.Common.SetRect 50,32,120,21  
  DropDown1.AddItem("Disk size (mins)")
  DropDown1.AddItem("File size (mb)")
  DropDown1.ItemIndex = mode
  DropDown1.Style = 2
  Dim Edit1 : Set Edit1 = SDB.UI.NewEdit(Form1)
  Edit1.Common.SetRect 50,57,120,21
  Select Case mode
    Case 0
      Edit1.Text = DiskSize
    Case 1
      Edit1.Text = FileSize
  End Select
  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
  Dim Button2 : Set Button2 = SDB.UI.NewButton(Form1)
  Button2.Caption = "Ok"
  Button2.Default = True  
  Button2.ModalResult = 1
  Button2.Common.SetRect Button1.Common.Left-85,Button1.Common.Top,75,25  
  
  'show confirmation
  If Form1.ShowModal = 2 Then
    Exit Sub
  End If
  If Edit1.Text = "" Or Int(Edit1.Text) = 0 Then
    Call SDB.MessageBox("DiscSplitter: Size limit not specified or invalid.",mtError,Array(mbOk))
    Exit Sub
  End If
  
  'save settings
  mode = DropDown1.ItemIndex
  ini.IntValue("DiscSplitter","Mode") = mode
  Select Case mode
    Case 0
      DiskSize = Int(Edit1.Text)
      ini.IntValue("DiscSplitter","Disk") = DiskSize
    Case 1
      FileSize = Int(Edit1.Text)
      ini.IntValue("DiscSplitter","File") = FileSize
  End Select  
  
  'check total length
  Dim ds,ts
  Select Case mode
    Case 0
      ds = DiskSize * 60
      ts = dit.ValueByIndex(1) / 1000
    Case 1
      ds = FileSize * 1024
      ts = dit.ValueByIndex(2) / 1024
  End Select
  If ds > ts Then
    Call SDB.MessageBox("DiscSplitter: Selected node does not need to be split.",mtError,Array(mbOk))
    Exit Sub
  End If  
   
  'initialise
  Dim fso : Set fso = CreateObject("Scripting.FileSystemObject")
  Dim prog : Set prog = SDB.Progress
  prog.Value = 0
  prog.MaxValue = tot
  prog.Text = "DiscSplitter: Initialising..."
  Dim cds : cds = (ts\ds)+1
  Dim num : num = 1
  Dim val : val = 0
  Dim fis : fis = 0
  Dim fnf : fnf = 0
  Dim rs : rs = ds
  Dim nam : nam = Left(loc,Len(loc)-1)
  nam = loc&Mid(nam,InStrRev(nam,"\"))&" "
  
  'loop through tracks
  Dim sql : sql = ""
  Select Case mode
    Case 0 
      sql = "SongLength"
    Case 1
      sql = "FileLength"
  End Select
  If SDB.VersionHi > 2 Then
    sql = "SELECT Medias.DriveLetter, Songs.SongPath, Songs."&sql&" FROM Songs,Medias WHERE Songs.IDMedia = Medias.IDMedia AND Songs.SongPath LIKE '"&loc&"%' ORDER BY Songs.SongPath"
  Else
    sql = "SELECT Medias.DriveLetter, Songs.SongPath, Songs."&sql&" FROM Songs LEFT JOIN Medias ON Songs.IDMedia = Medias.IDMedia WHERE Songs.SongPath LIKE '"&loc&"%' ORDER BY Songs.SongPath"
  End If
  Set dit = SDB.Database.OpenSQL(sql)
  While (Not dit.EOF) And (Not prog.Terminate)
    'check song path
    Dim sour : sour = Replace(dit.StringByIndex(1),loc,"")
    If InStr(sour,"\") = 0 Then
      'check file exists
      sour = Chr(65+dit.ValueByIndex(0))&dit.StringByIndex(1)
      If fso.FileExists(sour) Then
        'check song length
        Select Case mode
          Case 0
            val = dit.ValueByIndex(2)/1000
          Case 1
            val = dit.ValueByIndex(2)/1024
        End Select
        rs = rs-val
        If Not (rs > 0) Then
          num = num + 1
          rs = ds-val
        End If      
        
        'move file to folder  
        prog.Text = "DiscSplitter: Moving track "&(prog.Value+1)&"/"&(tot)&" to disc "&(num)&"/"&(cds)&"..."      
        Dim dest : dest = Chr(65+dit.ValueByIndex(0))&nam&num&"\"
        If Not (fso.FolderExists(dest)) Then
          Call fso.CreateFolder(dest)
        End If
        Call fso.MoveFile(sour,dest)
      Else
        prog.Text = "DiscSplitter: Skipping track "&(prog.Value+1)&"/"&(tot)&" (file not found)..."
        fnf = fnf + 1
      End If
    Else
      prog.Text = "DiscSplitter: Skipping track "&(prog.Value+1)&"/"&(tot)&" (file in subfolder)..."
      fis = fis + 1
    End If
    
    'iterate
    prog.Increase
    dit.Next
  WEnd
  
  'final warnings
  If Int(fnf+fis) = Int(tot) Then
    If fnf = tot Then
      Call SDB.MessageBox("DiscSplitter: No files could be found.",mtError,Array(mbOk))
      Exit Sub
    End If
    If fis = tot Then
      Call SDB.MessageBox("DiscSplitter: No files in selected folder.",mtError,Array(mbOk))
      Exit Sub
    End If  
    Call SDB.MessageBox("DiscSplitter: No files could be found in selected folder.",mtError,Array(mbOk))
  End If
End Sub

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("DiscSplitter","Filename") = "DiscSplitter.vbs"
    inif.StringValue("DiscSplitter","Procname") = "DiscSplitter"
    inif.StringValue("DiscSplitter","Order") = "100"
    inif.StringValue("DiscSplitter","DisplayName") = "&Disc Splitter"
    inif.StringValue("DiscSplitter","Description") = "Split tracks into groups of disc size"
    inif.StringValue("DiscSplitter","Language") = "VBScript"
    inif.StringValue("DiscSplitter","ScriptType") = "0"
    SDB.RefreshScriptItems
  End If
End Sub
Last edited by trixmoto on Tue Jan 22, 2008 6:51 pm, edited 1 time in total.
Download my scripts at my own MediaMonkey fansite.
All the code for my website and scripts is safely backed up immediately and for free using Dropbox.
trixmoto
Posts: 10024
Joined: Fri Aug 26, 2005 3:28 am
Location: Hull, UK
Contact:

Post by trixmoto »

New version (1.1) is now available from my website. Changes include...

- Fixed subsequent folders sometimes exceed disc length
- Added original folder name to created folder names
Download my scripts at my own MediaMonkey fansite.
All the code for my website and scripts is safely backed up immediately and for free using Dropbox.
Mizery_Made
Posts: 2283
Joined: Tue Aug 29, 2006 1:09 pm
Location: Kansas City, Missouri, United States

Post by Mizery_Made »

Here's another idea for you, maybe supporting File Size (700mb for instance) for easier MP3 Disc splitting, might help in backing up your MP3's, you know? Just a thought.
trixmoto
Posts: 10024
Joined: Fri Aug 26, 2005 3:28 am
Location: Hull, UK
Contact:

Post by trixmoto »

Thanks for the suggestion. :)
Download my scripts at my own MediaMonkey fansite.
All the code for my website and scripts is safely backed up immediately and for free using Dropbox.
some1
Posts: 91
Joined: Tue Jul 03, 2007 3:10 am

Post by some1 »

Thanks for this!
I do use this! :)
trixmoto
Posts: 10024
Joined: Fri Aug 26, 2005 3:28 am
Location: Hull, UK
Contact:

Post by trixmoto »

I'm glad you've found it useful! :D
Download my scripts at my own MediaMonkey fansite.
All the code for my website and scripts is safely backed up immediately and for free using Dropbox.
trixmoto
Posts: 10024
Joined: Fri Aug 26, 2005 3:28 am
Location: Hull, UK
Contact:

Post by trixmoto »

New version (1.2) is now available to download from my website. Changes include...

- Made compatible with MM3
- Added option to split by physical size

Instead of changing the settings in the script file there is now a popup to select the options, which are stored in the ini file. :)
Download my scripts at my own MediaMonkey fansite.
All the code for my website and scripts is safely backed up immediately and for free using Dropbox.
Post Reply