Compare commits
1 Commits
master
...
feature/cr
Author | SHA1 | Date |
---|---|---|
|
5eb19682ff | 4 years ago |
1 changed files with 249 additions and 0 deletions
@ -0,0 +1,249 @@ |
||||
#!/usr/bin/env python3 |
||||
# |
||||
# Epour - A bittorrent client using EFL and libtorrent |
||||
# |
||||
# Copyright 2012-2017 Kai Huuhko <kai.huuhko@gmail.com> |
||||
# |
||||
# 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, write to the Free Software |
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, |
||||
# MA 02110-1301, USA. |
||||
# |
||||
|
||||
import os |
||||
|
||||
import libtorrent as lt |
||||
|
||||
from efl import elementary as elm |
||||
from efl.evas import EXPAND_BOTH, FILL_BOTH, EXPAND_HORIZ, FILL_HORIZ |
||||
|
||||
|
||||
data = {"trackers": list()} |
||||
|
||||
class CreateTorrentGui(elm.StandardWindow): |
||||
def __init__(self): |
||||
super().__init__("testi", "testi", autodel=True) |
||||
|
||||
data["storage"] = lt.file_storage() |
||||
|
||||
nf = elm.Naviframe(self, size_hint_weight=EXPAND_BOTH) |
||||
self.resize_object_add(nf) |
||||
nf.show() |
||||
|
||||
first_next = elm.Button(self, text="Files/Directories") |
||||
second_prev = elm.Button(self, text="Base Directory") |
||||
second_next = elm.Button(self, text="Tracker URLs") |
||||
third_prev = elm.Button(self, text="Files/Directories") |
||||
third_next = elm.Button(self, text="Generate") |
||||
fourth_prev = elm.Button(self, text="Tracker URLs") |
||||
|
||||
first_content = BaseDirectorySelection(self) |
||||
second_content = FileSelection(self) |
||||
third_content = TrackerAddition(self) |
||||
fourth_content = TorrentGenerate(self) |
||||
|
||||
first = elm.NaviframeItem("Select Base Directory", next_btn=first_next, content=first_content) |
||||
second = elm.NaviframeItem("Select Files/Directories", prev_btn=second_prev, next_btn=second_next, content=second_content) |
||||
third = elm.NaviframeItem("Add Tracker URLs", prev_btn=third_prev, next_btn=third_next, content=third_content) |
||||
fourth = elm.NaviframeItem("Generate Torrent", prev_btn=fourth_prev, content=fourth_content) |
||||
|
||||
def first_next_cb(obj): |
||||
second.promote() |
||||
|
||||
def second_prev_cb(obj): |
||||
first.promote() |
||||
|
||||
def second_next_cb(obj): |
||||
third.promote() |
||||
|
||||
def third_prev_cb(obj): |
||||
second.promote() |
||||
|
||||
def third_next_cb(obj): |
||||
fourth.promote() |
||||
|
||||
def fourth_prev_cb(obj): |
||||
third.promote() |
||||
|
||||
first_content.selector.callback_directory_open_add(second_content.basedir_changed_cb) |
||||
|
||||
|
||||
first_next.callback_clicked_add(first_next_cb) |
||||
second_prev.callback_clicked_add(second_prev_cb) |
||||
second_next.callback_clicked_add(second_next_cb) |
||||
third_prev.callback_clicked_add(third_prev_cb) |
||||
third_next.callback_clicked_add(third_next_cb) |
||||
fourth_prev.callback_clicked_add(fourth_prev_cb) |
||||
|
||||
for page in first, second, third, fourth: |
||||
page.push_to(nf) |
||||
|
||||
first.promote() |
||||
|
||||
self.size = 400, 400 |
||||
self.show() |
||||
|
||||
|
||||
class BaseDirectorySelection(elm.Box): |
||||
def __init__(self, parent, *args, **kwargs): |
||||
super().__init__(parent, *args, **kwargs) |
||||
|
||||
def bdir_cb(obj, path): |
||||
if not path: |
||||
return |
||||
data["base_dir"] = path |
||||
|
||||
selector = self.selector = elm.Fileselector( |
||||
self, |
||||
size_hint_weight=EXPAND_BOTH, |
||||
size_hint_align=FILL_BOTH, |
||||
buttons_ok_cancel=False, |
||||
folder_only=True, |
||||
expandable=False |
||||
) |
||||
selector.callback_directory_open_add(bdir_cb) |
||||
selector.show() |
||||
self.pack_end(selector) |
||||
|
||||
class FileSelection(elm.Box): |
||||
def __init__(self, parent, *args, **kwargs): |
||||
super().__init__(parent, *args, **kwargs) |
||||
|
||||
self.size_hint_weight=EXPAND_BOTH |
||||
self.size_hint_align=FILL_BOTH |
||||
|
||||
def add_cb(obj, path): |
||||
if not path: |
||||
return |
||||
|
||||
if not path.startswith(data["base_dir"]): |
||||
print("Error! Target must be inside base directory!") |
||||
return |
||||
size = os.stat(path).st_size |
||||
lt.add_files(data["storage"], path) |
||||
flist.item_append(path) |
||||
flist.go() |
||||
|
||||
def del_db(obj): |
||||
if not flist.selected_item: |
||||
return |
||||
lt.del_files(data["storage"], flist.selected_item.text) |
||||
|
||||
flist = elm.List(self, size_hint_weight=EXPAND_BOTH, size_hint_align=FILL_BOTH) |
||||
flist.show() |
||||
flist.go() |
||||
self.pack_end(flist) |
||||
|
||||
add_btn = self.add_btn = elm.FileselectorButton( |
||||
self, |
||||
size_hint_weight=EXPAND_BOTH, |
||||
size_hint_align=FILL_BOTH, |
||||
text="Add file" |
||||
) |
||||
add_btn.callback_file_chosen_add(add_cb) |
||||
add_btn.show() |
||||
self.pack_end(add_btn) |
||||
|
||||
# del_btn = self.del_btn = elm.Button( |
||||
# self, |
||||
# text="Delete file" |
||||
# ) |
||||
# del_btn.callback_clicked_add(del_db) |
||||
# del_btn.show() |
||||
# self.pack_end(del_btn) |
||||
|
||||
def basedir_changed_cb(self, obj, path): |
||||
print("basedir") |
||||
self.add_btn.path = path |
||||
|
||||
|
||||
class TrackerAddition(elm.Box): |
||||
def __init__(self, parent, *args, **kwargs): |
||||
super().__init__(parent, *args, **kwargs) |
||||
|
||||
tlist = elm.List(self, size_hint_weight=EXPAND_BOTH, size_hint_align=FILL_BOTH) |
||||
tlist.show() |
||||
tlist.go() |
||||
self.pack_end(tlist) |
||||
|
||||
add_box = elm.Box( |
||||
self, |
||||
size_hint_weight=EXPAND_BOTH, |
||||
size_hint_align=FILL_BOTH |
||||
) |
||||
|
||||
def add_cb(obj): |
||||
url = add_entry.entry |
||||
if not url: |
||||
return |
||||
data["trackers"].append(url) |
||||
tlist.item_append(url) |
||||
tlist.go() |
||||
|
||||
add_entry = elm.Entry( |
||||
self, |
||||
size_hint_weight=EXPAND_HORIZ, |
||||
size_hint_align=FILL_HORIZ |
||||
) |
||||
add_entry.show() |
||||
add_box.pack_end(add_entry) |
||||
|
||||
add_btn = elm.Button(self, text="Add") |
||||
add_btn.callback_clicked_add(add_cb) |
||||
add_btn.show() |
||||
add_box.pack_end(add_btn) |
||||
|
||||
add_box.show() |
||||
self.pack_end(add_box) |
||||
|
||||
self.show() |
||||
|
||||
|
||||
class TorrentGenerate(elm.Box): |
||||
def __init__(self, parent, *args, **kwargs): |
||||
super().__init__(parent, *args, **kwargs) |
||||
|
||||
def gen_cb(obj, path): |
||||
if not path: |
||||
return |
||||
t = lt.create_torrent(data["storage"]) |
||||
lt.set_piece_hashes(t, data["base_dir"]) |
||||
for tracker in data["trackers"]: |
||||
t.add_tracker(tracker) |
||||
entry = t.generate() |
||||
print(entry) |
||||
bentry = lt.bencode(entry) |
||||
with open(path, "wb") as fp: |
||||
fp.write(bentry) |
||||
|
||||
print("Done!") |
||||
|
||||
gen_btn = FSButton(self, text="Generate Torrent", is_save=True, window_title="Name and path for new torrent") |
||||
gen_btn.callback_file_chosen_add(gen_cb) |
||||
gen_btn.show() |
||||
self.pack_end(gen_btn) |
||||
|
||||
|
||||
class FSButton(elm.Fileselector, elm.FileselectorButton): |
||||
def __init__(self, parent, *args, **kwargs): |
||||
elm.FileselectorButton.__init__(self, parent, *args, **kwargs) |
||||
|
||||
|
||||
class FSEntry(elm.Fileselector, elm.FileselectorEntry): |
||||
def __init__(self, parent, *args, **kwargs): |
||||
elm.FileselectorEntry.__init__(self, parent, *args, **kwargs) |
||||
|
||||
|
||||
elm.policy_set(elm.ELM_POLICY_QUIT, elm.ELM_POLICY_QUIT_LAST_WINDOW_CLOSED) |
||||
CreateTorrentGui() |
||||
elm.run() |
Loading…
Reference in new issue