/lib/Teto/Track/SoundCloud.pm

http://github.com/motemen/Teto · Perl · 62 lines · 49 code · 12 blank · 1 comment · 4 complexity · e365972ad20ff5409c2b9a668918b8d1 MD5 · raw file

  1. package Teto::Track::SoundCloud;
  2. use Mouse;
  3. extends 'Teto::Track';
  4. my $NON_USER = qr/^(tags|tracks|people|groups|tour|you|settings|pages|developers|premium|login|followings)$/;
  5. my $NON_MIX = qr/^(following|groups|follow|tracks|comments|favorites|sets)$/;
  6. override buildargs_from_url => sub {
  7. my ($class, $url) = @_;
  8. my ($user, $mix) = $url =~ m<^http://soundcloud\.com/([\w-]+)/([\w-]+)$> or return undef;
  9. return undef if $user =~ $NON_USER;
  10. return undef if $mix =~ $NON_MIX;
  11. return {};
  12. };
  13. override _play => sub {
  14. my $self = shift;
  15. my $media_url = $self->media_url or return;
  16. # $self->send_url_to_buffer($media_url);
  17. my $fh = $self->url_to_fh($media_url);
  18. $self->send_file_to_buffer($fh);
  19. };
  20. sub _build_media_url {
  21. my $self = shift;
  22. my $res = $self->user_agent->get($self->url);
  23. unless ($res->is_success) {
  24. $self->add_error($res->message);
  25. return;
  26. }
  27. if (defined (my $title = $self->extract_title_from_res($res))) {
  28. $self->title($title);
  29. }
  30. if (defined (my $image = $self->extract_image_from_res($res))) {
  31. $self->image($image);
  32. }
  33. my ($media_url) = $res->decoded_content =~ m<"streamUrl":"([^"]+)"> or return;
  34. return $media_url;
  35. }
  36. sub extract_title_from_res {
  37. my ($self, $res) = @_;
  38. my ($title) = $res->decoded_content =~ m#<h1[^>]*><em>\s*(.+)\s*</em></h1>#;
  39. return $title;
  40. }
  41. sub extract_image_from_res {
  42. my ($self, $res) = @_;
  43. my ($image) = $res->decoded_content =~ m#<meta content="([^"]+)" property="og:image" />#;
  44. return $image;
  45. }
  46. __PACKAGE__->meta->make_immutable;
  47. no Mouse;
  48. 1;