SELECT opdracht combineren

Voor vragen over Playlist Automation Language.
Plaats reactie
drOhimself

SELECT opdracht combineren

Ongelezen bericht door drOhimself »

Ja, de doctor weet ook niet alles......
Hier is het vraagstuk (probleem is een groot woord) :

1. PAL wordt gebruikt om songs te selecteren die voldoen aan bepaalde duur (lengte van song).
2. De songs moeten daarnaast ook nog voldoen aan een bepaald CategoryID. (bijv: DanceClassics / 80s / Rock)

Het eerste stuk is opgelost, die PAL is er en werkt goed, echter worden ALLE beschikbare songs bekeken op duur.
In dat gedeelte wordt gebruikt gemaakt van de Tabel 'songlist' uit de SAMDB.
Uit die Tabel worden de volgende velden gebruikt : ID, filename, duration, artist, title.

Van de Tabel 'categorylist' worden de velden : ID, SongID en CategoryID gebruikt.

U begrijpt het al: er moet een link komen tussen de tabel 'songlist' en 'categorylist'.
Want we willen alleen op duur (lengte) geselecteerde songs hebben die voldoen aan een bepaald categoryID.
(Onderaan zal ik de huidige complete PAL zetten.)

Nog wat uitleg:
Nadat er berekend is hoe lang de song mag duren (met een uitloop van een paar seconden), wordt de eerste selectie uitgevoerd met:

Code: Selecteer alles

var D : TDataSet;
D := QUERY('SELECT Songlist.id,Songlist.Filename,Songlist.Duration,Songlist.Artist,Songlist.Title ' +
'FROM songlist ' +
'WHERE Duration >= '+InttoStr(RestTijd) + ' ' +
'AND Duration <= '+InttoStr(RestTijd+5000) ,[],True);
Om de category te bepalen, doen we het volgende:

Code: Selecteer alles

var categoryName : String = '70s';
var categoryData : TDataSet = Query('SELECT id FROM category WHERE name = ' + QuotedStr(categoryName),[], true);
WriteLn('Found ID: ' + IntToStr(categoryData['id']));
Dus we zoeken naar iets wat lijkt op deze regel :

Code: Selecteer alles

'WHERE songlist.id = categorylist.songid and categorylist.categoryid = ' + IntToStr(categoryData['id']) + ' ' +
echter als ik die in de QUERY SELECT regel stop, dan krijgen we MySQL foutmeldingen.

De gebruikte SAM is 4.9.x en MySQL 5.1 (maar versie zou niet uit moeten maken).
Tijdstip waarop de PAL moet starten is xx:55:00.
Hieronder de PAL welke momenteel werkt, maar welke dus nog niet goed is :

Code: Selecteer alles

//PAL.Loop:=True;
PAL.LockExecution;
PAL.WaitForTime(T['xx:55:00']);

//variabele voor huidige tijd
var H_uur,H_min,H_sec,H_msec: INteger;
//variabele voor RestTijd;
var RestTijd: Integer;
//variabele voor de tijd waarop opvulmuziek gestart moet worden
var StartTijd: String;
//variabele voor huidige tijd in mseconden
var Nu : Integer;
//variabel voor aantal songs in selectiequery
var AantalSongs : Integer;
//variabele voor query
var D, QInfo : TDataSet;
Randomize;
var myRandomNumber : Integer;
var categoryName : String = '70s';

//bereken de huidige tijd in milliseconden
DecodeTime(Now,H_uur,H_min,H_sec,H_msec);
Nu:= (H_uur*3600000) + (H_min*60000) + (H_sec*1000);

//Resterende tijd tot aan het volgende hele uur berekenen
RestTijd := ((H_uur+1)*3600000) - (nu + Activeplayer.duration - activeplayer.curtime);

//Vind de CatID van variable 'categoryName'
var categoryData : TDataSet = Query('SELECT id FROM category WHERE name = ' + QuotedStr(categoryName),[], true);
WriteLn('Found CatID: ' + IntToStr(categoryData['id']));

