Ver código fonte

More decoupling

Zachary Kotlarek 6 anos atrás
pai
commit
c35b412677
1 arquivos alterados com 116 adições e 0 exclusões
  1. 116 0
      yt/fetch.pl

+ 116 - 0
yt/fetch.pl

@@ -0,0 +1,116 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+use FindBin;
+use lib "$FindBin::Bin/";
+
+use File::Touch;
+use File::Basename;
+use IPC::System::Simple qw( system run capture EXIT_ANY $EXITVAL );
+use IPC::Cmd qw( can_run );
+use Cwd qw( abs_path );
+
+# Paramters
+my $YTDL_BIN      = $ENV{'HOME'} . '/bin/video/yt/youtube-dl';
+my @YTDL_ARGS     = ('--force-ipv4', '--socket-timeout', '10', '--retries', '1', 
+			'--no-playlist', '--max-downloads', '1', '--age-limit', '99');
+my @YTDL_QUIET    = ('--quiet', '--no-warnings');
+my @YTDL_DEBUG    = ('--verbose');
+
+# Debug
+my $DEBUG = 0;
+if ($ENV{'DEBUG'}) {
+	if ($ENV{'DEBUG'} =~ /(\d+)/) {
+		$DEBUG = $1;
+	} else {
+		$DEBUG = 1;
+	}
+}
+
+# Sanity check
+if (scalar(@ARGV) < 1) {
+	die('Usage: ' . basename($0) . " output_directory\n");
+}
+
+if ($DEBUG) {
+	print STDERR 'Fetching video: ' . $id . "\n";
+}
+
+my $reviewed = videoSE($videos->{$id}->{'season'}, $videos->{$id}->{'number'}) . $id . '.reviewed';
+touch($reviewed);
+my @args = ('--output', videoSE($videos->{$id}->{'season'}, $videos->{$id}->{'number'}) . '%(id)s.%(ext)s', '--', $id);
+my @name = ($YTDL_BIN);
+push(@name, @YTDL_ARGS);
+my @fetch = @name;
+push(@name,  '--get-filename');
+push(@fetch, @args);
+push(@name,  @args);
+
+# Count fetch attempts (even if they fail later)
+$fetched++;
+if ($FETCH_LIMIT && $fetched > $FETCH_LIMIT) {
+	print STDERR 'Reached fetch limit (' . $FETCH_LIMIT . ') for: ' . $NAME . "\n";
+	if ($DEBUG) {
+		print STDERR "\tLocal/Remote videos at start:" . scalar(keys(%{$files})) . '/' . scalar(keys(%{$videos})) . "\n";
+	}
+	exit 1;
+}
+
+# Find the output file name
+if ($DEBUG > 1) {
+	print STDERR join(' ', @name) . "\n";
+}
+delay();
+my $file = capture(EXIT_ANY, @name);
+if ($EXITVAL != 0) {
+	warn('Error executing youtube-dl for name: ' . $NAME . '/' . $id . ' (' . $EXITVAL . ")\n");
+	next FETCH_LOOP;
+}
+if ($file =~ /\n\S/) {
+	$file =~ s/^.*\n//;
+}
+$file =~ s/^\s+//;
+$file =~ s/\s+$//;
+
+# Sanity check
+if (!$file) {
+	warn('No file name available for video: ' . $NAME . '/' . $id . "\n");
+	next FETCH_LOOP;
+} elsif ($DEBUG > 0) {
+	print STDERR 'Output video file: ' . $file . "\n";
+}
+
+# Download
+if ($DEBUG > 1) {
+	print STDERR join(' ', @fetch) . "\n";
+}
+delay();
+my $exit = run(EXIT_ANY, @fetch);
+if ($exit != 0) {
+	if ($DEBUG) {
+		warn('Error executing youtube-dl for video: ' . $NAME . '/' . $id . "\n");
+	}
+	next FETCH_LOOP;
+}
+
+# Ensure we found something useful
+if (-e $file . '.part') {
+	warn('Partial download detected: ' . $NAME . '/' . $file . "\n");
+	next FETCH_LOOP;
+}
+# Sometimes the downloader lies about file extensions
+if (!-s $file) {
+	$file =~ s/\.webm$/.mp4/;
+}
+if (!-s $file) {
+	$file =~ s/\.mp4$/.webm/;
+}
+# But we still need *a* file
+if (!-s $file) {
+	warn('No output video file: ' . $NAME . '/' . $file . "\n");
+	next FETCH_LOOP;
+}
+
+# Touch the file to reflect the download time rather than the upload time
+touch($file);
+