#!/usr/bin/perl # Copyright (C) 2010-2012 Trizen . # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # #------------------------------------------------------- # Appname: wimp-viewer # License: GPLv3 # Created on: 24 August 2010 # Latest edit on: 14 February 2012 # Website: http://trizen.googlecode.com #------------------------------------------------------- use 5.010; use strict; use XML::Fast qw(xml2hash); use MIME::Base64 qw(decode_base64); require LWP::UserAgent; my $lwp = LWP::UserAgent->new(env_proxy => 1, keep_alive => 1,); my $appname = 'wimp-viewer'; my $version = '0.2.0'; my $cache = 10000; my $cache_min = 5; sub help { print <<"HELP"; usage: $0 [options]\n Options : -f --fullscreen : fullscreen mode --random=i : play 'i' random videos -cache=i : set cache for mplayer (default: $cache) -cache-min=i : set cache-min for mplayer (default: $cache_min) -mplayer=argv : set arguments for mplayer -v --version : print version and exit -h --help : print help and exit\n HELP exit 0; } sub version { say "$appname $version"; exit 0; } my $base_url = 'http://www.wimp.com'; my $match_regexp = qr{/([^\\/]*(?:\\.[^\\/]*)*)/}; my $get_video_url = qr/\bvar\s+googleCode\s*=\s*(['"])(.+?)\1/; # tricky :) my @mplayer_arguments = qw(-really-quiet -prefer-ipv4 -really-quiet); my %constant = (win32 => $^O eq 'MSWin32' ? 1 : 0); my ($bred, $bgreen, $reset); if ($constant{win32}) { $bred = ''; $bgreen = ''; $reset = ''; } else { $bred = "\e[1;31m"; $bgreen = "\e[1;32m"; $reset = "\e[0m"; } foreach my $arg (@ARGV) { if ($arg ~~ ['-f', '-fs', '--fullscreen']) { push @mplayer_arguments, '-fs'; } elsif ($arg =~ /\bwimp\.com\b/) { play(get_video_url($arg)); } elsif ($arg =~ /^--?r(?:andom)?=(\d+)/) { foreach my $i (1 .. $1) { say "$bred**$reset Video: $i"; play_random_video(); } exit 0; } elsif ($arg =~ /^--?m(?:player)?=(.+)/) { push @mplayer_arguments, $1; } elsif ($arg =~ /^--?cache=(\d+)/) { $cache = $1; } elsif ($arg =~ /^--?cache-min=(\d+)/) { $cache_min = $1; } elsif ($arg ~~ ['-h', '--help', '-?']) { help(); } elsif ($arg ~~ ['-v', '--version', '-V']) { version(); } } push @mplayer_arguments, '-cache', $cache, '-cache-min', $cache_min; sub get_mplayer { if ($constant{win32}) { my $smplayer = $ENV{'ProgramFiles'} . '\\SMPlayer\\mplayer\\mplayer.exe'; if (-e $smplayer) { return $smplayer; # Windows MPlayer } else { warn "\n\n!!! Install SMPlayer in order to stream Wimp videos.\n\n"; return $smplayer; } } else { return 'mplayer' # *NIX MPlayer } } sub play { my ($url) = @_; say "$bred**$reset Streaming: $url\n"; system get_mplayer(), @mplayer_arguments, $url; return 1; } sub get_video_url { my ($url) = @_; my $content = $lwp->get($url)->content; if ($content =~ m{(.+?)}) { say "$bred**$reset Playing: $1"; } if ($content =~ /$get_video_url/o) { if (decode_base64($2) =~ /(['"])(http.+?)\1/) { return $2; } } warn "$bred(x_x) Unable to get the video url!$reset\n"; return; } my @results = @{xml2hash($lwp->get('http://www.wimp.com/rss')->content)->{rss}{channel}{item}}; sub play_picked_videos { return unless @_; foreach my $num (@_) { play(get_video_url($results[$num - 1]->{link})); } return 1; } sub play_random_video { play(get_video_url("$base_url/random")); return 1; } sub parse_date { my ($date) = @_; # Mon, 06 Feb 2012 00:00:00 -0600 06 Feb 2012 if ($date =~ /^\S+ (\d+) (\S+) (\d+)/) { return "$1 $2 $3"; } return $date // ''; } { my $num = 1; foreach my $video (@results) { printf "$bred%s$num$reset - %s (%s)\n", $num++ < 10 ? ' ' : '', $video->{title}, parse_date($video->{pubDate}); } { print "\n$bred=>>$bgreen Insert a number (? - help)$reset\n> "; given () { chomp; when (['help', '?']) { print "\n", <<'STDIN_HELP'; [int number] : play the corresponding video [videoname] : play a video by name all : play all videos 3-8, 3..8 : same as 3 4 5 6 7 8 r, random : play a random video /my?[regex]*$/ : play videos matched by a regex (/i) q, quit, exit : exit application STDIN_HELP redo; } when (['q', 'quit', 'exit']) { exit 0; } when (['all']) { play_picked_videos((1 .. @results)); } when (/\d/ and not /(?>\s|^)[^\d-]/) { s/(\d+)(?>-|\.\.)(\d+)/join q{ }, $1 .. $2;/eg; # '2..5' or '2-5' to '2 3 4 5' unless (play_picked_videos(grep { $_ > 0 and $_ <= @results if /^\d+$/ } split /[\s[:punct:]]+/, $_)) { continue; } } when (['r', 'random']) { play_random_video(); redo; } when (chr ord eq q{/} and /$match_regexp/o) { my $match = qr/$1/i; unless (play_picked_videos(grep { $results[$_ - 1]->{'title'} =~ /$match/ } 1 .. @results)) { warn "\n${bred}(X_X) No video matched by the regexp: $bgreen/$match/$reset\n\n"; redo; } } default { redo; } } } redo; }