/lib/Teto/Worker/FeedTracksToQueue.pm

http://github.com/motemen/Teto · Perl · 79 lines · 60 code · 19 blank · 0 comment · 1 complexity · 0de5f5a2f11f170849abfefe47926f72 MD5 · raw file

  1. package Teto::Worker::FeedTracksToQueue;
  2. use Mouse;
  3. use MouseX::Types::URI;
  4. use Coro;
  5. with 'Teto::Role::Log';
  6. has playlist => (
  7. is => 'rw',
  8. isa => 'Teto::Playlist',
  9. );
  10. has queue => (
  11. is => 'rw',
  12. isa => 'Teto::Queue',
  13. );
  14. has dismissed => (
  15. is => 'rw',
  16. );
  17. __PACKAGE__->meta->make_immutable;
  18. no Mouse;
  19. sub spawn {
  20. my ($class, %args) = @_;
  21. my $self = $class->new(%args);
  22. $self->work_async;
  23. return $self;
  24. }
  25. sub work_async {
  26. my $self = shift;
  27. async {
  28. $Coro::current->{desc} = 'FeedTracksToQueue';
  29. $self->work;
  30. };
  31. }
  32. sub work {
  33. my $self = shift;
  34. $self->queue->clear;
  35. my @tracks = $self->playlist->tracks;
  36. $self->queue->add_track(@tracks);
  37. until ($self->dismissed) {
  38. $self->log(debug => 'wait for playlist signal');
  39. $self->playlist->track_signal->wait;
  40. my @new_tracks = do {
  41. my @tt = $self->playlist->tracks;
  42. splice @tt, scalar @tracks;
  43. };
  44. $self->log(debug => 'playlist signal: got ' . scalar(@new_tracks) . ' new tracks');
  45. $self->queue->add_track(@new_tracks);
  46. push @tracks, @new_tracks;
  47. }
  48. }
  49. sub dismiss {
  50. my $self = shift;
  51. $self->{dismissed}++;
  52. $self->log(debug => 'dismissed');
  53. }
  54. sub DESTROY {
  55. my $self = shift;
  56. local $@;
  57. eval { $self->dismiss };
  58. warn $@ if $@;
  59. }
  60. 1;