250 lines
7.6 KiB
Python
Executable File
250 lines
7.6 KiB
Python
Executable File
#!/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()
|