////////////selecteer passende song
//omdat de tijd in milliseconden staat, is de kans dat een nummer met exact dezelfde tijd aanwezig is verwaarloosbaar.
//daarom een marge van 10 seconden boven de minimale tijd ingebouwd in de selectievoorwaarde
//ook vanwege eventueel korter draaien van nummers door crossfade instellingen
D := QUERY('SELECT Songlist.id,Songlist.Filename,Songlist.Duration,Songlist.Artist,Songlist.Title ' +
'FROM songlist ' +
'WHERE Duration >= '+InttoStr(RestTijd) + ' ' +
'AND Duration <= '+InttoStr(RestTijd+5000) ,[],True);

//ga naar begin van de selectie
D.First;

//bereken het aantal tracs in de query
while not D.EOF do
begin
 	AantalSongs := AantalSongs +1;
    D.next;
end;
WriteLn('Songs found: '+IntToStr(AantalSongs));
//genereer een random getal, dit getal wordt gebruikt om een wilekeurige track uit de slectie te selecteren
//PAL.UnLockExecution;
myRandomNumber:=(RandomInt(AantalSongs) );
WriteLn('Random nr: '+IntToStr(myRandomNumber));WriteLn('Duration: '+IntToStr(RestTijd));

D.First;
//loop de selectiequery door totdat het juiste nummer gevonden is
AantalSongs:=0;
while not D.EOF do
begin
	AantalSongs := AantalSongs +1;
	Writeln (D['artist']+' - '+D['title'] );
	if AantalSongs = myRandomNumber  then
		//song is gevonden, plaats nu boven in de queue
		begin
			Writeln ('Artist: '+D['artist']+'  '+'Title: '+D['title' ] );
			Queue.AddFile(D['filename'],ipTop);
		end;
	D.Next;
end;
PAL.UnLockExecution;
De uitput in het PAL venster heb ik hier onder aangeplakt, dan krijg je een indruk wat er gebeurt.
(De dubbele songs rechts, zijn nummers die er dus meerdere keren in staan, in diverse categorien.)

Vragen ?
Je hebt niet voldoende permissies om de bijlagen van dit bericht te bekijken.
Gebruikersavatar
Wout
Beheerder
Berichten: 3501
Lid geworden op: 03 dec 2007, 14:17
SAM-versie: 2019.3
Database: MariaDB
Windows: 11
Locatie: West-Brabant
Contacteer:

Re: SELECT opdracht combineren

Ongelezen bericht door Wout »

Code: Selecteer alles

{     
    http://broadcasterforum.nl/viewtopic.php?f=8&p=25651#p25651
 
    Laat een plaat mooi uitspelen voor het nieuws!
    
    Op verzoek van Gerrie K, opzet van drOhimself
}

PAL.Loop := True ;

    // Begin het script op elk uur vanaf 5 voor het uur
    PAL.WaitForTime(T['XX:55:00']) ;    

    // Speed some things up
    PAL.LockExecution ;

        // Wat variabele instellen
        var ID, RestTijd : Integer ;
        var Now_minutes : String ;
        var C, D : TDataSet ;

        // Alleen de minuten van het uur
        Now_minutes := FormatDateTime('n', Now) ;

        // De aantal minuten afhalen van 1 uur en waar rekening is gehouden met de spelende nummer in miliseconden
        RestTijd := ( (60 - Now_minutes ) * 60000) - ( Activeplayer.Duration - ActivePlayer.CurTime ) ;    

        // Hier halen we alleen de Categorie-id (nummer) van de spelende nummer
        C := QUERY('SELECT ' +
                'songlist.date_played, songlist.songtype,songlist.ID, categorylist.categoryID, categorylist.songID ' +
            'FROM ' +
                'songlist ' +
            'INNER JOIN ' +
                'categorylist ' +
            'ON' +
                '(categorylist.songID = songlist.ID)' +                
            'WHERE ' +
                '(songlist.songtype = :songtype ) ' +
            'ORDER BY ' +
                'songlist.date_played ' +
            'DESC ' +
            'LIMIT 1 ', ['S'], True ) ;

        C.First ;

        while not C.EOF do
            begin
               ID := C['categoryID'] ;
               C.next ;
            end ;

        C.free ;

        // Hier zoek ie de nummer in de juiste categorie met de juiste lengte + een beetje meer
        D := QUERY('SELECT ' +
                'categorylist.songID, categorylist.categoryID, songlist.artist, songlist.filename, songlist.duration, songlist.ID ' +
            'FROM ' +
                'categorylist ' +
            'INNER JOIN ' +
                'songlist ' +
            'ON ' +
                '(songlist.ID = categorylist.songID) ' +
            'WHERE ' +
                'categoryID = :catID ' +
            'AND ' +
                'date_played <= DATE_SUB( NOW( ), INTERVAL 1 HOUR )' +  // Alleen nummers die al 1 uur niet zijn gespeeld              
            'AND '+
                'duration '+
            'BETWEEN '+
                ':RestTijd '+    
            'AND '+
                ':RestTijd + 9000 ' +    // Hier wat speling op de lengte van het gezochte nummer met 9 seconden
            'ORDER BY RAND() ' +    // Hij pakt een willekeurige nummer die voldoet aan de eisen
            'LIMIT 1', [ID, RestTijd], True ) ;

        D.First ;

        while not D.EOF do
            begin
                Queue.Addfile(+D['filename'], IpTop) ;            
                D.next ;
            end ;

        D.free ;

    // Slow some things down
    PAL.UnLockExecution ; 

