Artiesten scheiden

Voor vragen over Playlist Automation Language.
Plaats reactie
renem
**
Berichten: 28
Lid geworden op: 09 jan 2018, 07:33
SAM-versie: 4.9.0.*
Database: MySQL 5.6
Windows: 7 32-bits

Artiesten scheiden

Ongelezen bericht door renem » 11 feb 2018, 15:36

Is er een mogelijkheid om artiesten te scheiden? Ik ben me bewust dat deze vraag behoorlijk onduidelijk duidelijk is, daarom een voorbeeld:

Michael Jackson & Paul McCartney - Say Say Say

Sam Broadcaster ziet dit als de artiest Michael Jackson & Paul McCartney. waardoor de volgende plaat zomaar van Michael Jackson kan zijn of van Paul McCartney terwijl ik heb ingesteld bij Playlist Rotation Rules: Do Not Play Same Artist Within 480 minutes. Ik heb de scheiding tussen de artiesten bij al mijn mp3's door een & teken ingesteld. Na het draaien van bovenstaande plaat zou Sam moeten weten dat ik zojuist Michael Jackson en ook Paul McCartney heb gedraaid en mag beide artiesten 480 minuten niet meer draaien.

Dit zou eigenlijk een standaard Sam instelling moeten zijn maar die is er, voor zover ik kan zien, niet. Vooral de laatste jaren zijn dit soort samenwerkingen enorm toegenomen, denk bv aan David Guetta die bij iedere plaat met een andere artiest samenwerkt. Daarom vraag ik mij af of dit te bereiken is met een Pal script?

Gebruikersavatar
drOhimself
Moderator
Berichten: 2940
Lid geworden op: 27 mar 2010, 11:44
SAM-versie: SAM 2014.7
Database: MySQL 5.0
Windows: 2000

Re: Artiesten scheiden

Ongelezen bericht door drOhimself » 12 feb 2018, 22:00

Je kunt e.e.a. wel een beetje voorkomen door de artiest altijd maar één persoon te laten zijn.
En dan in de track titel de naam van de samenwerker te vermelden.
Dus in bovenstaand geval zou het dan worden : Michael Jackson - Say say say (ft. Paul McCartney).
Natuurlijk niet de meest elegante methode, maar wel de effectiefste !
Een nummer van Michael J. wordt dan voorlopig niet gedraaid.



Verzonden vanaf mijn iPhone met Tapatalk
Groedjez,
drO

renem
**
Berichten: 28
Lid geworden op: 09 jan 2018, 07:33
SAM-versie: 4.9.0.*
Database: MySQL 5.6
Windows: 7 32-bits

Re: Artiesten scheiden

Ongelezen bericht door renem » 12 feb 2018, 23:07

Dat zou inderdaad kunnen, maar in het tempo waarin ik werk ben ik daar wel weer een paar jaar mee bezig voordat ik alle 50000 nummers heb aangepast haha en heel erg effectief is het ook niet, je beperkt er weliswaar mee dat Michael Jackson dubbelop gedraaid wordt maar je hebt natuurlijk nog steeds kans dat Paul McCartney dubbel gedraaid wordt.

Gebruikersavatar
Wout
Moderator
Berichten: 3217
Lid geworden op: 03 dec 2007, 14:17
SAM-versie: SAM 2018.10
Database: MySQL 8.0
Windows: Windows 10
Locatie: Bergen op Zoom
Contacteer:

Re: Artiesten scheiden

Ongelezen bericht door Wout » 13 feb 2018, 16:32

Ik heb ooit voor de database een opzetje gemaakt. Dit kan ook als PAL-script worden toegepast. Althans dit zal wel wat tijd kosten. :D
database/informatie-van-database-t5016-20.html#p35568
Afbeelding

renem
**
Berichten: 28
Lid geworden op: 09 jan 2018, 07:33
SAM-versie: 4.9.0.*
Database: MySQL 5.6
Windows: 7 32-bits

Re: Artiesten scheiden

Ongelezen bericht door renem » 13 feb 2018, 18:49

