Repository: ytdl-org/youtube-dl

Issue:
openload.co extractor not working
 youtube-dl --get-url --verbose  https://openload.co/embed/kUEfGclsU9o/
[debug] System config: []
[debug] User config: []
[debug] Command-line args: [u'--get-url', u'--verbose', u'https://openload.co/embed/kUEfGclsU9o/']
[debug] Encodings: locale UTF-8, fs UTF-8, out UTF-8, pref UTF-8
[debug] youtube-dl version 2016.08.22
[debug] Python version 2.6.6 - Linux-2.6.32-642.1.1.el6.x86_64-x86_64-with-centos-6.8-Final
[debug] exe versions: ffmpeg 0.6.5, ffprobe 0.6.5
[debug] Proxy map: {}
ERROR: Unable to extract link image; please report this issue on https://yt-dl.org/bug . Make sure you are using the latest version; type  youtube-dl -U  to update. Be sure to call youtube-dl with the --verbose flag and include its complete output.
Traceback (most recent call last):
  File "/usr/local/bin/youtube-dl/youtube_dl/YoutubeDL.py", line 691, in extract_info
    ie_result = ie.extract(url)
  File "/usr/local/bin/youtube-dl/youtube_dl/extractor/common.py", line 347, in extract
    return self._real_extract(url)
  File "/usr/local/bin/youtube-dl/youtube_dl/extractor/openload.py", line 62, in _real_extract
    r'<img[^>]+id="linkimg"[^>]+src="([^"]+)"', webpage, 'link image')
  File "/usr/local/bin/youtube-dl/youtube_dl/extractor/common.py", line 650, in _search_regex
    raise RegexNotFoundError('Unable to extract %s' % _name)
RegexNotFoundError: Unable to extract link image; please report this issue on https://yt-dl.org/bug . Make sure you are using the latest version; type  youtube-dl -U  to update. Be sure to call youtube-dl with the --verbose flag and include its complete output.



Discussion:
they've changed the video link obfuscation to a very simple method, lol

openload video link extraction script
http://pastebin.com/PJ4SFqBM

A nice hit! @yokrysty Did you write this script? If so could you declare this script as Public Domain or UNLICENSE so that it can be used in youtube-dl?

yes i wrote it now in 5 min :), yes you can use it

before decrypting the data make sure you replace all the html entities
i updated the script with html replacing

Many thanks @yokrysty Would you like to be listed on [AUTHORS](https://github.com/rg3/youtube-dl/blob/master/AUTHORS) for the openload algorithm?

i don't mind :)

OK Anyway thanks for the code :)

Thank you, too.
Could anyone explain me, how i change the new code to my exist youtube-dl setups on my servers. The release 2016.08.22 didn't have the updated code.

Before a new version is released, you can download https://github.com/rg3/youtube-dl/archive/master.zip and unzip it.

Amazing! Thank you very much ;)

we're getting pigeons again

Confirmed.

@yan12125  the change is not major: at the last char code in the array add 2 then convert it to char
http://pastebin.com/xXZv59Jc

Many thanks again! Updated.

They updated their site again. Add 1 instead of 2. Maybe this gets changed throughout the day?

Or, they are watching this repo today. It's working two hours ago.

then do it like this
oldown.py http://pastebin.com/zW4sGyZd
aa_decode.py http://pastebin.com/jFtB8dhi

:)

Just tried it. The latest commit is still working. Doesn't it work for you? @yokrysty 

This is not working because the number added to last char code is variable.
At now it is 1 not 2.

I've changed 2 to 1 in 98908bc, and it's still working. Feel free to leave a comment if its algorithm is changed again.

@yan12125  use my method from above where I read the number that needs to be added from the javascript

I see. Will integrate it the next time `var_val` is changed.

seems that they're now migrating to the canvas method, but on a different host.

Its a 3 now.

yes, its a 3!

seems like @yokrysty's method might be a better plan since it reads the var_val, however using it's own list of emoji's to decrypt might be less robust since a small edit to the list would break the script.

check out this method http://pastebin.com/QZRcczrN  xd

dependencies:
pip install pyside
pip install ghost.py

@yokrysty I think it's the best approach since Openload updates their obfuscate algorithm frequently.

@NitroXenon maybe if we could do this without adding two dependencies to youtube-dl.

@bigmittens Alright. Take a look at this. This is working currently

https://github.com/tknorris/script.module.urlresolver/blob/master/lib/urlresolver/plugins/ol_gmu.py

But it uses GPLv3

@NitroXenon its basically my method that i posted 9 days ago, scroll up

@gdkchan please help us 😩

@yokrysty http://pastebin.com/jFtB8dhi and http://pastebin.com/zW4sGyZd now gives penguins.

@bigmittens Help with what? Well they are not using AAEncode on the obfuscation of the main HiddenURL decoding JavaScript function, that's why the script yokristy made are all broken (including the last one that tries to decode the AAEncode, but not the one that uses an entire browser to get the link lol). Other than this the code is the same, and they are still adding 3 to the last character.

They seems to be using a moving target approach now, but the method was pretty much the same for one week now, so I think it's feasible to just keep updating the extractor when they update it. The only other solution that would require less frequen fixes would be having a entire javascript engine running the link decoding functions.

