summaryrefslogtreecommitdiffstats
path: root/youtube-viewer/youtube-viewer
diff options
context:
space:
mode:
Diffstat (limited to 'youtube-viewer/youtube-viewer')
-rw-r--r--youtube-viewer/youtube-viewer866
1 files changed, 866 insertions, 0 deletions
diff --git a/youtube-viewer/youtube-viewer b/youtube-viewer/youtube-viewer
new file mode 100644
index 0000000..09c93fd
--- /dev/null
+++ b/youtube-viewer/youtube-viewer
@@ -0,0 +1,866 @@
+#!/usr/bin/perl
+
+# Last edit on January 12 2011, 10:25 PM
+
+$appname = 'youtube-viewer';
+$version = 'v2.4.4';
+
+=start
+-------------------------------------------------------
+ (C) 2010-2011 by Trizen
+ WebSite: http://trizen.go.ro
+ Email: echo dHJpemVueEBnbWFpbC5jb20K | base64 -d
+-------------------------------------------------------
+
+[?] What is this script for?
+ - This script is useful if do you hate the Flash Player and love YouTube.
+ - Using this script you can search and play YouTube Videos with MPlayer...
+ - Have fun!
+
+[!] Most important changes are written in the changelog!
+
+ [CHANGELOG]
+ - First version with Windows support. Require SMPlayer to play videos. See MPlayer Line - NEW (v2.4.*)
+ - Code has been changed in a proportion of ~60% and optimized for speed // --480 became -4 - NEW (v2.4.*)
+ - Added mega-powers of omnibox to the STDIN :) - NEW (v2.3.*)
+ - Re-added the option to list and play youtube videos from a user profile. Usage: -u [user] - NEW (v2.3.*)
+ - Added a new option to play all video clips from a category. Usage: '-c 9' and insert 'all' - NEW (v2.3.*)
+ - Category area is more friendly... New options: -c [n] where 'n' is the number of category - NEW (v2.3.*)
+ - Added a new option to play only the audio track of a videoclip. Usage: [words] -n - NEW (v2.3.*)
+ - Added option for fullscreen (-f, --fullscreen). Usage: youtube-viewer [words] -f - NEW (v2.3.*)
+ - Added one new option '-c'. It shows available categories and will let you to choose one. - NEW (v2.3.*)
+ - Added one new option '-m'. It shows 3 pages of youtube video results. Usage: [words] -m - NEW (v2.3.*)
+ - For "-p" option has been added 3 pages of youtube video results (60 clips) - NEW (v2.3.*)
+ - Added "-prefer-ipv4" to the mplayer line (videoclips starts in no time now). - NEW (v2.3.*)
+ - Search and play videos at 480p, 720p. Ex: [words] --480, [words] -p --480 - NEW (v2.3.*)
+ - Search has been corrected due to some YouTube changes... - (v2.2.*)
+ - Added support to play a video at 480p even if it's resolution is higher. Ex: [url] --480 - (v2.2.*)
+ - Added a nice feature which prints some informations about the video which you watching at - (v2.2.*)
+ - Added support to play videos by your order. Example: after search results, insert: 3 5 2 1 - (v2.1.*)
+ - Added support for next pages of video results (press ENTER when ask you to insert number) - (v2.1.*)
+ - Bug fixed: "Numbers go crazy after more than 20 video results". - (v2.1.*)
+ - Added support to continue playing searched videos, usage: "youtube-viewer [words] -p" - (v2.1.*)
+ - Added support to print counted videos and support to insert the number of video to play it - (v2.1.*)
+ - Added support to search YouTube Videos in script (ex: youtube-viewer avatar trailer 2009) - (v2.0.*)
+ - Added support for script to choose automat quality if it is lower than 1080p - (v2.0.*)
+ - Added support to choose the quality only between 720p and 1080p (if it is available) - (v2.0.*)
+ - Added support for an YouTube video code (ex: youtube-viewer WVTWCPoUt8w) - (v1.0.*)
+ - Added support for 720p and 1080p YouTube Videos... - (v1.0.*)
+
+ Special thanks to:
+ - Army (for bugs reports and for his great ideas)
+ - dhn (for adding youtube-viewer in freshports.org)
+
+ And also many thanks to:
+ - everybody who use this script...
+=cut
+
+require LWP::UserAgent;
+
+$os = $^O;
+if ($os =~ /MSWin/) {
+ $MPlayerLine = '"C:\\Program Files\\SMPlayer\\mplayer\\mplayer.exe" -prefer-ipv4 -cache 10000 -cache-min 1';
+}
+else {
+ $MPlayerLine = 'mplayer -prefer-ipv4 -cache 100000 -cache-min 1';
+}
+$lwp = 'LWP::UserAgent'->new;
+$lwp->agent('Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.634.0 Safari/534.16');
+unless ($os =~ /MSWin/) {
+ $bred = "\e[1;31m";
+ $bgreen = "\e[1;32m";
+ $reset = "\e[0m";
+}
+$a = $ARGV[0];
+$b = $ARGV[1];
+unless ($b) {
+ $b = '';
+}
+unless ($a) {
+ $a = '';
+}
+if ($a =~ /^(-v|--version)$/) {
+ $appname =~ s/-/ /;
+ $appname =~ s/(.)(.+) (.)/\U$1\E\L$2 \E\U$3\E/g;
+ print "$appname $version\n";
+ exit;
+}
+my($Picks, $pickcat, $Search);
+$PickBackup = '';
+$SearchBackup = '';
+$MoreResults = '';
+$FirstPage = 1;
+$NextPage = 1;
+$username = 0;
+$pick = '';
+if ($a =~ /^(-a|--author)$/) {
+ @_ = ('4', '2', ')', ':', '%', '.');
+ foreach $_ (@_) {
+ $@ = '@';
+ $_ = $@ | $_;
+ &_;
+ sub _ {
+ $@ = $] * ($] * 3 + 1);
+ print '=' x $@ . "\n";
+ }
+ print "\t" x $] . "\U$_\n\E";
+ &_;
+ }
+ exit;
+}
+$Working = "\n[...] Working... Please wait...$reset\n";
+$app = $0;
+$app =~ s[(.*)/([^/]+)$][$2];
+for ($n = 0; $n <= $#ARGV; ++$n) {
+ push @args, $ARGV[$n];
+}
+if ($args[0]) {
+ foreach $arg (@args) {
+ next if $arg eq '';
+ $arg =~ s/--novideo/-n/;
+ $arg =~ s/--categories/-c/;
+ $arg =~ s/^-([-]?)f(.*)/-f/;
+ if ($arg eq '-n') {
+ $MPlayerLine =~ s/mplayer /mplayer -novideo /;
+ $MPlayerLine =~ s/mplayer.exe"/mplayer.exe" -novideo/;
+ $SearchBackup = ' --480';
+ }
+ if ($arg =~ /^-([-]?)([\d]+)/) {
+ $SearchBackup .= " $arg";
+ }
+ if ($arg eq '-c') {
+ $categories = 'TRUE';
+ }
+ if ($arg eq '-m' or $arg eq '-p') {
+ $MoreResults = 1;
+ }
+ else {
+ $MoreResults = 0;
+ }
+ if ($arg eq '-f') {
+ $SearchBackup .= " $arg";
+ $MPlayerLine =~ s/mplayer /mplayer -fs /;
+ $MPlayerLine =~ s/mplayer.exe"/mplayer.exe" -fs/;
+ }
+ }
+}
+if ($a eq '' or $a =~ /^([-]?)-([471]+)|^-f|^-m|^-n/ and $b eq '') {
+ &InsertURL;
+}
+if ($a) {
+ $a =~ s[http://.*embed/][]i;
+ if ($a =~ m[^http://] and not $a =~ /youtube\.com/) {
+ $connect = $lwp->get($a);
+ if ($connect->content =~ m[youtube.com/v/([\w\-]{11})]) {
+ $youtube = "v=$1";
+ &GetYouTube;
+ }
+ }
+}
+if ($a =~ /^-g([^\=]*)=([\w]+)/) {
+ $NextPage = 0;
+ $a = "http://www.youtube.com/music/$2";
+ $Search .= ' ';
+}
+elsif ($a =~ /^-g$/ and $b =~ /([\w]*)/) {
+ $NextPage = 0;
+ $a = "http://www.youtube.com/music/$b";
+ $Search .= ' ';
+}
+sub InsertURL {
+ print "\n$bred=>>$reset$bgreen Insert an YouTube URL or search something...\n$reset> ";
+ chomp($youtube = <STDIN>);
+ if ($youtube =~ m[^http://] and not $youtube =~ /youtube\.com/) {
+ $connect = $lwp->get($youtube);
+ if ($connect->content =~ m[youtube.com/v/([\w\-]{11})]) {
+ $youtube = "v=$1";
+ &GetYouTube;
+ }
+ }
+ elsif (not $youtube =~ m[youtube.com(.+)v([\=/]+)([\w\-]{11})] and $youtube) {
+ $SearchBackup .= ' ' . $youtube;
+ $Search = $youtube;
+ $number = 0;
+ &Trizen;
+ }
+ elsif (not $youtube =~ /youtube.com(.+)([\w\-]{11})/) {
+ print $bred;
+ print "\n(x_x) Invalid URL...\n\n";
+ print $reset;
+ exit;
+ }
+ else {
+ print $bgreen . '';
+ &GetYouTube;
+ }
+}
+if ($categories) {
+ foreach $arg (@args) {
+ if ($arg =~ /^([\d]+)$/) {
+ $catnr = $1;
+ }
+ }
+ unless ($catnr) {
+ $catnr = '';
+ }
+}
+if ($a =~ /youtube.com/ and not $a =~ m[v([=/]+)([\w\-]+)]) {
+ $c = 'TRUE';
+ $CatURL = $a;
+ &CatSearch;
+}
+else {
+ $c = '';
+}
+if ($a =~ /^-u/ and not $b =~ /(.+)/) {
+ die "\nUsage: $0 -u [username]\n\t$0 [username] -u\n\n";
+}
+if ($a =~ /^-([-]*)u/ and $b =~ /(.+)/ or $b =~ /^-([-]*)u/) {
+ if ($b =~ /^-([-]*)u/) {
+ $b = $a;
+ }
+ $username = 1;
+ $NextPage = 0;
+ $ytp = "http://gdata.youtube.com/feeds/api/users/$b/uploads";
+ $connect = $lwp->get($ytp);
+ $cc = $connect->content;
+ if ($cc eq 'User not found') {
+ die "\n(x_x) $cc...\n\n";
+ }
+ $cc =~ s/\n//g;
+ $cc =~ s/<title type='text'>/\nTITLE=/g;
+ @content = split(?\n?, $cc, 0);
+ foreach $_ (@content) {
+ if ($_ =~ /TITLE\=/) {
+ $_ =~ s[TITLE\=([^\<]+)</title>(.+)v\=([\w\-]{11})(.+)duration([^\']*)'([\d\:]+)'(.+)][v=$3+title="$1">+video-time">$6];
+ push @Videos, $_;
+ }
+ }
+ print "\n";
+ &PrintResults;
+}
+if ($a =~ /^([-]?)-c/) {
+ if ($catnr =~ /(.+)/) {
+ print $bgreen . "$Working";
+ }
+ if ($b =~ /([-]?)-([\d]+)/) {
+ $PickBackup = $b;
+ }
+ $NextPage = 0;
+ $connect = $lwp->get('http://www.youtube.com/videos');
+ @cates = split(/\n/, $connect->content, 0);
+ foreach $_ (@cates) {
+ if ($_ =~ m[<a href=\"(.+)\">(.+)</a>([\ ]*)]) {
+ push @cats, "$1 -*- $2";
+ }
+ }
+ $nbr = 0;
+ foreach $cat (@cats) {
+ unless ($cat =~ /\?v=|http|title=\"|style=\"|onclick=\"/) {
+ foreach $_ ($number = 0) {
+ $number = $nbr + 1;
+ $nbr = $number;
+ while ($cat =~ /\"/) {
+ $cat =~ s/(.+)"(.+)-\*-/$1 -*-/;
+ }
+ push @categories, "$number - $cat\n" unless $cat =~ m[/t/|class=]g;
+ }
+ }
+ }
+ print "\n";
+ foreach $_ (@categories) {
+ next if $_ =~ m[/music|press_room]g;
+ if ($_ =~ /opt_out/) {
+ $caturl = 'http://www.youtube.com/videos';
+ $catname = 'Main videos';
+ $pick = '1';
+ }
+ if ($_ =~ /([\d]+) - (.+) -\*- (.+)/ and not $_ =~ /opt_out/) {
+ $caturl = $2;
+ $catname = $3;
+ $pick = $1;
+ }
+ if ($catnr eq '' and $pick < 10) {
+ print "$bred $pick$reset - $catname\n$bred";
+ }
+ else {
+ if ($catnr eq '' and not $caturl =~ /ads/) {
+ print "$bred$pick$reset - $catname\n$bred";
+ }
+ }
+ }
+ if (not $catnr =~ /(.+)/) {
+ print $bgreen;
+ print "\n=>> Insert the number of a category\n> ";
+ print $reset;
+ chomp($pickcat = <STDIN>);
+ }
+ else {
+ $pickcat = $catnr;
+ }
+ foreach $cat (@categories) {
+ if ($cat =~ /^$pickcat - (.+) -\*- (.+)/) {
+ $catname = $1;
+ $youtube = "http://www.youtube.com$1";
+ $catname =~ s/^(.+)\?(.+)/$2/;
+ $connect = $lwp->get($youtube);
+ @content = split(/\n/, $connect->content, 0);
+ }
+ }
+ &CatSearch;
+ sub CatSearch {
+ if ($c =~ /(.+)/) {
+ $connect = $lwp->get($CatURL);
+ @content = split(/\n/, $connect->content, 0);
+ }
+ foreach $_ (@content) {
+ $_ =~ s[\&amp\;feature\=([\w\-]+)|\"\ data\-thumb(.+)\.jpg|src="http://(.+)gif\"|click="" onmousedown="][]g;
+ if ($pickcat) {
+ unless ($pickcat =~ /16/) {
+ $_ =~ s/\="http([^\"]+)"|yt.analytics([^\;]+)\;|"src//g;
+ $_ =~ s/" alt\="([^\"]+)"([\ ]*)//g;
+ }
+ }
+ else {
+ $_ =~ s/" src="(.+)\.jpg//g;
+ }
+ $_ =~ s/" onload="tn_load\(\)" data-thumb alt="([^\"]+)\" |" onload="tn_load\(\)src|src=//g;
+ push @Videos, $_ if $_ =~ /^</;
+ }
+ print "\n";
+ &PrintResults;
+ }
+ ;
+}
+if ($a =~ m[youtube.com(.+)v([\=/]+)([\w\-]{11})]) {
+ $youtube = "http://www.youtube.com/watch?v=$3";
+ print $bgreen . "$Working";
+ &GetYouTube;
+}
+if ($a =~ /^([\w\-]{11})$/) {
+ $youtube = 'http://www.youtube.com/watch?v=' . $a;
+ if ($a =~ /([\d]+)/ or $a =~ /([A-Z]+)/) {
+ &GetYouTube;
+ }
+}
+if ($a =~ /^-h$/ or $a =~ /^--help$/) {
+ $appname =~ s/(.+)/\U$1\E/g;
+ $app =~ s/(.*)\\([^\\]+)$/$2/;
+ die "\n\t" . '=' x 17 . " $appname " . '=' x 17 . qq[
+\t\t\t\t by Trizen (trizen.go.ro)
+
+ Usage: $app || [url] || [words] || [code]
+
+Base Options: $app [...]
+ [url] : play an YouTube video by URL
+ [code] : play an YouTube video by code
+ [words] : search and play YouTube videos
+
+Other options:
+ -c, --categories : shows available YouTube categories
+ -n, --novideo : plays only audio track of the video
+ [words] -f : plays all videos in fullscreen mode
+ [words] -p : plays all video results in order
+ [words] -m : shows 3 pages of video results (60 videos)
+ [words] -n : plays only the audio track of video results
+ [words] -4, -7 : plays video results at 480p resolution (or 720p)
+ [ytURL] -4, -7 : plays an YouTube video by URL at 480p (or 720p)
+ [username] -u : lists videos from a YouTube user profile
+ -h, --help : outputs this message...
+
+Tips and tricks:
+ 1. Search something and press enter for the next page.
+ 2. Search and play all video results by adding "-p" after keywords.
+ 3. After search results, you can insert: 3 5 8 1 to play videos in your order
+ 4. Play all audio tracks of video results by adding "-p -n" after keywords.
+ 5. To listen music from YouTube use: "-c -n 10" and insert "all"
+ 6. Play videos one after one in fullscreen mode: "[words] -p -f"
+ 7. Play all video results at 480p: "[words] -p -4" (or 720p => "-7")
+ 8. Play all videos from a user at 480p: "[username] -u -4" and insert "all"
+ 9. Play a genre of music from YT: "-g [genre]". Example: "-g reggae -n"
+
+];
+}
+elsif ($a =~ /^-p/) {
+ die "Usage: $app [words] $a\n";
+}
+elsif (not $a =~ /^-([-]?)4|^-([-]?)7|^-g|^-p|^-n|^-([-]?)1|^-f|^-m/ and $a =~ /^-/) {
+ die "Unknown option '${a}'\n";
+}
+$Search = join(' ', @args) . ' ';
+&Trizen;
+sub Trizen {
+ $PageNumber = 1;
+ $FirstPage = 1;
+ $SearchBackup .= ' ' . $Search;
+ $Search =~ s/\ ([-]?)-([\d]+)|\ -p|\ -m|\ ([-]?)-f([^\ ]*)|\ -n//g;
+ $ys = "http://www.youtube.com/results?search_query=$Search&aq=f";
+ if ($MoreResults eq 1) {
+ $ys = "http://www.youtube.com/results?search_query=$Search&aq=f";
+ $connect = $lwp->get($ys);
+ push @source, $connect->content . "\n";
+ for ($number = 2; $number <= 3; ++$number) {
+ $ys = "http://www.youtube.com/results?search_query=$Search".
+ "&suggested_categories=10%2C24&page=$number";
+ $connect = $lwp->get($ys);
+ push @source, $connect->content . "\n";
+ }
+ $source = join('', @source);
+ @content = split(?\n?, $source, 0);
+ print "\n";
+ }
+ else {
+ $connect = $lwp->get($ys);
+ @content = split(/\n/, $connect->content, 0);
+ if ($connect->content =~ m[class="largeText">(.+)<a href="/results\?search_query=(.+)&search=Search(.+)"(.+)</a></span></div>]) {
+ $spell = $4;
+ $research = "http://www.youtube.com/results?search_query=$2&search=Search";
+ $spell =~ s[<i>|</i>|<b>|</b>|>|<][]g;
+ print "\n$bgreen=>> Did you mean: ";
+ print "$bred$spell$reset (Y/n)\n> ";
+ chomp($yn = <STDIN>);
+ if ($yn eq '' or $yn =~ /y/i) {
+ $connect = $lwp->get($research);
+ splice @content;
+ @content = split(/\n/, $connect->content, 0);
+ }
+ }
+ elsif ($connect->content =~ m[Results for: <a href="/results\?search_query=(.+)">(.+)</a>]) {
+ $research = "http://www.youtube.com/results?search_query=$1&search=Search";
+ print "$bgreen\n=>> Did you mean: $bred$2$reset (Y/n)\n> ";
+ chomp($yn = <STDIN>);
+ if ($yn eq '' or $yn =~ /y/i) {
+ $connect = $lwp->get($research);
+ splice @content;
+ @content = split(/\n/, $connect->content, 0);
+ }
+ }
+ print "\n";
+ }
+ &Search;
+}
+sub Search {
+ splice @Videos;
+ splice @codes;
+ foreach $_ (@content) {
+ if ($_ =~ m[^<a href="/watch\?v=]) {
+ $_ =~ s/\" data-thumb(.+)\.jpg//g;
+ push @Videos, $_;
+ }
+ }
+ &PrintResults;
+}
+sub PrintResults {
+ $number = 0;
+ foreach $_ (@Videos) {
+ chomp($line = $_);
+ if ($line =~ /v\=([\w\-]{11})(.*)title="([^\"]+)(.*)time\">([\d\:]*)/) {
+ ++$number;
+ $code = $1;
+ $title = $3;
+ $time = $5;
+ unless ($time =~ /\:/) {
+ $sec = $time;
+ $time = $sec / 3600 % 24 . ':' . $sec / 60 % 60 . ':' . $sec % 60;
+ $time =~ s/^0\://;
+ unless ($time =~ /\:/) {
+ $time = "0:$time";
+ }
+ if ($time =~ /(.):(.):(.+)/) {
+ $time = "$1:0$2:$3";
+ }
+ if ($time =~ /^(.+):(.)$/) {
+ $time = "$1:0$2";
+ }
+ }
+ push @codes, "$number - $code $time";
+ $title =~ s/\&amp;\#39;/'/g;
+ $title =~ s/\&amp;/&/g;
+ $title =~ s/\&quot;/"/g;
+ $title =~ s/\&amp;\#([\d]+);|amp;|quot;//g;
+ $title =~ s/src class=$|class=$//g;
+ print "$bred";
+ if ($number < 10) {
+ print ' ';
+ }
+ print "$number$reset - $title ($time)\n$bred";
+ }
+ }
+ if ($SearchBackup) {
+ if ($SearchBackup =~ /\ -p/) {
+ for ($i = 1; $i <= $number; ++$i) {
+ push @picks2, "$i ";
+ }
+ $youtube = join('', @picks2);
+ @picks = split(' ', $youtube, 0);
+ &PicksArea;
+ }
+ }
+ print "\n$bred=>>$reset$bgreen Insert a number or search something else\n$reset> ";
+ chomp($youtube = <STDIN>);
+ $PickBackup = $youtube;
+ if ($youtube =~ /^(q|quit|exit)$/) {
+ print "\n[*] Exiting...\n\n";
+ exit;
+ }
+ if ($PickBackup =~ m[^http://] and not $PickBackup =~ /youtube\.com/) {
+ $connect = $lwp->get($PickBackup);
+ if ($connect->content =~ m[youtube.com/v/([\w\-]{11})]) {
+ $youtube = "v=$1";
+ &GetYouTube;
+ }
+ }
+ if ($PickBackup =~ /([\d]+) ([-]?)-([\d]+)/) {
+ $youtube = $1;
+ }
+ print $bgreen . "$Working";
+ if ($youtube =~ /^([\d]+)$/) {
+ if ($youtube > $number or $youtube eq 0) {
+ print "\n";
+ &PrintResults;
+ }
+ }
+ if ($youtube =~ /^([\d]+)$/) {
+ $PICK = $1;
+ &ForeachCode;
+ }
+ if ($youtube eq '' and $NextPage eq 1) {
+ $PageNumber = $FirstPage;
+ ++$PageNumber;
+ print "\n[!]$bgreen Page:$reset $PageNumber\n";
+ $SearchURL = "http://www.youtube.com/results?search_query=$Search".
+ "&suggested_categories=10%2C24&page=$PageNumber";
+ $connect = $lwp->get($SearchURL);
+ splice @content;
+ @content = split(/\n/, $connect->content, 0);
+ print "\n";
+ $FirstPage = $PageNumber;
+ &Search;
+ }
+ elsif ($NextPage eq 0 and $youtube eq '') {
+ print "\n";
+ &PrintResults;
+ }
+ if ($youtube eq 'all') {
+ $SearchBackup .= ' --1080';
+ splice @picks;
+ for ($i = 1; $i <= $number; ++$i) {
+ push @picks, "$i";
+ }
+ &PicksArea;
+ }
+ if ($youtube =~ m[v([=/]+)([\w\-]{11})]) {
+ $youtube = "http://youtube.com/watch?v=$2";
+ &GetYouTube;
+ }
+ if ($youtube =~ /([\d]+) ([\d]+)/) {
+ @picks = split(' ', $youtube, 0);
+ &PicksArea;
+ sub PicksArea {
+ $NrOfPicks = @picks;
+ $no = 0;
+ $lastpick = '';
+ $number = 0;
+ &ForeachPick;
+ }
+
+ sub ForeachPick {
+ for ($number = $no; $number <= $NrOfPicks; ++$number) {
+ $no = $number;
+ $pick = $picks[$number];
+ next if $lastpick eq $pick;
+ &PrintResults if $number eq $NrOfPicks;
+ $Picks = 'TRUE';
+ $lastpick = $pick;
+ &PlayBack;
+ }
+ }
+ ;
+ }
+ if ($youtube ne 'all' and $youtube =~ /(.+)/ and not $youtube =~ /^(q|quit|exit)$/) {
+ $Search = $youtube;
+ &Trizen;
+ }
+}
+sub PlayBack {
+ foreach $Code (@codes) {
+ if ($Picks eq 'TRUE' and not $Code =~ /^$pick - /) {
+ next;
+ }
+ elsif ($Code =~ /^$pick - ([\w\-]{11})(.*)/ and $Picks eq 'TRUE') {
+ $VideoCode = $1;
+ $duration = $2;
+ $youtube = "http://www.youtube.com/watch?v=$1";
+ }
+ elsif ($Code =~ /(.+)([\w\-]{11})(.*)/ and $Picks ne 'TRUE') {
+ $VideoCode = $2;
+ $duration = $2;
+ $youtube = "http://www.youtube.com/watch?v=$2";
+ }
+ &GetYouTube;
+ }
+}
+sub VideoCheck {
+ if (not $connect->content =~ /itag=34/ and $connect->content =~ /itag=([\d]+)([\W]+)/) {
+ $itag = $1;
+ $streaming =~ s/(.*)http(.+)itag=$itag([^\%]*)(.+)/http$2itag=$itag$3/;
+ unless ($SearchBackup =~ / ([-]?)-f/) {
+ $MPlayerLine =~ s/-fs //;
+ }
+ &Description;
+ &MPlayer;
+ }
+ if ($b =~ /^([-]?)-4/ or $PickBackup =~ / ([-]?)-4/ or $SearchBackup =~ / ([-]?)-4/) {
+ $streaming =~ s/(.*)http(.+)itag=34([^\%]*)(.+)/http$2itag=34$3/;
+ unless ($SearchBackup =~ / ([-]?)-f/) {
+ $MPlayerLine =~ s/-fs //;
+ }
+ &Description;
+ &MPlayer;
+ }
+ if ($b =~ /^([-]?)-7/ or $PickBackup =~ / ([-]?)-7/ or $SearchBackup =~ / ([-]?)-7/) {
+ if ($connect->content =~ /itag=22/) {
+ $streaming =~ s/(.*)http(.+)itag=22([^\%]*)(.+)/http$2itag=22$3/;
+ $MPlayerLine =~ s/mplayer -p/mplayer -fs -p/;
+ $MPlayerLine =~ s/mplayer.exe" -p/mplayer.exe" -fs -p/;
+ &Description;
+ &MPlayer;
+ }
+ else {
+ unless ($SearchBackup =~ / ([-]?)-f/) {
+ $MPlayerLine =~ s/-fs //;
+ }
+ $streaming =~ s/(.*)http(.+)itag=34([^\%]*)(.+)/http$2itag=34$3/;
+ &Description;
+ &MPlayer;
+ }
+ }
+ if ($b =~ /^([-]?)-1/ or $PickBackup =~ / ([-]?)-1/ or $SearchBackup =~ / ([-]?)-1/) {
+ if ($connect->content =~ /fmt_list=37/) {
+ $streaming =~ s/(.*)http(.+)itag=37([^\%]*)(.+)/http$2itag=37$3/;
+ $MPlayerLine =~ s/mplayer -p/mplayer -fs -p/;
+ $MPlayerLine =~ s/mplayer.exe" -p/mplayer.exe" -fs -p/;
+ &Description;
+ &MPlayer;
+ }
+ elsif ($connect->content =~ /itag=22/) {
+ $streaming =~ s/(.*)http(.+)itag=22([^\%]*)(.+)/http$2itag=22$3/;
+ $MPlayerLine =~ s/mplayer -p/mplayer -fs -p/;
+ $MPlayerLine =~ s/mplayer.exe" -p/mplayer.exe" -fs -p/;
+ &Description;
+ &MPlayer;
+ }
+ else {
+ unless ($SearchBackup =~ / ([-]?)-f/) {
+ $MPlayerLine =~ s/-fs //;
+ }
+ $streaming =~ s/(.*)http(.+)itag=34([^\%]*)(.+)/http$2itag=34$3/;
+ &Description;
+ &MPlayer;
+ }
+ }
+ &Description;
+ &ResolutionSearch;
+}
+sub Description {
+ if ($connect->content =~ /likes\">([\d\.\,]+)(.+)dislikes\">([^\<]+)/) {
+ $like = $1;
+ $dislike = $3;
+ }
+ if ($connect->content =~ m[video-date" >([\ ]*)\n([\t\ ]*)(.+)\n([\ ]*)</span>]) {
+ $date = $3;
+ $date =~ s[<span>(.+)</span>][];
+ }
+ if ($connect->content =~ /<meta name="title" content="(.+)">/) {
+ $title = $1;
+ $title =~ s/\&amp;quot;/"/g;
+ $title =~ s/\&amp;amp;/&/g;
+ $title =~ s/\&amp;\#39;/'/g;
+ $title =~ s/\&amp;\#([\d]+);//g;
+ }
+ print "\n$bred=>> $reset";
+ print $bgreen;
+ print "$title\n";
+ print $reset;
+ print '-' x 80;
+ if ($connect->content =~ m[description" >(.*)</p>]) {
+ $desc = $1;
+ $desc =~ s[<em>|</em>][]g;
+ $desc =~ s[<br\ />|<br/>][\n]g;
+ $desc =~ s[<a\ href\=\"\#\"\ onclick\=\"yt\.www\.watch\.player\.seekTo\((.+)\);return\ false;\">|<a\ href\=\"(.+)\"\ target\=\"\_blank\"\ title\=\"|\"\ rel\=\"nofollow\"\ dir="ltr\"\ class\=\"(.*)\">(.+)</a>|<wbr />|</a>|<wbr>\&shy;|<wbr>][]g;
+ $desc =~ s/\&quot;/"/g;
+ $desc =~ s/&amp;/&/g;
+ $desc =~ s/\&\#39;/'/g;
+ $desc =~ s/\&\#([\d]+);//g;
+ print "\n$desc\n";
+ }
+ print '-' x 80 . "\n";
+ print "$bred=>> $reset";
+ print $bgreen;
+ print "View & Download\n";
+ print $reset;
+ print '-' x 80;
+ $get = $streaming;
+ $get =~ s/http:([^\%]+)(.*)/http:$1/;
+ $get =~ s/(.*)http/http/;
+ $get =~ s/\\//g;
+ print "\n* URL $url\n";
+ print "* GET $get\n";
+ print '-' x 80 . "\n";
+ $count = $title =~ s/(.)/$1/gs;
+ if ($count <= 40) {
+ print "$bred\t\t=>> ";
+ }
+ elsif ($count >= 40 and $count <= 55) {
+ print "$bred\t=>> ";
+ }
+ elsif ($count >= 56) {
+ print "$bred =>> ";
+ }
+ print $bgreen;
+ print "$title";
+ print $reset;
+ print "$bred <<=\n";
+ print $reset;
+ if ($connect->content =~ m[href="/user/([\w\-]+)"><strong>]) {
+ print "\n* Uploaded by $1\n";
+ }
+ if ($duration) {
+ print "* Duration:$duration\n";
+ }
+ if ($connect->content =~ m[<strong>([\d\,]+)</strong>]) {
+ print "* Views: $1\n";
+ }
+ if ($date =~ /(.+)/) {
+ print "* Date: $date\n";
+ }
+ if ($like =~ /(.+)/) {
+ print "* Likes: $like+; Dislikes: $dislike-\n";
+ }
+ print '-' x 80 . "\n\n";
+}
+sub MPlayer {
+ $streaming =~ s/%(.+)$//;
+ `$MPlayerLine "$streaming"`;
+ print "\n";
+ if ($Picks) {
+ if ($Picks eq 'TRUE') {
+ &ForeachPick;
+ }
+ }
+ if ($Search or $a =~ /^([-]?)-c/ or $username eq 1) {
+ &PrintResults;
+ }
+ exit;
+}
+sub ForeachCode {
+ foreach $code (@codes) {
+ if ($code =~ /^$PICK - ([\w\-]{11})(.*)/) {
+ $code = $1;
+ $duration = $2;
+ $youtube = 'http://www.youtube.com/watch?v=' . $code;
+ $url = $youtube;
+ }
+ }
+ &GetYouTube;
+}
+sub GetYouTube {
+ if ($youtube =~ m[v([=/]+)([\w\-]{11})]) {
+ $VideoCode = $2;
+ $youtube = 'http://www.youtube.com/watch?v=' . $2;
+ }
+ $Count = $VideoCode =~ s/(.)/$1/gs;
+ if ($Count ne 11) {
+ print "\n$bred(x_x) Invalid URL...$reset\n\n";
+ exit;
+ }
+ unless ($youtube =~ /^http:/) {
+ $youtube = 'http://' . $youtube;
+ }
+ $connect = $lwp->get($youtube);
+ $url = $youtube;
+ if ($connect->content =~ /fmt_url_map=([^\&]+)\&/) {
+ $streaming = $1;
+ $streaming =~ s/%3A/:/gi;
+ $streaming =~ s[%2F][/]gi;
+ $streaming =~ s/%26/&/g;
+ $streaming =~ s/%3D/=/gi;
+ $streaming =~ s/%3F/?/gi;
+ $streaming =~ s/%252C/,/gi;
+ &VideoCheck;
+ }
+ else {
+ $unable = "$bred(x_x) Unable to play: $reset$url\n";
+ print $bred;
+ print "\n(x_x) Something went wrong...\n\n";
+ print $reset;
+ if (not $SearchBackup =~ / -p/ or $NrOfPicks eq '') {
+ print "$unable\n";
+ }
+ if ($Search =~ /(.+)/) {
+ unless ($SearchBackup =~ / -p/) {
+ sleep 1;
+ &PrintResults;
+ }
+ }
+ else {
+ exit;
+ }
+ }
+ if ($streaming =~ /(.+)/) {
+ &Description;
+ }
+ else {
+ print $unable;
+ }
+ &ResolutionSearch;
+}
+sub ResolutionSearch {
+ if ($connect->content =~ /fmt_list=37/ and not $SearchBackup =~ / -p/) {
+ &pick;
+ }
+ elsif ($SearchBackup =~ /-p/) {
+ if ($connect->content =~ /fmt_list=37/) {
+ $streaming =~ s/(.*)http(.+)itag=37([^\%]*)(.+)/http$2itag=37$3/;
+ $MPlayerLine =~ s/mplayer -p/mplayer -fs -p/;
+ $MPlayerLine =~ s/mplayer.exe" -p/mplayer.exe" -fs -p/;
+ &Description;
+ &MPlayer;
+ }
+ }
+ if ($connect->content =~ /itag=22/) {
+ $streaming =~ s/(.*)http(.+)itag=22([^\%]*)(.+)/http$2itag=22$3/;
+ $MPlayerLine =~ s/mplayer -p/mplayer -fs -p/;
+ $MPlayerLine =~ s/mplayer.exe" -p/mplayer.exe" -fs -p/;
+ &MPlayer;
+ }
+ else {
+ $streaming =~ s/(.*)http(.+)itag=34([^\%]*)(.+)/http$2itag=34$3/;
+ unless ($SearchBackup =~ / ([-]?)-f/) {
+ $MPlayerLine =~ s/-fs //;
+ }
+ &MPlayer;
+ }
+}
+sub pick {
+ print "$bred=>>$reset $bgreen Please choose quality of video (default: 1)$reset\n\n";
+ print " $bred 1$reset - 1280x720 (720p)\n $bred 2$reset - 1920x1080 (1080p)\n ";
+ print '=' x 23 . "\n";
+ print $bgreen;
+ print "\n=>> Pick format: ";
+ print $reset;
+ chomp($pick = <STDIN>);
+ print '-' x 80 . "\n\n";
+ if ($pick ne 2) {
+ $streaming =~ s/(.*)http(.+)itag=22([^\%]*)(.+)/http$2itag=22$3/;
+ $MPlayerLine =~ s/mplayer -p/mplayer -fs -p/;
+ $MPlayerLine =~ s/mplayer.exe" -p/mplayer.exe" -fs -p/;
+ &MPlayer;
+ }
+ if ($pick eq 2) {
+ $streaming =~ s/(.*)http(.+)itag=37([^\%]*)(.+)/http$2itag=37$3/;
+ $MPlayerLine =~ s/mplayer -p/mplayer -fs -p/;
+ $MPlayerLine =~ s/mplayer.exe" -p/mplayer.exe" -fs -p/;
+ &MPlayer;
+ }
+}