Просмотр исходного кода

Use LWP::UA instead of LWP::Simple.
General debug

Zachary Kotlarek 11 лет назад
Родитель
Сommit
efb19fd265
1 измененных файлов с 42 добавлено и 11 удалено
  1. 42 11
      yt/subscribe.pl

+ 42 - 11
yt/subscribe.pl

@@ -8,7 +8,7 @@ use File::Touch;
 use File::Basename;
 use Date::Parse;
 use Date::Format;
-use LWP::Simple;
+use LWP::UserAgent;
 use URI::Escape;
 use JSON;
 use XML::LibXML;
@@ -29,6 +29,9 @@ my $BATCH_SIZE    = 50;
 my $MAX_INDEX     = 25000;
 my $FETCH_LIMIT   = 50;
 my $DELAY         = 1.1;
+my $HTTP_TIMEOUT  = 10;
+my $HTTP_UA       = 'ZachBot/1.0 (Plex)';
+my $HTTP_VERIFY   = 0;
 my $API_URL       = 'https://www.googleapis.com/youtube/v3/';
 my $API_KEY       = $ENV{'YT_API_KEY'};
 my %API           = (
@@ -106,6 +109,7 @@ sub videoSE($$);
 sub videoPath($$$$);
 sub renameVideo($$$$$$);
 sub parseFilename($);
+sub fetch($$);
 
 # Sanity check
 if (scalar(@ARGV) < 1) {
@@ -189,6 +193,7 @@ if (exists($ENV{'FETCH_LIMIT'}) && $ENV{'FETCH_LIMIT'} =~ /(\d+)/) {
 }
 
 # Construct globals
+my $LWP = undef();
 foreach my $key (keys(%API)) {
 	if (exists($API{$key}{'params'}{'maxResults'})) {
 		$API{$key}{'params'}{'maxResults'} = $BATCH_SIZE;
@@ -622,19 +627,19 @@ sub fetchParse($$) {
 		print STDERR 'Fetching ' . $name . ' API URL: ' . $url . "\n";
 	}
 	sleep($DELAY);
-	my $content = get($url);
-	if (!defined($content) || length($content) < 10) {
-		die('Invalid content from URL: ' . $url . "\n");
+	my $content;
+	if (fetch($url, \$content) != 200 || !defined($content) || length($content) < 10) {
+		die('Invalid content from URL: ' . $url . "\n" . $content . "\n");
 	}
 
 	# Parse
+	if ($DEBUG > 2) {
+		print STDERR "Raw JSON data:\n" . $content . "\n";
+	}
 	my $data = decode_json($content);
 	if (!defined($data) || ref($data) ne 'HASH') {
 		die('Invalid JSON: ' . $content . "\n");
 	}
-	if ($DEBUG > 2) {
-		print STDERR "Raw JSON data:\n" . prettyPrint($data, '  ') . "\n";
-	}
 
 	return $data;
 }
@@ -749,8 +754,10 @@ sub saveChannel($) {
 
 		# Save the poster
 		if (exists($channel->{'thumbnail'}) && length($channel->{'thumbnail'}) > 5) {
-			my $jpg = get($channel->{'thumbnail'});
-			saveString('poster.jpg', $jpg);
+			my $jpg;
+			if (fetch($channel->{'thumbnail'}, \$jpg) == 200) {
+				saveString('poster.jpg', $jpg);
+			}
 		}
 
 		# Save the series NFO
@@ -992,8 +999,6 @@ sub findVideos($) {
 		{
 			if (exists($data->{'nextPageToken'})) {
 				$pageToken = $data->{'nextPageToken'};
-			} elsif ($data->{'pageInfo'}->{'totalResults'} > $count + $data->{'pageInfo'}->{'resultsPerPage'}) {
-				warn("Missing nextPageToken\n");
 			}
 			if (!$totalCount) {
 				$totalCount = $data->{'pageInfo'}->{'totalResults'};
@@ -1152,3 +1157,29 @@ sub parseFilename($) {
 	my ($file) = @_;
 	return $file =~ /^S(\d+)+E(\d+) - ([\w\-]+)\.(\w\w\w)$/i;
 }
+
+# GET the requested URL, accepting encoded data and extracting the HTTP status code
+sub fetch($$) {
+	my ($url, $data) = @_;
+
+	# Init the global LWP as needed
+	if (!defined($LWP)) {
+		$LWP = new LWP::UserAgent;
+		$LWP->agent($HTTP_UA);
+		$LWP->timeout($HTTP_TIMEOUT);
+		$LWP->ssl_opts({ 'verify_hostname' => $HTTP_VERIFY });
+	}
+
+	# Make a request
+	my $request = HTTP::Request->new('GET' => $url);
+	$request->header('Accept-Encoding' => HTTP::Message::decodable);
+	my $response = $LWP->request($request);
+
+	# Do something useful with the response
+	my $code = 400;
+	if ($response->status_line =~ /^(\d+)\s/) {
+		$code = $1;
+	}
+	${$data} = $response->decoded_content();
+	return $code;
+}