Artiesten scheiden
- renem
- ****
- Berichten: 85
- Lid geworden op: 09 jan 2018, 07:33
- SAM-versie: 2021.2
- Database: MariaDB
- Windows: 10
- Locatie: Hilversum
Artiesten scheiden
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?
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?
-
drOhimself
Re: Artiesten scheiden
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
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
- renem
- ****
- Berichten: 85
- Lid geworden op: 09 jan 2018, 07:33
- SAM-versie: 2021.2
- Database: MariaDB
- Windows: 10
- Locatie: Hilversum
Re: Artiesten scheiden
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.
- Wout
- Beheerder
- Berichten: 3522
- Lid geworden op: 03 dec 2007, 14:17
- SAM-versie: 2019.3
- Database: MariaDB
- Windows: 11
- Locatie: West-Brabant
- Contacteer:
Re: Artiesten scheiden
Ik heb ooit voor de database een opzetje gemaakt. Dit kan ook als PAL-script worden toegepast. Althans dit zal wel wat tijd kosten.
database/informatie-van-database-t5016-20.html#p35568
database/informatie-van-database-t5016-20.html#p35568
- renem
- ****
- Berichten: 85
- Lid geworden op: 09 jan 2018, 07:33
- SAM-versie: 2021.2
- Database: MariaDB
- Windows: 10
- Locatie: Hilversum
Re: Artiesten scheiden
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 
-
drOhimself
Re: Artiesten scheiden
Als je dat soort nummers al gaat toevoegen aan je SAM, is natuurlijk het einde zoek !! 




Verzonden vanaf mijn iPhone met Tapatalk





Verzonden vanaf mijn iPhone met Tapatalk
- renem
- ****
- Berichten: 85
- Lid geworden op: 09 jan 2018, 07:33
- SAM-versie: 2021.2
- Database: MariaDB
- Windows: 10
- Locatie: Hilversum
Re: Artiesten scheiden
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.drOhimself schreef:Als je dat soort nummers al gaat toevoegen aan je SAM, is natuurlijk het einde zoek !!
Verzonden vanaf mijn iPhone met Tapatalk
- renem
- ****
- Berichten: 85
- Lid geworden op: 09 jan 2018, 07:33
- SAM-versie: 2021.2
- Database: MariaDB
- Windows: 10
- Locatie: Hilversum
Re: Artiesten scheiden
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:
Op de regel waar de 3 *** staan moet deze sqlquery:
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.
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;
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 &%'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: 85
- Lid geworden op: 09 jan 2018, 07:33
- SAM-versie: 2021.2
- Database: MariaDB
- Windows: 10
- Locatie: Hilversum
Re: Artiesten scheiden
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:
En hier zie je het in actie:

Ik ben blij! [smilie=yahoo.gif]
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);

Ik ben blij! [smilie=yahoo.gif]
- Wout
- Beheerder
- Berichten: 3522
- Lid geworden op: 03 dec 2007, 14:17
- SAM-versie: 2019.3
- Database: MariaDB
- Windows: 11
- Locatie: West-Brabant
- Contacteer:
Re: Artiesten scheiden
Netjes en bedankt voor het delen ervan. Er zullen nu en in de toekomst mensen blij zijn met je code. [smilie=good.gif]
- renem
- ****
- Berichten: 85
- Lid geworden op: 09 jan 2018, 07:33
- SAM-versie: 2021.2
- Database: MariaDB
- Windows: 10
- Locatie: Hilversum
Re: Artiesten scheiden
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);
- renem
- ****
- Berichten: 85
- Lid geworden op: 09 jan 2018, 07:33
- SAM-versie: 2021.2
- Database: MariaDB
- Windows: 10
- Locatie: Hilversum
Re: Artiesten scheiden
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):
Maar mocht ik nog nieuwe bugs of verbeteringen vinden dan zet ik de code uiteraard hier weer neer!
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;
-
- Vergelijkbare Onderwerpen
- Reacties
- Weergaves
- Laatste bericht


