Open jegue opened 8 years ago
Please paste at least one video URL.
Closing as no response for a long time.
Please, reopen this bug.
It would be nice if rumble.com would be supported. It's still not supported by youtube-dl 2020.09.20.
Here are two video URLs: https://rumble.com/vanu5z-polizei-strmt-unser-dinner.html https://rumble.com/vank3h-lneburg-livestream-polizei-besteht-auf-masken-aber-nur-im-stehen..html
And here are the embedded iframe urls for the videos in the same order: https://rumble.com/embed/v81nzb/?pub=4 https://rumble.com/embed/v81dwt/?pub=4
Those videos have been live streams made by Samuel Eckert on the Corona Info Tour (kind of a demonstration tour) he's doing together with Dr. Bodo Schiffmann and Wolfgang Greulich through Germany, Switzerland and Austria. They use rumble.com as a replacement for YouTube due to YouTube's censorship. So there's no copyright infringement.
Both videos can be played perfectly in a browser at least with Firefox.
Could this issue be reopened?
Seems to be working now (version 2020.12.05) - instead of the page url I put in the embed iframe url. Also gave me options
youtube-dl -F https://rumble.com/embed/[[ID]]/?pub=4
[RumbleEmbed] [[D]]: Downloading JSON metadata
[info] Available formats for [[ID]]:
format code extension resolution note
mp4-240p mp4 240p 200k
mp4-360p mp4 360p 409k
mp4-480p mp4 480p 587k
webm-480p webm 480p 739k (best)
Thanks youtube-dl!
If embed urls works then a possible way of extracting it could look like this:
curl -s https://rumble.com/vbgwka-dog-think-shes-covering-her-food.html \
| xmllint --html --xpath 'string(//script[@type="application/ld+json"])' - 2> /dev/null \
| jq -r '.[0].embedUrl'
# => https://rumble.com/embed/v8uqdm/
I think youtube-dl may have general capabilities to extract json from webpages from tags like this.
It definitely does not work. It can't even recognize pages:
$ youtube-dl -f https://rumble.com/vd1xd5-lazy-latch.html
Usage: youtube-dl [OPTIONS] URL [URL...]
youtube-dl: error: You must provide at least one URL.
Type youtube-dl --help to see a list of all options.
It definitely does not work. It can't even recognize pages:
It does work, but only with the embedded links so far. So when you go on the page click the button "EMBED" below the video and copy&paste the "Embed IFRAME URL".
It would indeed be nice if it would work with the normal URL, too.
As others have mentioned, only the "embed" links work so far. It would be nice if the video url could look up the embed url automatically (if that's how the download is going to work).
It looks like short urls redirect properly -- https://rumble.com/vd9yyx gets forwarded and resolves to https://rumble.com/vd9yyx-scuba-diver-meets-gigantic-manta-ray-up-close-in-galapagos-silands.html within youtube-dl, which is good.
I was hoping I could just use the url with the short code (here, the "vd9yyx") and add "/embed" in the middle -- but the short code for the video page ends up being different from the short code in the embed link. This one is "vanss9" -- i.e., "https://rumble.com/embed/vanss9" for the shortest working embed url I could find.
…
I don't think playlists exist on rumble yet, though I know they're working on a lot of new features right now.
It might also be nice in the future if it would support downloading all videos from a channel, which is a type of list, e.g.: https://rumble.com/c/WildCreatures
Maybe also search result lists, though maybe that would be problematic for the quantity of results -- but maybe that's the user's problem. Anyway, example: https://rumble.com/search/video?q=whale%20shark
Note that I personally don't really need either of those in the near future; it's just a suggestion that may be useful eventually.
In case it was missed I have tried to provide an example of how the embedded url can be extracted: https://github.com/ytdl-org/youtube-dl/issues/10785#issuecomment-741973114
The main difference would be converting that xpath and json query into python equivalents.
I haven't yet looked into channels or search results but they appear to be relatively easy.
Edit: This is enough for the time being to fetch rumble channel or search result links from which the embedded link can be extracted:
curl -s 'channel or search results link' \
| xmllint --html --xpath '//article[@class = "video-item"]/a/@href' - 2> /dev/null \
| sed -n 's/ href="\([^"]\{0,\}\)"$/https:\/\/rumble.com\1/p'
PS: xmllint
only supports XPath 1.0 which is why I resorted to sed
. Hopefully someone who knows the code can find it useful when porting to python.
(Even) Embed URLs do not work.
$ youtube-dl https://rumble.com/embed/vbtxob/ [generic] vbtxob: Requesting header WARNING: Falling back on generic information extractor. [generic] vbtxob: Downloading webpage [generic] vbtxob: Extracting information
$ youtube-dl --version 2020.03.24
@aenchevich you're using an outdated version.
Yep, what @remitamine said. I just tested with version 2021.02.22 and 2021.03.03, and both worked with the embed urls (but still not the main urls).
(Even) Embed URLs do not work.
$ youtube-dl https://rumble.com/embed/vbtxob/ [generic] vbtxob: Requesting header WARNING: Falling back on generic information extractor. [generic] vbtxob: Downloading webpage [generic] vbtxob: Extracting information
$ youtube-dl --version 2020.03.24
(Even) Embed URLs do not work.
The rumble page URL is: https://rumble.com/veg3uf-canadian-doctors-speak-out.html
The embed URL is: https://rumble.com/embed/vbtxob/
The embed URL is: https://rumble.com/embed/vbtxob/?pub=4 I can download it perfectly with youtube-dl 2021.03.02
You should use the complete URL, not only a part of it. And you should update youtube-dl.
Yes, works with the newest version and the full embed URL. Thank you.
I'd leave it open until youtube-dl can extract the embed URL from the page URL.
To manually find the video address with Firefox, press \<ctrl>\<i>, select the "media"tab, and look for "video":
Or just start playing the video, right click onto the video and click "copy video address" (don't know how it's named exactly in the English version).
In this case it's a lot easier to click "Embed" and copy the "Embed IFRAME URL".
On 4/22/21 12:26 PM, the-real-cyberpatrol wrote:
Or just start playing the video, right click onto the video and click "copy video address" (don't know how it's named exactly in the English version).
In this case it's a lot easier to click "Embed" and copy the "Embed IFRAME URL".
That does not work anymore in:
firefox-87.0-12.fc33.x86_64 vivaldi-stable-3.7.2218.55-1.x86_64 waterfox-classic-kpe-2021.03-53.2.x86_64
Right click is ignored. Only left click works.
:'(
On 4/22/21 12:26 PM, the-real-cyberpatrol wrote:
Or just start playing the video, right click onto the video and click "copy video address" (don't know how it's named exactly in the English version).
In this case it's a lot easier to click "Embed" and copy the "Embed IFRAME URL".
The right click context menu is still active in
seamonkey-2.53.7-3.fc33.x86_64.rpm
But you can get around it by using
Hi All,
Figured it out. It is not a json call.
Basically you have to dig out the embedded video url from the original url. On the embedded url page (sans all the other junk), the address to the mp4 (and webm) is given.
I wrote my own downloader. Anyone who want my code is welcome to it. The process it pretty well documented.
-T
Hi All,
Figured it out. It is not a json call.
Basically you have to dig out the embedded video url from the original url. On the embedded url page (sans all the other junk), the address to the mp4 (and webm) is given.
I wrote my own downloader. Anyone who want my code is welcome to it. The process it pretty well documented.
-T
Please share your downloader. Thanks
@dskrad I've already demonstrated two examples of this in the thread above.
On 5/19/21 10:11 AM, Earnestly wrote:
@dskrad https://github.com/dskrad I've already demonstrated two examples of this in the thread above.
Since someone has beet me to it, I will just share the basics of what I did.
I program in Raku (Perl 6).
On this video:
I first downloaded the entire web site in a variable. with a module I wrote to interface with cURL.
Note that on there is a "content: ' • ' ` (chr 8226)" UTF16 character on one of the lines that terminates the "-o -" tty output with cURL, so I had to save to a file and then read file into the variable.
Once in the variable, I searched for the term "embedUrl" which gives the actual location of the video, sans all the garbage.
<script @.**@.":"VideoObject","name": "The Piano Soundtrack (guitar cover)","playerType":"HTML5","description":"The piano soundtrack (guitar cover) Learn Spanish guitar with one of my guitar courses: Songs for Spanish and Classical Guitar: https://www.thespanishguitarhub.com/book2/ Amazon USA: https://amzn.to/2","thumbnailUrl":"
https://i.rmbl.ws/s8/6/J/3/k/D/J3kDb.4Wpjb.1.jpg","uploadDate":"2021-03-11T15:21:52+00:00",
"duration":"PT00H02M52S","embedUrl":"https://rumble.com/embed/vbxbfr/","url":"https
if $WebPage.contains( "embedUrl" ) {
if $Debug { print "entering extract embedded Url\n"; }
$EmbedAddr = $WebPage;
$EmbedAddr ~~ s| .*? "embedUrl" ||;
$EmbedAddr ~~ s| .*? "http" |http|;
$EmbedAddr ~~ s| \" .* ||;
if $Debug { PrintGreen "EmbedAddr = <$EmbedAddr>\n"; }
( $EmbedWebPage, $PageStatus ) = CurlGetWebSite( $EmbedAddr );
if $PageStatus ne 0 {
PrintRedErr "$SubName\: error: $EmbedAddr download failed.
Cowardly exiting. Bummer Dude...\n"; return False; }
# exit;
} else
The embedded web page is https://rumble.com/embed/vbxbfr/
Then I download the embedded web page and have some fun:
<script type="text/javascript">!function(l,a){function
d(){return(new Date).getTime()/1e3}var t,r,o,n,i,u,e=
"Rumble",f={F:0};(a=l[e]=l[e]||function(){a..push(arguments)}).=a._||[],f.f={},f.b={};f.f["vbxbfr"]= {"fps":29.97,"w":1920,"h":1080,"u":{"
mp4":{"url":"https:\/\/sp.rmbl.ws\/s8\/2\/J\/3\/k\/D\/J3kDb.caa.1.mp4","meta": ...
I dig out the mp4 and place it into $ClickHere with
if $Debug { print "$SubName: Entering ClickHere regexes\n"; }
$ClickHere = $EmbedWebPage;
$ClickHere ~~ s| .*? 'mp4":{"url":"' ||;
$ClickHere ~~ s| \" .* ||;
$ClickHere ~~ s:global| \\ ||;
if $Debug { PrintGreen "$SubName: ClickHere = <$ClickHere>\n"; }
# exit;
The location of the (mp4) video ($ClickHere) is https://sp.rmbl.ws/s8/2/J/3/k/D/J3kDb.caa.1.mp4
Then I dig out the extension (mp4) with:
if $Debug { print "$SubName: NewFileName extenion extraction\n"; }
$Ext = $ClickHere;
$Ext ~~ s| .* '.' ||;
if $Debug { PrintBlue "$SubName: Ext = <$Ext>\n"; }
The Extension ($Ext) is mp4
Then I dig out the name of the video with:
# <head>
# <title>The Piano Soundtrack (guitar cover) - Rumble</title>
$NewFileName = $EmbedWebPage;
$NewFileName ~~ s| '</title' .* ||;
$NewFileName ~~ s| .* "title>" ||;
if $Debug { PrintBlue "extracted title <$NewFileName>\n"; }
Then I pull out the spaces from the file name to make cURL happy:
$NewFileName ~~ s:global| " " |_|;
$NewFileName = $WorkingDir ~ Q[/] ~ $NewFileName ~ Q[.] ~ $Ext;
if $Debug { PrintGreen "$SubName: NewFileName = <$NewFileName>\n"; }
The name of the video ($NewFileName) is The_PianoSoundtrack(guitarcover)-_Rumble.mp4
So now cURL has all the information it need to download the file and store it where I want.
I wrote a little bash script that gets everything I currently need... Gets the first video of the channel/user if you put that in as the url, otherwise it gets the info for the video that is given. If you put in a 2nd thing in there, it saves a json similar to youtube-dl.
#!/bin/bash
if [[ ! $1 ]]; then
echo "usage:
$(basename "$0") https://rumble.com/...... [JSONtoSave]"
exit 1
fi
RumbleVideo="$(curl -s "$1" \ |
xmllint --html --xpath '/html/body/main/div/div[2]/div[1]/ol/li/article/a/@href' - 2> /dev/null \
| sed -n 's/ href="\([^"]\{0,\}\)"$/https:\/\/rumble.com\1/p')"
if [[ $RumbleVideo ]]; then
echo "Rumble Video: $RumbleVideo"
else
RumbleVideo="$1"
fi
RumbleMeta="$(curl -s "$RumbleVideo" \
| xmllint --html --xpath 'string(//script[@type="application/ld+json"])' - 2> /dev/null )"
RumbleEmbed="$( echo "$RumbleMeta" | jq -r '.[0].embedUrl' )"
Rumble_description="$( echo "$RumbleMeta" | jq -r '.[0].description' )"
Rumble_thumbnailUrl="$( echo "$RumbleMeta" | jq -r '.[0].thumbnailUrl' )"
Rumble_name="$( echo "$RumbleMeta" | jq -r '.[0].name' )"
if [[ $RumbleEmbed ]]; then
tmpscript=$(curl -s "$RumbleEmbed" | xmllint --html --xpath 'string(//script[@type="text/javascript"])' - 2> /dev/null )
echo "$tmpscript" > /Temp/javascript.js
# echo "Test: $test"
if [[ $(echo "$tmpscript" | grep 'live":true') ]]; then
echo "Video is LIVE"
live=true
else
live=false
echo "Video is NOT LIVE"
fi
Rumble_HLS="$( echo "$tmpscript" | grep 'hls":{"url":"https:\|"mp4":{"url"' | sed -e 's!.*"hls":{"url":"!!' -e 's!.*"mp4":{"url":"!!' -e 's!.*"1080":{"url":"!!' -e 's!".*!!' -e 's!\\!!g' )"
# Rumble_HLS="$( curl -s "$RumbleEmbed" | grep 'hls":{"url":"https:\|"mp4":{"url"' )"
echo "Title: $Rumble_name"
echo "Description: $Rumble_description"
echo "Thumbnail Url: $Rumble_thumbnailUrl"
echo "Rumble Embed Link: $RumbleEmbed"
echo "Rumble HLS: $Rumble_HLS"
fi
if [[ $2 ]]; then
jq -n --arg title "$Rumble_name" \
--arg description "$Rumble_description" \
--arg thumbnail "$Rumble_thumbnailUrl" \
--arg fulltitle "$Rumble_name" \
--arg manifest_url "$Rumble_HLS" \
--arg webpage_url "$RumbleEmbed" \
--arg isLive "$live" \
'{description: $description, thumbnail: $thumbnail, fulltitle: $fulltitle, manifest_url: $manifest_url, webpage_url: $webpage_url, isLive: $isLive }' > "$2"
else
jq -n --arg title "$Rumble_name" \
--arg description "$Rumble_description" \
--arg thumbnail "$Rumble_thumbnailUrl" \
--arg fulltitle "$Rumble_name" \
--arg manifest_url "$Rumble_HLS" \
--arg webpage_url "$RumbleEmbed" \
--arg isLive "$live" \
'{description: $description, thumbnail: $thumbnail, fulltitle: $fulltitle, manifest_url: $manifest_url, webpage_url: $webpage_url, isLive: $isLive }'
fi
Out of the box youtube-dl doesn't work for me for Rumble. Would love to see it implemented though.
I wrote a little bash script that gets everything I currently need... Gets the first video of the channel/user if you put that in as the url, otherwise it gets the info for the video that is given. If you put in a 2nd thing in there, it saves a json similar to youtube-dl.
#!/bin/bash if [[ ! $1 ]]; then echo "usage: $(basename "$0") https://rumble.com/...... [JSONtoSave]" exit 1 fi RumbleVideo="$(curl -s "$1" \ | xmllint --html --xpath '/html/body/main/div/div[2]/div[1]/ol/li/article/a/@href' - 2> /dev/null \ | sed -n 's/ href="\([^"]\{0,\}\)"$/https:\/\/rumble.com\1/p')" if [[ $RumbleVideo ]]; then echo "Rumble Video: $RumbleVideo" else RumbleVideo="$1" fi RumbleMeta="$(curl -s "$RumbleVideo" \ | xmllint --html --xpath 'string(//script[@type="application/ld+json"])' - 2> /dev/null )" RumbleEmbed="$( echo "$RumbleMeta" | jq -r '.[0].embedUrl' )" Rumble_description="$( echo "$RumbleMeta" | jq -r '.[0].description' )" Rumble_thumbnailUrl="$( echo "$RumbleMeta" | jq -r '.[0].thumbnailUrl' )" Rumble_name="$( echo "$RumbleMeta" | jq -r '.[0].name' )" if [[ $RumbleEmbed ]]; then tmpscript=$(curl -s "$RumbleEmbed" | xmllint --html --xpath 'string(//script[@type="text/javascript"])' - 2> /dev/null ) echo "$tmpscript" > /Temp/javascript.js # echo "Test: $test" if [[ $(echo "$tmpscript" | grep 'live":true') ]]; then echo "Video is LIVE" live=true else live=false echo "Video is NOT LIVE" fi Rumble_HLS="$( echo "$tmpscript" | grep 'hls":{"url":"https:\|"mp4":{"url"' | sed -e 's!.*"hls":{"url":"!!' -e 's!.*"mp4":{"url":"!!' -e 's!.*"1080":{"url":"!!' -e 's!".*!!' -e 's!\\!!g' )" # Rumble_HLS="$( curl -s "$RumbleEmbed" | grep 'hls":{"url":"https:\|"mp4":{"url"' )" echo "Title: $Rumble_name" echo "Description: $Rumble_description" echo "Thumbnail Url: $Rumble_thumbnailUrl" echo "Rumble Embed Link: $RumbleEmbed" echo "Rumble HLS: $Rumble_HLS" fi if [[ $2 ]]; then jq -n --arg title "$Rumble_name" \ --arg description "$Rumble_description" \ --arg thumbnail "$Rumble_thumbnailUrl" \ --arg fulltitle "$Rumble_name" \ --arg manifest_url "$Rumble_HLS" \ --arg webpage_url "$RumbleEmbed" \ --arg isLive "$live" \ '{description: $description, thumbnail: $thumbnail, fulltitle: $fulltitle, manifest_url: $manifest_url, webpage_url: $webpage_url, isLive: $isLive }' > "$2" else jq -n --arg title "$Rumble_name" \ --arg description "$Rumble_description" \ --arg thumbnail "$Rumble_thumbnailUrl" \ --arg fulltitle "$Rumble_name" \ --arg manifest_url "$Rumble_HLS" \ --arg webpage_url "$RumbleEmbed" \ --arg isLive "$live" \ '{description: $description, thumbnail: $thumbnail, fulltitle: $fulltitle, manifest_url: $manifest_url, webpage_url: $webpage_url, isLive: $isLive }' fi
Can you include some sample commands?
Out of the box youtube-dl doesn't work for me for Rumble. Would love to see it implemented though.
Use the EMBED IFRAME URL.
Out of the box youtube-dl doesn't work for me for Rumble. Would love to see it implemented though.
Use the EMBED IFRAME URL.
Why can't the extractor grab the Embed Iframe url, that's the actual fix not me clicking around and other people stumbling over it.
Rumble doesn't necessary use iframes when embedding videos. See for example: https://americasfrontlinedoctors.org/videos/white-coat-summit-the-one-year-anniversary/
Could we get support for rumble, please? Thanks!
Why not just have a function that searches for the "embedUrl" in the html of a video page
"embedUrl":"https://rumble.com/embed/abcxyz0/"
Why not just have a function that searches for the "embedUrl" in the html of a video page
"embedUrl":"https://rumble.com/embed/abcxyz0/"
Seems like a fine solution to me.
Would have to aggregate the URLs from the channel pages and the dates from the datetime
tag, then search each URL for the embedURL
tag.
I don't mean to kill your enthusiasm, but finding out how to trace embedded URLs back to rumble.com will not help without support in youtube-dl for rumble.com.
I am able to do it. I am not sure what the issue is.
Your missing an antecedent. What is "it"?
Get the rumble embedUrl from the html page, which result works as url for youtube-dl:
wget -O- https://rumble.com/vkownr-summit-sessions-the-law-todd-callender-jd-how-to-file-a-criminal-complaint.html | sed -n -E 's/^.*embedUrl...([^"]+).*$/\1/p'
@ballsystemlord
[debug] youtube-dl version 2021.01.08
Sorry, I don't know Python to do the same thing. Could put this in ~/.bashrc ---
rumble-dl() {
[ -n "$1" ] && for s in $*
do url=`wget -O- $s | sed -n -E 's/^.*embedUrl...([^"]+).*$/\1/p'`
[ -n "$url" ] && youtube-dl $url
done
}
and then
rumble-dl https://rumble.com/vkownr-summit-sessions-the-law-todd-callender-jd-how-to-file-a-criminal-complaint.html
Get the rumble embedUrl from the html page, which result works as url for youtube-dl:
wget -O- https://rumble.com/vkownr-summit-sessions-the-law-todd-callender-jd-how-to-file-a-criminal-complaint.html | sed -n -E 's/^.*embedUrl...([^"]+).*$/\1/p'
@ballsystemlord
[debug] youtube-dl version 2021.01.08
Sorry, I don't know Python to do the same thing. Could put this in ~/.bashrc ---
rumble-dl() { [ -n "$1" ] && for s in $* do url=`wget -O- $s | sed -n -E 's/^.*embedUrl...([^"]+).*$/\1/p'` [ -n "$url" ] && youtube-dl $url done }
and then
rumble-dl https://rumble.com/vkownr-summit-sessions-the-law-todd-callender-jd-how-to-file-a-criminal-complaint.html
works great here ! thanks for the workaround !
Yes, that works well.
+1
BTW, https://github.com/yt-dlp/yt-dlp is a Port of youtube-dl, but it adds more fixes and features. It has had Rumble support for a while. YouTube-dl needs to backport some of the changes that yt-dlp has. But Hey, I have moved on to yt-dlp. The commands are also backward compatible with Youtube-dl, so you won't have a learning curve.
@o6uoq
Noting for the record that while youtube-dl supports the "embed" version of a given URL, this trick does not work for any video that is currently being live-streamed. Thus one cannot use mpv with built-in ytdl hook on an "embed" URL if it's live the way one can on a youtube video.
nb. if the url for embed on live is https://rumble.com/embed/v1jhm8u/ the corresponding m3u8 live link seems to be v1jhm8u -> 1jhm8u https://rumble.com/live-hls-dvr/1jhm8u/playlist.m3u8 (which you can open with vlc)
Please follow the guide below
x
into all the boxes [ ] relevant to your issue (like that [x])Make sure you are using the latest version: run
youtube-dl --version
and ensure your version is 2016.09.27. If it's not read this FAQ entry and update. Issues with outdated version will be rejected.Before submitting an issue make sure you have:
What is the purpose of your issue?
The following sections concretize particular purposed issues, you can erase any section (the contents between triple ---) not applicable to your issue
If the purpose of this issue is a bug report, site support request or you are not completely sure provide the full verbose output as follows:
Add
-v
flag to your command line you run youtube-dl with, copy the whole output and insert it here. It should look similar to one below (replace it with your log inserted between triple ```):If the purpose of this issue is a site support request please provide all kinds of example URLs support for which should be included (replace following example URLs by yours):
Description of your issue, suggested solution and other information
Explanation of your issue in arbitrary form goes here. Please make sure the description is worded well enough to be understood. Provide as much context and examples as possible. If work on your issue requires account credentials please provide them or explain how one can obtain them.