LinkedTracks v1.1.1 [MM2+3+4] (TSFKA TiedSongsGroups)

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

Moderators: Peke, Gurus

Steegy
Posts: 3452
Joined: Sat Nov 05, 2005 7:17 pm

LinkedTracks v1.1.1 [MM2+3+4] (TSFKA TiedSongsGroups)

Post by Steegy »

:: Script LinkedTracks v1.1.1 (TiedSongsGroups)

This script lets you link tracks together in a group, so when one track of the group is played, the previous & next tracks in the group are also added for playback (in order, if they weren't already there). Optionally the player will always jump to the first track in the group and start playing from there continuously till the last track in the group.

The idea came from here.

Installation Package: LinkedTracks111.mmip

How to use:
  1. Select the tracks in the main tracklist that you want to link, right-click and choose "Link selected tracks" (Shift+Ctrl+L).
  2. Add e.g. one of the linked songs to the now playing list.
  3. When playback starts on the added song, notice that the other songs of the group will be added before/after.
  4. Depending on the options (menu Tools > Options > Player > Linked Tracks), playback will start from the added song or from the first song in the group, till the last one in the group, and this in continuous mode (independant of how shuffle, auto-dj, ... was set before).
  5. When the last song in the group is played, the player continues with the other songs in the now playing list (restoring shuffle, auto-dj, ...).
Note: By default, the 'link' between the linked tracks will be stored in the tracks' Custom5 field. This can be changed in the settings (e.g. if you are already using this field for another purpose).

Version 1.1 of the script now called LinkedTracks (indeed sounds better than TiedSongsGroups) is, simply put, a combination of the different versions (Steegy, das Monkey, Rycher) posted in this thread by the different authors. It has the option panel to change the script's configuration, and the context menu item to create a group with the selected songs.
As always feel free to update the script and put the installation package online. Then me or a moderator can update this first post to reference the new version.


Attention: This script is NOT the DJTiedSongsGroups. The last version of Rycher's DJTiedSongsGroups script can be found here.
Last edited by Steegy on Sun Jun 12, 2011 5:45 pm, edited 5 times in total.
Extensions: ExternalTools, ExtractFields, SongPreviewer, LinkedTracks, CleanImport, and some other scripts (Need Help with Addons > List of All Scripts).
Lowlander
Posts: 56465
Joined: Sat Sep 06, 2003 5:53 pm
Location: MediaMonkey 5

Post by Lowlander »

Does it also add previous songs tied to the song, ie songs with a lower track number?
Steegy
Posts: 3452
Joined: Sat Nov 05, 2005 7:17 pm

Post by Steegy »

No it doesn't for now, as the script was made "on request" just to add the following tracks.
But I think that can be easily added, as an option to choose. Anyway, I'll try...

BTW: I forgot to mention where the idea came from; I'll add a link to the request thread right away.



ADDITION: Before I implement the suggestion to also add previous songs from the same group, can anyone please give an example of a case in which this would be useful.

Maybe it would make sense to make the script begin playing at the beginning of the group whenever one song would be played?

Now: if song 5 (of 1 to 9) is in the playlist and would start playback, now it adds songs 6 to 9 after it, and then plays these in ordered way. Once the last song (9) is played, the playlist returns to the previous state (e.g. shuffle or auto-dj, if there were active).

This new proposal would add 1 to 4 before, and 6 to 9 after track 5, and the playback would start from 1 and go continuously to 9, after that, the normal now playing behaviour continues.
Would you like this?
(this feature looks only useful to me if the playback starts from the first track (1), instead of continuing as it would, with track 5 (because the added songs 1 to 4 wouldn't be played otherwise).)

(Just to avoid me doing unnecessary things...)

Cheers
Steegy
Extensions: ExternalTools, ExtractFields, SongPreviewer, LinkedTracks, CleanImport, and some other scripts (Need Help with Addons > List of All Scripts).
trixmoto
Posts: 10024
Joined: Fri Aug 26, 2005 3:28 am
Location: Hull, UK
Contact:

Post by trixmoto »

I didn't realise methods for switching on/off shuffle were accessible already. Nice one! :)
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.
Guest

Post by Guest »

I'm confused.

i already did this with auto playlists?

i added some stuff in to the custom field i wanted it in.

on all the songs i wanted it in. then made the auto playlist look for that stuff in that field.

it gathers all the songs that have that stuff in the custom field?


why is there need for a script. i don't understand this need?

:-?

roving cowboy / keith hall
just riding the fence line again.
Guest

Post by Guest »

please disreguard my other post.

i have been reading and reading this.

i know now what this will be good at doing.

Example.

some one has a new computer that will not handle large files like one hour or longer concert wav files.

so instead of using the wav editor and putting all the wav's back together as one long wav file.

this script would allow all the files of concert sections to be played in order with out having to merge them back in to one file.

this is also handy for use with classical symphony's where they are broken in to segments and sometimes only one segment is recorded by one orchestra, in which you would need to gather all parts up from the different conductors so you could hear the complete symphony.

roving cowboy / keith hall
riding the fence line is tiresome and makes you not read things right the first time.
Steegy
Posts: 3452
Joined: Sat Nov 05, 2005 7:17 pm

Post by Steegy »

Indeed, please also read http://www.mediamonkey.com/forum/viewtopic.php?t=8404 if you want more information.
Extensions: ExternalTools, ExtractFields, SongPreviewer, LinkedTracks, CleanImport, and some other scripts (Need Help with Addons > List of All Scripts).
Just JP
Posts: 151
Joined: Sun Oct 01, 2006 6:53 pm
Location: New Jersey, USA

Post by Just JP »

As mentioned in another post, could this script be made MM3 compatible.

Jim
Image
Bex
Posts: 6316
Joined: Fri May 21, 2004 5:44 am
Location: Sweden

Post by Bex »

This should do it.
Replace line 96.
From:

Code: Select all

Set MySongs = SDB.Database.QuerySongs("AND Songs.Custom3='" & DoubleUpSingleQuotes(SDB.Player.CurrentSong.Custom3) & "' AND Songs.SongOrder >= " & SDB.Player.CurrentSong.TrackOrder & " ORDER BY Songs.SongOrder ASC")
To:

Code: Select all

Set MySongs = SDB.Database.QuerySongs("Songs.Custom3='" & DoubleUpSingleQuotes(SDB.Player.CurrentSong.Custom3) & "' AND Songs.TrackNumber  > '" & SDB.Player.CurrentSong.TrackOrderStr & "' ORDER BY Songs.TrackNumber ASC")
Not tested...
Advanced Duplicate Find & Fix Find More From Same - Custom Search. | Transfer PlayStat & Copy-Paste Tags/AlbumArt between any tracks.
Tagging Inconsistencies Do you think you have your tags in order? Think again...
Play History & Stats Node Like having your Last-FM account stored locally, but more advanced.
Case & Leading Zero Fixer Works on filenames too!

All My Scripts
Just JP
Posts: 151
Joined: Sun Oct 01, 2006 6:53 pm
Location: New Jersey, USA

Post by Just JP »

WOW, that was quick.

I'll have to give it a try and see what happens. Thanks.

Jim
Image
Dreadlau
Posts: 1967
Joined: Sun Nov 25, 2007 6:49 am

Post by Dreadlau »

MMMh I will have to try this when I get home :D
das Monkey
Posts: 70
Joined: Tue Feb 12, 2008 7:11 pm

Post by das Monkey »

It works. I made some modifications for me personally, namely a configuration screen where I can select which Custom field to use (in case 3 is used for something else) and enable/disable Crossfading between linked tracks. It's unlikely anyone would ever want linked tracks of this nature to Crossfade, so it seemed a logical addition.

One issue to consider: if you quit MediaMonkey before the last track in a group has been loaded, you'll lose your AutoDJ, Shuffle, and Repeat settings (and in my case, Crossfade). They're simple toggles, so it's not a big deal, but just be aware of that possibility.

Anyway, many thanks for the script, Steegy!

das
Just JP
Posts: 151
Joined: Sun Oct 01, 2006 6:53 pm
Location: New Jersey, USA

Post by Just JP »

I finally got around to installing the updated version of this script and it works perfectly.

Thanks to Steegy for writing the original script and to Bex for making it work in MM3.

Jim
Image
Dreadlau
Posts: 1967
Joined: Sun Nov 25, 2007 6:49 am

Post by Dreadlau »

@Das Monkey.

Care to share your mod? Would be apraciated.

Thanks
das Monkey
Posts: 70
Joined: Tue Feb 12, 2008 7:11 pm

Post by das Monkey »

I don't mind sharing my code, but all I did was plagiarize Steegy's original hard work and rename things more logically for my setup. Furthermore, I borrowed the config screen coordinates and translation code from something else in my scripts directory (I don't recall which script now). I hope it's not stepping on any toes to post it. The original work and inspiration are not mine, and all credit belongs to other people.

First, in /Scripts/Auto/ I created a file called LinkedTracks.vbs (I changed the name because it made more sense to me that way and I didn't want to confuse my code with the original):

Code: Select all

Sub OnStartUp
	Dim i : i = SDB.UI.AddOptionSheet("Linked Tracks", Script.ScriptPath, "InitSheet", "SaveSheet", -2)
End Sub

Sub InitSheet(Sheet)
	Dim UI : Set UI = SDB.UI
	Dim ini : Set ini = SDB.IniFile
	
  Dim Label1 : Set Label1 = UI.NewLabel(Sheet)
  Label1.Alignment = 1
  Label1.Autosize = False
  Label1.Common.SetRect 5,10,130,18
  Label1.Common.ControlName = "CustomLabel"
  Label1.Caption = Translate("Custom Field") & ":"
  
  Dim DropDown1 : Set DropDown1 = UI.NewDropDown(Sheet)
  DropDown1.Style = 2
  DropDown1.Common.SetRect 140,6,200,21
  DropDown1.Common.ControlName = "CustomField"
  DropDown1.AddItem(CustomField(1))
  DropDown1.AddItem(CustomField(2))
  DropDown1.AddItem(CustomField(3))
  DropDown1.AddItem(CustomField(4))
  DropDown1.AddItem(CustomField(5))
  DropDown1.ItemIndex = ini.IntValue("LinkedTracks", "CustomField")

  Dim Checkbox1 : Set Checkbox1 = UI.NewCheckbox(Sheet)
  Checkbox1.Common.SetRect 110,50,250,18
  Checkbox1.Common.ControlName = "DisableCrossFade"
  Checkbox1.Caption = "Disable Crossfade between linked tracks"
  Checkbox1.Checked = ini.BoolValue("LinkedTracks", "DisableCrossFade") 
End Sub

Sub SaveSheet(Sheet)
	Dim ini : Set ini = SDB.IniFile

  ini.IntValue("LinkedTracks", "CustomField") = Sheet.Common.ChildControl("CustomField").ItemIndex
  ini.BoolValue("LinkedTracks", "DisableCrossFade") = Sheet.Common.ChildControl("DisableCrossFade").Checked
End Sub

Function Translate(str)
  Translate = str
  Dim dic : Set dic = SDB.Objects("LyrDict")
  If Not (dic Is Nothing) Then
    If dic.Exists(str) Then
      Translate = dic.Item(str)
    End If
  End If
End Function

Function CustomField(i)
	CustomField = SDB.IniFile.StringValue("CustomFields","Fld" & i & "Name")
End Function
If you go to Tools/Options/Player/Linked Tracks, you can select which Custom Field. It should pull the names of the fields from Library/Appearance if you've changed them. There's also a simple checkbox for whether or not to disable crossfading. It defaults to false.

In Scripts.ini, I added this:

Code: Select all

[LinkedTracks]
FileName=LinkedTracks.vbs
ProcName=LinkTracks
Order=1
Language=VBScript
ScriptType=2
And in the main /Scripts/ directory, I created another file called LinkedTracks.vbs (yeah, I named it the same thing -- sorry, I guess that's confusing :) I wasn't expecting to share it.):

Code: Select all

Sub LinkTracks
	Dim ini : Set ini = SDB.IniFile

	Dim CustomField : CustomField = ini.IntValue("LinkedTracks", "CustomField")
	Dim CurrentCustom, NextCustom
	
	Select Case CustomField
		Case 0: CurrentCustom = SDB.Player.CurrentSong.Custom1
		Case 1:	CurrentCustom = SDB.Player.CurrentSong.Custom2
		Case 2:	CurrentCustom = SDB.Player.CurrentSong.Custom3
		Case 3: CurrentCustom = SDB.Player.CurrentSong.Custom4
		Case 4:	CurrentCustom = SDB.Player.CurrentSong.Custom5
	End Select	
	
	If SDB.Player.CurrentSongIndex + 1 < SDB.Player.PlaylistCount Then
		Select Case CustomField
			Case 0:	NextCustom = SDB.Player.PlaylistItems(SDB.Player.CurrentSongIndex + 1).Custom1
			Case 1:	NextCustom = SDB.Player.PlaylistItems(SDB.Player.CurrentSongIndex + 1).Custom2
			Case 2:	NextCustom = SDB.Player.PlaylistItems(SDB.Player.CurrentSongIndex + 1).Custom3
			Case 3:	NextCustom = SDB.Player.PlaylistItems(SDB.Player.CurrentSongIndex + 1).Custom4
			Case 4:	NextCustom = SDB.Player.PlaylistItems(SDB.Player.CurrentSongIndex + 1).Custom5
		End Select	
	End If

	If Left(CurrentCustom, 3) = "LT_" Then
    If Not SDB.IniFile.StringValue("Player", "saved_hasBeenSaved") = "True" Then
      SDB.IniFile.StringValue("Player", "saved_hasBeenSaved") = "True"
      SavePlayerStates
    End If

    If SDB.Player.CurrentSongIndex = SDB.Player.PlaylistCount - 1 Then
    'Last song in playlist
      PlayerStatesAsContinuous
      Call AddOtherTiedSongs(CurrentCustom)
    Else
      If NextCustom <> CurrentCustom Or SDB.Player.PlaylistItems(SDB.Player.CurrentSongIndex + 1).TrackOrder > CurrentCustom Then
      'Non-tied song comes after
	      Call AddOtherTiedSongs(CurrentCustom)
      Else
      'Tied song comes after
        PlayerStatesAsContinuous
      End If
    End If
  Else
    If SDB.IniFile.StringValue("Player", "saved_hasBeenSaved") = "True" Then
      SDB.IniFile.StringValue("Player", "saved_hasBeenSaved") = "False"
      RestoreSavedPlayerStates
    End If
  End If
End Sub

Sub AddOtherTiedSongs(CurrentCustom)
	Dim ini : Set ini = SDB.IniFile

  Dim IndexForAdding
  IndexForAdding = SDB.Player.CurrentSongIndex

  Dim MySongs
	Set MySongs = SDB.Database.QuerySongs("Songs.Custom" & CInt(ini.IntValue("LinkedTracks", "CustomField")) + 1 & "='" & DoubleUpSingleQuotes(CurrentCustom) & "' AND Songs.TrackNumber  > '" & SDB.Player.CurrentSong.TrackOrderStr & "' ORDER BY Songs.TrackNumber ASC")
  
  If MySongs.EOF Then
    RestoreSavedPlayerStates
  End If

  Do While Not MySongs.EOF
    IndexForAdding = IndexForAdding + 1
    SDB.Player.PlaylistAddTrack MySongs.Item
    SDB.Player.PlaylistMoveTrack SDB.Player.PlaylistCount - 1, IndexForAdding
    MySongs.Next
  Loop
End Sub

Sub RestoreSavedPlayerStates
  SDB.Player.isAutoDJ = StringToBool(SDB.IniFile.StringValue("Player", "saved_isAutoDJ"))
  SDB.Player.isShuffle = StringToBool(SDB.IniFile.StringValue("Player", "saved_isShuffle"))
  SDB.Player.isRepeat = StringToBool(SDB.IniFile.StringValue("Player", "saved_isRepeat"))
  SDB.Player.isCrossfade = StringToBool(SDB.IniFile.StringValue("Player", "saved_isCrossfade"))

	SDB.IniFile.StringValue("Player", "saved_hasBeenSaved") = "False"
End Sub

Sub PlayerStatesAsContinuous
	Dim ini : Set ini = SDB.IniFile

	Dim DisableCrossFade : DisableCrossFade = ini.BoolValue("LinkedTracks", "DisableCrossFade")

  SDB.Player.isAutoDJ = False
  SDB.Player.isShuffle = False
  SDB.Player.isRepeat = False
	If DisableCrossFade Then
  	SDB.Player.isCrossfade = False
  End If
End Sub

Sub SavePlayerStates
  SDB.IniFile.StringValue("Player", "saved_isAutoDJ") = SDB.Player.isAutoDJ
  SDB.IniFile.StringValue("Player", "saved_isShuffle") = SDB.Player.isShuffle
  SDB.IniFile.StringValue("Player", "saved_isRepeat") = SDB.Player.isRepeat
  SDB.IniFile.StringValue("Player", "saved_isCrossfade") = SDB.Player.isCrossfade
End Sub

Function StringToBool(InpuString)
  If InpuString = "True" Then
    StringToBool = True
  Else
    StringToBool = False
  End If
End Function

Function DoubleUpSingleQuotes(strInput)
    DoubleUpSingleQuotes = Replace(strInput, "'", "''")
End Function
I changed the "TG" prefix to "LT_", again to avoid potential confusion.

99% of this code is the work of others. I just tweaked it around to fit my needs.

das
Post Reply