// Broadcasterforum.nl, Drohimself, Gerrie K & Wout Franken, 19 oktober 2011  
Afbeelding
drOhimself

Re: SELECT opdracht combineren

Ongelezen bericht door drOhimself »

Perfect Wout !
Getest en helemaal goed bevonden, great job !
Ik denk dat nu iemand heel blij gaat worden.....
Gebruikersavatar
Gerrie K
VIP
Berichten: 492
Lid geworden op: 02 jan 2011, 23:41
SAM-versie: 2022.6
Database: MySQL
Windows: 10
Locatie: Strijen
Contacteer:

Re: SELECT opdracht combineren

Ongelezen bericht door Gerrie K »

drOhimself schreef:Perfect Wout !
Getest en helemaal goed bevonden, great job !
Ik denk dat nu iemand heel blij gaat worden.....

Ik wil eerst jullie bedanken voor jullie tijd en inzet om dit "probleempje" op te lossen/aan te pakken.
Ik stoor mij al hier al maanden aan,en zoals de Weekpal met het geimplementeerde stukje uurtimer PAL op dit moment op een testPC loopt is dit alleen maar hoopgevend........en tot nu toe is het Super.......
Dit PAL timed gewoon (nou ja ,gewoon [smilie=gamer2.gif] )naar het nieuws toe......en als in de Queue een nummer staat als laatste gepland,en het is lang genoeg,dan doe ie er niets mee.Dankzij Wout en Dr.O worden de uurtimer nummers uit de Cat gehaald die als laatste aangeroepen is.(als ik goed ben ingelicht)

Dit Weekpal zal een tijdje getest worden op een TestPC.
Als de test goed wordt doorstaan (en ik ben daar stellig van overtuigd) wordt de weekpal hier geplaatst, zodat iedereen
zijn voordeel ermee kan doen....

Dr.O en Wout nogmaals mijn dank voor jullie inzet en tijd.....Great Job,ja...

Keep you posted.(Binnen een week)
Gebruikersavatar
peellandfm
Moderator
Berichten: 1290
Lid geworden op: 27 feb 2006, 11:26
SAM-versie: 4.9.1.*
Database: MySQL
Windows: 10
Contacteer:

Re: SELECT opdracht combineren

Ongelezen bericht door peellandfm »

Mooi werk mannen.
Deze pak ik ook even mee.

Dank jullie wel.
Gebruikersavatar
Gerrie K
VIP
Berichten: 492
Lid geworden op: 02 jan 2011, 23:41
SAM-versie: 2022.6
Database: MySQL
Windows: 10
Locatie: Strijen
Contacteer:

Re: SELECT opdracht combineren

Ongelezen bericht door Gerrie K »

Keep you posted.(Binnen een week)
Effe een update:

Valt nog wel tegen om de juiste timing te vinden,er wordt hier gebruik gemaakt van diverse jingels voor en na het nieuws.
Die na het nieuws komen zijn het probleem niet,maar die voor het nieuws............,op 59:45 wordt er via PAL een Uursluiter gestart die tegen het nieuwsblok aanhangt met een speling(overlapping) van 3 sec.....In de oude situatie werkt dat altijd ongeacht wat er draait op dat moment.......Maar in de nieuwe situatie (met uurtimer) gaat dit niet op...
Ten eerste de track die in de Queue als uurvuller wordt gezet loopt door tot over het uur al zal ik deze zonder Fading en Gap-killer instellen....Maar ja,wie ben ik om dit zonder te doen.......En nu komt het: met Gap-killer en Cross-fading wordt het nummer zomaar 10 tot 15 sec korter........Bij een Cross-fade Point Triggering van -18DB is het bijv. 15sec en bij en Cross-Fade triggering van -10db zelfs 20sec.....Begrijpelijk want het nummer wordt korter.
De Uurvuller houd hier géén rekening mee,want die gaat van de totaal tijd van de track uit.
Ook was/is het zo,als de laatste track een jingle is en die in de Queue staat en niet als ''J" (Jingle) in de tag staat aangegeven...maar als "S" (Normal Song).....werkt het niet,want een jingle van ruim 4 minuten....nee,dat is hier niet aanwezig.

Dankzij Dr.O konden we dit laatste ondervangen door een Regel in Wout z'n PAL.

'(songlist.songtype = :songtype ) ' +
'ORDER BY ' +
'songlist.date_played ' +
'DESC ' +
'LIMIT 1 ', ['S'], True ) ;

Dus de uursluiter werkt wel, maar het instellen ervan (de Momenten wanneer hij een track moet plaatsen,starten,vullen tot 59:45)is toch wat listiger dan wat ik denk.......
Mochten mij 2 medestrijders nog wat ideeen hebben dan hoor en zie het graag.
Je hebt niet voldoende permissies om de bijlagen van dit bericht te bekijken.
drOhimself

Re: SELECT opdracht combineren

Ongelezen bericht door drOhimself »

Misschien dan ook nog deze er een beetje infrommelen ....?

Code: Selecteer alles

    PAL.Loop := True ;

        var uur : String ;

        uur := FormatDateTime('hh', Now) ;

        if (Now >= T[uur+':05:00']) and (Now <= T[uur+':55:00']) then
            begin
                CAT['Jingles (All)'].QueueBottom(smLemmingLogic, NoRules);
            end
        else
            begin
                 WriteLn('Geen Jingle') ;
            end ;
            
        PAL.WaitForPlayCount(3) ;
    // Wout Franken, Broadcasterforum.nl, 09-juni-2011      
Gebruikersavatar
Gerrie K
VIP
Berichten: 492
Lid geworden op: 02 jan 2011, 23:41
SAM-versie: 2022.6
Database: MySQL
Windows: 10
Locatie: Strijen
Contacteer:

Re: SELECT opdracht combineren

Ongelezen bericht door Gerrie K »

Hallo guys,

Tot mijn spijt moet ik mededelen dat ik na een weekje rommelen nog steeds niet een vergulde middenweg heeft gevonden.
Er is een regel in dit script (Wat door onze Wout is gemaakt)waar ik een beetje de timing kan regelen....

RestTijd := ( (60 - Now_minutes ) * 60000) - ( Activeplayer.Duration - ActivePlayer.CurTime ) ;

Maar,kan ik in deze regel een aanpassing maken dat hij de Fadetijd ook meeneemt in z'n Timing?
Ik weet, door het proberen de tijden van Fading en Gapkilling te veranderen,dat de timing dan anders wordt in de laatst geplaatste track (uurvuller).Zie hieronder:

RestTijd := ( (60 - Now_minutes ) * 60000) - ( Activeplayer.Duration - ActivePlayer.CurTime - 60000 ) ;

En ook:

RestTijd := ( (60 - Now_minutes ) * 60000) - ( Activeplayer.Duration) ;

Bij deze Bovenstaande aanpassing wordt dus de volledige Tracktijd in de Timing meegenomen,Alleen dan gaat de Uurvuller overslaan,Dus het niet uitvoeren van het script.


Als hij de FadeTime ook mee neemt in zijn timing naar het uur,dan zal het voor mijn makkelijker om de tijden aan te passen in de verschillende uren.....

Bijv: Elke dag om 23:57:13 wordt er een dagsluiter gestart vanuit het Weekpal script,dus het zal mooi wezen als hij de uurvuller in de buurt van die tijd laat komen.....(zie onder,stukje uit Weekpal)