Dat is inderdaad precies wat ik bedoel. Ik zie al wel dat het & teken ook problemen veroorzaakt, zoals bv Kool & The Gang. Maar is het dan mogelijk om SAM te laten kijken naar de resultaten van deze query als deze een nieuwe track gaat zoeken? En hij zal niet alleen artist1 en artist2 moeten vinden maar ook 3, 4, 5 enz. Ik heb bv ook: Dimitri Vegas & Like Mike & Quintino & Boef & Ronnie Flex & Ali B & I Am Aisha - Slow down.mp3 :(

Gebruikersavatar
drOhimself
Moderator
Berichten: 2940
Lid geworden op: 27 mar 2010, 11:44
SAM-versie: SAM 2014.7
Database: MySQL 5.0
Windows: 2000

Re: Artiesten scheiden

Ongelezen bericht door drOhimself » 14 feb 2018, 23:58

Als je dat soort nummers al gaat toevoegen aan je SAM, is natuurlijk het einde zoek !!


Verzonden vanaf mijn iPhone met Tapatalk
Groedjez,
drO

renem
**
Berichten: 28
Lid geworden op: 09 jan 2018, 07:33
SAM-versie: 4.9.0.*
Database: MySQL 5.6
Windows: 7 32-bits

Re: Artiesten scheiden

Ongelezen bericht door renem » 15 feb 2018, 22:35

drOhimself schreef:Als je dat soort nummers al gaat toevoegen aan je SAM, is natuurlijk het einde zoek !! AfbeeldingAfbeeldingAfbeeldingAfbeeldingAfbeelding


Verzonden vanaf mijn iPhone met Tapatalk
Hahaha, ben ik best wel met je eens, maar die verdwijnen weer heel snel hoor. Zolang het top40 hits zijn staan ze erin bij mij, daarna verban ik ze. :-D

Gebruikersavatar
drOhimself
Moderator
Berichten: 2940
Lid geworden op: 27 mar 2010, 11:44
SAM-versie: SAM 2014.7
Database: MySQL 5.0
Windows: 2000

Re: Artiesten scheiden

Ongelezen bericht door drOhimself » 15 feb 2018, 23:19




Verzonden vanaf mijn iPhone met Tapatalk
Groedjez,
drO

renem
**
Berichten: 28
Lid geworden op: 09 jan 2018, 07:33
SAM-versie: 4.9.0.*
Database: MySQL 5.6
Windows: 7 32-bits

Re: Artiesten scheiden

Ongelezen bericht door renem » 07 mei 2018, 00:18

Ik ben er nu bijna uit maar zit nog met het laatste deel, hopelijk kan iemand op dit forum me hiermee helpen. Ik denk dat meer mensen dit script handig zullen vinden.

Ik heb de code her en der vandaan geplukt, ik snap zelf niet zoveel van PAL, zou zomaar kunnen dat het veel makkelijker kan. Dit is de code die ik tot nu toe heb:

Code: Selecteer alles

PAL.Loop := True;
const arrayNum = 10; // Max Number of items in ALL Arrays in Script
const EOF = '[EOF]'; // Tells us that there is no more in Array (A Unique String)
const sepLines = '& '; // Delimiter to Separate Record Lines
var aArray : Array[0..arrayNum] of String; //Arrays for Records & Ads
var Song : TSongInfo;
Song := ActivePlayer.GetSongInfo;
cnt : Integer = 0;
FUNCTION explode(text,delimiter : String) : Array[0..arrayNum] of String; forward;

if Song = nil then
   WriteLn('No Song Loaded!')
else

aArray := explode(Song['artist'],seplines);

PAL.WaitForPlayCount(1);

//
//  EXPLODE to ARRAY
//
FUNCTION explode(text,delimiter : String) : Array[0..arrayNum] of String;
  BEGIN
    var x : Integer = 0; //current character position
    var y : Integer = 0; //counting for array
    var yArray : Array[0..arrayNum] of String;   

    while text <> '' do
      BEGIN
        var strTmp : String = text;
        x := Pos(delimiter,text);
        if  x > 0 then
          BEGIN
            Delete (strTmp, x, Length (strTmp));
            Delete (text, 1, x);
          END
        else
          BEGIN
            strTmp := text;
            text := '';
          END;
        yArray[y] := strTmp;
        WriteLn('Field #'+IntToStr(y)+': '+Trim(yArray[y]));
***        cnt := ExecSQL('UPDATE songlist SET `date_artist_played` = CURRENT_TIME() WHERE `artist` = "Veronica";', []);
        WriteLn(IntToStr(cnt)+' records were updated');
        y := y + 1;
      END;
    if y <=   arrayNum then yArray[y] := EOF;
    result := yArray;
  END;
Op de regel waar de 3 *** staan moet deze sqlquery:

Code: Selecteer alles

UPDATE songlist SET date_artist_played = "huidige datum/tijd" WHERE `artist` = 'Michael Jackson' OR `artist` LIKE '%& Michael Jackson' OR `artist` LIKE 'Michael Jackson &%'
Michael Jackson moet uiteraard vervangen worden door het resultaat yArray[y]

Ik blijf maar de melding 'Error: invalid variant operation' krijgen, niet als ik de code compile, dan lijkt nl alles goed. Pas nadat de code gerunt wordt.

renem
**
Berichten: 28
Lid geworden op: 09 jan 2018, 07:33
SAM-versie: 4.9.0.*
Database: MySQL 5.6
Windows: 7 32-bits

Re: Artiesten scheiden

Ongelezen bericht door renem » 12 mei 2018, 08:59

Ik ben er uit! [smilie=yes2.gif] En het werkt perfect! Je moet hiervoor dus wel een zelfde scheidingsteken hebben tussen de verschillende artiesten bij alle mp3's die je gebruikt. Ik heb gelukkig overal een & teken gebruikt, maar als je bv ft of AND gebruikt kun je dat aanpassen in het script bij 'sepLines'.

Nogmaals, ik snap nog steeds erg weinig van Pal en het grootste gedeelte van het script heb ik van het forum van Spacialaudio geplukt maar ik begrijp de details nog niet echt. Het zou zomaar kunnen dat er nog heel wat code weggelaten kan worden uit het script, maar het werkt en daar gaat het om.
Dit is hem:

Code: Selecteer alles

PAL.Loop := True;
Pal.LockExecution; // Speed some things up
const arrayNum = 10; // Max Number of items in ALL Arrays in Script
const EOF = '[EOF]'; // Tells us that there is no more in Array (A Unique String)
const sepLines = '&'; // Delimiter to Separate Record Lines
//var aArray : Array[0..arrayNum] of String; //Arrays for Records & Ads
var Song : TSongInfo;
var cnt : Integer = 0;
var x : Integer = 0; //current character position
var y : Integer = 0; //counting for array
var yArray : Array[0..arrayNum] of String;
var singer : String;
var result : Array[0..arrayNum] of String;

PAL.WaitForTime(T['+00:00:10']);

Song := ActivePlayer.GetSongInfo;

if Song = nil then
   WriteLn('No Song Loaded!')
else
If (Song['songtype'] = 'S') then
     singer := Song['artist'];
    //aArray := explode(Song['artist'],seplines);
    while singer <> '' do
      BEGIN
        var strTmp : String = singer;
        x := Pos(sepLines,singer);
        if  x > 0 then
          BEGIN
            Delete (strTmp, x, Length (strTmp));
            Delete (singer, 1, x);
          END
        else
          BEGIN
            strTmp := singer;
            singer := '';
          END;
        yArray[y] := strTmp;
        WriteLn('Field #'+IntToStr(y)+': '+Trim(yArray[y]));
      		cnt := ExecSQL('UPDATE songlist SET date_artist_played = :DatePlayed WHERE artist = :artist OR artist LIKE :artist1 OR artist LIKE :artist2', [Now,Trim(yArray[y]),'%'+sepLines+' '+Trim(yArray[y]),Trim(yArray[y])+' '+sepLines+'%']);
		      WriteLn(IntToStr(cnt)+' records were updated');
        y := y + 1;
      END;
    if y <=   arrayNum then yArray[y] := EOF;
    result := yArray;
	
Pal.UnLockExecution; //Slow some things down
PAL.WaitForPlayCount(1);
En hier zie je het in actie:
Afbeelding

Ik ben blij! [smilie=yahoo.gif]

Gebruikersavatar
Wout
Moderator
Berichten: 3217
Lid geworden op: 03 dec 2007, 14:17
SAM-versie: SAM 2018.10
Database: MySQL 8.0
Windows: Windows 10
Locatie: Bergen op Zoom
Contacteer:

Re: Artiesten scheiden

Ongelezen bericht door Wout » 13 mei 2018, 07:39

Netjes en bedankt voor het delen ervan. Er zullen nu en in de toekomst mensen blij zijn met je code. [smilie=good.gif]
Afbeelding

renem
**
Berichten: 28
Lid geworden op: 09 jan 2018, 07:33
SAM-versie: 4.9.0.*
Database: MySQL 5.6
Windows: 7 32-bits

Re: Artiesten scheiden

Ongelezen bericht door renem » 13 mei 2018, 10:08

Ik heb alweer een bug gevonden. Als er 3 of meer artiesten aan een nummer meedoen dan werden alleen de eerste en laatste gevonden. Ik heb het script nu aangepast zodat ook de middelste(n) wordt gevonden:

Code: Selecteer alles

PAL.Loop := True;
Pal.LockExecution; // Speed some things up
const arrayNum = 10; // Max Number of items in ALL Arrays in Script
const EOF = '[EOF]'; // Tells us that there is no more in Array (A Unique String)
const sepLines = '&'; // Delimiter to Separate Record Lines
//var aArray : Array[0..arrayNum] of String; //Arrays for Records & Ads
var Song : TSongInfo;
var cnt : Integer = 0;
var x : Integer = 0; //current character position
var y : Integer = 0; //counting for array
var yArray : Array[0..arrayNum] of String;
var singer : String;
var result : Array[0..arrayNum] of String;

PAL.WaitForTime(T['+00:00:10']);

Song := ActivePlayer.GetSongInfo;

if Song = nil then
   WriteLn('No Song Loaded!')
else
If (Song['songtype'] = 'S') then
     singer := Song['artist'];
    //aArray := explode(Song['artist'],seplines);
    while singer <> '' do
      BEGIN
        var strTmp : String = singer;
        x := Pos(sepLines,singer);
        if  x > 0 then
          BEGIN
            Delete (strTmp, x, Length (strTmp));
            Delete (singer, 1, x);
          END
        else
          BEGIN
            strTmp := singer;
            singer := '';
          END;
        yArray[y] := strTmp;
        WriteLn('Field #'+IntToStr(y)+': '+Trim(yArray[y]));
      		cnt := ExecSQL('UPDATE songlist SET date_artist_played = :DatePlayed WHERE artist = :artist OR artist LIKE :artist1 OR artist LIKE :artist2 OR artist LIKE :artist3', [Now,Trim(yArray[y]),'%'+sepLines+' '+Trim(yArray[y]),Trim(yArray[y])+' '+sepLines+'%','%'+sepLines+' '+Trim(yArray[y])+' '+sepLines+'%']);
		      WriteLn(IntToStr(cnt)+' records were updated');
        y := y + 1;
      END;
    if y <=   arrayNum then yArray[y] := EOF;
    result := yArray;
	
Pal.UnLockExecution; //Slow some things down
PAL.WaitForPlayCount(1);

Gebruikersavatar
drOhimself
Moderator
Berichten: 2940
Lid geworden op: 27 mar 2010, 11:44
SAM-versie: SAM 2014.7
Database: MySQL 5.0
Windows: 2000

Re: Artiesten scheiden

Ongelezen bericht door drOhimself » 13 mei 2018, 18:04

Goed bezig !
Groedjez,
drO

renem
**
Berichten: 28
Lid geworden op: 09 jan 2018, 07:33
SAM-versie: 4.9.0.*
Database: MySQL 5.6
Windows: 7 32-bits

Re: Artiesten scheiden

Ongelezen bericht door renem » 19 mei 2018, 23:18

Ik heb het script verder bestudeerd en ik denk dat ik nu precies weet hoe het werkt. Daarom heb ik nog wat verbeteringen aangebracht en ik denk dat het nu wel helemaal klaar is (Er zaten nog een paar kleine bugs in, die er nu hopelijk helemaal uit zijn):

Code: Selecteer alles

PAL.Loop := True;

var Song : TSongInfo;

PAL.WaitForTime(T['+00:00:05']); // To prevent the script runs to often when no item of the S songtype is played

Song := ActivePlayer.GetSongInfo;

if Song = nil then
   WriteLn('No Song Loaded!')
else
If (Song['songtype'] = 'S') then // The script works only with songtype S but you can add more types
BEGIN
    Pal.LockExecution; // Speed some things up
    const arrayNum = 10; // Max Number of artists
    const sepLines = '&'; // Delimiter to Separate Artists, change this to the delimiter you use (like ft or AND or , etc) you cn only use 1 delimiter
    var cnt : Integer = 0;
    var x : Integer = 0; // current character position
    var y : Integer = 0; // counting for array
    var yArray : Array[0..arrayNum] of String;
    var singer : String;

    singer := Song['artist'];
    while singer <> '' do
      BEGIN
        var strTmp : String = singer;
        x := Pos(sepLines,singer);
        if  x > 0 then
          BEGIN
            Delete (strTmp, x, Length (strTmp));
            Delete (singer, 1, x);
          END
        else
          BEGIN
            strTmp := singer;
            singer := '';
          END;
        yArray[y] := strTmp;
        //WriteLn('Field #'+IntToStr(y)+': '+Trim(yArray[y])); // Uncomment this line to see what is happening in the Output Window
      		cnt := ExecSQL('UPDATE songlist SET date_artist_played = :DatePlayed WHERE artist = :artist OR artist LIKE :artist1 OR artist LIKE :artist2 OR artist LIKE :artist3', [Now,Trim(yArray[y]),'%'+sepLines+' '+Trim(yArray[y]),Trim(yArray[y])+' '+sepLines+'%','%'+sepLines+' '+Trim(yArray[y])+' '+sepLines+'%']);
		      //WriteLn(IntToStr(cnt)+' records were updated'); // Uncomment this line to see what is happening in the Output Window
        y := y + 1;
      END;
   Pal.UnLockExecution; // Slow some things down
   PAL.WaitForPlayCount(1);
END;	

Maar mocht ik nog nieuwe bugs of verbeteringen vinden dan zet ik de code uiteraard hier weer neer!

Plaats reactie
  • Vergelijkbare Onderwerpen
    Reacties
    Weergaves
    Laatste bericht