now they use jjencode (the js above the AAEncoded js)
[here](https://hackvertor.co.uk/hvurl/49#PEBkX29jdGFsXzE+PEBkX2pqZW5jb2RlXzA+aj1+W107aj17X19fOisraiwkJCQkOighW10rIiIpW2pdLF9fJDorK2osJF8kXzooIVtdKyIiKVtqXSxfJF86KytqLCRfJCQ6KHt9KyIiKVtqXSwkJF8kOihqW2pdKyIiKVtqXSxfJCQ6KytqLCQkJF86KCEiIisiIilbal0sJF9fOisraiwkXyQ6KytqLCQkX186KHt9KyIiKVtqXSwkJF86KytqLCQkJDorK2osJF9fXzorK2osJF9fJDorK2p9O2ouJF89KGouJF89aisiIilbai4kXyRdKyhqLl8kPWouJF9bai5fXyRdKSsoai4kJD0oai4kKyIiKVtqLl9fJF0pKygoIWopKyIiKVtqLl8kJF0rKGouX189ai4kX1tqLiQkX10pKyhqLiQ9KCEiIisiIilbai5fXyRdKSsoai5fPSghIiIrIiIpW2ouXyRfXSkrai4kX1tqLiRfJF0rai5fXytqLl8kK2ouJDtqLiQkPWouJCsoISIiKyIiKVtqLl8kJF0rai5fXytqLl8rai4kK2ouJCQ7ai4kPShqLl9fXylbai4kX11bai4kX107ai4kKGouJChqLiQkKyJcIiIrIiQoIitqLiQkXyQrai5fJCtqLiQkX18rai5fKyJcXCIrai5fXyQrai4kXyQrai4kXyQrai4kJCRfKyJcXCIrai5fXyQrai4kXyQrai4kJF8rai5fXysiKS5cXCIrai5fXyQrai4kJF8rai5fJF8rai4kJCRfK2ouJF8kXytqLiQkXyQrIlxcIitqLl9fJCtqLiQkJCtqLl9fJCsiKCIrai4kJCQkK2ouXysiXFwiK2ouX18kK2ouJF8kK2ouJCRfK2ouJCRfXytqLl9fKyJcXCIrai5fXyQrai4kXyQrai5fXyQrai5fJCsiXFwiK2ouX18kK2ouJF8kK2ouJCRfKyIoKVxcIitqLiRfXytqLl9fXysie1xcIitqLl9fJCtqLiRfJCsiXFwiK2ouX18kK2ouXyRfKyJcXCIrai5fXyQrai5fXyQrIlxcIitqLl9fJCtqLiQkXytqLiQkXytqLiRfJF8rIlxcIitqLl9fJCtqLiQkXytqLl8kXysiXFwiK2ouJF9fK2ouX19fKyJcXCIrai5fXyQrai4kJCQrai5fX18rIlxcIitqLiRfXytqLl9fXysiPVxcIitqLiRfXytqLl9fXysiJChcXFwiI1xcIitqLl9fJCtqLiRfJCtqLl9fXysiXFwiK2ouX18kK2ouJF8kK2ouX18kK2ouJCRfJCtqLiQkXyQrai4kJCRfKyJcXCIrai5fXyQrai4kXyQrai4kJF8rai5fKyJcXCIrai5fXyQrai4kJF8rai5fJF8rKCFbXSsiIilbai5fJF9dKyJcXFwiKS4iK2ouX18rai4kJCRfKyJcXCIrai5fXyQrai4kJCQrai5fX18rai5fXysiKCk7XFwiK2ouX18kK2ouJF8kKyJcXCIrai5fXyQrai5fJF8rIlxcIitqLl9fJCtqLl9fJCsiXFwiK2ouX18kK2ouJCRfK2ouJCRfK2ouJF8kXysiXFwiK2ouX18kK2ouJCRfK2ouXyRfKyJcXCIrai4kX18rai5fX18rIlxcIitqLl9fJCtqLiQkXytqLl8kJCsiPVtdOyIrai4kJCQkK2ouXyQrIlxcIitqLl9fJCtqLiQkXytqLl8kXysiKFxcIitqLl9fJCtqLiQkXytqLiQkXytqLiRfJF8rIlxcIitqLl9fJCtqLiQkXytqLl8kXysiXFwiK2ouJF9fK2ouX19fKyJcXCIrai5fXyQrai4kXyQrai5fXyQrIj0iK2ouX19fKyI7XFwiK2ouX18kK2ouJF8kK2ouX18kKyI8XFwiK2ouX18kK2ouJCQkK2ouX19fKyIuIisoIVtdKyIiKVtqLl8kX10rai4kJCRfKyJcXCIrai5fXyQrai4kXyQrai4kJF8rIlxcIitqLl9fJCtqLiRfXytqLiQkJCtqLl9fKyJcXCIrai5fXyQrai4kXyQrai5fX18rIjtcXCIrai5fXyQrai4kXyQrai5fXyQrIisrKXtcXCIrai5fXyQrai4kJF8rai4kJF8rai4kXyRfKyJcXCIrai5fXyQrai4kJF8rai5fJF8rIlxcIitqLiRfXytqLl9fXysiXFwiK2ouX18kK2ouJF8kK2ouXyRfKyI9XFwiK2ouX18kK2ouJCQkK2ouX19fKyIuIitqLiQkX18rIlxcIitqLl9fJCtqLiRfJCtqLl9fXytqLiRfJF8rIlxcIitqLl9fJCtqLiQkXytqLl8kXysiXFwiK2ouX18kK2ouX19fK2ouXyQkK2ouXyQrai4kJF8kK2ouJCQkXysiXFwiK2ouX18kK2ouX19fK2ouX18kK2ouX18rIihcXCIrai5fXyQrai4kXyQrai5fXyQrIik7XFwiK2ouX18kK2ouJF8kK2ouX18kK2ouJCQkJCsiKChcXCIrai5fXyQrai4kXyQrai5fJF8rIj49IitqLl8kJCtqLl8kJCsiKSYmKFxcIitqLl9fJCtqLiRfJCtqLl8kXysiPD0iK2ouX18kK2ouXyRfK2ouJCRfKyIpKXtcXCIrai5fXyQrai4kJF8rai5fJCQrIltcXCIrai5fXyQrai4kXyQrai5fXyQrIl09XFwiK2ouX18kK2ouXyRfK2ouXyQkK2ouX18rIlxcIitqLl9fJCtqLiQkXytqLl8kXysiXFwiK2ouX18kK2ouJF8kK2ouX18kKyJcXCIrai5fXyQrai4kXyQrai4kJF8rIlxcIitqLl9fJCtqLiRfXytqLiQkJCsiLiIrai4kJCQkKyJcXCIrai5fXyQrai4kJF8rai5fJF8rai5fJCsiXFwiK2ouX18kK2ouJF8kK2ouJF8kKyJcXCIrai5fXyQrai5fX18rai5fJCQrIlxcIitqLl9fJCtqLiRfJCtqLl9fXytqLiRfJF8rIlxcIitqLl9fJCtqLiQkXytqLl8kXysiXFwiK2ouX18kK2ouX19fK2ouXyQkK2ouXyQrai4kJF8kK2ouJCQkXysiKCIrai5fJCQrai5fJCQrIisoKFxcIitqLl9fJCtqLiRfJCtqLl8kXysiKyIrai5fXyQrai4kX18rIiklIitqLiRfXyQrai4kX18rIikpO30iK2ouJCQkXysoIVtdKyIiKVtqLl8kX10rIlxcIitqLl9fJCtqLiQkXytqLl8kJCtqLiQkJF8rIntcXCIrai5fXyQrai4kJF8rai5fJCQrIltcXCIrai5fXyQrai4kXyQrai5fXyQrIl09XFwiK2ouX18kK2ouXyRfK2ouXyQkK2ouX18rIlxcIitqLl9fJCtqLiQkXytqLl8kXysiXFwiK2ouX18kK2ouJF8kK2ouX18kKyJcXCIrai5fXyQrai4kXyQrai4kJF8rIlxcIitqLl9fJCtqLiRfXytqLiQkJCsiLiIrai4kJCQkKyJcXCIrai5fXyQrai4kJF8rai5fJF8rai5fJCsiXFwiK2ouX18kK2ouJF8kK2ouJF8kKyJcXCIrai5fXyQrai5fX18rai5fJCQrIlxcIitqLl9fJCtqLiRfJCtqLl9fXytqLiRfJF8rIlxcIitqLl9fJCtqLiQkXytqLl8kXysiXFwiK2ouX18kK2ouX19fK2ouXyQkK2ouXyQrai4kJF8kK2ouJCQkXysiKFxcIitqLl9fJCtqLiRfJCtqLl8kXysiKTt9fVxcIitqLl9fJCtqLiRfJCsiXFwiK2ouX18kK2ouXyRfKyJcXCIrai5fXyQrai5fXyQrIlxcIitqLl9fJCtqLiQkXytqLiQkXytqLiRfJF8rIlxcIitqLl9fJCtqLiQkXytqLl8kXysiXFwiK2ouJF9fK2ouX19fK2ouX18rIlxcIitqLl9fJCtqLiRfJCtqLiRfJCsiXFwiK2ouX18kK2ouJCRfK2ouX19fKyI9XFwiK2ouX18kK2ouJCRfK2ouXyQkKyIuXFwiK2ouX18kK2ouJF8kK2ouXyRfK2ouXyQrIlxcIitqLl9fJCtqLiRfJCtqLl9fJCsiXFwiK2ouX18kK2ouJF8kK2ouJCRfKyIoXFxcIlxcXCIpO1xcIitqLl9fJCtqLiRfJCsiXFwiK2ouX18kK2ouXyRfKyJcXCIrai5fXyQrai5fXyQrIlxcIitqLl9fJCtqLiQkXytqLiQkXytqLiRfJF8rIlxcIitqLl9fJCtqLiQkXytqLl8kXysiXFwiK2ouJF9fK2ouX19fKyJcXCIrai5fXyQrai4kJF8rai5fJCQrai5fXysiXFwiK2ouX18kK2ouJCRfK2ouXyRfKyJcXCIrai4kX18rai5fX18rIj1cXCIrai4kX18rai5fX18rai5fXysiXFwiK2ouX18kK2ouJF8kK2ouJF8kKyJcXCIrai5fXyQrai4kJF8rai5fX18rIi5cXCIrai5fXyQrai4kJF8rai5fJCQrai5fK2ouJF8kJCsiXFwiK2ouX18kK2ouJCRfK2ouXyQkK2ouX18rIlxcIitqLl9fJCtqLiQkXytqLl8kXysiXFwiK2ouX18kK2ouJF8kK2ouX18kKyJcXCIrai5fXyQrai4kXyQrai4kJF8rIlxcIitqLl9fJCtqLiRfXytqLiQkJCsiKCIrai5fX18rIixcXCIrai4kX18rai5fX18rai5fXysiXFwiK2ouX18kK2ouJF8kK2ouJF8kKyJcXCIrai5fXyQrai4kJF8rai5fX18rIi4iKyghW10rIiIpW2ouXyRfXStqLiQkJF8rIlxcIitqLl9fJCtqLiRfJCtqLiQkXysiXFwiK2ouX18kK2ouJF9fK2ouJCQkK2ouX18rIlxcIitqLl9fJCtqLiRfJCtqLl9fXysiXFwiK2ouJF9fK2ouX19fKyItXFwiK2ouJF9fK2ouX19fK2ouX18kKyIpXFwiK2ouJF9fK2ouX19fKyIrXFwiK2ouJF9fK2ouX19fKyJcXCIrai5fXyQrai5fJF8rai5fJCQrai5fXysiXFwiK2ouX18kK2ouJCRfK2ouXyRfKyJcXCIrai5fXyQrai4kXyQrai5fXyQrIlxcIitqLl9fJCtqLiRfJCtqLiQkXysiXFwiK2ouX18kK2ouJF9fK2ouJCQkKyIuIitqLiQkJCQrIlxcIitqLl9fJCtqLiQkXytqLl8kXytqLl8kKyJcXCIrai5fXyQrai4kXyQrai4kXyQrIlxcIitqLl9fJCtqLl9fXytqLl8kJCsiXFwiK2ouX18kK2ouJF8kK2ouX19fK2ouJF8kXysiXFwiK2ouX18kK2ouJCRfK2ouXyRfKyJcXCIrai5fXyQrai5fX18rai5fJCQrai5fJCtqLiQkXyQrai4kJCRfKyIoIitqLl9fKyJcXCIrai5fXyQrai4kXyQrai4kXyQrIlxcIitqLl9fJCtqLiQkXytqLl9fXysiLlxcIitqLl9fJCtqLiQkXytqLl8kJCsoIVtdKyIiKVtqLl8kX10rIlxcIitqLl9fJCtqLiRfJCtqLl9fJCtqLiQkX18rai4kJCRfKyIoLSIrai5fXyQrIikuIitqLiQkX18rIlxcIitqLl9fJCtqLiRfJCtqLl9fXytqLiRfJF8rIlxcIitqLl9fJCtqLiQkXytqLl8kXysiXFwiK2ouX18kK2ouX19fK2ouXyQkK2ouXyQrai4kJF8kK2ouJCQkXysiXFwiK2ouX18kK2ouX19fK2ouX18kK2ouX18rIigiK2ouX19fKyIpXFwiK2ouJF9fK2ouX19fKyIrXFwiK2ouJF9fK2ouX19fK2ouXyQkKyIpO1xcIitqLl9fJCtqLiRfJCsiXFwiK2ouX18kK2ouXyRfKyJcXCIrai5fXyQrai5fXyQrIiQoXFxcIiNcXCIrai5fXyQrai4kJF8rai5fJCQrai5fXysiXFwiK2ouX18kK2ouJCRfK2ouXyRfK2ouJCQkXytqLiRfJF8rIlxcIitqLl9fJCtqLiRfJCtqLiRfJCtqLl8rIlxcIitqLl9fJCtqLiQkXytqLl8kXysoIVtdKyIiKVtqLl8kX10rIlxcXCIpLiIrai5fXytqLiQkJF8rIlxcIitqLl9fJCtqLiQkJCtqLl9fXytqLl9fKyIoXFwiK2ouX18kK2ouJCRfK2ouXyQkK2ouX18rIlxcIitqLl9fJCtqLiQkXytqLl8kXysiKTtcXCIrai5fXyQrai4kXyQrIlxcIitqLl9fJCtqLl8kXysifSk7XFwiK2ouX18kK2ouJF8kKyJcXCIrai5fXyQrai5fJF8rIlwiIikoKSkoKTs8QC9kX2pqZW5jb2RlXzA+PEAvZF9vY3RhbF8xPg==) is the script decoded

@gdkchan is right - a real Javascript engine might be the final solution...
I see @yokrysty proposed using a browser engine to get the video URL. It's not a good approach. In browser engines, anything can happen. User data may be uploaded to hacker's servers. So, real browser engines should not enter youtube-dl. On the other hand, modern Javascript engines have sandboxes, where only ECMAScript standard objects are accessible. I guess it's unlikely to have security issues.

@yan12125 I didn't proposed cause those are licensed and writing one from scratch, not worth the time, I just did a demo, btw I am pretty sure ghost.py is sandboxed

Edit:
@yan12125 can you use [this ](https://github.com/crackinglandia/python-jjdecoder) decoder for jjEncode?

I see - I was concerning things like file uploading. Seems both ghost.py and PhantomJS handles it well. 

License is not a problem if youtube-dl does not bundle ghost.py files. A previous case is PyCrypto (#8201).

jjencode/aaencode isnt an issue, but does someone actually know where the #streamurl lies?

Is it on the:

```
<script type="text/javascript">
eval (function(p,a,c,k,e,d)
```

part?

You are funny, because everything is working but now there is need add +3 to last char.
Do you really need, so many days and discussion?
You simple can change +1 to +3 and then you can discuss.

Please refrain from offensive words.

@yan12125
Were you see "offensive words" in my message?

For me "funny" is. I may be too strict. I just try to keep peaceful discussions.

But, you are really funny. Observing this discussion. 
In my opinion you should rather say "THANKS" instead of writing "Please refrain from offensive words.".

In my opinion you are not good person to moderate anything here. 
Why? Because you do basic errors. For example taking my code without inform me as I requested.

I confess I didn't do everything well. Being late to push simple fixes is one.

> taking my code without inform me as I requested.

Your codes are **never** integrated into rg3/youtube-dl. In fact I've never looked into your version as it couldn't be used in youtube-dl, so I didn't notice @Belderak's version was different from @gdkchan's.

You want to use my code taken by other user. So, what is the difference?
Also maybe you will check based on which code auto signatures decryption for youtube have been made?

Please stop to discredit yourself.

> You want to use my code taken by other user.

Wrong. Before your first post, all I can tell is that @Belderak's version was based on @gdkchan's, and the latter is clean.

You want to say that. You not know. So, everything is OK?
You should ask @Belderak if he is authot of this code. 
Any way the problem is not from where the code was taken the problem is because it not problem for me.
But I asked to copy also from where the code was taken that's all.

Also you think that there is no problem when I spent a hours of reverse engineering to write a code and then some one based on my code write his own and not inform based on which code he write his own in your opinion this is OK.

NOT THIS IS NOT! Because not problem to write the code when you exactly know algorithm.
You really do not understand this? What a man.

> You should ask @Belderak if he is authot of this code.

Yes that's the point. I should, and will be more careful in the future. I just want to clarify I didn't mean to take your codes without informing you.

@samsamsam-iptvplayer initial signature decryption has been [impemented](https://github.com/rg3/youtube-dl/pull/900) by @jaimeMF and reversed by @FiloSottile. Later on it's been maintained by the same persons and @phihag. JS interpreter has been written by @phihag and then maintained by youtube-dl developers. Thus this claim is complete bullshit until proved.

If you are able to reverse, this does not mean nobody else can do. "Don't think you are a navel of the World" as you like to blame others.

> Also you think that there is no problem when I spent a hours of reverse engineering to write a code and then some one based on my code write his own and not inform based on which code he write his own in your opinion this is OK.

If you don't want anybody to write something based on your code then don't make it public. It's impossible to get protected against another code written based on whatever one's code (either with mentioning the source or without it). Moreover it's very problematic to prove the similarity until there are obvious similar patterns discovered. There are lots of codes reversed by youtube-dl developers (by myself in particular) that are used in other projects either modified or intact without any mentioning of the source. And we don't really care about that.

After all, we technically can't control the origin of the code and we assume honesty of the person providing it (even if we ask about the authorship this basically changes nothing since one may lie).

If you are so concerned leave your name I'll add it to AUTHORS.

Thanks @dstftw the history before my first contribution is quite interesting and fascinating. It's a bad thing that I have no time to understand how youtube-dl grows to such a large project. ChangeLog compensates the blank to some extent. That's one of the reasons that I hope there's a ChangeLog in this project. 

@dstftw 
" Thus this claim is complete bullshit until proved."
Are you all right? I do not thinks so. This is not claim, only information.
really you do not know what you're saying.

At frist please check issues:
https://github.com/rg3/youtube-dl/issues/1208
https://github.com/rg3/youtube-dl/pull/1216

Also ask @phihag based on which code he write his code.

I'm waiting for apology.

This proves nothing. I see no typical similarities between this code and @phihag's implementation. Only not so well written and stylistically non-pythonic code.

> I'm waiting for apology.

For what? For using open source program code (Even if)?

I don't think you really know how this works. Better educate yourself.

"For what?"

For this: "bullshit"

@dstftw
You are programmer and not see? If you are programmer and not see please ask.
What a person...

I think that you know perfectly well. But you have no honor to say: "Sorry I do not know".

@Hrxn
"I don't think you really know how this works. Better educate yourself."
Really? I think you do not know how open source works. 

Well... I don't think that @yan12125 did anything wrong at all... Because first, afaik this is a volunteer work, so no one is obligated to do anything in the first place... He was discussing the best way to face the recent changes, because he could change the code to use + 3 instead of + 1, and openload could change the values once again a few hours later, making his effort useless.

Those inflammatory comments and discussion over code that is not even being used anymore seems pretty pointless and childish too...

@JustMeDaFaq 
The streamurl is a span tag on the HTML of the page, something like `span id="streamurl">HERE IS THE LINK</span>`, and then theres an AAEncoded script that assigns the value that comes out of the hiddenurl decoder to this tag. The function that decodes the hiddenurl is the JJEncoded one,

@gdkchan 
Effort changing 1 to 3. Yes, this is really big effort.

"childish" - are you read with understanding?

Another demonstration of total ignorance. There is no sense to further discuss.
In this thread there are some persons without honor. This is a clue.
Have fun.

Is it just me getting pigeons or did they changed theyre method again?

Nope, they didn't, I get pigeons too, and I checked that java script that they run and the last number is still 3

@baron19  so, any idea why were getting pigeons? :D

I'm trying to figure it out, but no luck yet. I can open it from any browser though, is that also the case with you?

@baron19  Yeah, can watch it via any browser 
The script is still in JJEncode? Cant actually find it anymore.

It seems like, they changed it again. It's not a JJEncoded script anymore.

Yes, it's not JJEncoded anymore, but they are still using the same method, they just changed the value that is added to the last character to 2. I checked with a couple of links and it works. 

This is what I got after de-obfuscating it

http://pastebin.com/xsUxcY37

@baron19 
Could you may give an hint on how you deobfuscated it?

And thanks btw

@JustMeDaFaq  

I used this -> https://addons.mozilla.org/en-US/firefox/addon/javascript-deobfuscator/

It just shows all the javascript that the browser is running. 

So, yeah, I have no clue where that code is or where that 2 or sometimes 3 is coming from.

@baron19 Thanks! Works fawlessly with using 2 instead of 3!

This is still JJEncode but before it is additionally obfuscated:
https://gitlab.com/iptvplayer-for-e2/iptvplayer-for-e2/commit/f3a5a0b6521731438072bb37bd351983e55bb16c

there are multiple levels of encryption.
for the example url from the issue:
the code for decryption can be found in first line of the last inline script in the wabpage.

``` javascript
eval (function(p,a,c,k,e,d){e=function(c){return c};if(!''.replace(/^/,String)){while(c--){d[c]=k[c]||c}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}(function(z){var a="0%3Z%7A%5X%5Z%3X0%3Z%7X3%3W%2X%2X0%2Y%24%24%24%24%3W%28%21%5X%5Z%2X%22%22%29%5X0%5Z%2Y2%24%3W%2X%2X0%2Y%241%241%3W%28%21%5X%5Z%2X%22%22%29%5X0%5Z%2Y1%241%3W%2X%2X0%2Y%241%24%24%3W%28%7X%7Z%2X%22%22%29%5X0%5Z%2Y%24%241%24%3W%280%5X0%5Z%2X%22%22%29%5X0%5Z%2Y1%24%24%3W%2X%2X0%2Y%24%24%241%3W%28%21%22%22%2X%22%22%29%5X0%5Z%2Y%242%3W%2X%2X0%2Y%241%24%3W%2X%2X0%2Y%24%242%3W%28%7X%7Z%2X%22%22%29%5X0%5Z%2Y%24%241%3W%2X%2X0%2Y%24%24%24%3W%2X%2X0%2Y%243%3W%2X%2X0%2Y%242%24%3W%2X%2X0%7Z%3X0.%241%3Z%280.%241%3Z0%2X%22%22%29%5X0.%241%24%5Z%2X%280.1%24%3Z0.%241%5X0.2%24%5Z%29%2X%280.%24%24%3Z%280.%24%2X%22%22%29%5X0.2%24%5Z%29%2X%28%28%210%29%2X%22%22%29%5X0.1%24%24%5Z%2X%280.2%3Z0.%241%5X0.%24%241%5Z%29%2X%280.%24%3Z%28%21%22%22%2X%22%22%29%5X0.2%24%5Z%29%2X%280.1%3Z%28%21%22%22%2X%22%22%29%5X0.1%241%5Z%29%2X0.%241%5X0.%241%24%5Z%2X0.2%2X0.1%24%2X0.%24%3X0.%24%24%3Z0.%24%2X%28%21%22%22%2X%22%22%29%5X0.1%24%24%5Z%2X0.2%2X0.1%2X0.%24%2X0.%24%24%3X0.%24%3Z%280.3%29%5X0.%241%5Z%5X0.%241%5Z%3X0.%24%280.%24%280.%24%24%2X%22%5Y%22%22%2X%22%24%28%22%2X0.%24%241%24%2X0.1%24%2X0.%24%242%2X0.1%2X%22%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.%241%24%2X0.%24%24%241%2X%22%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.%24%241%2X0.2%2X%22%29.%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.1%241%2X0.%24%24%241%2X0.%241%241%2X0.%24%241%24%2X%22%5Y%5Y%22%2X0.2%24%2X0.%24%24%24%2X0.2%24%2X%22%28%22%2X0.%24%24%24%24%2X0.1%2X%22%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.%24%241%2X0.%24%242%2X0.2%2X%22%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.2%24%2X0.1%24%2X%22%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.%24%241%2X%22%28%29%5Y%5Y%22%2X0.%242%2X0.3%2X%22%7X%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X%22%5Y%5Y%22%2X0.2%24%2X0.1%241%2X%22%5Y%5Y%22%2X0.2%24%2X0.2%24%2X%22%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.%24%241%2X0.%241%241%2X%22%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.1%241%2X%22%5Y%5Y%22%2X0.%242%2X0.3%2X%22%5Y%5Y%22%2X0.2%24%2X0.%24%24%24%2X0.3%2X%22%5Y%5Y%22%2X0.%242%2X0.3%2X%22%3Z%5Y%5Y%22%2X0.%242%2X0.3%2X%22%24%28%5Y%5Y%5Y%22%23%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.3%2X%22%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.2%24%2X0.%24%241%24%2X0.%24%241%24%2X0.%24%24%241%2X%22%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.%24%241%2X0.1%2X%22%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.1%241%2X%28%21%5X%5Z%2X%22%22%29%5X0.1%241%5Z%2X%22%5Y%5Y%5Y%22%29.%22%2X0.2%2X0.%24%24%241%2X%22%5Y%5Y%22%2X0.2%24%2X0.%24%24%24%2X0.3%2X0.2%2X%22%28%29%3X%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X%22%5Y%5Y%22%2X0.2%24%2X0.1%241%2X%22%5Y%5Y%22%2X0.2%24%2X0.2%24%2X%22%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.%24%241%2X0.%241%241%2X%22%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.1%241%2X%22%5Y%5Y%22%2X0.%242%2X0.3%2X%22%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.1%24%24%2X%22%3Z%5X%5Z%3X%22%2X0.%24%24%24%24%2X0.1%24%2X%22%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.1%241%2X%22%28%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.%24%241%2X0.%241%241%2X%22%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.1%241%2X%22%5Y%5Y%22%2X0.%242%2X0.3%2X%22%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.2%24%2X%22%3Z%22%2X0.3%2X%22%3X%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.2%24%2X%22%3Y%5Y%5Y%22%2X0.2%24%2X0.%24%24%24%2X0.3%2X%22.%22%2X%28%21%5X%5Z%2X%22%22%29%5X0.1%241%5Z%2X0.%24%24%241%2X%22%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.%24%241%2X%22%5Y%5Y%22%2X0.2%24%2X0.%242%2X0.%24%24%24%2X0.2%2X%22%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.3%2X%22%3X%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.2%24%2X%22%2X%2X%29%7X%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.%24%241%2X0.%241%241%2X%22%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.1%241%2X%22%5Y%5Y%22%2X0.%242%2X0.3%2X%22%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.1%241%2X%22%3Z%5Y%5Y%22%2X0.2%24%2X0.%24%24%24%2X0.3%2X%22.%22%2X0.%24%242%2X%22%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.3%2X0.%241%241%2X%22%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.1%241%2X%22%5Y%5Y%22%2X0.2%24%2X0.3%2X0.1%24%24%2X0.1%24%2X0.%24%241%24%2X0.%24%24%241%2X%22%5Y%5Y%22%2X0.2%24%2X0.3%2X0.2%24%2X0.2%2X%22%28%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.2%24%2X%22%29%3X%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.2%24%2X0.%24%24%24%24%2X%22%28%28%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.1%241%2X%22%3A%3Z%22%2X0.1%24%24%2X0.1%24%24%2X%22%29%26%26%28%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.1%241%2X%22%3Y%3Z%22%2X0.2%24%2X0.1%241%2X0.%24%241%2X%22%29%29%7X%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.1%24%24%2X%22%5X%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.2%24%2X%22%5Z%3Z%5Y%5Y%22%2X0.2%24%2X0.1%241%2X0.1%24%24%2X0.2%2X%22%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.1%241%2X%22%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.2%24%2X%22%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.%24%241%2X%22%5Y%5Y%22%2X0.2%24%2X0.%242%2X0.%24%24%24%2X%22.%22%2X0.%24%24%24%24%2X%22%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.1%241%2X0.1%24%2X%22%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.%241%24%2X%22%5Y%5Y%22%2X0.2%24%2X0.3%2X0.1%24%24%2X%22%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.3%2X0.%241%241%2X%22%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.1%241%2X%22%5Y%5Y%22%2X0.2%24%2X0.3%2X0.1%24%24%2X0.1%24%2X0.%24%241%24%2X0.%24%24%241%2X%22%28%22%2X0.1%24%24%2X0.1%24%24%2X%22%2X%28%28%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.1%241%2X%22%2X%22%2X0.2%24%2X0.%242%2X%22%29%25%22%2X0.%242%24%2X0.%242%2X%22%29%29%3X%7Z%22%2X0.%24%24%241%2X%28%21%5X%5Z%2X%22%22%29%5X0.1%241%5Z%2X%22%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.1%24%24%2X0.%24%24%241%2X%22%7X%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.1%24%24%2X%22%5X%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.2%24%2X%22%5Z%3Z%5Y%5Y%22%2X0.2%24%2X0.1%241%2X0.1%24%24%2X0.2%2X%22%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.1%241%2X%22%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.2%24%2X%22%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.%24%241%2X%22%5Y%5Y%22%2X0.2%24%2X0.%242%2X0.%24%24%24%2X%22.%22%2X0.%24%24%24%24%2X%22%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.1%241%2X0.1%24%2X%22%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.%241%24%2X%22%5Y%5Y%22%2X0.2%24%2X0.3%2X0.1%24%24%2X%22%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.3%2X0.%241%241%2X%22%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.1%241%2X%22%5Y%5Y%22%2X0.2%24%2X0.3%2X0.1%24%24%2X0.1%24%2X0.%24%241%24%2X0.%24%24%241%2X%22%28%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.1%241%2X%22%29%3X%7Z%7Z%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X%22%5Y%5Y%22%2X0.2%24%2X0.1%241%2X%22%5Y%5Y%22%2X0.2%24%2X0.2%24%2X%22%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.%24%241%2X0.%241%241%2X%22%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.1%241%2X%22%5Y%5Y%22%2X0.%242%2X0.3%2X0.2%2X%22%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.%241%24%2X%22%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.3%2X%22%3Z%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.1%24%24%2X%22.%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.1%241%2X0.1%24%2X%22%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.2%24%2X%22%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.%24%241%2X%22%28%5Y%5Y%5Y%22%5Y%5Y%5Y%22%29%3X%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X%22%5Y%5Y%22%2X0.2%24%2X0.1%241%2X%22%5Y%5Y%22%2X0.2%24%2X0.2%24%2X%22%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.%24%241%2X0.%241%241%2X%22%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.1%241%2X%22%5Y%5Y%22%2X0.%242%2X0.3%2X%22%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.1%24%24%2X0.2%2X%22%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.1%241%2X%22%5Y%5Y%22%2X0.%242%2X0.3%2X%22%3Z%5Y%5Y%22%2X0.%242%2X0.3%2X0.2%2X%22%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.%241%24%2X%22%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.3%2X%22.%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.1%24%24%2X0.1%2X0.%241%24%24%2X%22%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.1%24%24%2X0.2%2X%22%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.1%241%2X%22%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.2%24%2X%22%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.%24%241%2X%22%5Y%5Y%22%2X0.2%24%2X0.%242%2X0.%24%24%24%2X%22%28%22%2X0.3%2X%22%2Y%5Y%5Y%22%2X0.%242%2X0.3%2X0.2%2X%22%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.%241%24%2X%22%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.3%2X%22.%22%2X%28%21%5X%5Z%2X%22%22%29%5X0.1%241%5Z%2X0.%24%24%241%2X%22%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.%24%241%2X%22%5Y%5Y%22%2X0.2%24%2X0.%242%2X0.%24%24%24%2X0.2%2X%22%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.3%2X%22%5Y%5Y%22%2X0.%242%2X0.3%2X%22-%5Y%5Y%22%2X0.%242%2X0.3%2X0.2%24%2X%22%29%5Y%5Y%22%2X0.%242%2X0.3%2X%22%2X%5Y%5Y%22%2X0.%242%2X0.3%2X%22%5Y%5Y%22%2X0.2%24%2X0.1%241%2X0.1%24%24%2X0.2%2X%22%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.1%241%2X%22%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.2%24%2X%22%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.%24%241%2X%22%5Y%5Y%22%2X0.2%24%2X0.%242%2X0.%24%24%24%2X%22.%22%2X0.%24%24%24%24%2X%22%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.1%241%2X0.1%24%2X%22%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.%241%24%2X%22%5Y%5Y%22%2X0.2%24%2X0.3%2X0.1%24%24%2X%22%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.3%2X0.%241%241%2X%22%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.1%241%2X%22%5Y%5Y%22%2X0.2%24%2X0.3%2X0.1%24%24%2X0.1%24%2X0.%24%241%24%2X0.%24%24%241%2X%22%28%22%2X0.2%2X%22%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.%241%24%2X%22%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.3%2X%22.%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.1%24%24%2X%28%21%5X%5Z%2X%22%22%29%5X0.1%241%5Z%2X%22%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.2%24%2X0.%24%242%2X0.%24%24%241%2X%22%28-%22%2X0.2%24%2X%22%29.%22%2X0.%24%242%2X%22%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.3%2X0.%241%241%2X%22%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.1%241%2X%22%5Y%5Y%22%2X0.2%24%2X0.3%2X0.1%24%24%2X0.1%24%2X0.%24%241%24%2X0.%24%24%241%2X%22%5Y%5Y%22%2X0.2%24%2X0.3%2X0.2%24%2X0.2%2X%22%28%22%2X0.3%2X%22%29%5Y%5Y%22%2X0.%242%2X0.3%2X%22%2X%5Y%5Y%22%2X0.%242%2X0.3%2X0.1%241%2X%22%29%3X%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X%22%5Y%5Y%22%2X0.2%24%2X0.1%241%2X%22%5Y%5Y%22%2X0.2%24%2X0.2%24%2X%22%24%28%5Y%5Y%5Y%22%23%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.1%24%24%2X0.2%2X%22%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.1%241%2X0.%24%24%241%2X0.%241%241%2X%22%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X0.%241%24%2X0.1%2X%22%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.1%241%2X%28%21%5X%5Z%2X%22%22%29%5X0.1%241%5Z%2X%22%5Y%5Y%5Y%22%29.%22%2X0.2%2X0.%24%24%241%2X%22%5Y%5Y%22%2X0.2%24%2X0.%24%24%24%2X0.3%2X0.2%2X%22%28%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.1%24%24%2X0.2%2X%22%5Y%5Y%22%2X0.2%24%2X0.%24%241%2X0.1%241%2X%22%29%3X%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X%22%5Y%5Y%22%2X0.2%24%2X0.1%241%2X%22%7Z%29%3X%5Y%5Y%22%2X0.2%24%2X0.%241%24%2X%22%5Y%5Y%22%2X0.2%24%2X0.1%241%2X%22%5Y%22%22%29%28%29%29%28%29%3X";return decodeURIComponent(a.replace(/[a-zA-Z]/g,function(c){return String.fromCharCode((c<="Z"?90:122)>=(c=c.charCodeAt(0)+z)?c:c-26);}));}(4),4,4,('j^_^__^___'+'').split("^"),0,{}))
```

decrypted to:

``` javascript
j=~[];j={___:++j,$$$$:(![]+"")[j],__$:++j,$_$_:(![]+"")[j],_$_:++j,$_$$:({}+"")[j],$$_$:(j[j]+"")[j],_$$:++j,$$$_:(!""+"")[j],$__:++j,$_$:++j,$$__:({}+"")[j],$$_:++j,$$$:++j,$___:++j,$__$:++j};j.$_=(j.$_=j+"")[j.$_$]+(j._$=j.$_[j.__$])+(j.$$=(j.$+"")[j.__$])+((!j)+"")[j._$$]+(j.__=j.$_[j.$$_])+(j.$=(!""+"")[j.__$])+(j._=(!""+"")[j._$_])+j.$_[j.$_$]+j.__+j._$+j.$;j.$$=j.$+(!""+"")[j._$$]+j.__+j._+j.$+j.$$;j.$=(j.___)[j.$_][j.$_];j.$(j.$(j.$$+"\""+"$("+j.$$_$+j._$+j.$$__+j._+"\\"+j.__$+j.$_$+j.$_$+j.$$$_+"\\"+j.__$+j.$_$+j.$$_+j.__+").\\"+j.__$+j.$$_+j._$_+j.$$$_+j.$_$_+j.$$_$+"\\"+j.__$+j.$$$+j.__$+"("+j.$$$$+j._+"\\"+j.__$+j.$_$+j.$$_+j.$$__+j.__+"\\"+j.__$+j.$_$+j.__$+j._$+"\\"+j.__$+j.$_$+j.$$_+"()\\"+j.$__+j.___+"{\\"+j.__$+j.$_$+"\\"+j.__$+j._$_+"\\"+j.__$+j.__$+"\\"+j.__$+j.$$_+j.$$_+j.$_$_+"\\"+j.__$+j.$$_+j._$_+"\\"+j.$__+j.___+"\\"+j.__$+j.$$$+j.___+"\\"+j.$__+j.___+"=\\"+j.$__+j.___+"$(\\\"#\\"+j.__$+j.$_$+j.___+"\\"+j.__$+j.$_$+j.__$+j.$$_$+j.$$_$+j.$$$_+"\\"+j.__$+j.$_$+j.$$_+j._+"\\"+j.__$+j.$$_+j._$_+(![]+"")[j._$_]+"\\\")."+j.__+j.$$$_+"\\"+j.__$+j.$$$+j.___+j.__+"();\\"+j.__$+j.$_$+"\\"+j.__$+j._$_+"\\"+j.__$+j.__$+"\\"+j.__$+j.$$_+j.$$_+j.$_$_+"\\"+j.__$+j.$$_+j._$_+"\\"+j.$__+j.___+"\\"+j.__$+j.$$_+j._$$+"=[];"+j.$$$$+j._$+"\\"+j.__$+j.$$_+j._$_+"(\\"+j.__$+j.$$_+j.$$_+j.$_$_+"\\"+j.__$+j.$$_+j._$_+"\\"+j.$__+j.___+"\\"+j.__$+j.$_$+j.__$+"="+j.___+";\\"+j.__$+j.$_$+j.__$+"<\\"+j.__$+j.$$$+j.___+"."+(![]+"")[j._$_]+j.$$$_+"\\"+j.__$+j.$_$+j.$$_+"\\"+j.__$+j.$__+j.$$$+j.__+"\\"+j.__$+j.$_$+j.___+";\\"+j.__$+j.$_$+j.__$+"++){\\"+j.__$+j.$$_+j.$$_+j.$_$_+"\\"+j.__$+j.$$_+j._$_+"\\"+j.$__+j.___+"\\"+j.__$+j.$_$+j._$_+"=\\"+j.__$+j.$$$+j.___+"."+j.$$__+"\\"+j.__$+j.$_$+j.___+j.$_$_+"\\"+j.__$+j.$$_+j._$_+"\\"+j.__$+j.___+j._$$+j._$+j.$$_$+j.$$$_+"\\"+j.__$+j.___+j.__$+j.__+"(\\"+j.__$+j.$_$+j.__$+");\\"+j.__$+j.$_$+j.__$+j.$$$$+"((\\"+j.__$+j.$_$+j._$_+">="+j._$$+j._$$+")&&(\\"+j.__$+j.$_$+j._$_+"<="+j.__$+j._$_+j.$$_+")){\\"+j.__$+j.$$_+j._$$+"[\\"+j.__$+j.$_$+j.__$+"]=\\"+j.__$+j._$_+j._$$+j.__+"\\"+j.__$+j.$$_+j._$_+"\\"+j.__$+j.$_$+j.__$+"\\"+j.__$+j.$_$+j.$$_+"\\"+j.__$+j.$__+j.$$$+"."+j.$$$$+"\\"+j.__$+j.$$_+j._$_+j._$+"\\"+j.__$+j.$_$+j.$_$+"\\"+j.__$+j.___+j._$$+"\\"+j.__$+j.$_$+j.___+j.$_$_+"\\"+j.__$+j.$$_+j._$_+"\\"+j.__$+j.___+j._$$+j._$+j.$$_$+j.$$$_+"("+j._$$+j._$$+"+((\\"+j.__$+j.$_$+j._$_+"+"+j.__$+j.$__+")%"+j.$__$+j.$__+"));}"+j.$$$_+(![]+"")[j._$_]+"\\"+j.__$+j.$$_+j._$$+j.$$$_+"{\\"+j.__$+j.$$_+j._$$+"[\\"+j.__$+j.$_$+j.__$+"]=\\"+j.__$+j._$_+j._$$+j.__+"\\"+j.__$+j.$$_+j._$_+"\\"+j.__$+j.$_$+j.__$+"\\"+j.__$+j.$_$+j.$$_+"\\"+j.__$+j.$__+j.$$$+"."+j.$$$$+"\\"+j.__$+j.$$_+j._$_+j._$+"\\"+j.__$+j.$_$+j.$_$+"\\"+j.__$+j.___+j._$$+"\\"+j.__$+j.$_$+j.___+j.$_$_+"\\"+j.__$+j.$$_+j._$_+"\\"+j.__$+j.___+j._$$+j._$+j.$$_$+j.$$$_+"(\\"+j.__$+j.$_$+j._$_+");}}\\"+j.__$+j.$_$+"\\"+j.__$+j._$_+"\\"+j.__$+j.__$+"\\"+j.__$+j.$$_+j.$$_+j.$_$_+"\\"+j.__$+j.$$_+j._$_+"\\"+j.$__+j.___+j.__+"\\"+j.__$+j.$_$+j.$_$+"\\"+j.__$+j.$$_+j.___+"=\\"+j.__$+j.$$_+j._$$+".\\"+j.__$+j.$_$+j._$_+j._$+"\\"+j.__$+j.$_$+j.__$+"\\"+j.__$+j.$_$+j.$$_+"(\\\"\\\");\\"+j.__$+j.$_$+"\\"+j.__$+j._$_+"\\"+j.__$+j.__$+"\\"+j.__$+j.$$_+j.$$_+j.$_$_+"\\"+j.__$+j.$$_+j._$_+"\\"+j.$__+j.___+"\\"+j.__$+j.$$_+j._$$+j.__+"\\"+j.__$+j.$$_+j._$_+"\\"+j.$__+j.___+"=\\"+j.$__+j.___+j.__+"\\"+j.__$+j.$_$+j.$_$+"\\"+j.__$+j.$$_+j.___+".\\"+j.__$+j.$$_+j._$$+j._+j.$_$$+"\\"+j.__$+j.$$_+j._$$+j.__+"\\"+j.__$+j.$$_+j._$_+"\\"+j.__$+j.$_$+j.__$+"\\"+j.__$+j.$_$+j.$$_+"\\"+j.__$+j.$__+j.$$$+"("+j.___+",\\"+j.$__+j.___+j.__+"\\"+j.__$+j.$_$+j.$_$+"\\"+j.__$+j.$$_+j.___+"."+(![]+"")[j._$_]+j.$$$_+"\\"+j.__$+j.$_$+j.$$_+"\\"+j.__$+j.$__+j.$$$+j.__+"\\"+j.__$+j.$_$+j.___+"\\"+j.$__+j.___+"-\\"+j.$__+j.___+j.__$+")\\"+j.$__+j.___+"+\\"+j.$__+j.___+"\\"+j.__$+j._$_+j._$$+j.__+"\\"+j.__$+j.$$_+j._$_+"\\"+j.__$+j.$_$+j.__$+"\\"+j.__$+j.$_$+j.$$_+"\\"+j.__$+j.$__+j.$$$+"."+j.$$$$+"\\"+j.__$+j.$$_+j._$_+j._$+"\\"+j.__$+j.$_$+j.$_$+"\\"+j.__$+j.___+j._$$+"\\"+j.__$+j.$_$+j.___+j.$_$_+"\\"+j.__$+j.$$_+j._$_+"\\"+j.__$+j.___+j._$$+j._$+j.$$_$+j.$$$_+"("+j.__+"\\"+j.__$+j.$_$+j.$_$+"\\"+j.__$+j.$$_+j.___+".\\"+j.__$+j.$$_+j._$$+(![]+"")[j._$_]+"\\"+j.__$+j.$_$+j.__$+j.$$__+j.$$$_+"(-"+j.__$+")."+j.$$__+"\\"+j.__$+j.$_$+j.___+j.$_$_+"\\"+j.__$+j.$$_+j._$_+"\\"+j.__$+j.___+j._$$+j._$+j.$$_$+j.$$$_+"\\"+j.__$+j.___+j.__$+j.__+"("+j.___+")\\"+j.$__+j.___+"+\\"+j.$__+j.___+j._$_+");\\"+j.__$+j.$_$+"\\"+j.__$+j._$_+"\\"+j.__$+j.__$+"$(\\\"#\\"+j.__$+j.$$_+j._$$+j.__+"\\"+j.__$+j.$$_+j._$_+j.$$$_+j.$_$_+"\\"+j.__$+j.$_$+j.$_$+j._+"\\"+j.__$+j.$$_+j._$_+(![]+"")[j._$_]+"\\\")."+j.__+j.$$$_+"\\"+j.__$+j.$$$+j.___+j.__+"(\\"+j.__$+j.$$_+j._$$+j.__+"\\"+j.__$+j.$$_+j._$_+");\\"+j.__$+j.$_$+"\\"+j.__$+j._$_+"});\\"+j.__$+j.$_$+"\\"+j.__$+j._$_+"\"")())();
```

decrypted to:

```
$(docu\155e\156t).\162ead\171(fu\156ct\151o\156()\40{\15\12\11\166a\162\40\170\40=\40$(\"#\150\151dde\156u\162l\").te\170t();\15\12\11\166a\162\40\163=[];fo\162(\166a\162\40\151=0;\151<\170.le\156\147t\150;\151++){\166a\162\40\152=\170.c\150a\162\103ode\101t(\151);\151f((\152>=33)&&(\152<=126)){\163[\151]=\123t\162\151\156\147.f\162o\155\103\150a\162\103ode(33+((\152+14)%94));}el\163e{\163[\151]=\123t\162\151\156\147.f\162o\155\103\150a\162\103ode(\152);}}\15\12\11\166a\162\40t\155\160=\163.\152o\151\156(\"\");\15\12\11\166a\162\40\163t\162\40=\40t\155\160.\163ub\163t\162\151\156\147(0,\40t\155\160.le\156\147t\150\40-\401)\40+\40\123t\162\151\156\147.f\162o\155\103\150a\162\103ode(t\155\160.\163l\151ce(-1).c\150a\162\103ode\101t(0)\40+\402);\15\12\11$(\"#\163t\162ea\155u\162l\").te\170t(\163t\162);\15\12});\15\12
```

unescaped to:

``` javascript
$(document).ready(function() {

    var x = $("#hiddenurl").text();

    var s=[];for(var i=0;i<x.length;i++){var j=x.charCodeAt(i);if((j>=33)&&(j<=126)){s[i]=String.fromCharCode(33+((j+14)%94));}else{s[i]=String.fromCharCode(j);}}

    var tmp=s.join("");

    var str = tmp.substring(0, tmp.length - 1) + String.fromCharCode(tmp.slice(-1).charCodeAt(0) + 2);

    $("#streamurl").text(str);

});

```

Pigeons again. 

They added another span tag right below the hidden URL with a seemingly random Id name, and is using that instead of the HiddenURL itself. It's pretty easy to grab it with a regex through, something like `<span id=\"[\w-]{10}\">(.+?)</span>`.

Yeah, I noticed that, but how are they generating that tag?

The name is generated on the server.

I quickly improvised some code to get the real video url with success so far, feel free to use it how ever you want :)
http://pastebin.com/EjcSpZyE

Even with the recently introduced changes by @jnbdz, still pidgeons

Thanks to @daniel100097 (#10727), openload is fixed.

They will change it sooner than you think. Only solution for such stubborn sites would be actual JS engine.

> They will change it sooner than you think.

It's surprising for me that they didn't change it in 9 hours.

Doesn't really matter, all it takes is one simple and easy commit with changes to `youtube_dl/extractor/openload.py`, which can be done here, on this site, in your browser.
Just a few seconds...

Edit:

The full link...

https://github.com/rg3/youtube-dl/blob/master/youtube_dl/extractor/openload.py

Broken again :D

Nah, still works for me. 

Pigeons a.k.a. broken again. I'm using  2016.10.19

Pigeons again. Add 3 instead of 2.  
Also, this is basically all they added. Hilarious!

``` javascript
function nWuEkcMO4z() {
    return 2 + 1;
}
```

Thanks updated!

the obfuscated code changes periodically.
for example on one invocation you get this code:

```
$(document).ready(function() {
    var y = $("#zHCzsPtNLbx").text();
    var x = $("#zHCzsPtNLb").text();
    var s = [];
    for (var i = 0; i < y.length; i++) {
        var j = y.charCodeAt(i);
        if ((j >= 33) && (j <= 126)) {
            s[i] = String.fromCharCode(33 + ((j + 14) % 94));
        } else {
            s[i] = String.fromCharCode(j);
        }
    }
    var tmp = s.join("");
    var str = tmp.substring(0, tmp.length - _CoRPE1bSt9()) + String.fromCharCode(tmp.slice(0 - _CoRPE1bSt9()).charCodeAt(0) + _0oN0h2PZmC()) + tmp.substring(tmp.length - _CoRPE1bSt9() + 1);
    $("#streamurl").text(str);
});

function nWuEkcMO4z() {
    return 2 + 1;
}

function _CoRPE1bSt9() {
    return nWuEkcMO4z() + 1478067443 - 1478067445;
}

function _0oN0h2PZmC() {
    return _CoRPE1bSt9() - _7L9xjpbs4N();
}

function _7L9xjpbs4N() {
    return -2;
}
```

after sometime you get another code that change the names of the functions and the values returned:

```
$(document).ready(function() {
    var y = $("#Y4zn66ZGffx").text();
    var x = $("#Y4zn66ZGff").text();
    var s = [];
    for (var i = 0; i < y.length; i++) {
        var j = y.charCodeAt(i);
        if ((j >= 33) && (j <= 126)) {
            s[i] = String.fromCharCode(33 + ((j + 14) % 94));
        } else {
            s[i] = String.fromCharCode(j);
        }
    }
    var tmp = s.join("");
    var str = tmp.substring(0, tmp.length - _z4PH29hWyZ()) + String.fromCharCode(tmp.slice(0 - _z4PH29hWyZ()).charCodeAt(0) + _9p4KA2Owka()) + tmp.substring(tmp.length - _z4PH29hWyZ() + 1);
    $("#streamurl").text(str);
});

function nWuEkcMO4z() {
    return 2 + 1;
}

function _z4PH29hWyZ() {
    return nWuEkcMO4z() + 1478069447 - 1478069445;
}

function _9p4KA2Owka() {
    return _z4PH29hWyZ() - _b85AjZu8sA();
}

function _b85AjZu8sA() {
    return 3;
}
```

The first function always returns a 3 and if the result of the second and third function are subtracted from each other the result is always the value of the fourth.

That may help with figuring out how the initial numbers are being generated or it may just be a coincidence, its probably pretty obvious but i'm too tired to think right now.

@remitamine Where exactly is the obfuscated code on the video page's source code? Is it the one on the bottom?
Edit: Nevermind, you explained it in a earlier post.

why not use the new API used in Kodi? (see urlresolver)
visit https://api.openload.co/1/streaming/get?file={media_id}
if the message is: IP address not authorized. Visit https://openload.co/pair
tell the user to visit the pair page from above, follow the instructions then visit again https://api.openload.co/1/streaming/get?file={media_id} to obtain the media url
for 4 hours any stream can be used

CAPTCHA are not supported yet (#154). And in the case of https://openload.co/pair, I guess youtube-dl need to launch a browser. Unlike Kodi, youtube-dl is a command line program, so exchanging data with browsers would be complicated

you don't need captcha you just inform the user to open browser and pair, then for 4 hours he can download and you can launch the browser from command line

@samsamsam-iptvplayer's approach :
https://gitlab.com/iptvplayer-for-e2/iptvplayer-for-e2/commit/9f99dfbe5ec5592cb5a105f31d6dec9b15fc9744

> The first function always returns a 3 and if the result of the second and third function are subtracted from each other the result is always the value of the fourth.

This is wrong. You based your conclusion only on those two examples above. 

I've taken a quick look They change one char in last part of url.  To one of last 7 chars random value form range 1-3 is added. And that's all. Same thing as before, but now it isn't always last char and value is random. There is no way to predict where "token" was broken. 

P.S Since they add only values from 1-3 range simple brute forcing proper url works fine :D 

I didn't use the examples to check, but yeah i was totally wrong.

Anyway, looks like the best way to get around this is to AADecode then get the values via regex like what @samsamsam-iptvplayer did.

@TwelveCharzz Yeah something like that. I think @yokrysty approach should only be used when there's no way to extract the link programmatically from the webpage.

openload fix 
https://github.com/mrknow/filmkodi/blob/telewizjada_i_wizja/script.mrknow.urlresolver/lib/urlresolver9/plugins/openload.py

thanks @mrknow ! it indeed work by this method. its all in the return of functions. just match them

This is my approach:
https://github.com/NitroXenon/Terrarium-Public/blob/gh-pages/openload.js#L30-L110

It simply translates the whole function to make it capable to evaluate using js eval().

Thanks to @kasper93, it's working again!

https://openload.co/stream/nJ5WmuyOh3c~1379490585~2001:19f0::~l7eMTCK6?mime=true
Bug:  {"status":403,"msg":"wrong IP"}

Which video are you downloading? And did you pull down the latest git version?

Thanks all of you. Now I ported in java for my personal application and You are free to use it whenever you want to use it. http://pastebin.com/FUCmgw5i
@Makgun.   Thanks , I can implement some parts of your cod3 in my own youtube-dl-java project. You can use it , its open source after all
looks like it is not working any more do u have a update or any solution this is the erro i get:

Traceback (most recent call last):
  File "C:\Users\xxx\Documents\aaaaa.py", line 57, in <module>
    raise Exception("Video link encrypted data is not available.")
Exception: Video link encrypted data is not available.

even if your url or mine
Just tried and it's still working:
```
$ youtube-dl -v "https://openload.co/embed/kUEfGclsU9o/"
[debug] System config: []
[debug] User config: []
[debug] Command-line args: ['-v', 'https://openload.co/embed/kUEfGclsU9o/']
[debug] Encodings: locale UTF-8, fs utf-8, out UTF-8, pref UTF-8
[debug] youtube-dl version 2016.11.27
[debug] Git HEAD: c2530d3
[debug] Python version 3.5.2 - Linux-4.8.10-1-ARCH-x86_64-with-arch
[debug] exe versions: ffmpeg 3.2.1, ffprobe 3.2.1
[debug] Proxy map: {}
[Openload] kUEfGclsU9o: Downloading webpage
[debug] Invoking downloader on 'https://openload.co/stream/kUEfGclsU9o~1480488541~140.112.0.0~forydFaa?mime=true'
[download] Destination: skyrim_no-audio_1080.mp4-kUEfGclsU9o.mp4
[download] 100% of 9.80MiB in 01:31
```
Please make sure you're using the latest version (2016.11.27)
yes , its working 

 youtube-dl -v "https://openload.co/embed/kUEfGclsU9o/"
[debug] System config: []
[debug] User config: []
[debug] Command-line args: [u'-v', u'https://openload.co/embed/kUEfGclsU9o/']
[debug] Encodings: locale UTF-8, fs UTF-8, out UTF-8, pref UTF-8
[debug] youtube-dl version 2016.11.27
[debug] Python version 2.7.12 - Linux-4.4.0-47-generic-x86_64-with-LinuxMint-18-sarah
[debug] exe versions: ffmpeg 2.8.8-0ubuntu0.16.04.1, ffprobe 2.8.8-0ubuntu0.16.04.1
[debug] Proxy map: {}
[Openload] kUEfGclsU9o: Downloading webpage
[debug] Invoking downloader on u'https://openload.co/stream/kUEfGclsU9o~1480598193~47.29.0.0~qSQlHxGa?mime=true'
[download] Destination: skyrim_no-audio_1080.mp4-kUEfGclsU9o.mp4
[download]  24.1% of 9.80MiB at 133.15KiB/s ETA 00:57^C
ERROR: Interrupted by user

Traceback (most recent call last):
  File "C:\Users\danfl\Documents\aaaaa.py", line 57, in <module>
    raise Exception("Video link encrypted data is not available.")
Exception: Video link encrypted data is not available.

this is what i get 
but any way i dont what to download it , i just what to get that link show in your debug how do i code python to print me that link 

[debug] Invoking downloader on u'**https://openload.co/stream/kUEfGclsU9o~1480598193~47.29.0.0~qSQlHxGa?mime=true**'
What's in aaaaa.py?

On Dec 1, 2016 10:17 AM, "sonaldynho" <notifications@github.com> wrote:

> but any way i dont what to download it , i just what to get that link show
> in your debug how do i code python to print me that link
>
> [debug] Invoking downloader on u'*https://openload.co/stream/kUEfGclsU9o~1480598193~47.29.0.0~qSQlHxGa?mime=true
> <https://openload.co/stream/kUEfGclsU9o%7E1480598193%7E47.29.0.0%7EqSQlHxGa?mime=true>*
> '
>
> —
> You are receiving this because you modified the open/close state.
> Reply to this email directly, view it on GitHub
> <https://github.com/rg3/youtube-dl/issues/10408#issuecomment-264059574>,
> or mute the thread
> <https://github.com/notifications/unsubscribe-auth/AB2RGXV_22yD10MWoaVHBJlsZc91RSgCks5rDi43gaJpZM4JqWX->
> .
>

import sys, re, urllib2
from HTMLParser import HTMLParser
 
url = raw_input('url: ')
 
if not url:
    url = 'https://openload.co/embed/LFWZT-Ig3gk/'
 
_USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36'
 
_regex = re.compile(r'//.+?/(?:embed|f)/([0-9a-zA-Z-_]+)')
 
def get_embed_url(url):
    ids = _regex.findall(url)
    if ids:
        return 'https://openload.co/embed/%s/' % ids[0]
    return url
 
 
def getHtml(url):
    req = urllib2.Request(url)
    req.add_header('User-Agent', _USER_AGENT)
    req.add_header('Referer', url)
    response = urllib2.urlopen(req)
    html = response.read()
 
    try:
        content_type = response.headers.get('Content-Type')
        if 'charset=' in content_type:
            encoding = content_type.split('charset=')[-1]
    except:
        pass
 
    m = re.search(r'<meta\s+http-equiv="Content-Type"\s+content="(?:.+?);\s+charset=(.+?)"', html, re.IGNORECASE)
    if m:
        encoding = m.group(1)
 
    try:
        html = unicode(html, encoding)
    except:
        pass
   
    return html
 
 
print url
print '\n'
 
html = getHtml(get_embed_url(url))
 
if any(x in html for x in ['We are sorry', 'File not found']):
    raise Exception('The file was removed')
 
m = re.search(r'<span id="hiddenurl">(.+?)<\/span>', html)
 
if not m:
    raise Exception("Video link encrypted data is not available.")
 
enc_data = m.group(1).strip()
enc_data = HTMLParser().unescape(enc_data)
 
#print enc_data
 
video_url_chars = []
 
for c in enc_data:
    j = ord(c)
    if j >= 33 and j <= 126:
        j = ((j + 14) % 94) + 33
    video_url_chars += chr(j)
 
video_url = 'https://openload.co/stream/%s?mime=true'
video_url = video_url % (''.join(video_url_chars))
 
print video_url
 
raw_input()

this is in aaaaaa.py
aaaaaa.py is not a part of or related to youtube-dl.
@sonaldynho That's a very old version of openload.py. You may want to [use the youtube_dl library directly](https://github.com/rg3/youtube-dl/blob/master/README.md#embedding-youtube-dl) or copying the latest codes from https://github.com/rg3/youtube-dl/blob/master/youtube_dl/extractor/openload.py
Let's say I want to install in my addon what is the step by step on what to do ?????my addon is simple and have just the basics, 2 files addon.xml and default.py

I guess you're using Kodi (XBMC)? You may want to ask on Kodi forums for how to use youtube-dl in Kodi.
They are full of bull****** over there every time I ask something like that over there they say it is against the rules 
Guys could we stay on topic here? I watch this thread to get info about
openload in youtube-dl only. There are other channels to discuss different
topics.

Thanks.

yan12125 Do u have a e-mail or some way I can talk to u out side the post so I don't disturb evebody else
My email can be found on https://github.com/yan12125
They updated their site again.
So heres the new code they added:  
```js
ﾟωﾟﾉ= /｀ｍ´）ﾉ ~┻━┻   //*´∇｀*/ ['_']; o=(ﾟｰﾟ)  =_=3; c=(ﾟΘﾟ) =(ﾟｰﾟ)-(ﾟｰﾟ); (ﾟДﾟ) =(ﾟΘﾟ)= (o^_^o)/ (o^_^o);(ﾟДﾟ)={ﾟΘﾟ: '_' ,ﾟωﾟﾉ : ((ﾟωﾟﾉ==3) +'_') [ﾟΘﾟ] ,ﾟｰﾟﾉ :(ﾟωﾟﾉ+ '_')[o^_^o -(ﾟΘﾟ)] ,ﾟДﾟﾉ:((ﾟｰﾟ==3) +'_')[ﾟｰﾟ] }; (ﾟДﾟ) [ﾟΘﾟ] =((ﾟωﾟﾉ==3) +'_') [c^_^o];(ﾟДﾟ) ['c'] = ((ﾟДﾟ)+'_') [ (ﾟｰﾟ)+(ﾟｰﾟ)-(ﾟΘﾟ) ];(ﾟДﾟ) ['o'] = ((ﾟДﾟ)+'_') [ﾟΘﾟ];(ﾟoﾟ)=(ﾟДﾟ) ['c']+(ﾟДﾟ) ['o']+(ﾟωﾟﾉ +'_')[ﾟΘﾟ]+ ((ﾟωﾟﾉ==3) +'_') [ﾟｰﾟ] + ((ﾟДﾟ) +'_') [(ﾟｰﾟ)+(ﾟｰﾟ)]+ ((ﾟｰﾟ==3) +'_') [ﾟΘﾟ]+((ﾟｰﾟ==3) +'_') [(ﾟｰﾟ) - (ﾟΘﾟ)]+(ﾟДﾟ) ['c']+((ﾟДﾟ)+'_') [(ﾟｰﾟ)+(ﾟｰﾟ)]+ (ﾟДﾟ) ['o']+((ﾟｰﾟ==3) +'_') [ﾟΘﾟ];(ﾟДﾟ) ['_'] =(o^_^o) [ﾟoﾟ] [ﾟoﾟ];(ﾟεﾟ)=((ﾟｰﾟ==3) +'_') [ﾟΘﾟ]+ (ﾟДﾟ) .ﾟДﾟﾉ+((ﾟДﾟ)+'_') [(ﾟｰﾟ) + (ﾟｰﾟ)]+((ﾟｰﾟ==3) +'_') [o^_^o -ﾟΘﾟ]+((ﾟｰﾟ==3) +'_') [ﾟΘﾟ]+ (ﾟωﾟﾉ +'_') [ﾟΘﾟ]; (ﾟｰﾟ)+=(ﾟΘﾟ); (ﾟДﾟ)[ﾟεﾟ]='\\'; (ﾟДﾟ).ﾟΘﾟﾉ=(ﾟДﾟ+ ﾟｰﾟ)[o^_^o -(ﾟΘﾟ)];(oﾟｰﾟo)=(ﾟωﾟﾉ +'_')[c^_^o];(ﾟДﾟ) [ﾟoﾟ]='\"';(ﾟДﾟ) ['_'] ( (ﾟДﾟ) ['_'] (ﾟεﾟ+(ﾟДﾟ)[ﾟoﾟ]+ (ﾟДﾟ)[ﾟεﾟ]+(-~0)+ ((o^_^o) +(o^_^o) +(c^_^o))+ ((ﾟｰﾟ) + (o^_^o))+ (ﾟДﾟ)[ﾟεﾟ]+(-~0)+ ((ﾟｰﾟ) + (ﾟΘﾟ))+ (-~0)+ (ﾟДﾟ)[ﾟεﾟ]+(-~0)+ ((ﾟｰﾟ) + (ﾟΘﾟ))+ ((o^_^o) +(o^_^o) +(c^_^o))+ (ﾟДﾟ)[ﾟεﾟ]+(-~0)+ (-~3)+ (-~3)+ (ﾟДﾟ)[ﾟεﾟ]+(-~0)+ ((ﾟｰﾟ) + (ﾟΘﾟ))+ ((ﾟｰﾟ) + (o^_^o))+ (ﾟДﾟ)[ﾟεﾟ]+(-~0)+ ((o^_^o) +(o^_^o) +(c^_^o))+ ((ﾟｰﾟ) + (o^_^o))+ (ﾟДﾟ)[ﾟεﾟ]+((ﾟｰﾟ) + (ﾟΘﾟ))+ ((o^_^o) +(o^_^o) +(c^_^o))+ (ﾟДﾟ)[ﾟεﾟ]+(-~0)+ ((o^_^o) +(o^_^o) +(c^_^o))+ (-~1)+ (ﾟДﾟ)[ﾟεﾟ]+((ﾟｰﾟ) + (o^_^o))+ ((ﾟｰﾟ) + (ﾟΘﾟ))+ (ﾟДﾟ)[ﾟεﾟ]+(-~3)+ ((ﾟｰﾟ) + (o^_^o))+ (ﾟДﾟ)[ﾟεﾟ]+(-~0)+ ((c^_^o)-(c^_^o))+ (-~3)+ (ﾟДﾟ)[ﾟεﾟ]+(-~0)+ (-~0)+ ((ﾟｰﾟ) + (ﾟΘﾟ))+ (ﾟДﾟ)[ﾟεﾟ]+(-~0)+ ((ﾟｰﾟ) + (o^_^o))+ ((c^_^o)-(c^_^o))+ (ﾟДﾟ)[ﾟεﾟ]+(-~0)+ ((ﾟｰﾟ) + (o^_^o))+ (-~1)+ (ﾟДﾟ)[ﾟεﾟ]+(-~0)+ (-~1)+ (-~0)+ (ﾟДﾟ)[ﾟεﾟ]+(-~0)+ (-~1)+ ((c^_^o)-(c^_^o))+ (ﾟДﾟ)[ﾟεﾟ]+(-~0)+ (-~0)+ (-~0)+ (ﾟДﾟ)[ﾟεﾟ]+(-~0)+ ((ﾟｰﾟ) + (ﾟΘﾟ))+ (-~1)+ (ﾟДﾟ)[ﾟεﾟ]+(-~0)+ (-~0)+ (-~0)+ (ﾟДﾟ)[ﾟεﾟ]+((o^_^o) +(o^_^o) +(c^_^o))+ (-~1)+ (ﾟДﾟ)[ﾟεﾟ]+(-~3)+ ((ﾟｰﾟ) + (o^_^o))+ (ﾟДﾟ)[ﾟεﾟ]+((ﾟｰﾟ) + (o^_^o))+ (-~-~1)+ (ﾟДﾟ)[ﾟoﾟ]) (ﾟΘﾟ)) ('_');var _0x305e=['\x63\x6d\x56\x68\x5a\x48\x6b\x3d','\x64\x47\x56\x34\x64\x41\x3d\x3d','\x63\x33\x56\x69\x63\x33\x52\x79','\x62\x47\x56\x75\x5a\x33\x52\x6f','\x5a\x6e\x4a\x76\x62\x55\x4e\x6f\x59\x58\x4a\x44\x62\x32\x52\x6c','\x49\x33\x4e\x30\x63\x6d\x56\x68\x62\x58\x56\x79\x62\x41\x3d\x3d'];var _0x5694=function(_0x305ec9,_0x5694f8){var _0x305ec9=parseInt(_0x305ec9,0x10);var _0x3e3904=_0x305e[_0x305ec9];if(!_0x5694['\x61\x74\x6f\x62\x50\x6f\x6c\x79\x66\x69\x6c\x6c\x41\x70\x70\x65\x6e\x64\x65\x64']){(function(){var _0x42c25c=Function('\x72\x65\x74\x75\x72\x6e\x20\x28\x66\x75\x6e\x63\x74\x69\x6f\x6e\x20\x28\x29\x20'+'\x7b\x7d\x2e\x63\x6f\x6e\x73\x74\x72\x75\x63\x74\x6f\x72\x28\x22\x72\x65\x74\x75\x72\x6e\x20\x74\x68\x69\x73\x22\x29\x28\x29'+'\x29\x3b');var _0xc6b157=_0x42c25c();var _0x4469d5='\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x2b\x2f\x3d';_0xc6b157['\x61\x74\x6f\x62']||(_0xc6b157['\x61\x74\x6f\x62']=function(_0x2b92ae){var _0x3b3706=String(_0x2b92ae)['\x72\x65\x70\x6c\x61\x63\x65'](/=+$/,'');for(var _0xf3c59=0x0,_0x1c690b,_0x895967,_0x3fa331=0x0,_0x511535='';_0x895967=_0x3b3706['\x63\x68\x61\x72\x41\x74'](_0x3fa331++);~_0x895967&&(_0x1c690b=_0xf3c59%0x4?_0x1c690b*0x40+_0x895967:_0x895967,_0xf3c59++%0x4)?_0x511535+=String['\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65'](0xff&_0x1c690b>>(-0x2*_0xf3c59&0x6)):0x0){_0x895967=_0x4469d5['\x69\x6e\x64\x65\x78\x4f\x66'](_0x895967);}return _0x511535;});}());_0x5694['\x61\x74\x6f\x62\x50\x6f\x6c\x79\x66\x69\x6c\x6c\x41\x70\x70\x65\x6e\x64\x65\x64']=!![];}if(!_0x5694['\x62\x61\x73\x65\x36\x34\x44\x65\x63\x6f\x64\x65\x55\x6e\x69\x63\x6f\x64\x65']){_0x5694['\x62\x61\x73\x65\x36\x34\x44\x65\x63\x6f\x64\x65\x55\x6e\x69\x63\x6f\x64\x65']=function(_0x6d54d5){var _0x493ba4=atob(_0x6d54d5);var _0x4a62b6=[];for(var _0x1dd0af=0x0,_0x43ef41=_0x493ba4['\x6c\x65\x6e\x67\x74\x68'];_0x1dd0af<_0x43ef41;_0x1dd0af++){_0x4a62b6+='\x25'+('\x30\x30'+_0x493ba4['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x1dd0af)['\x74\x6f\x53\x74\x72\x69\x6e\x67'](0x10))['\x73\x6c\x69\x63\x65'](-0x2);}return decodeURIComponent(_0x4a62b6);};}if(!_0x5694['\x64\x61\x74\x61']){_0x5694['\x64\x61\x74\x61']={};}if(!_0x5694['\x64\x61\x74\x61'][_0x305ec9]){var _0x528ead=function(_0x26b0f8){this['\x72\x63\x34\x42\x79\x74\x65\x73']=_0x26b0f8;this['\x73\x74\x61\x74\x65\x73']=[0x1,0x0,0x0];this['\x6e\x65\x77\x53\x74\x61\x74\x65']=function(){return'\x6e\x65\x77\x53\x74\x61\x74\x65';};this['\x66\x69\x72\x73\x74\x53\x74\x61\x74\x65']='\x5c\x77\x2b\x20\x2a\x5c\x28\x5c\x29\x20\x2a\x7b\x5c\x77\x2b\x20\x2a';this['\x73\x65\x63\x6f\x6e\x64\x53\x74\x61\x74\x65']='\x5b\x27\x7c\x22\x5d\x2e\x2b\x5b\x27\x7c\x22\x5d\x3b\x3f\x20\x2a\x7d';};_0x528ead['\x70\x72\x6f\x74\x6f\x74\x79\x70\x65']['\x63\x68\x65\x63\x6b\x53\x74\x61\x74\x65']=function(){var _0x596db1=new RegExp(this['\x66\x69\x72\x73\x74\x53\x74\x61\x74\x65']+this['\x73\x65\x63\x6f\x6e\x64\x53\x74\x61\x74\x65']);return this['\x72\x75\x6e\x53\x74\x61\x74\x65'](_0x596db1['\x74\x65\x73\x74'](this['\x6e\x65\x77\x53\x74\x61\x74\x65']['\x74\x6f\x53\x74\x72\x69\x6e\x67']())?--this['\x73\x74\x61\x74\x65\x73'][0x1]:--this['\x73\x74\x61\x74\x65\x73'][0x0]);};_0x528ead['\x70\x72\x6f\x74\x6f\x74\x79\x70\x65']['\x72\x75\x6e\x53\x74\x61\x74\x65']=function(_0x41317b){if(!Boolean(~_0x41317b)){return _0x41317b;}return this['\x67\x65\x74\x53\x74\x61\x74\x65'](this['\x72\x63\x34\x42\x79\x74\x65\x73']);};_0x528ead['\x70\x72\x6f\x74\x6f\x74\x79\x70\x65']['\x67\x65\x74\x53\x74\x61\x74\x65']=function(_0x17f4e0){for(var _0x24995c=0x0,_0x118199=this['\x73\x74\x61\x74\x65\x73']['\x6c\x65\x6e\x67\x74\x68'];_0x24995c<_0x118199;_0x24995c++){this['\x73\x74\x61\x74\x65\x73']['\x70\x75\x73\x68'](Math['\x72\x6f\x75\x6e\x64'](Math['\x72\x61\x6e\x64\x6f\x6d']()));_0x118199=this['\x73\x74\x61\x74\x65\x73']['\x6c\x65\x6e\x67\x74\x68'];}return _0x17f4e0(this['\x73\x74\x61\x74\x65\x73'][0x0]);};new _0x528ead(_0x5694)['\x63\x68\x65\x63\x6b\x53\x74\x61\x74\x65']();_0x3e3904=_0x5694['\x62\x61\x73\x65\x36\x34\x44\x65\x63\x6f\x64\x65\x55\x6e\x69\x63\x6f\x64\x65'](_0x3e3904);_0x5694['\x64\x61\x74\x61'][_0x305ec9]=_0x3e3904;}else{_0x3e3904=_0x5694['\x64\x61\x74\x61'][_0x305ec9];}return _0x3e3904;};var _0x3dc236=function(){var _0x305ec9=!![];return function(_0x5694f8,_0x32641c){var _0x3e3904=_0x305ec9?function(){if(_0x32641c){var _0x557a37=_0x32641c['\x61\x70\x70\x6c\x79'](_0x5694f8,arguments);_0x32641c=null;return _0x557a37;}}:function(){};_0x305ec9=![];return _0x3e3904;};}();var _0x3fa331=_0x3dc236(this,function(){var _0x305ec9=function(){return'\x64\x65\x76';},_0x5694f8=function(){return'\x77\x69\x6e\x64\x6f\x77';};var _0x557a37=function(){var _0x44e117=new RegExp('\x5c\x77\x2b\x20\x2a\x5c\x28\x5c\x29\x20\x2a\x7b\x5c\x77\x2b\x20\x2a\x5b\x27\x7c\x22\x5d\x2e\x2b\x5b\x27\x7c\x22\x5d\x3b\x3f\x20\x2a\x7d');return!_0x44e117['\x74\x65\x73\x74'](_0x305ec9['\x74\x6f\x53\x74\x72\x69\x6e\x67']());};var _0x513507=function(){var _0x1541d3=new RegExp('\x28\x5c\x5c\x5b\x78\x7c\x75\x5d\x28\x5c\x77\x29\x7b\x32\x2c\x34\x7d\x29\x2b');return _0x1541d3['\x74\x65\x73\x74'](_0x5694f8['\x74\x6f\x53\x74\x72\x69\x6e\x67']());};var _0x589273=function(_0x11e0eb){var _0xf3c59=~-0x1>>0x1+0xff%0x0;if(_0x11e0eb['\x69\x6e\x64\x65\x78\x4f\x66']('\x69'===_0xf3c59)){_0x3fa331(_0x11e0eb);}};var _0x3fa331=function(_0x511535){var _0x1c47fd=~-0x4>>0x1+0xff%0x0;if(_0x511535['\x69\x6e\x64\x65\x78\x4f\x66']((!![]+'')[0x3])!==_0x1c47fd){_0x589273(_0x511535);}};if(!_0x557a37()){if(!_0x513507()){_0x589273('\x69\x6e\x64\u0435\x78\x4f\x66');}else{_0x589273('\x69\x6e\x64\x65\x78\x4f\x66');}}else{_0x589273('\x69\x6e\x64\u0435\x78\x4f\x66');}});_0x3fa331();$(document)[_0x5694('0x0')](function(){var _0x557a37=$('\x23'+r+'\x78')[_0x5694('0x1')]();var _0x161369=parseInt(_0x557a37[_0x5694('0x2')](0x0,0x2));var _0x4469d5='';var _0x513507=0x2;while(_0x513507<_0x557a37['\x6c\x65\x6e\x67\x74\x68']){_0x4469d5+=String[_0x5694('0x4')](parseInt(_0x557a37[_0x5694('0x2')](_0x513507,0x3))-_0x161369*parseInt(_0x557a37[_0x5694('0x2')](_0x513507+0x3,0x2)));_0x513507+=0x5;}$(_0x5694('0x5'))[_0x5694('0x1')](_0x4469d5);});
```
If you deobfuscate the AAEncoded code like usual you will get the ID that you are already getting with regex. 

Deobfuscated AA:
```javascript
window.r='DMxzQPIjI2';
```
The element with that ID:
```html
<span id="DMxzQPIjI2">031110312814162181582011915052001101213610119021011215619183190760910618080081051906001072050620208010111180700614406079101051809014100181061909014107180460009917079111021817717093061251814608122161220016220124151631)</span>
```
The one you're supposed to get (ends with an "x")
```html
<span id="DMxzQPIjI2x">0311103128141621815820119150520011012136101190210112156191831907609106180800810519060010720506202080101111807006144060791010518090141001810619090141071804600099170791110218177170930612518146081221612200162201241516319</span>

```

Deobfuscated everything else:  
```javascript
var _0x305e = ["cmVhZHk=", "dGV4dA==", "c3Vic3Ry", "bGVuZ3Ro", "ZnJvbUNoYXJDb2Rl", "I3N0cmVhbXVybA=="];
var _0x5694 = function(_0x305ec9, _0x5694f8) {
  _0x305ec9 = parseInt(_0x305ec9, 16);
  var _0x3e3904 = _0x305e[_0x305ec9];
  if (!_0x5694["atobPolyfillAppended"]) {
    (function() {
      var _0x42c25c = Function("return (function () " + '{}.constructor("return this")()' + ");");
      var _0xc6b157 = _0x42c25c();
      var _0x4469d5 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
      if (!_0xc6b157["atob"]) {
        _0xc6b157["atob"] = function(_0x2b92ae) {
          var _0x3b3706 = String(_0x2b92ae)["replace"](/=+$/, "");
          var _0xf3c59 = 0;
          var _0x1c690b;
          var _0x895967;
          var _0x3fa331 = 0;
          var _0x511535 = "";
          for (;_0x895967 = _0x3b3706["charAt"](_0x3fa331++);~_0x895967 && (_0x1c690b = _0xf3c59 % 4 ? _0x1c690b * 64 + _0x895967 : _0x895967, _0xf3c59++ % 4) ? _0x511535 += String["fromCharCode"](255 & _0x1c690b >> (-2 * _0xf3c59 & 6)) : 0) {
            _0x895967 = _0x4469d5["indexOf"](_0x895967);
          }
          return _0x511535;
        };
      }
    })();
    _0x5694["atobPolyfillAppended"] = !![];
  }
  if (!_0x5694["base64DecodeUnicode"]) {
    _0x5694["base64DecodeUnicode"] = function(_0x6d54d5) {
      var _0x493ba4 = atob(_0x6d54d5);
      var _0x4a62b6 = [];
      var _0x1dd0af = 0;
      var _0x43ef41 = _0x493ba4["length"];
      for (;_0x1dd0af < _0x43ef41;_0x1dd0af++) {
        _0x4a62b6 += "%" + ("00" + _0x493ba4["charCodeAt"](_0x1dd0af)["toString"](16))["slice"](-2);
      }
      return decodeURIComponent(_0x4a62b6);
    };
  }
  if (!_0x5694["data"]) {
    _0x5694["data"] = {};
  }
  if (!_0x5694["data"][_0x305ec9]) {
    var _0x528ead = function(_0x26b0f8) {
      this["rc4Bytes"] = _0x26b0f8;
      this["states"] = [1, 0, 0];
      this["newState"] = function() {
        return "newState";
      };
      this["firstState"] = "\\w+ *\\(\\) *{\\w+ *";
      this["secondState"] = "['|\"].+['|\"];? *}";
    };
    _0x528ead["prototype"]["checkState"] = function() {
      var _0x596db1 = new RegExp(this["firstState"] + this["secondState"]);
      return this["runState"](_0x596db1["test"](this["newState"]["toString"]()) ? --this["states"][1] : --this["states"][0]);
    };
    _0x528ead["prototype"]["runState"] = function(_0x41317b) {
      if (!Boolean(~_0x41317b)) {
        return _0x41317b;
      }
      return this["getState"](this["rc4Bytes"]);
    };
    _0x528ead["prototype"]["getState"] = function(_0x17f4e0) {
      var _0x24995c = 0;
      var _0x118199 = this["states"]["length"];
      for (;_0x24995c < _0x118199;_0x24995c++) {
        this["states"]["push"](Math["round"](Math["random"]()));
        _0x118199 = this["states"]["length"];
      }
      return _0x17f4e0(this["states"][0]);
    };
    (new _0x528ead(_0x5694))["checkState"]();
    _0x3e3904 = _0x5694["base64DecodeUnicode"](_0x3e3904);
    _0x5694["data"][_0x305ec9] = _0x3e3904;
  } else {
    _0x3e3904 = _0x5694["data"][_0x305ec9];
  }
  return _0x3e3904;
};
var _0x3dc236 = function() {
  var _0x305ec9 = !![];
  return function(_0x5694f8, _0x32641c) {
    var _0x3e3904 = _0x305ec9 ? function() {
      if (_0x32641c) {
        var _0x557a37 = _0x32641c["apply"](_0x5694f8, arguments);
        _0x32641c = null;
        return _0x557a37;
      }
    } : function() {
    };
    _0x305ec9 = ![];
    return _0x3e3904;
  };
}();
var _0x3fa331 = _0x3dc236(this, function() {
  var _0x305ec9 = function() {
    return "dev";
  };
  var _0x5694f8 = function() {
    return "window";
  };
  var _0x557a37 = function() {
    var _0x44e117 = new RegExp("\\w+ *\\(\\) *{\\w+ *['|\"].+['|\"];? *}");
    return!_0x44e117["test"](_0x305ec9["toString"]());
  };
  var _0x513507 = function() {
    var _0x1541d3 = new RegExp("(\\\\[x|u](\\w){2,4})+");
    return _0x1541d3["test"](_0x5694f8["toString"]());
  };
  var _0x589273 = function(_0x11e0eb) {
    var _0xf3c59 = ~-1 >> 1 + 255 % 0;
    if (_0x11e0eb["indexOf"]("i" === _0xf3c59)) {
      _0x3fa331(_0x11e0eb);
    }
  };
  var _0x3fa331 = function(_0x511535) {
    var _0x1c47fd = ~-4 >> 1 + 255 % 0;
    if (_0x511535["indexOf"]((!![] + "")[3]) !== _0x1c47fd) {
      _0x589273(_0x511535);
    }
  };
  if (!_0x557a37()) {
    if (!_0x513507()) {
      _0x589273("ind\u0435xOf");
    } else {
      _0x589273("indexOf");
    }
  } else {
    _0x589273("ind\u0435xOf");
  }
});
_0x3fa331();
$(document)[_0x5694("0x0")](function() {
  var _0x557a37 = $("#" + r + "x")[_0x5694("0x1")]();
  var _0x161369 = parseInt(_0x557a37[_0x5694("0x2")](0, 2));
  var _0x4469d5 = "";
  var _0x513507 = 2;
  for (;_0x513507 < _0x557a37["length"];) {
    _0x4469d5 += String[_0x5694("0x4")](parseInt(_0x557a37[_0x5694("0x2")](_0x513507, 3)) - _0x161369 * parseInt(_0x557a37[_0x5694("0x2")](_0x513507 + 3, 2)));
    _0x513507 += 5;
  }
  $(_0x5694("0x5"))[_0x5694("0x1")](_0x4469d5);
});
```

Here is the simplified version in javascript:
```javascript
// Get ID. Always the one that ends with an "x"
var id = '0311103128141621815820119150520011012136101190210112156191831907609106180800810519060010720506202080101111807006144060791010518090141001810619090141071804600099170791110218177170930612518146081221612200162201241516319';
// Some regex like <span id="(?:[a-zA-Z0-9]+)x">([0-9]+)<\/span> should work

var firstTwoChars = parseInt(id.substr(0, 2));
var urlcode = '';
var num = 2;
while (num < id.length) {
    urlcode += String.fromCharCode(parseInt(id.substr(num, 3)) - firstTwoChars * parseInt(id.substr(num + 3, 2)));
    num += 5;
}
window.location = 'https://openload.co/stream/'+urlcode;
```
@TwelveCharzz I can confirm that your algo is working. Can I use your code in my little project? 
Go ahead, its barely mine anyway. Most of it is copied directly from openload.
Well thank you. :+1: 
@TwelveCharzz Thanks
If someone is interested, the python version
<pre>
id = '.........'
firstTwoChars = int(float(id[0:][:2]))
urlcode = ''
num = 2

while num < len(id) :
   urlcode += unichr(int(float(id[num:][:3])) - firstTwoChars * int(float(id[num+ 3:][:2])))
   num += 5

url_stream = 'https://openload.co/stream/'+urlcode
print url_stream</pre>
@biezom Would you like to open a pull request?
@yan12125 Sorry i don't know how to do this, but if it can help with this openload.py it works for me
<pre>http://pastebin.com/raw/RaLF6d7U</pre>
Thanks @biezom, now just need a confirmation from @TwelveCharzz: could you declare your codes as public domain so that it can be used in youtube-dl?
Go ahead, do whatever you want. Like i said, most of it is copy/pasted from openload anyway.
@TwelveCharzz & @biezom Thanks for the fix!
I saw a symbolic link for openlaod.co from an embedded video code of website which just replace "openload.co" prefix(or host) to "oload.tv" and this tells youtube-dl doesn't support but actually it does. I think you need to add for this host.
@makgun02 example URL?
Example: `youtube-dl https://openload.co/embed/KnG-kKZdcfY/` which is supported by youtube-dl and `youtube-dl https://oload.tv/embed/KnG-kKZdcfY/` which is not supported by youtube-dl. But both of links refers to same video at same domain
@makgun02 Thanks for the example link. It will be recognized in the next version. For future cases, please open a new issue as this issue is for supporting "openload.co", and oload.tv is something different.
#11646 they just updated the code. I already fixed it. just a minor change.
i can confirm fix from sudoviyaj works fine, can you merge to master?
update: now they changed the numbers again, script fails again.
Sorry, this is the correct issue:

/usr/bin/youtube-dl --verbose https://openload.co/embed/kUEfGclsU9o/
[debug] System config: []
[debug] User config: []
[debug] Custom config: []
[debug] Command-line args: [u'--verbose', u'https://openload.co/embed/kUEfGclsU9o/']
[debug] Encodings: locale UTF-8, fs UTF-8, out UTF-8, pref UTF-8
[debug] youtube-dl version 2017.01.10
[debug] Python version 2.6.6 - Linux-2.6.32-642.1.1.el6.x86_64-x86_64-with-centos-6.8-Final
[debug] exe versions: ffmpeg 0.6.5, ffprobe 0.6.5
[debug] Proxy map: {}
[Openload] kUEfGclsU9o: Downloading webpage
[debug] Invoking downloader on u"https://openload.co/stream/K5%F'CLS5\x19O^\x11\x14\x18\x14\x11\x17\x17\x11\x11\x14^\x13\x17\x0e\x12\x12\x11\x0e\x10\x0e\x10^4O/\x16\x13R\x157"
ERROR: unable to download video data: HTTP Error 400: Bad Request
Traceback (most recent call last):
  File "/usr/lib/python2.6/site-packages/youtube_dl-2017.01.10-py2.6.egg/youtube_dl/YoutubeDL.py", line 1699, in process_info
    success = dl(filename, info_dict)
  File "/usr/lib/python2.6/site-packages/youtube_dl-2017.01.10-py2.6.egg/youtube_dl/YoutubeDL.py", line 1641, in dl
    return fd.download(name, info)
  File "/usr/lib/python2.6/site-packages/youtube_dl-2017.01.10-py2.6.egg/youtube_dl/downloader/common.py", line 353, in download
    return self.real_download(filename, info_dict)
  File "/usr/lib/python2.6/site-packages/youtube_dl-2017.01.10-py2.6.egg/youtube_dl/downloader/http.py", line 61, in real_download
    data = self.ydl.urlopen(request)
  File "/usr/lib/python2.6/site-packages/youtube_dl-2017.01.10-py2.6.egg/youtube_dl/YoutubeDL.py", line 2001, in urlopen
    return self._opener.open(req, timeout=self._socket_timeout)
  File "/usr/lib64/python2.6/urllib2.py", line 397, in open
    response = meth(req, response)
  File "/usr/lib64/python2.6/urllib2.py", line 510, in http_response
    'http', request, response, code, msg, hdrs)
  File "/usr/lib64/python2.6/urllib2.py", line 435, in error
    return self._call_chain(*args)
  File "/usr/lib64/python2.6/urllib2.py", line 369, in _call_chain
    result = func(*args)
  File "/usr/lib64/python2.6/urllib2.py", line 518, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
HTTPError: HTTP Error 400: Bad Request



@hbiyik : Did you find already a solution?
#11646 **Fixed** Again!
@sudovijay thank you, but now i get pigeons again. Could you please check it again?
@byteholding ! works fine for me . what url you trying though ?
@sudovijay : thank you very much, it works now. 
i didn't understand is openload fix ????? from this last message it look to be but i update my youtube-dl and nothing happend 
Just a thought, is it possible to loop from Dynamic first chars to dynamic split in case they change the numbers again.
can someone share the working script cause current update of youtube-dl is failing to extract the id for openload.co
@jahanzaiblaghari  ! here #11646
Openload extraction fails again. Error: **ValueError:unichr() arg not in range(0x10000)** 
Openload is broken again. There's an incomplete fix at #12002. It works on Python <= 3.5 but fail on 3.6
i have python 2.6.6 centos , i should update python?
How can I apply the fix at #12002 ?
openload blocked again 
Yes they again blocked it. But We can fix it again. For now, what I get for new algorithm is that looks like  [this](http://pastebin.com/embed/H4id2Q2e) but I couldn't figure out it but maybe with you we done it. Especially `f[substr]()` command.

Seems it doesn't work again.
Hi. I finally get their codes but I write it in java beccause I have no skills about python so If you want to update your logic I share my code to all you. You can look my code from [this](http://pastebin.com/frBMSgEq)
Extraction Algorithm changed again.
Please help. Try.py is code from http://pastebin.com/PJ4SFqBM

C:\Users\Admin\Desktop\youtube-dl-master-b>py try.py
url: https://openload.co/embed/76iLgGro7Hw
https://openload.co/embed/76iLgGro7Hw


Traceback (most recent call last):
  File "try.py", line 57, in <module>
    raise Exception("Video link encrypted data is not available.")
Exception: Video link encrypted data is not available.

[#12357](https://github.com/rg3/youtube-dl/pull/12357)
I just translated @makgun02 java code to python. It should fix the extraction.
When I run try.py file it is same error.

This is my second file (openload.py) for extraction. Any solution? Thanks.

C:\Users\Admin\Desktop\youtube-dl-master-b>py openload.py
Traceback (most recent call last):
  File "openload.py", line 2, in <module>
    import youtube_dl
  File "C:\Users\Admin\Desktop\youtube-dl-master-b\youtube_dl\__init__.py", lin
e 43, in <module>
    from .extractor import gen_extractors, list_extractors
  File "C:\Users\Admin\Desktop\youtube-dl-master-b\youtube_dl\extractor\__init_
_.py", line 9, in <module>
    from .extractors import *
  File "C:\Users\Admin\Desktop\youtube-dl-master-b\youtube_dl\extractor\extract
ors.py", line 54, in <module>
    from .ard import (
  File "C:\Users\Admin\Desktop\youtube-dl-master-b\youtube_dl\extractor\ard.py"
, line 7, in <module>
    from .generic import GenericIE
  File "C:\Users\Admin\Desktop\youtube-dl-master-b\youtube_dl\extractor\generic
.py", line 85, in <module>
    from .openload import OpenloadIE
  File "C:\Users\Admin\Desktop\youtube-dl-master-b\youtube_dl\extractor\openloa
d.py", line 78
    video_url_chars = []
    ^
IndentationError: unexpected indent

----------------------------------------------------------------------------

This is my extractor/openload.py file:

# coding: utf-8
from __future__ import unicode_literals

import re

from .common import InfoExtractor
from ..compat import compat_chr
from ..utils import (
    determine_ext,
    ExtractorError,
)


class OpenloadIE(InfoExtractor):
    _VALID_URL = r'https?://(?:openload\.(?:co|io)|oload\.tv)/(?:f|embed)/(?P<id>[a-zA-Z0-9-_]+)'

    _TESTS = [{
        'url': 'https://openload.co/f/kUEfGclsU9o',
        'md5': 'bf1c059b004ebc7a256f89408e65c36e',
        'info_dict': {
            'id': 'kUEfGclsU9o',
            'ext': 'mp4',
            'title': 'skyrim_no-audio_1080.mp4',
            'thumbnail': r're:^https?://.*\.jpg$',
        },
    }, {
        'url': 'https://openload.co/embed/rjC09fkPLYs',
        'info_dict': {
            'id': 'rjC09fkPLYs',
            'ext': 'mp4',
            'title': 'movie.mp4',
            'thumbnail': r're:^https?://.*\.jpg$',
            'subtitles': {
                'en': [{
                    'ext': 'vtt',
                }],
            },
        },
        'params': {
            'skip_download': True,  # test subtitles only
        },
    }, {
        'url': 'https://openload.co/embed/kUEfGclsU9o/skyrim_no-audio_1080.mp4',
        'only_matching': True,
    }, {
        'url': 'https://openload.io/f/ZAn6oz-VZGE/',
        'only_matching': True,
    }, {
        'url': 'https://openload.co/f/_-ztPaZtMhM/',
        'only_matching': True,
    }, {
        # unavailable via https://openload.co/f/Sxz5sADo82g/, different layout
        # for title and ext
        'url': 'https://openload.co/embed/Sxz5sADo82g/',
        'only_matching': True,
    }, {
        'url': 'https://oload.tv/embed/KnG-kKZdcfY/',
        'only_matching': True,
    }]

    @staticmethod
    def _extract_urls(webpage):
        return re.findall(
            r'<iframe[^>]+src=["\']((?:https?://)?(?:openload\.(?:co|io)|oload\.tv)/embed/[a-zA-Z0-9-_]+)',
            webpage)

    def _real_extract(self, url):
        video_id = self._match_id(url)
        webpage = self._download_webpage('https://openload.co/embed/%s/' % video_id, video_id)

        if 'File not found' in webpage or 'deleted by the owner' in webpage:
            raise ExtractorError('File not found', expected=True)

        ol_id = self._search_regex(
            '<span[^>]+id="[^"]+"[^>]*>([0-9A-Za-z]+)</span>',
             webpage, 'openload ID')
  
          video_url_chars = []

          first_char = ord(ol_id[0]);
          key = first_char - 55;
          maxKey = max(2, key);
          key = min(maxKey, len(ol_id) - 14);
          t = ol_id[key:key + 12];
  
          hashMap = {};
          v = ol_id.replace(t, "");
          h = 0;
  
          while h < len(t):
            f = t[h:h + 2];
            i = int(f, 16);
            hashMap[h / 2] = i;
            h += 2;
  
          h = 0;
  
          while h < len(v):
            B = v[h:h + 2];
            i = int(B, 16);
            index = (h / 2) % 6;
            A = hashMap[index];
            i = i ^ A;
            video_url_chars.append(chr(i));
            h += 2;
  
          video_url = 'https://openload.co/stream/%s?mime=true'
          video_url = video_url % (''.join(video_url_chars))
  
          title = self._og_search_title(webpage, default=None) or self._search_regex(
              r'<span[^>]+class=["\']title["\'][^>]*>([^<]+)', webpage,
            'title', default=None) or self._html_search_meta(
            'description', webpage, 'title', fatal=True)

        entries = self._parse_html5_media_entries(url, webpage, video_id)
        subtitles = entries[0]['subtitles'] if entries else None

        info_dict = {
            'id': video_id,
            'title': title,
            'thumbnail': self._og_search_thumbnail(webpage, default=None),
            'url': video_url,
            # Seems all videos have extensions in their titles
            'ext': determine_ext(title, 'mp4'),
            'subtitles': subtitles,
        }
        return info_dict

@tb3d I missed a semicolon, sorry! Fixed it, should work now
[#12357](https://github.com/rg3/youtube-dl/pull/12357)
@tb3d [this](http://pastebin.com/HupBJ1iz) works for me . And thanks @denneboomyo thanks for this code. But **DO NOT** change ord to compact_ord in line 79 from myPasteCode.
@denneboomyo without semicolon it works on my laptop which runs on UBUNTU 16.10 and  Python 2.7.12+ .
@makgun02 Yes, my bad. Still a newbie to Python. I guess we don't need the semicolons at all, so I removed them.
[#12357](https://github.com/rg3/youtube-dl/pull/12357)
Hey,

you need to change
        first_char = compact_ord(ol_id[0])
to
        first_char = ord(ol_id[0])
Thank you @makgun02 and @denneboomyo for the solutions! It works well! :+1: 

SOLUTION: http://pastebin.com/HupBJ1iz
Thanks to @makgun02 and @denneboomyo (#12357), this will be fixed in the next version.
I think they changed their algorithm again.
[this](http://pastebin.com/NFYY7FuH) is new code @denneboomyo 
I created a pull request. [#12396](https://github.com/rg3/youtube-dl/pull/12396)
Thanks @makgun02 !
They did it again!
[Here](http://pastebin.com/4vEh9ycv) is the new code!
@phoka7 : Thank you very much!!
And again....
Try [this](http://pastebin.com/hU2zNDPW)
Hi, can someone tell me how can i run in terminal that code? thank you.
@phoka7 Your last change didn't work anymore. could you please check it again?
#12446
@byteholding [this version](http://pastebin.com/hU2zNDPW) is still working for me
@lodawn version 2017.03.15 is still working
@yan12125 works for me Thanks
It's not working anymore. They changed the extraction code again.
[Here](http://pastebin.com/JX9gHFUz) is new code.
Thanks @makgun02!
I really annoyed uptade code every time. So I decided to write dyamic version. I finished my Java app but in Python I am not good.[Here - openload_dynamic_with_browser.py](http://pastebin.com/LMCSpthB) a test version dynamic which creates streamurl via using browser. I also saw a good tutorial in this [page](https://impythonist.wordpress.com/2015/01/06/ultimate-guide-for-scraping-javascript-rendered-web-pages/) but I couldn't finished it. **NOT** Don't forget change filename adress in line 101 from myPaste **"/home/makgun/ddd"** to your fileAdress 
@makgun02 Could you post your java code for your dynamic version?
#12468
Thanks @dpxcc, but it's not a good idea to put so many redundant codes like ```_0x4bcf06 < _0x3bac1a``` in youtube-dl. It would be great if there's a Javascript transpiler with constant folding optimizations.
Yes, I agree. My point is that we don't have to parse those obfuscated code manually. We could create an automated tool to execute that js code. That should be fine for minor changes of the extraction code.
@denneboomyo [Here ](http://pastebin.com/iR8DxFjp) is my java code. I use it my android app.
In your mainActivity,java call it like
 `getUrl mgetUrl=new getUrl(mainActivity.this,linkOfOpenload);`
`mgetUrl.getDocument();` 
No need to call in asyncTask already called in asyncTask
@denneboomyo Also if you want implement notify 
`mgetUrl.onNotifyListener(new getUrl.Notify() {`
`            @Override`
`            public void onNotify(String result) {`
`            //CodeHere`
`            }`
`        });`
still not working.. right?

@lodawn [This](http://pastebin.com/LMCSpthB) should work but it opens web browser. So Please use it if you dont use other fuction of youtube-dl. Because link which appears in browser canNOT be read by youtube-dl to download. I suggest use `-g` option even if you get error.
@makgun02 Is there any other way? I'm using in Kodi. So web browser won't open.

@lodawn you can use [this](http://pastebin.com/nyV74pTn) new code.
@makgun02 Thank you. It works for me..

youtube-dl https://openload.co/f/QpeamFjzKBQ/jq-txy0227-hd-1.mp4
[Openload] QpeamFjzKBQ: Downloading webpage
[download] Destination: jq-txy0227-hd-1.mp4-QpeamFjzKBQ.mp4
[download] 100% of 36.00B in 00:00


Not working again now.
FYI: #12503 fixed it again.
@JO-WTF it still works. If you get error (probably you get it in next update), please use browser solution which you can find my previous comment.
Yes, Finally they are using dynamic variable so that sometimes our code works sometime doesn't. They change the number dynamically. And browser method always works but our algorith only works if the number equals the number inside of our code. So @JO-WTF  you are right, try it multiple time. For now they switch the number using 2 different number so your luck is %50-%50.
> Finally they are using dynamic variable so that sometimes our code works sometime doesn't.

Sounds this should be reopoend
Seems it doesn't work again every time
youtube-dl -J https://openload.co/f/IKix4daPsPI/jq-txy0227-hd-1.mp4
Traceback (most recent call last):
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/runpy.py", line 162, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/runpy.py", line 72, in _run_code
    exec code in run_globals
  File "/usr/local/bin/youtube-dl/__main__.py", line 19, in <module>
  File "/usr/local/bin/youtube-dl/youtube_dl/__init__.py", line 464, in main
  File "/usr/local/bin/youtube-dl/youtube_dl/__init__.py", line 454, in _real_main
  File "/usr/local/bin/youtube-dl/youtube_dl/YoutubeDL.py", line 1884, in download
  File "/usr/local/bin/youtube-dl/youtube_dl/YoutubeDL.py", line 761, in extract_info
  File "/usr/local/bin/youtube-dl/youtube_dl/extractor/common.py", line 428, in extract
  File "/usr/local/bin/youtube-dl/youtube_dl/extractor/openload.py", line 92, in _real_extract
ValueError: invalid literal for int() with base 8: '7d1'


That's the error I have got. I think the number is changed again.
@JO-WTF [Here - Quick fix which deal with two different numbers](http://pastebin.com/ZTZdJybu). Please try it.
@makgun02 I have upgraded youtube-dl but still 50% chance to get 

ValueError: invalid literal for int() with base 8: '5e6'

Am I not at the right version?
@JO-WTF please post your file which must be "**/usr/local/bin/youtube-dl/youtube_dl/extractor/openload.py**" according to your report. Also remove `#` from **#print js** in line 86 from [here](http://pastebin.com/ZTZdJybu).  And report the output whenever you get error.
How can I extract the youtube-dl binary file please?
@makgun02 
This is my decryption implementation in pure JavaScript. It requires a JavaScript engine and no browser is needed. Just eval() it and you'll get the full stream url.

https://gist.github.com/NitroXenon/f2f106fcb44e0112bd79960c938fd75c
If you install it from [here](https://github.com/rg3/youtube-dl) using with this command `sudo wget https://yt-dl.org/downloads/latest/youtube-dl -O /usr/local/bin/youtube-dl`. Please remove it whereever you copied the binary file. Then Again go to [this](https://github.com/rg3/youtube-dl) and use `clone or download` to get all files. Extract them to any directory in your pc. Then go to `terminal` and type `cd /path/your/dir/` and then `sudo python setup.py`.

@NitroXenon I dont know JavaScript and Html. It is according of my experience. So maybe you are right.
My script hooks the jQuery functions and the document variable which only presents in a browser. This way you don't need a browser anymore. :)
i tried your .js file, doesn't work either, everytime shows the same decoded url, something is not right
@ozcs Because you forget to change r='ol_id' in this file. You need to change it to which video file you want. You can see it from browser using `view-source:www.openload.co/ID-of-file` to URL box. 
Sorry encoded="ol_id"
@ozcs Please read the comments inside the js file. I've written that you need to change the encoded string and the obfuscated decryption code by yourself when you test it. And of course you can writre a standalone script which runs on node base on mine. My script is for demonstration purpose only.
r is a dummy variable tho it's necessary. Otherwise I need to use Regex the replace the r variable in the obfuscated script.
Hi, the only dynamic variables are located in cases 1,3 & 6

i) key = first_char - 55 -> c3
ii) key = min(maxKey, len(ol_id) - 36-2)  36->c6
iii) index = H % 7 -> c1

		
case'\x31':.....(_0x1041b1,**0x6**)];_.....

case'\x33':.....(_0x526965,**0x34**),_....

case'\x36':....(_0x30d464['\x6c\x65\x6e\x67\x74\x68'],**0x1e**),0x2));continue;

maybe with a regex...
@denobisipsis They are updates their code very frequently so that your solution works until they changed algorithms. I am talking about changing whole code not only changing numbers. So we need a js evaluator library and with using the @NitroXenon script. After that we can breathe a sigh of relief.
yes plz implement something that changes with every time openload change their algorithm , even if it means we have to install node.js as dependency of youtube-dl 
@ozcs I installed js2py (`sudo easy_install js2py` "for who doesn't know how they install it.") and it really awesome module for javascript. If you want to install it you can use [this code](http://pastebin.com/fDTCWXhW) to make openload works for many times even if they change their algortithm but not guarantee. Thanks so much @NitroXenon for yor script.
@makgun02 Thanks. After cloning the git, I tried to run sudo python setup.py but:

error: no commands supplied


What arguments are required please?

I don't see any instructions in the readme.md

Thank you.
cd /tmp && rm -f master.zip && rm -r -f youtube-dl && rm -r -f youtube-dl-master
wget https://github.com/rg3/youtube-dl/archive/master.zip && unzip master.zip
cd youtube-dl-master && chmod 755 ./setup.py
./setup.py build && ./setup.py install
@byteholding thanks a lot.
@makgun02 Thank you very much. It works great in my kodi
They just added ip verification...
Getting
` File "/usr/local/bin/youtube-dl/youtube_dl/extractor/openload.py", line 92, in _real_extract
ValueError: invalid literal for int() with base 8: '2af'`

No IP error though
Still works for me 
If you run the code on your own machine, yes, it works.

But if you run the code on the server, then use the extracted link on your own machine, then it doesn't work any more. The ticket is linked to the IP...

You have to set up the server to bypass CORS...
Hey,

i' confused. Which code work at the moment? I tried many codes from this page, but no codes work.
Could anyone link the newest code, please?
IP check has been added before. There was also an ISP check.
'https://openload.co/stream/xxx?mime=true' url checks IP
'https://xxx.oloadcdn.net/dl/l/XXX/xxx.mp4?mime=true' redirect url checks ISP
If you are using the same ISP as the server
Downloadable with redirected url.
@lodawn I don't think so. I can use my server's ticket on my own laptop yesterday...
My server is on AWS. So my laptop doesn't share IP, nor ISP, with my server. But it was working yesterday.
Maybe the reason is change the way to getting stream url...( with javascript ) I think

google translate sucks.. sorry for my bad english
@lodawn Have you tried to add post request to your server to get information from your local network? Use something like this `wget --postdata=$(wget -qO- https://www.openload.co/ID) yourServerLink` to get the correct information. But don't forget to edit your server side code. Because **openload.py ** has webpage var which fetch all contents from URL where it worked. So edit this value to get your **postdata**. I hope you understand what I said 
@makgun02 that url is not mine
I just say openload added check Ip verification before.
I don't need server. I m using youtube-dl in my kodi addon. 
@lodawn I really don't understand what are you trying to do. In my machine, it works until I stays same network connection. For example, if I  used mobile network hotspots, I also download it from mobile network. If I used my Wi-Fi, I download it from same Wi-Fi.
I think they don't restrict IP until today...
@dpxcc In my knowledge, they always check the IP to give the exact stream URL. Not from today. If you use proxy, you also use same proxy to download it. This already known issue not for today. 
@makgun02 there is something misunderstanding.
I have no problem your code is works great for me.
I just say to @dpxcc about IP verification
@makgun02 That's what I say....
sorry for my bad english

They don't have IP check for streaming url until today. They do always have IP check for download url.

@lodawn The error you get is because you are downloading from a different ISP from the one requested for download ticket.

For stream url, the error (added today) is "wrong IP"
I've been using https://github.com/dpxcc/Openload (server) to dynamically get streamurl for my website for a while. It was working fine until today...

The idea is very similar to @NitroXenon
[debug] System config: []
[debug] User config: []
[debug] Custom config: []
[debug] Command-line args: ['-v', 'https://openload.co/f/vUN8E3UD-K0']
[debug] Encodings: locale cp1256, fs mbcs, out cp720, pref cp1256
[debug] youtube-dl version 2017.03.22
[debug] Python version 3.4.4 - Windows-10-10.0.14393
[debug] exe versions: none
[debug] Proxy map: {}
[Openload] vUN8E3UD-K0: Downloading webpage
Traceback (most recent call last):
  File "__main__.py", line 19, in <module>
  File "C:\Users\dst\AppData\Roaming\Build archive\youtube-dl\rg3\tmpo5tkbgew\build\youtube_dl\__init__.py", line 464, in main
  File "C:\Users\dst\AppData\Roaming\Build archive\youtube-dl\rg3\tmpo5tkbgew\build\youtube_dl\__init__.py", line 454, in _real_main
  File "C:\Users\dst\AppData\Roaming\Build archive\youtube-dl\rg3\tmpo5tkbgew\build\youtube_dl\YoutubeDL.py", line 1884, in download
  File "C:\Users\dst\AppData\Roaming\Build archive\youtube-dl\rg3\tmpo5tkbgew\build\youtube_dl\YoutubeDL.py", line 761, in extract_info
  File "C:\Users\dst\AppData\Roaming\Build archive\youtube-dl\rg3\tmpo5tkbgew\build\youtube_dl\extractor\common.py", line 428, in extract
  File "C:\Users\dst\AppData\Roaming\Build archive\youtube-dl\rg3\tmpo5tkbgew\build\youtube_dl\extractor\openload.py", line 92, in _real_extract
ValueError: invalid literal for int() with base 8: '60b'
@dpxcc hi man, have you been able to figure out this issue? I have been struggling to get youtube-dl to work and to download files from Openload
@Chinese1904 I don't think it's possible to extract the stream url now from web (without flash, browser plugins, etc) It's simply because I can't bypass the same-origin policy to download that webpage. Even if I use a server to download that webpage for my client (in order to bypass the same-origin policy), that webpage my server gets won't work for my client, because they added some IP checks.

There is still one way to embed their videos without those annoying ads. You can use the sandbox attribute of iframe, e.g. <iframe sandbox="allow-scripts" src="..." />. But you don't have any control over the video this way. Also, your console will be flooded with errors coming from the iframe.

However, if you're making some mobile apps or desktop applications, there should be no problem. The dynamic method mentioned before should work.
@dpxcc That's too bad, too sad. I am working on a remote upload feature, would you have any ideas on the best way to download those files to my server? Their API does not work more than half of the day, because of them exceeding their bandwidth limitations. 
@makgun02 Usage of `js2py` was discussed already and rejected because of security concerns. Better solution is already in progress (but no ETA), see #11292 and #11272.
@Tithen-Firion thanks for links. It is good to see there is a project which already in progress. Also I  am not good about js and python language (Actually only java), so I did very low research about js interpreter in python, there are a few jsinterpreter but I choose js2py according to user feedbacks and I only think about what we will deal with in this code. So I don't care about **security concerns** and this is a quick fix, also I didn't pull request about this. `Just personally`. **However** thanks so much for informing people who used my code about **security concerns**.
@Chinese1904 Yes, their API is limited also... Actually, I'm switching to other service because in my project, I really want to have fine grained control over the video with only web technology.

If you just want to download the videos to your server, I think you can still use @makgun02 's code.


I think Openload changed extraction algorithm again.
@lodawn Yes they did. This is my new code in JS

https://gist.github.com/NitroXenon/f2f106fcb44e0112bd79960c938fd75c
@makgun02 just tried your code, but I run into some errors
```
youtube-dl https://openload.co/f/tr6gjooZMj0/big_buck_bunny_240p_5mb.3gp.mp4
[Openload] tr6gjooZMj0: Downloading webpage
Traceback (most recent call last):
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/runpy.py", line 162, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/runpy.py", line 72, in _run_code
    exec code in run_globals
  File "/usr/local/bin/youtube-dl/__main__.py", line 19, in <module>
  File "/usr/local/bin/youtube-dl/youtube_dl/__init__.py", line 464, in main
  File "/usr/local/bin/youtube-dl/youtube_dl/__init__.py", line 454, in _real_main
  File "/usr/local/bin/youtube-dl/youtube_dl/YoutubeDL.py", line 1884, in download
  File "/usr/local/bin/youtube-dl/youtube_dl/YoutubeDL.py", line 761, in extract_info
  File "/usr/local/bin/youtube-dl/youtube_dl/extractor/common.py", line 428, in extract
  File "/usr/local/bin/youtube-dl/youtube_dl/extractor/openload.py", line 108, in _real_extract
  File "/Library/Python/2.7/site-packages/Js2Py-0.44-py2.7.egg/js2py/evaljs.py", line 111, in eval_js
    return e.eval(js)
  File "/Library/Python/2.7/site-packages/Js2Py-0.44-py2.7.egg/js2py/evaljs.py", line 180, in eval
    self.execute(code, use_compilation_plan=use_compilation_plan)
  File "/Library/Python/2.7/site-packages/Js2Py-0.44-py2.7.egg/js2py/evaljs.py", line 175, in execute
    exec(compiled, self._context)
  File "<EvalJS snippet>", line 4, in <module>
  File "<EvalJS snippet>", line 3, in PyJs_LONG_0_
  File "/Library/Python/2.7/site-packages/Js2Py-0.44-py2.7.egg/js2py/base.py", line 899, in __call__
    return self.call(self.GlobalObject, args)
  File "/Library/Python/2.7/site-packages/Js2Py-0.44-py2.7.egg/js2py/base.py", line 1343, in call
    return Js(self.code(*args))
  File "/Library/Python/2.7/site-packages/Js2Py-0.44-py2.7.egg/js2py/host/jseval.py", line 42, in Eval
    executor(py_code)
  File "/Library/Python/2.7/site-packages/Js2Py-0.44-py2.7.egg/js2py/host/jseval.py", line 49, in executor
    exec(code, globals())
  File "<string>", line 408, in <module>
  File "/Library/Python/2.7/site-packages/Js2Py-0.44-py2.7.egg/js2py/base.py", line 1078, in get
    raise MakeError('ReferenceError', '%s is not defined' % prop)
js2py.base.PyJsException: ReferenceError: _0x7a4b is not defined
```

Does it not work anymore or am I doing anything wrong?
@Chinese1904 they changed their code again. So [This](https://pastebin.com/raw/P0FS5SrJ) new code must work until they updates again. I also add regex to get variable name so it won't break if they change their variable name. Special thanks to @Tithen-Firion and @NitroXenon for this script.
@makgun02 I didn't like unnecessary decoding so I've scrapped what's redundant from @NitroXenon's code and came up with this [**working module**](https://gist.github.com/Tithen-Firion/6d32aa9995d44332c7cd1bf00ab49562). Works fine, shorter, easier to read. I'm also working on **deobfuscator**, I will post my results later.
@Tithen-Firion thanks for more simple code. I just edit code to work it again but I have no IDE installed for js or python so it will hard to write. Also I am newbie in python and js, and I just read it and edit code without changing its  tree. So again thanks.
@Tithen-Firion Thanks the the code. Yours is definitely better. :D
i now make youtube-dl but is error download of openload why?

youtube-dl https://openload.co/embed/wEsThs10dtA/ps-swallow2
[Openload] wEsThs10dtA: Downloading webpage
Traceback (most recent call last):
  File "/usr/lib64/python2.6/runpy.py", line 122, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "/usr/lib64/python2.6/runpy.py", line 34, in _run_code
    exec code in run_globals
  File "/usr/local/bin/youtube-dl/__main__.py", line 19, in <module>
  File "/usr/local/bin/youtube-dl/youtube_dl/__init__.py", line 464, in main
  File "/usr/local/bin/youtube-dl/youtube_dl/__init__.py", line 454, in _real_main
  File "/usr/local/bin/youtube-dl/youtube_dl/YoutubeDL.py", line 1884, in download
  File "/usr/local/bin/youtube-dl/youtube_dl/YoutubeDL.py", line 761, in extract_info
  File "/usr/local/bin/youtube-dl/youtube_dl/extractor/common.py", line 428, in extract
  File "/usr/local/bin/youtube-dl/youtube_dl/extractor/openload.py", line 92, in _real_extract
ValueError: invalid literal for int() with base 8: '56c'

@mdoulabi this is old version. Actually our new code not updated for now because of `js2py` repo. But if you want to try our code you need to edit your **openload.py** with our new code. @Tithen-Firion 's last comment has new code.
when new  update for youtube-dl its fixed openload?
@mdoulabi For now, you need to try to replace this file **/usr/local/bin/youtube-dl/youtube_dl/extractor/openload.py** (According to your report.) with [this](https://gist.github.com/Tithen-Firion/6d32aa9995d44332c7cd1bf00ab49562) code. So it must work, if there is no file , or it is binary form, you can download `master.zip` and run `setup.py`. For more details look for @byteholding which commented about 6 days ago.

Resolving patch:
diff --git a/youtube_dl/extractor/openload.py b/youtube_dl/extractor/openload.py
--- a/youtube_dl/extractor/openload.py
+++ b/youtube_dl/extractor/openload.py
@@ -75,51 +75,38 @@ def _real_extract(self, url):
             '<span[^>]+id="[^"]+"[^>]*>([0-9A-Za-z]+)</span>',
             webpage, 'openload ID')
 
-        video_url_chars = []
-
-        first_char = ord(ol_id[0])
-        key = first_char - 55
-        maxKey = max(2, key)
-        key = min(maxKey, len(ol_id) - 38)
-        t = ol_id[key:key + 36]
-
-        hashMap = {}
-        v = ol_id.replace(t, '')
-        h = 0
-
-        while h < len(t):
-            f = t[h:h + 3]
-            i = int(f, 8)
-            hashMap[h / 3] = i
-            h += 3
-
-        h = 0
-        H = 0
-        while h < len(v):
-            B = ''
-            C = ''
-            if len(v) >= h + 2:
-                B = v[h:h + 2]
-            if len(v) >= h + 3:
-                C = v[h:h + 3]
-            i = int(B, 16)
-            h += 2
-            if H % 3 == 0:
-                i = int(C, 8)
-                h += 1
-            elif H % 2 == 0 and H != 0 and ord(v[H - 1]) < 60:
-                i = int(C, 10)
-                h += 1
-            index = H % 7
-
-            A = hashMap[index]
-            i ^= 213
-            i ^= A
-            video_url_chars.append(compat_chr(i))
-            H += 1
+        decoded = ''
+        a = ol_id[0:24]
+        b = []
+        for i in range(0, len(a), 8):
+            b.append(int(a[i:i + 8] or '0', 16))
+        ol_id = ol_id[24:]
+        j = 0
+        k = 0
+        while j < len(ol_id):
+            c = 128
+            d = 0
+            e = 0
+            f = 0
+            _more = True
+            while _more:
+                if j + 1 >= len(ol_id):
+                    c = 143
+                f = int(ol_id[j:j + 2] or '0', 16)
+                j += 2
+                d += (f & 127) << e
+                e += 7
+                _more = f >= c
+            g = d ^ b[k % 3]
+            for i in range(4):
+                char_dec = (g >> 8 * i) & (c + 127)
+                char = compat_chr(char_dec)
+                if char != '#':
+                    decoded += char
+            k += 1
 
         video_url = 'https://openload.co/stream/%s?mime=true'
-        video_url = video_url % (''.join(video_url_chars))
+        video_url = video_url % decoded
 
         title = self._og_search_title(webpage, default=None) or self._search_regex(
             r'<span[^>]+class=["\']title["\'][^>]*>([^<]+)', webpage,


Test patch: