#!/usr/bin/ruby # v 0.3 # helper script for streaming and downloading of zdf mediathek video content # quality settings: default is vh(very high) QUALITY = nil # 'h' (high) or 'l' (low) MODE = 'view' # or 'download' # VIEW_CMD = 'mplayer -display :0.0 -prefer-ipv4 -fs -cache 500 "[URL]"' =begin MPlayer dev-SVN-rUNKNOWN-4.3.3 does not work atm with asx/mms steaming zdf content use vlc: =end VIEW_CMD = 'vlc [URL]' DOWNLOAD_CMD = 'mmsrip "[URL]"' # alternative: "mplayer -dumpstream [URL]" # use mechanize for url retrieval require 'rubygems' require 'mechanize' # install mechanize via gems: # gem install mechanize --remote agent = WWW::Mechanize.new puts 'Mediathek Downloader' if ARGV.length < 1 puts 'Syntax: ./mtget.rb [URL/ID]' exit end url = ARGV[0] id = nil # search for id if url.match /^[0-9]+$/ id = url.to_i else # matching url structure? if url.match /zdf\.de\/ZDFmediathek\/content\/([0-9]+)/ id = $1 else # search inside page page = agent.get url if page.body.match // $1.match /([0-9]+)/ id = $1 end end end if id == nil puts 'Could not find Mediathek-Id' exit end puts " [#] mediathek id: #{id}" # build rss url: url = "http://www.zdf.de/ZDFmediathek/content/#{id}" puts " [#] mediathek url: #{url}" # Try to load rss: page = nil begin page = agent.get "#{url}?view=rss" rescue WWW::Mechanize::ResponseCodeError puts ' [*] could not get rss url' page = agent.get url # search rss url: page.body.match /"([^"]+\?view=rss)"/ puts " [*] alternative rss: #{$1}" page = agent.get $1 end if page == nil puts 'Error, could not get RSS' exit end # store mms links in this array: mms_links = [] def scan_for_mms(body) ret_mms_links = [] mms_matches = body.scan /"(mms:\/\/[^"]+)"/ mms_matches.each do |mms_url| mms_url = mms_url.to_s # change Video Quality mms_url.gsub!(/_vh\.wmv$/, "_#{QUALITY}.wmv") if QUALITY != nil ret_mms_links << mms_url end ret_mms_links end # search for asx or mms links: puts ' [*] scanning asx links' asx_matches = page.body.scan /"([^"]+\.asx)"/ asx_matches.each do |asx_url| puts "asx: #{asx_url}" asx_page = agent.get asx_url mms_links += scan_for_mms(asx_page.body) end puts ' [*] scanning mms links' mms_links += scan_for_mms(page.body) puts ' [#] found mms links:' mms_links.each_index do |idx| puts " [#{idx}] #{mms_links[idx]}" end while true print " [+] #{MODE} selection: [a=All or 0-#{mms_links.length-1}] " input = $stdin.gets.chop break if input.match /^[aA]$/ break if input.match /^[0-9]+$/ and mms_links[input.to_i] != nil end mms_links.each_index do |idx| if input.match /^[aA]$/ or idx == input.to_i if MODE == 'view' cmd = VIEW_CMD.gsub /\[URL\]/, mms_links[idx] else cmd = DOWNLOAD_CMD.gsub /\[URL\]/, mms_links[idx] end puts "Execute: #{cmd}" `#{cmd}` end end