From b4aa60892fb60efd57f593006f35f94868a646da Mon Sep 17 00:00:00 2001 From: RaNaN Date: Fri, 5 Feb 2010 22:08:48 +0100 Subject: FlashGot + ClickNLoad Support + Webif. improvm.!! pyLoad FTW !! --- module/plugins/hooks/ClickAndLoad.py | 112 +++++++++++++++ module/web/ajax/urls.py | 1 + module/web/ajax/views.py | 8 ++ module/web/cnl/__init__.py | 0 module/web/cnl/models.py | 3 + module/web/cnl/tests.py | 23 ++++ module/web/cnl/urls.py | 18 +++ module/web/cnl/views.py | 83 +++++++++++ module/web/media/default/img/Button-Add-grey.png | Bin 2112 -> 0 bytes module/web/media/default/img/Button-Add.png | Bin 2110 -> 0 bytes module/web/media/default/img/Button-Pause-grey.png | Bin 1932 -> 0 bytes module/web/media/default/img/Button-Pause.png | Bin 2146 -> 0 bytes module/web/media/default/img/Button-Play-grey.png | Bin 1938 -> 0 bytes module/web/media/default/img/Button-Play.png | Bin 2023 -> 0 bytes .../web/media/default/img/head-menu-collector.png | Bin 0 -> 1953 bytes module/web/media/default/img/head-menu-config.png | Bin 0 -> 1802 bytes .../media/default/img/head-menu-development.png | Bin 1324 -> 876 bytes module/web/media/default/img/head-menu-queue.png | Bin 0 -> 2629 bytes module/web/media/default/img/package_go.png | Bin 0 -> 898 bytes module/web/pyload/urls.py | 2 + module/web/pyload/views.py | 21 ++- module/web/settings.py | 1 + module/web/templates/default/base.html | 12 +- module/web/templates/default/collector.html | 152 +++++++++++++++++++++ module/web/templates/default/downloads.html | 16 ++- module/web/templates/default/logs.html | 18 ++- module/web/templates/default/queue.html | 37 +++-- module/web/templates/default/settings.html | 32 +++++ module/web/urls.py | 3 + 29 files changed, 516 insertions(+), 26 deletions(-) create mode 100644 module/plugins/hooks/ClickAndLoad.py create mode 100644 module/web/cnl/__init__.py create mode 100644 module/web/cnl/models.py create mode 100644 module/web/cnl/tests.py create mode 100644 module/web/cnl/urls.py create mode 100644 module/web/cnl/views.py delete mode 100644 module/web/media/default/img/Button-Add-grey.png delete mode 100644 module/web/media/default/img/Button-Add.png delete mode 100644 module/web/media/default/img/Button-Pause-grey.png delete mode 100644 module/web/media/default/img/Button-Pause.png delete mode 100644 module/web/media/default/img/Button-Play-grey.png delete mode 100644 module/web/media/default/img/Button-Play.png create mode 100644 module/web/media/default/img/head-menu-collector.png create mode 100644 module/web/media/default/img/head-menu-config.png create mode 100644 module/web/media/default/img/head-menu-queue.png create mode 100644 module/web/media/default/img/package_go.png create mode 100644 module/web/templates/default/collector.html create mode 100644 module/web/templates/default/settings.html (limited to 'module') diff --git a/module/plugins/hooks/ClickAndLoad.py b/module/plugins/hooks/ClickAndLoad.py new file mode 100644 index 000000000..83a328276 --- /dev/null +++ b/module/plugins/hooks/ClickAndLoad.py @@ -0,0 +1,112 @@ +# -*- coding: utf-8 -*- + +""" + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, + or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, see . + + @author: RaNaN + @interface-version: 0.1 +""" + +import asyncore +import socket +import thread + +from module.plugins.Hook import Hook + +class ClickAndLoad(Hook): + def __init__(self, core): + Hook.__init__(self, core) + props = {} + props['name'] = "ClickAndLoad" + props['version'] = "0.1" + props['description'] = """Gives abillity to use jd's click and load. depends on webinterface""" + props['author_name'] = ("RaNaN") + props['author_mail'] = ("RaNaN@pyload.de") + self.props = props + + self.port = int(self.core.config['webinterface']['port']) + if not self.core.config['webinterface']['activated']: + forwarder('127.0.0.1', 9666, '127.0.0.1', self.port) + thread.start_new_thread(asyncore.loop, ()) + +class forwarder(asyncore.dispatcher): + def __init__(self, ip, port, remoteip, remoteport, backlog=5): + asyncore.dispatcher.__init__(self) + self.remoteip = remoteip + self.remoteport = remoteport + self.create_socket(socket.AF_INET, socket.SOCK_STREAM) + self.set_reuse_addr() + self.bind((ip, port)) + self.listen(backlog) + + def handle_accept(self): + conn, addr = self.accept() + # print '--- Connect --- ' + sender(receiver(conn), self.remoteip, self.remoteport) + +class receiver(asyncore.dispatcher): + def __init__(self, conn): + asyncore.dispatcher.__init__(self, conn) + self.from_remote_buffer = '' + self.to_remote_buffer = '' + self.sender = None + + def handle_connect(self): + pass + + def handle_read(self): + read = self.recv(4096) + # print '%04i -->'%len(read) + self.from_remote_buffer += read + + def writable(self): + return (len(self.to_remote_buffer) > 0) + + def handle_write(self): + sent = self.send(self.to_remote_buffer) + # print '%04i <--'%sent + self.to_remote_buffer = self.to_remote_buffer[sent:] + + def handle_close(self): + self.close() + if self.sender: + self.sender.close() + +class sender(asyncore.dispatcher): + def __init__(self, receiver, remoteaddr, remoteport): + asyncore.dispatcher.__init__(self) + self.receiver = receiver + receiver.sender = self + self.create_socket(socket.AF_INET, socket.SOCK_STREAM) + self.connect((remoteaddr, remoteport)) + + def handle_connect(self): + pass + + def handle_read(self): + read = self.recv(4096) + # print '<-- %04i'%len(read) + self.receiver.to_remote_buffer += read + + def writable(self): + return (len(self.receiver.from_remote_buffer) > 0) + + def handle_write(self): + sent = self.send(self.receiver.from_remote_buffer) + # print '--> %04i'%sent + self.receiver.from_remote_buffer = self.receiver.from_remote_buffer[sent:] + + def handle_close(self): + self.close() + self.receiver.close() \ No newline at end of file diff --git a/module/web/ajax/urls.py b/module/web/ajax/urls.py index d50e7121e..dd68729eb 100644 --- a/module/web/ajax/urls.py +++ b/module/web/ajax/urls.py @@ -26,4 +26,5 @@ urlpatterns = patterns('ajax', (r'^restart_package/(\d+)$', 'views.restart_package'), (r'^remove_link/(\d+)$', 'views.remove_link'), (r'^restart_link/(\d+)$', 'views.restart_link'), + (r'^push_to_queue/(\d+)$', 'views.push_to_queue'), ) \ No newline at end of file diff --git a/module/web/ajax/views.py b/module/web/ajax/views.py index 4d9762ab4..d00c283f1 100644 --- a/module/web/ajax/views.py +++ b/module/web/ajax/views.py @@ -192,5 +192,13 @@ def abort_link(request, id): try: settings.PYLOAD.stop_download("link", int(id)) return JsonResponse("sucess") + except: + return HttpResponseServerError() + +@permission('pyload.can_add_dl') +def push_to_queue(request, id): + try: + settings.PYLOAD.push_package_2_queue(int(id)) + return JsonResponse("sucess") except: return HttpResponseServerError() \ No newline at end of file diff --git a/module/web/cnl/__init__.py b/module/web/cnl/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/module/web/cnl/models.py b/module/web/cnl/models.py new file mode 100644 index 000000000..71a836239 --- /dev/null +++ b/module/web/cnl/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/module/web/cnl/tests.py b/module/web/cnl/tests.py new file mode 100644 index 000000000..2247054b3 --- /dev/null +++ b/module/web/cnl/tests.py @@ -0,0 +1,23 @@ +""" +This file demonstrates two different styles of tests (one doctest and one +unittest). These will both pass when you run "manage.py test". + +Replace these with more appropriate tests for your application. +""" + +from django.test import TestCase + +class SimpleTest(TestCase): + def test_basic_addition(self): + """ + Tests that 1 + 1 always equals 2. + """ + self.failUnlessEqual(1 + 1, 2) + +__test__ = {"doctest": """ +Another way to test that 1 + 1 is equal to 2. + +>>> 1 + 1 == 2 +True +"""} + diff --git a/module/web/cnl/urls.py b/module/web/cnl/urls.py new file mode 100644 index 000000000..5e06b639f --- /dev/null +++ b/module/web/cnl/urls.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +from django.conf.urls.defaults import * + + +urlpatterns = patterns('cnl', + # Example: + # (r'^pyload/', include('pyload.foo.urls')), + + # Uncomment the admin/doc line below and add 'django.contrib.admindocs' + # to INSTALLED_APPS to enable admin documentation: + # (r'^admin/doc/', include('django.contrib.admindocs.urls')), + + # Uncomment the next line to enable the admin: + (r'^add$', 'views.add'), + (r'^addcrypted$', 'views.addcrypted'), + (r'^addcrypted2$', 'views.addcrypted2'), + (r'', 'views.flash') + ) \ No newline at end of file diff --git a/module/web/cnl/views.py b/module/web/cnl/views.py new file mode 100644 index 000000000..490a445f1 --- /dev/null +++ b/module/web/cnl/views.py @@ -0,0 +1,83 @@ +# Create your views here. + + +from django.conf import settings +from django.http import HttpResponse +from django.http import HttpResponseServerError +from os.path import join +import binascii +from urllib import unquote +import re +import base64 + +try: + from Crypto.Cipher import AES +except: + pass + +def flash(request): + return HttpResponse() + +def add(request): + package = request.POST.get('referer','ClickAndLoad Package') + urls = filter(lambda x: x != "", request.POST['urls'].split("\n")) + + settings.PYLOAD.add_package(package, urls, False) + + return HttpResponse() + +def addcrypted(request): + + package = request.POST.get('referer','ClickAndLoad Package') + dlc = request.POST['crypted'].replace(" ","+") + + dlc_path = join(settings.DL_ROOT, package.replace("/","").replace("\\","").replace(":","")+".dlc") + dlc_file = file(dlc_path, "wb") + dlc_file.write(dlc) + dlc_file.close() + + + settings.PYLOAD.add_package(package, [dlc_path], False) + + return HttpResponse() + +def addcrypted2(request): + + package = request.POST.get("source", "ClickAndLoad Package") + crypted = request.POST["crypted"] + jk = request.POST["jk"] + + crypted = base64.standard_b64decode(unquote(crypted.replace(" ","+"))) + + jk = re.findall(r"return ('|\")(.+)('|\")", jk)[0][1] + + Key = binascii.unhexlify(jk) + IV = Key + + obj = AES.new(Key, AES.MODE_CBC, IV) + result = obj.decrypt(crypted).replace("\x00","").split("\n") + + settings.PYLOAD.add_package(package, result, False) + + return HttpResponse() + +def flashgot(request): + if request.META['HTTP_REFERER'] != "http://localhost:9666/flashgot" and request.META['HTTP_REFERER'] != "http://127.0.0.1:9666/flashgot": + return HttpResponseServerError() + + autostart = int(request.POST.get('autostart',0)) + package = request.POST.get('package', "FlashGot") + urls = request.POST['urls'].split("\n") + folder = request.POST.get('dir', None) + + settings.PYLOAD.add_package(package, urls, autostart) + + return HttpResponse("") + +def crossdomain(request): + rep = "\r\n" + rep += "\r\n" + rep += "\r\n" + rep += "\r\n" + rep += "\r\n" + return HttpResponse(rep) \ No newline at end of file diff --git a/module/web/media/default/img/Button-Add-grey.png b/module/web/media/default/img/Button-Add-grey.png deleted file mode 100644 index 6659e230e..000000000 Binary files a/module/web/media/default/img/Button-Add-grey.png and /dev/null differ diff --git a/module/web/media/default/img/Button-Add.png b/module/web/media/default/img/Button-Add.png deleted file mode 100644 index 602da4131..000000000 Binary files a/module/web/media/default/img/Button-Add.png and /dev/null differ diff --git a/module/web/media/default/img/Button-Pause-grey.png b/module/web/media/default/img/Button-Pause-grey.png deleted file mode 100644 index d1017e974..000000000 Binary files a/module/web/media/default/img/Button-Pause-grey.png and /dev/null differ diff --git a/module/web/media/default/img/Button-Pause.png b/module/web/media/default/img/Button-Pause.png deleted file mode 100644 index 68f3ffc3a..000000000 Binary files a/module/web/media/default/img/Button-Pause.png and /dev/null differ diff --git a/module/web/media/default/img/Button-Play-grey.png b/module/web/media/default/img/Button-Play-grey.png deleted file mode 100644 index 9f44c2289..000000000 Binary files a/module/web/media/default/img/Button-Play-grey.png and /dev/null differ diff --git a/module/web/media/default/img/Button-Play.png b/module/web/media/default/img/Button-Play.png deleted file mode 100644 index 1ce1ed913..000000000 Binary files a/module/web/media/default/img/Button-Play.png and /dev/null differ diff --git a/module/web/media/default/img/head-menu-collector.png b/module/web/media/default/img/head-menu-collector.png new file mode 100644 index 000000000..861be40bc Binary files /dev/null and b/module/web/media/default/img/head-menu-collector.png differ diff --git a/module/web/media/default/img/head-menu-config.png b/module/web/media/default/img/head-menu-config.png new file mode 100644 index 000000000..bbf43d4f3 Binary files /dev/null and b/module/web/media/default/img/head-menu-config.png differ diff --git a/module/web/media/default/img/head-menu-development.png b/module/web/media/default/img/head-menu-development.png index 8ef08e2e5..fad150fe1 100644 Binary files a/module/web/media/default/img/head-menu-development.png and b/module/web/media/default/img/head-menu-development.png differ diff --git a/module/web/media/default/img/head-menu-queue.png b/module/web/media/default/img/head-menu-queue.png new file mode 100644 index 000000000..be98793ce Binary files /dev/null and b/module/web/media/default/img/head-menu-queue.png differ diff --git a/module/web/media/default/img/package_go.png b/module/web/media/default/img/package_go.png new file mode 100644 index 000000000..aace63ad6 Binary files /dev/null and b/module/web/media/default/img/package_go.png differ diff --git a/module/web/pyload/urls.py b/module/web/pyload/urls.py index 73ba08c21..34c3aee18 100644 --- a/module/web/pyload/urls.py +++ b/module/web/pyload/urls.py @@ -11,6 +11,8 @@ urlpatterns = patterns('pyload', (r'^downloads/$', 'views.downloads',{},'downloads'), (r'^download/(?P[a-zA-z\.0-9\-/_%]+)$', 'views.download',{},'download'), (r'^queue/$', 'views.queue',{}, 'queue'), + (r'^collector/$', 'views.collector',{}, 'collector'), + (r'^settings/$', 'views.config',{}, 'config'), (r'^logs/$', 'views.logs',{}, 'logs'), (r'^logs/(?P\d+)$', 'views.logs',{}, 'logs'), (r'^$', 'views.home',{}, 'home'), diff --git a/module/web/pyload/views.py b/module/web/pyload/views.py index 9d3b6dd29..2891b373d 100644 --- a/module/web/pyload/views.py +++ b/module/web/pyload/views.py @@ -74,9 +74,7 @@ def home(request): @permission('pyload.can_see_dl') @check_server def queue(request): - queue = settings.PYLOAD.get_queue() - for pack in queue: - pack["children"] = map(settings.PYLOAD.get_file_info, settings.PYLOAD.get_package_files(pack["id"])) + queue = settings.PYLOAD.get_full_queue() return render_to_response(join(settings.TEMPLATE, 'queue.html'), RequestContext(request, {'content': queue}, [status_proc])) @@ -146,6 +144,7 @@ def download(request, path): def logs(request, page=0): log = file(join(settings.LOG_ROOT, "log.txt")).readlines() + log.reverse() data = [] page = int(page) try: @@ -155,3 +154,19 @@ def logs(request, page=0): pass return render_to_response(join(settings.TEMPLATE, 'logs.html'), RequestContext(request, {'log': data, 'next': str(page + 20), 'prev': 0 if page-20 < 0 else page-20}, [status_proc])) + +@login_required +@permission('pyload.can_add_dl') +@check_server +def collector(request): + coll = settings.PYLOAD.get_collector_packages() + for pack in coll: + pack["children"] = map(settings.PYLOAD.get_file_info, settings.PYLOAD.get_package_files(pack["id"])) + return render_to_response(join(settings.TEMPLATE, 'collector.html'), RequestContext(request, {'content': coll}, [status_proc])) + + +@login_required +@permission('pyload.can_change_status') +@check_server +def config(request): + return render_to_response(join(settings.TEMPLATE, 'settings.html'), RequestContext(request, {}, [status_proc])) diff --git a/module/web/settings.py b/module/web/settings.py index dfde88f5c..0b9a9e460 100644 --- a/module/web/settings.py +++ b/module/web/settings.py @@ -129,6 +129,7 @@ INSTALLED_APPS = ( 'django.contrib.admin', 'pyload', 'ajax', + 'cnl' ) diff --git a/module/web/templates/default/base.html b/module/web/templates/default/base.html index bb44433ce..6f9157ecd 100644 --- a/module/web/templates/default/base.html +++ b/module/web/templates/default/base.html @@ -147,12 +147,20 @@ function AddBox() {% trans "Home" %}
  • - {% trans "Queue" %}
  • + {% trans "Queue" %} + +
  • + {% trans "Collector" %} +
  • - {% trans "Downloads" %}
  • + {% trans "Downloads" %} +
  • {% trans "Logs" %}
  • +
  • + {% trans "Config" %} +
  • {% endblock %} diff --git a/module/web/templates/default/collector.html b/module/web/templates/default/collector.html new file mode 100644 index 000000000..73625136c --- /dev/null +++ b/module/web/templates/default/collector.html @@ -0,0 +1,152 @@ +{% extends 'default/base.html' %} +{% load i18n %} + +{% block head %} + +{% endblock %} + +{% block title %}{% trans "Collector" %} - {{block.super}} {% endblock %} +{% block subtitle %}{% trans "Collector" %}{% endblock %} + +{% block menu %} +
  • + {% trans "Home" %} +
  • +
  • + {% trans "Queue" %} +
  • +
  • + {% trans "Collector" %} +
  • +
  • + {% trans "Downloads" %} +
  • +
  • + {% trans "Logs" %} +
  • +
  • + {% trans "Config" %} +
  • {% endblock %} + +{% block content %} +{% for package in content %} +
    +
    + {{ package.package_name }} +    + +    + +    + +
    + +
    +{% endfor %} + +{% endblock %} \ No newline at end of file diff --git a/module/web/templates/default/downloads.html b/module/web/templates/default/downloads.html index 3c370aaa2..b9cffa955 100644 --- a/module/web/templates/default/downloads.html +++ b/module/web/templates/default/downloads.html @@ -5,14 +5,22 @@ {% block menu %}
  • - Home + {% trans "Home" %}
  • - Queue
  • + {% trans "Queue" %} + +
  • + {% trans "Collector" %} +
  • - Downloads
  • + {% trans "Downloads" %} + +
  • + {% trans "Logs" %} +
  • - Logs + {% trans "Config" %}
  • {% endblock %} diff --git a/module/web/templates/default/logs.html b/module/web/templates/default/logs.html index 8dbe5a382..52120ffc4 100644 --- a/module/web/templates/default/logs.html +++ b/module/web/templates/default/logs.html @@ -6,14 +6,22 @@ {% block menu %}
  • - Home + {% trans "Home" %}
  • - Queue
  • + {% trans "Queue" %} + +
  • + {% trans "Collector" %} +
  • - Downloads
  • -
  • - Logs + {% trans "Downloads" %} +
  • +
  • + {% trans "Logs" %} +
  • +
  • + {% trans "Config" %}
  • {% endblock %} diff --git a/module/web/templates/default/queue.html b/module/web/templates/default/queue.html index 4cc01eeef..d33a11032 100644 --- a/module/web/templates/default/queue.html +++ b/module/web/templates/default/queue.html @@ -76,23 +76,36 @@ document.addEvent("domready", function(){ {% block subtitle %}{% trans "Queue" %}{% endblock %} {% block menu %} -
  • {% trans "Home" %}
  • -
  • {% trans "Queue" %}
  • -
  • {% trans "Downloads" %}
  • -
  • {% trans "Logs" %}
  • -{% endblock %} +
  • + {% trans "Home" %} +
  • +
  • + {% trans "Queue" %} +
  • +
  • + {% trans "Collector" %} +
  • +
  • + {% trans "Downloads" %} +
  • +
  • + {% trans "Logs" %} +
  • +
  • + {% trans "Config" %} +
  • {% endblock %} {% block content %} {% for package in content %} -
    +
    - {{ package.package_name }} + {{ package.data.package_name }}    - +    - +
    -