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


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
@@ -1,6 +1,8 @@
 # coding: utf-8
 from __future__ import unicode_literals, division
 
+import re
+
 from .common import InfoExtractor
 from ..compat import (
     compat_chr,
@@ -10,6 +12,10 @@
     determine_ext,
     ExtractorError,
 )
+from ..jsinterp import (
+    JSInterpreter,
+    _NAME_RE
+)
 
 
 class OpenloadIE(InfoExtractor):
@@ -56,6 +62,44 @@ class OpenloadIE(InfoExtractor):
         'only_matching': True,
     }]
 
+    def openload_decode(self, txt):
+        symbol_dict = {
+            '(ﾟДﾟ) [ﾟΘﾟ]': '_',
+            '(ﾟДﾟ) [ﾟωﾟﾉ]': 'a',
+            '(ﾟДﾟ) [ﾟΘﾟﾉ]': 'b',
+            '(ﾟДﾟ) [\'c\']': 'c',
+            '(ﾟДﾟ) [ﾟｰﾟﾉ]': 'd',
+            '(ﾟДﾟ) [ﾟДﾟﾉ]': 'e',
+            '(ﾟДﾟ) [1]': 'f',
+            '(ﾟДﾟ) [\'o\']': 'o',
+            '(oﾟｰﾟo)': 'u',
+            '(ﾟДﾟ) [\'c\']': 'c',
+            '((ﾟｰﾟ) + (o^_^o))': '7',
+            '((o^_^o) +(o^_^o) +(c^_^o))': '6',
+            '((ﾟｰﾟ) + (ﾟΘﾟ))': '5',
+            '(-~3)': '4',
+            '(-~-~1)': '3',
+            '(-~1)': '2',
+            '(-~0)': '1',
+            '((c^_^o)-(c^_^o))': '0',
+        }
+        delim = '(ﾟДﾟ)[ﾟεﾟ]+'
+        end_token = '(ﾟДﾟ)[ﾟoﾟ]'
+        symbols = '|'.join(map(re.escape, symbol_dict.keys()))
+        txt = re.sub('(%s)\+\s?' % symbols, lambda m: symbol_dict[m.group(1)], txt)
+        ret = ''
+        for aacode in re.findall(r'{0}\+\s?{1}(.*?){0}'.format(re.escape(end_token), re.escape(delim)), txt):
+            for aachar in aacode.split(delim):
+                if aachar.isdigit():
+                    ret += compat_chr(int(aachar, 8))
+                else:
+                    m = re.match(r'^u([\da-f]{4})$', aachar)
+                    if m:
+                        ret += compat_chr(int(m.group(1), 16))
+                    else:
+                        self.report_warning("Cannot decode: %s" % aachar)
+        return ret
+
     def _real_extract(self, url):
         video_id = self._match_id(url)
         webpage = self._download_webpage('https://openload.co/embed/%s/' % video_id, video_id)
@@ -70,19 +114,26 @@ def _real_extract(self, url):
             r'<span[^>]*>([^<]+)</span>\s*<span[^>]*>[^<]+</span>\s*<span[^>]+id="streamurl"',
             webpage, 'encrypted data')
 
-        magic = compat_ord(enc_data[-1])
+        enc_code = self._html_search_regex(r'<script[^>]+>(ﾟωﾟ[^<]+)</script>',
+                                           webpage, 'encrypted code')
+
+        js_code = self.openload_decode(enc_code)
+        jsi = JSInterpreter(js_code)
+
+        m_offset_fun = self._search_regex(r'slice\(0\s*-\s*(%s)\(\)' % _NAME_RE, js_code, 'javascript offset function')
+        m_diff_fun = self._search_regex(r'charCodeAt\(0\)\s*\+\s*(%s)\(\)' % _NAME_RE, js_code, 'javascript diff function')
+
+        offset = jsi.call_function(m_offset_fun)
+        diff = jsi.call_function(m_diff_fun)
+
         video_url_chars = []
 
         for idx, c in enumerate(enc_data):
             j = compat_ord(c)
-            if j == magic:
-                j -= 1
-            elif j == magic - 1:
-                j += 1
             if j >= 33 and j <= 126:
                 j = ((j + 14) % 94) + 33
-            if idx == len(enc_data) - 1:
-                j += 3
+            if idx == len(enc_data) - offset:
+                j += diff
             video_url_chars += compat_chr(j)
 
         video_url = 'https://openload.co/stream/%s?mime=true' % ''.join(video_url_chars)
diff --git a/youtube_dl/jsinterp.py b/youtube_dl/jsinterp.py
--- a/youtube_dl/jsinterp.py
+++ b/youtube_dl/jsinterp.py
@@ -198,12 +198,12 @@ def interpret_expression(self, expr, local_vars, allow_recursion):
             return opfunc(x, y)
 
         m = re.match(
-            r'^(?P<func>%s)\((?P<args>[a-zA-Z0-9_$,]+)\)$' % _NAME_RE, expr)
+            r'^(?P<func>%s)\((?P<args>[a-zA-Z0-9_$,]*)\)$' % _NAME_RE, expr)
         if m:
             fname = m.group('func')
             argvals = tuple([
                 int(v) if v.isdigit() else local_vars[v]
-                for v in m.group('args').split(',')])
+                for v in m.group('args').split(',')]) if len(m.group('args')) > 0 else tuple()
             if fname not in self._functions:
                 self._functions[fname] = self.extract_function(fname)
             return self._functions[fname](argvals)


Test patch:
diff --git a/test/test_jsinterp.py b/test/test_jsinterp.py
--- a/test/test_jsinterp.py
+++ b/test/test_jsinterp.py
@@ -104,6 +104,13 @@ def test_precedence(self):
         }''')
         self.assertEqual(jsi.call_function('x'), [20, 20, 30, 40, 50])
 
+    def test_call(self):
+        jsi = JSInterpreter('''
+        function x() { return 2; }
+        function y(a) { return x() + a; }
+        function z() { return y(3); }
+        ''')
+        self.assertEqual(jsi.call_function('z'), 5)
 
 if __name__ == '__main__':
     unittest.main()