Youtube mp3 instant rippen

Posted by Patrick Krusenotto on Feb 5, 2010 in Allgemein |

Cooler Titel, oder? :-) Und es geht um folgendes: Gerade einen schönen Titel auf youtube gesehen? Davon wollen Sie auf Knopfdruck einen mp3-Abzug haben? Das kann richtig Arbeit werden! Man muss nämlich den URL aus dem Browser fischen, dann mit “youtube-dl” das flashvideo ziehen, warten bis es da ist, dann mit mplayer nach mp3 konvertieren und das hinten raus gefallene mp3-fiile geeignet umbenennen und in sein Musikarchiv kopieren, wo der Musik Player es dann findet.

Das war mir zu lästig und manchmal gucke ich auch am späten Abend nach zwei Gläsern Wein noch youtube. Dann spätestens wird Alles zu fehleranfällig.

Heute habe ich ein Icon auf meinem “Panel” auf das ich nur drauf klicken muss dahinter ist ein Skript, das

  1. In der Firefox-History den letzten link sucht
  2. Die Youtube-Seite zieht
  3. Aus dieser den Titel extrahiert
  4. Das Flash-Video von Youtube runterlädt
  5. Dieses nach MP3 konvertiert
  6. An geeigneter Stelle das mp3-File mit dem richtigen Namen ablegt

Damit das ganze klappt müssen unter ubuntu 9.10 folgende Pakete installiert werden:

sqlite3 - Das ist nötig, da Firefox seine history als sqlite-datenbank ablegt

libdbd-sqlite3-perl - Das Perl-Interface zu sqlite

youtube-dl - Youtube-Downloader

#!/usr/bin/perl

# Dieses Skript holt ein Video aus youtube aufgrund einer URL aus der
# Firefox-history, convertiert es nach mp3, holt den Namen aus youtube
# und speichert dann das mp3-file unter diesem Namen ab.

# Patrick Krusenotto, Januar 2010
# LIZENZBEDINGUNGEN: 
# Machen Sie damit was sie wollen. Hauptsache Sie machen es.

use strict;
use LWP::Simple;
use HTML::Entities;
use DBI;

sub get_default_firefox_profile {
  # unter der sehr warscheinlilchen Annahme, dass das default-profile
  # verwendet wird, muss dieses erst namentlich bestimmt werden
  for (`cat ~/.mozilla/firefox/profiles.ini`) {
    if (/^Name=default$/../^Path=/) {
      if (/^Path=(.*)$/) {
	return $1;
      }
    }
  }
  return undef;
}

sub get_firefox_default_profile {
  # das profile muss erstmal kopiert werden, denn firefox ist
  # vermutlich noch offen und auf der datenbank ein Lock und sqlite
  # gestattet dann nicht, das profile zu lesen.
  my $profile = get_default_firefox_profile();
  system("cp ~/.mozilla/firefox/$profile/places.sqlite /tmp/youtube.sqlite");
  return "/tmp/youtube.sqlite";
}

sub get_last_url_from_firefox_default_profile {
  # fische die letzte url aus der tabelle "moz_places"; der
  # firefox-history
  my $dbfile=get_firefox_default_profile();
  my $dbh = DBI->connect("dbi:SQLite:dbname=$dbfile","","");
  my $url = $dbh->selectall_arrayref("select url from moz_places where oid = (select max(oid) from moz_places); ");
  return $url->[0]->[0];
}

sub youtube_title {
  # ermittle den titel aus der html-seite. Das ist reine Heuristik und
  # könnte schon nächste woche nicht mehr funktionieren. Mit
  # HTML::Parser was zu bauen, war mir zu lästig
  my $id=shift;
  my @content = split /\n/, get "http://www.youtube.com/watch?v=$id";
  my $title;
  # Mit dieser Shell-Anweisung kann die auslösung des namens getestet
  # werden, falls der aufbau der yt-seiten sich ändern sollte: curl
  # http://www.youtube.com/watch?v=KLLxdcrk0-s 2>/dev/null | perl -ne
  # '/^\s*-\s(.*)$/ and print $1'
  for (@content) {
    if ($_=~ /^\s+-\s(.*)$/ ) {
      $title=$1;
      last;
    }
  }
  # In dem Titel ist einiges an dreck drin. Insbesondere HTML-Entities
  # und Sonderzeichen die bei Dateinamen unpraktisch sind. FOTT DAMETT! :
  $title = decode_entities($title);
  $title =~ s/'//g;
  $title =~ s/"//g;
  $title =~ s/\(//g;
  $title =~ s/\)//g;
  return $title;
}

# =============================================================================
# SECTION: MAIN
# =============================================================================

chdir "/tmp";

my $url = $ARGV[0] || get_last_url_from_firefox_default_profile();

my $id;
if ($url =~m|youtube|) {
  $url=~m|http://www\.youtube\.com/watch\?v=([^&]+)|;
  $id=$1
} else {
  $id = $url
}

my $title = youtube_title($id);

print "=====================================================================\n";
print "$title\n";
print "=====================================================================\n";

if (! -f "$id.mp3") {
  system("youtube-dl $id");
  system("mplayer -dumpaudio -dumpfile \"$title.mp3\" $id.flv");
}

system ("cp", "$title.mp3", "~/Musik");

Reply

Copyright © 2012 Das Algorithmenwerk* All rights reserved. Theme by Laptop Geek.