Hallo miteinander,
In diesem Beitrag wollte ich lediglich was nützliches mit euch allen teilen, da ich dies des öfteren selber gesucht habe: mithilfe von pyLoad Youtube Videos als mp3 herunterzuladen. Da ich nie video-dateien von youtube gedownloadet habe, hab ich auch keine Option reinprogrammiert die erlaubt auszusuchen ob man dies als mp3 downloaden will oder als video. (wenn ich mal wieder Zeit hab schau ich es mir mal genauer an, vielleicht geht dies ziemlich schnell umzusetzen)
Zuersteinmal sollte man das alte Youtube-Plugin irgendwo als backup speichern, wenn was schief laufen sollte. Das Youtube Plugin liegt in folgendem Ordner:
Wenn man sich ganz sicher ist einfach den Code darin mit dem gleich beschrieben - überschreiben.
Achtung: Nicht einfach umbenennen, da sonst pyLoad das umbenannte als Plugin erkennt.
Da das mit dem pyLoad ausgelieferte Youtube-Plugin meist nicht geupdated wird automatisch, habe ich mich direkt an der neuesten version (heute am 11.05.2013 ist es die version: 0.30) oreintiert. Die veränderung ist eigentlich ziemlich simpel und sieht wie folgt aus:
if ffmpeg:
mp3name = filename.replace(".mp4",".mp3")
subprocess.call([
ffmpeg,
"-i", filename,
"-ab", "192000",
"-vn", mp3name])
os.remove(filename)
Der ganze code würde dann wie folgt aussehen: (ich verlinke github extra nicht, da dort sicher das YoutubePlugin verändert wird und ich dann ned sicher gehen kann das dies auch mit meiner ergänzung funktioniert)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import re
import subprocess
import os
import os.path
from urllib import unquote
from module.utils import html_unescape
from module.plugins.Hoster import Hoster
def which(program):
"""Works exactly like the unix command which
Courtesy of http://stackoverflow.com/a/377028/675646"""
def is_exe(fpath):
return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
fpath, fname = os.path.split(program)
if fpath:
if is_exe(program):
return program
else:
for path in os.environ["PATH"].split(os.pathsep):
path = path.strip('"')
exe_file = os.path.join(path, program)
if is_exe(exe_file):
return exe_file
return None
class YoutubeCom(Hoster):
__name__ = "YoutubeCom"
__type__ = "hoster"
__pattern__ = r"(http|https)://(www\.)?(de\.)?\youtube\.com/watch\?v=.*"
__version__ = "0.30"
__config__ = [("quality", "sd;hd;fullhd;240p;360p;480p;720p;1080p;3072p", "Quality Setting", "hd"),
("fmt", "int", "FMT/ITAG Number (5-102, 0 for auto)", 0),
(".mp4", "bool", "Allow .mp4", True),
(".flv", "bool", "Allow .flv", True),
(".webm", "bool", "Allow .webm", False),
(".3gp", "bool", "Allow .3gp", False),
("3d", "bool", "Prefer 3D", False)]
__description__ = """Youtube.com Video Download Hoster"""
__author_name__ = ("spoob", "zoidberg")
__author_mail__ = ("spoob@pyload.org", "zoidberg@mujmail.cz")
# name, width, height, quality ranking, 3D
formats = {5: (".flv", 400, 240, 1, False),
6: (".flv", 640, 400, 4, False),
17: (".3gp", 176, 144, 0, False),
18: (".mp4", 480, 360, 2, False),
22: (".mp4", 1280, 720, 8, False),
43: (".webm", 640, 360, 3, False),
34: (".flv", 640, 360, 4, False),
35: (".flv", 854, 480, 6, False),
36: (".3gp", 400, 240, 1, False),
37: (".mp4", 1920, 1080, 9, False),
38: (".mp4", 4096, 3072, 10, False),
44: (".webm", 854, 480, 5, False),
45: (".webm", 1280, 720, 7, False),
46: (".webm", 1920, 1080, 9, False),
82: (".mp4", 640, 360, 3, True),
83: (".mp4", 400, 240, 1, True),
84: (".mp4", 1280, 720, 8, True),
85: (".mp4", 1920, 1080, 9, True),
100: (".webm", 640, 360, 3, True),
101: (".webm", 640, 360, 4, True),
102: (".webm", 1280, 720, 8, True)
}
def setup(self):
self.resumeDownload = self.multiDL = True
def process(self, pyfile):
html = self.load(pyfile.url, decode=True)
if "watch-player-unavailable" in html:
self.offline()
if "We have been receiving a large volume of requests from your network." in html:
self.tempOffline()
#get config
use3d = self.getConf("3d")
if use3d:
quality = {"sd":82,"hd":84,"fullhd":85,"240p":83,"360p":82,"480p":82,"720p":84,"1080p":85,"3072p":85}
else:
quality = {"sd":18,"hd":22,"fullhd":37,"240p":5,"360p":18,"480p":35,"720p":22,"1080p":37,"3072p":38}
desired_fmt = self.getConf("fmt")
if desired_fmt and desired_fmt not in self.formats:
self.logWarning("FMT %d unknown - using default." % desired_fmt)
desired_fmt = 0
if not desired_fmt:
desired_fmt = quality.get(self.getConf("quality"), 18)
#parse available streams
streams = re.search(r'"url_encoded_fmt_stream_map": "(.*?)",', html).group(1)
streams = [x.split('\u0026') for x in streams.split(',')]
streams = [dict((y.split('=',1)) for y in x) for x in streams]
streams = [(int(x['itag']), "%s&signature=%s" % (unquote(x['url']), x['sig'])) for x in streams]
#self.logDebug("Found links: %s" % streams)
self.logDebug("AVAILABLE STREAMS: %s" % [x[0] for x in streams])
#build dictionary of supported itags (3D/2D)
allowed = lambda x: self.getConfig(self.formats[x][0])
streams = [x for x in streams if x[0] in self.formats and allowed(x[0])]
if not streams:
self.fail("No available stream meets your preferences")
fmt_dict = dict([x for x in streams if self.formats[x[0]][4] == use3d] or streams)
self.logDebug("DESIRED STREAM: ITAG:%d (%s) %sfound, %sallowed" %
(desired_fmt,
"%s %dx%d Q:%d 3D:%s" % self.formats[desired_fmt],
"" if desired_fmt in fmt_dict else "NOT ",
"" if allowed(desired_fmt) else "NOT ")
)
#return fmt nearest to quality index
if desired_fmt in fmt_dict and allowed(desired_fmt):
fmt = desired_fmt
else:
sel = lambda x: self.formats[x][3] #select quality index
comp = lambda x, y: abs(sel(x) - sel(y))
self.logDebug("Choosing nearest fmt: %s" % [(x, allowed(x), comp(x, desired_fmt)) for x in fmt_dict.keys()])
fmt = reduce(lambda x, y: x if comp(x, desired_fmt) <= comp(y, desired_fmt) and
sel(x) > sel(y) else y, fmt_dict.keys())
self.logDebug("Chosen fmt: %s" % fmt)
url = fmt_dict[fmt]
self.logDebug("URL: %s" % url)
#set file name
file_suffix = self.formats[fmt][0] if fmt in self.formats else ".flv"
file_name_pattern = '<meta name="title" content="(.+?)">'
name = re.search(file_name_pattern, html).group(1).replace("/", "")
pyfile.name = html_unescape(name)
time = re.search(r"t(\d+)m)?(\d+)s", pyfile.url)
ffmpeg = which("ffmpeg")
if ffmpeg and time:
m, s = time.groups()[1:]
if not m:
m = "0"
pyfile.name += " (starting at %s:%s)" % (m, s)
pyfile.name += file_suffix
filename = self.download(url)
if ffmpeg:
mp3name = filename.replace(".mp4",".mp3")
subprocess.call([
ffmpeg,
"-i", filename,
"-ab", "192000",
"-vn", mp3name])
os.remove(filename)
Display More
Dies konvertiert nun direkt nachm download die .mp4 in .mp3 und löscht die alte .mp4. Ich habe hierbei nicht beachtet das jmd. flv vor .mp4 bevorzugen würde, somit wird von .flv nicht nach .mp3 konvertiert.
Da dies ziemlich schnell entstanden ist, wäre es nett auf sauberere Lösungen hinzuweisen, danke.
//Edit: Ich entschloss mich doch noch den ausgangs-code zu verlinken: https://github.com/pyload/pyload/…r/YoutubeCom.py
Greetz