erland wrote:
> How do you integrate ?
> I you integrate by implementing getNextDynamicPlayListTracks I guess you
> are aware that you need to return an array of Slim::Schema::Track
> objects and not the string with the sql statement. You need to execute
> the sql yourself and execute each sql statement separately, you can
> probably steal some code from SQL Playlist plugin function
> executeSQLForPlaylist:
> https://github.com/erland/lms-sqlplaylist/blob/5955592540b5c157518edf61a731b5ca484c8813/src/Plugin.pm#L1052
> It splits the statement string into separate statements, one per row,
> and execute the statements and lookup Slim::Schema::Track objects by
> calling the getTracksForResult function also included in SQL Playlist
> code. You can probably remove a large part of the code since you
> probably don’t need to cover all variants SQL Playlist supports.
>
> If you don’t want to execute the sql yourself you should instead
> integrate with SQL Playlist plugin. I think SQL playlist separate
> statements by new line character so you can’t write a statement on
> multiple rows as you did in your forum post.
>
> The free form query in Database Query only supports a single statement
> if I remember correctly so that’s probably the reason that doesn't
> work.
I have no problem with executing the sql in RL, gives me greater
control.
Here's the -entire- function so far that gets me zero tracks for
playlist *2* (DPL in LMS webUI sometimes even complains about "no
songs") :
Code:
--------------------
sub getNextDynamicPlayListTracks {
my ($client,$playlist,$limit,$offset,$parameters) = @_;
my $clientID = $client->id;
my $DPLid = @$playlist{dynamicplaylistid};
my @result = ();
my ($items, $sql, $sth, $track);
my $dbh = getCurrentDBH();
# Playlist1: "Rated"
if ($DPLid eq 'ratingslight_rated') {
$sql = "select tracks.url from tracks
join tracks_persistent on
tracks.url=tracks_persistent.url and tracks_persistent.rating > 0
left join comments as excludecomments on
tracks.id=excludecomments.track and excludecomments.value like
'%%never%%'
left join dynamicplaylist_history on
tracks.id=dynamicplaylist_history.id and
dynamicplaylist_history.client='$clientID'
where
audio=1
and dynamicplaylist_history.id is null
and excludecomments.id is null
and tracks.secs>90
and not exists (select * from tracks t2,genre_track,genres
where
t2.id=tracks.id and
tracks.id=genre_track.track and
genre_track.genre=genres.id and
genres.name in
('Classical','Classical - Opera'))
group by tracks.id
order by random()
limit $limit;";
}
# Playlist2: "Rated with top percentage"
if ($DPLid eq 'ratingslight_rated-with_top_percentage') {
my $percentagerated = $parameters->{1}->{'value'};
$sql = "DROP TABLE IF EXISTS randomweightedratingshigh;
DROP TABLE IF EXISTS randomweightedratingslow;
DROP TABLE IF EXISTS randomweightedratingscombined;
create temporary table randomweightedratingslow as select tracks.url as url
from tracks
join tracks_persistent on
tracks.url=tracks_persistent.url and tracks_persistent.rating
<= 49
left join comments as excludecomments on
tracks.id=excludecomments.track and excludecomments.value like
'%%never%%'
left join dynamicplaylist_history on
tracks.id=dynamicplaylist_history.id and
dynamicplaylist_history.client='$clientID'
where
audio=1
and excludecomments.id is null
and tracks.secs>90
and dynamicplaylist_history.id is null
and not exists (select * from tracks t2,genre_track,genres
where
t2.id=tracks.id and
tracks.id=genre_track.track and
genre_track.genre=genres.id and
genres.name in
('Classical','Classical - Opera'))
order by random()
limit (100-$percentagerated);
create temporary table randomweightedratingshigh as select tracks.url as url
from tracks
join tracks_persistent on
tracks.url=tracks_persistent.url and tracks_persistent.rating >
49
left join comments as excludecomments on
tracks.id=excludecomments.track and excludecomments.value like
'%%never%%'
left join dynamicplaylist_history on
tracks.id=dynamicplaylist_history.id and
dynamicplaylist_history.client='$clientID'
where
audio=1
and excludecomments.id is null
and tracks.secs>90
and dynamicplaylist_history.id is null
and not exists (select * from tracks t2,genre_track,genres
where
t2.id=tracks.id and
tracks.id=genre_track.track and
genre_track.genre=genres.id and
genres.name in
('Classical','Classical - Opera'))
order by random()
limit $percentagerated;
create temporary table randomweightedratingscombined as
SELECT * FROM randomweightedratingslow
UNION
SELECT * from randomweightedratingshigh;
SELECT * from randomweightedratingscombined
ORDER BY random()
limit $limit;
DROP TABLE randomweightedratingshigh;
DROP TABLE randomweightedratingslow;
DROP TABLE randomweightedratingscombined;
";
}
$sth = $dbh->prepare($sql);
$sth->execute();
my $trackURL;
$sth->bind_col(1,\$trackURL);
my @trackURLs = ();
while( $sth->fetch()) {
$track =
Slim::Schema->resultset("Track")->objectForUrl($trackURL);
push @result,$track;
}
$sth->finish();
return \@result;
}
--------------------
It's based on 'this SQLplaylist'
(https://github.com/AF-1/lms-misc/blob/main/Rating%20playlist%20definitions/RATED__2-with_TOP_PERCENTAGE.sql.xml).
If I work this out I want to do 'the others'
(https://github.com/AF-1/lms-misc/tree/main/Rating%20playlist%20definitions)
as well.
What I can't understand is why DynamicPlaylist is fine with a custom sql
playlist definition when it comes via SQLplaylist but not when it's
supplied by my plugin. I must have made a mistake somewhere, maybe in
the bind_col? Or some syntax stuff?
As I said, playlist1 ("Rated") works just fine.
P.S. I had looked at the very TS code you've referenced - and wonderd
exactly the same thing, if there's another option besides subscribing. I
posted a question in dev forum, maybe somebody there knows something
about this...
------------------------------------------------------------------------
afriend's Profile: http://forums.slimdevices.com/member.php?userid=39306
View this thread: http://forums.slimdevices.com/showthread.php?t=113344
_______________________________________________
plugins mailing list
[email protected]
http://lists.slimdevices.com/mailman/listinfo/plugins