Index: Queries.pm =================================================================== --- Queries.pm (revision 16973) +++ Queries.pm (working copy) @@ -350,7 +350,8 @@ # first PLAY ALL item if ($insertAll) { - ($chunkCount, $count) = _playAll(start => $start, end => $end, chunkCount => $chunkCount, listCount => $count, request => $request, loopname => $loopname, includeArt => 1); + $count = _fixCount($insertAll, \$index, \$quantity, $count); + $chunkCount = _playAll(start => $start, end => $end, chunkCount => $chunkCount, request => $request, loopname => $loopname, includeArt => 1); } @@ -530,7 +531,7 @@ } my $count = $rs->count; - my $totalCount = $count; + my $totalCount = $count || 0; # Various artist handling. Don't do if pref is off, or if we're # searching, or if we have a track @@ -543,25 +544,10 @@ $count_va = Slim::Schema->rs('Album')->search($where_va, $attr_va)->count; # fix the index and counts if we have to include VA - if ($count_va) { + $totalCount = _fixCount($count_va, \$index, \$quantity, $count); - $totalCount++; - - # return one less result as we've added the VA item in the first chunk - if (!$index) { - $quantity--; - } - - # decrease the index in subsequent queries - elsif ($index + $quantity >= $count) { - $index--; - $count_va = 0; - } - - else { - $count_va = 0; - } - } + # don't ad the VA item on subsequent queries + $count_va = ($count_va && !$index); } # now build the result @@ -641,7 +627,8 @@ # first PLAY ALL item if ($insertAll) { - ($chunkCount, $totalCount) = _playAll(start => $start, end => $end, chunkCount => $chunkCount, listCount => $totalCount, request => $request, loopname => $loopname); + $totalCount = _fixCount($insertAll, \$index, \$quantity, $count); + $chunkCount = _playAll(start => $start, end => $end, chunkCount => $chunkCount, request => $request, loopname => $loopname); } @@ -1160,7 +1147,8 @@ $request->addResult('offset', $start) if $menuMode; if ($insertAll) { - ($chunkCount, $count) = _playAll(start => $start, end => $end, listCount => $count, chunkCount => $chunkCount, request => $request, loopname => $loopname); + $count = _fixCount($insertAll, \$index, \$quantity, $count); + $chunkCount = _playAll(start => $start, end => $end, chunkCount => $chunkCount, request => $request, loopname => $loopname); } for my $eachitem ($rs->slice($start, $end)) { @@ -1440,7 +1428,9 @@ $request->addResult("rescan", 1); } - $count += 0; +$log->error($insertAll, ', ', $index, ', ', $quantity, ', ', $count); + my $totalCount = _fixCount($insertAll, \$index, \$quantity, $count); +$log->error($insertAll, ', ', $index, ', ', $quantity, ', ', $count); my ($valid, $start, $end) = $request->normalize(scalar($index), scalar($quantity), $count); @@ -1451,8 +1441,12 @@ $request->addResult('offset', $start) if $menuMode; if ($insertAll) { - ($chunkCount, $count) = _playAll(start => $start, end => $end, listCount => $count, chunkCount => $chunkCount, request => $request, loopname => $loopname); + + $totalCount = _fixCount($insertAll, \$index, \$quantity, $count); + $chunkCount = _playAll(start => $start, end => $end, chunkCount => $chunkCount, request => $request, loopname => $loopname); + } + for my $eachitem (@data[$start..$end]) { next if ($eachitem == undef); @@ -1591,7 +1585,7 @@ } } - $request->addResult('count', $count); + $request->addResult('count', $totalCount); # we might have changed - flush to the db to be in sync. $topLevelObj->update; @@ -2100,7 +2094,8 @@ $request->addResult('offset', $start) if $menuMode; if ($insertAll) { - ($chunkCount, $count) = _playAll(start => $start, end => $end, listCount => $count, chunkCount => $chunkCount, request => $request, loopname => $loopname); + $count = _fixCount($insertAll, \$index, \$quantity, $count); + $chunkCount = _playAll(start => $start, end => $end, chunkCount => $chunkCount, request => $request, loopname => $loopname); } for my $eachitem ($rs->slice($start, $end)) { @@ -3847,7 +3842,8 @@ # first PLAY ALL item if ($insertAll) { - ($chunkCount, $count) = _playAll(start => $start, end => $end, chunkCount => $chunkCount, request => $request, loopname => $loopname, listCount => $count); + $count = _fixCount($insertAll, \$index, \$quantity, $count); + $chunkCount = _playAll(start => $start, end => $end, chunkCount => $chunkCount, request => $request, loopname => $loopname, listCount => $count); } @@ -4029,7 +4025,8 @@ $request->addResult('offset', $start) if $menuMode; if ($insertAll) { - ($chunkCount, $count) = _playAll(start => $start, end => $end, listCount => $count, chunkCount => $chunkCount, request => $request, loopname => $loopname); + $count = _fixCount($insertAll, \$index, \$quantity, $count); + $chunkCount = _playAll(start => $start, end => $end, listCount => $count, chunkCount => $chunkCount, request => $request, loopname => $loopname); } for my $eachitem ($rs->slice($start, $end)) { @@ -4717,7 +4714,6 @@ my $start = $args{'start'}; my $end = $args{'end'}; my $chunkCount = $args{'chunkCount'}; - my $listCount = $args{'listCount'}; my $loopname = $args{'loopname'}; my $request = $args{'request'}; my $includeArt = defined($args{'includeArt'}) ? 1 : 0; @@ -4725,7 +4721,7 @@ # insert first item if needed if ($start == 0 && $end == 1) { # one item list, so do not add a play all and just return - return($start, $end, $chunkCount, $listCount); + return $chunkCount; } elsif ($start == 0) { # we're going to add a 'play all' and an 'add all' # init some vars for each mode for use in the two item loop below @@ -4821,13 +4817,12 @@ }; $request->addResultLoop($loopname, $chunkCount, 'actions', $actions); $chunkCount++; - $listCount++; } } - return($chunkCount, $listCount); + return $chunkCount; } @@ -4851,6 +4846,34 @@ $cache = {}; } + +# fix the count in case we're adding additional items +# (play all, VA etc.) to the resultset +sub _fixCount { + my $insertItem = shift; + my $index = shift; + my $quantity = shift; + my $count = shift; + + my $totalCount = $count || 0; + + if ($insertItem) { + + # return one less result as we only add the additional item in the first chunk + if ( !$$index ) { + $$quantity--; + } + + # decrease the index in subsequent queries + elsif ( $$index + $$quantity >= $count ) { + $$index--; + } + } + + return $totalCount; +} + + =head1 SEE ALSO L @@ -4858,5 +4881,4 @@ =cut 1; - __END__