Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Youtube download link from http://www.youtube-mp3.org/

I've been using the http://www.youtube-mp3.org/ to obtain download links for mp3 songs for a "internet radio" project (download file stream and output it). Lately the http://www.youtube-mp3.org/ seemed to changed it's workflow. Till now I was able to obtain the proper format of the url:

http://www.youtube-mp3.org/get?ab=128&video_id=KMU0tzLwhbE&h=5671e7d33d4eccb5b89ea8f54d9911d4&r=1387110278658.1527580295

Whereas r=timestamp I did the timestamp myself as epoch. This worked well without the .1527580295 suffix. Unfortunetly this seems to be needed as the link without the suffix redirects back to the conversion site.

Up till now the algorithim was as mentioned:

Youtube mp3 org linq acquiring explained

http://www.youtube-mp3.org/api/itemInfo/?video_id=#{video_id}&ac=www&r=#{Time.now.to_i}

Does any one know how to obtain the suffix part?

//Hey, I'm not much of an web programming guy ... but this is something I have surely overlooked. Thanks!

Added this to my small C# API.

  <!-- language: c# -->
    const int AM = 65521;
    int GetCCSufix(string a)
    {            
        int c = 1, b = 0, d, e;
        var chars = a.ToCharArray();
        for(e =0; e< chars.Length; e ++)
        {
            d = chars[e];
            c = (c + d) % AM;
            b = (b + c) % AM;
        }
        return b << 16 | c;
    }

Works great ;)

like image 268
okipol Avatar asked Dec 15 '13 12:12

okipol


1 Answers

I don't know what this suffix means but reading the client javascript file from youtube-mp3.org you can learn how to generate it.

var __AM=65521; // the largest prime less than 2^16...
function cc(a){
    var c = 1, b = 0, d, e;
    for(e = 0; e < a.length; e++){
        d = a.charCodeAt(e);
        c = (c+d)%__AM;
        b = (b+c)%__AM;
    }
    return b<<16|c;
}

The generated media URL is :

"http://www.youtube-mp3.org/get?ab=128&video_id="+video_id+"&h="+info.h+"&r="+timeNow+"."+cc(video_id+timeNow)

with

var timeNow = Date.now().toString();
like image 73
Raphaël Avatar answered Oct 19 '22 06:10

Raphaël