PAL.UnLockExecution;
var QueueTimeNachtbraker : Integer = (60*60*1050);
PAL.WaitForTime(T['23:57:13']);
SaveStringToFile('C:\Tekst\CurrentProgram.txt','Nu: Jukebox NachtBraker');
Queue.AddFile('C:\Sound\Nachtbraker.mp3',ipTop);
ActivePlayer.FadeTonext;
Queue.Clear;
Queue.AddFile('C:\Nieuws\Radio Vredenburg - NieuwsLMN.mp3',ipBottom);
Cat['JinglesRV'].QueueBottom(smRandom, NoRules);

Nu heb ik de weekpal op orde........maar zal voor een safety de uurvuller in een aparte weekpal mee laten lopen,dus niet geintregeerd in de bestaande weekpal....

Graag jullie antwoord,op deze vraag.
Gr,en bijvoorbaat dank, Gerrie
Je hebt niet voldoende permissies om de bijlagen van dit bericht te bekijken.
Gebruikersavatar
Gerrie K
VIP
Berichten: 492
Lid geworden op: 02 jan 2011, 23:41
SAM-versie: 2022.6
Database: MySQL
Windows: 10
Locatie: Strijen
Contacteer:

Re: SELECT opdracht combineren

Ongelezen bericht door Gerrie K »

goedenavond,

Omdat er een uurvuller Topic aangemaakt is, wordt verdere berichtgeving daarop geplaatst.

Bij deze de link: http://www.broadcasterforum.nl/viewtopi ... =81&t=4062
Gebruikersavatar
qradio
****
Berichten: 99
Lid geworden op: 18 dec 2009, 21:07
SAM-versie: 2013.6
Database: MySQL
Windows: 10

Re: SELECT opdracht combineren

Ongelezen bericht door qradio »

Geweldig PAL script.

Ik draai het op een test pc. Helaas pakt het bij mij geen nummer uit de juiste CAT als ik b.v. 80s draai. Het pakt een willekurige plaat tot aan het nieuws komt.

De queue staat gevuld op dat moment met alleen maar 80s muziek. Moet toch goed zijn ?

Verder werkt het prima. Heel tevreden mee
Gebruikersavatar
qradio
****
Berichten: 99
Lid geworden op: 18 dec 2009, 21:07
SAM-versie: 2013.6
Database: MySQL
Windows: 10

Re: SELECT opdracht combineren

Ongelezen bericht door qradio »

Correctie, na een herstart van de Sam pc was alles in orde. Dus het klopt allemaal wel. Blijft vreemd. Maar het werkt (y)
sandeland

Re: De laatste plaat voor de uurwisssel..meedenkers gevraagd

Ongelezen bericht door sandeland »

hallo mede sam gebruikers, ik maak gebruik van dit script wat in de bijlage staat, alleen komt het bij mij geregeld voor dat hij 5 tot ongeveer 8 seconde voor het uur nog een nieuw nummer start voordat het nieuws op het hele uur gaat spelen, wat zou ik in dit script kunnen aanpassen om dit beter te laten werken?

mvg joeri
Je hebt niet voldoende permissies om de bijlagen van dit bericht te bekijken.
Laatst gewijzigd door Wout op 24 mar 2012, 23:29, 1 keer totaal gewijzigd.
Reden: In de juiste topic geplaatst.
drOhimself

Re: De laatste plaat voor de uurwisssel..meedenkers gevraagd

Ongelezen bericht door drOhimself »

In ons script is wel iets rekening gehouden met de fade tijden, maar misschien dat het nog wat scherper moet.
Pas regel 72 iets aan :

':RestTijd + 9000 ' + // Hier wat speling op de lengte van het gezochte nummer met 9 seconden

Verhoog die 9000 naar 15000 bijvoorbeeld.
Gebruikersavatar
Wout
Beheerder
Berichten: 3501
Lid geworden op: 03 dec 2007, 14:17
SAM-versie: 2019.3
Database: MariaDB
Windows: 11
Locatie: West-Brabant
Contacteer:

Re: De laatste plaat voor de uurwisssel..meedenkers gevraagd

Ongelezen bericht door Wout »

sandeland schreef:wat zou ik in dit script kunnen aanpassen om dit beter te laten werken?
Je kan beter de PAL-script pakken van onderstaande link.
viewtopic.php?f=81&t=4062#p25909
Afbeelding
Plaats reactie
  • Vergelijkbare Onderwerpen
    Reacties
    Weergaves
    Laatste bericht