Boost compatibility with recent libtorrent versions.

Summary:
Since libtorrent 1.2.0.0, several things have changed:
* Session are handled differently. Must use get_settings() instead of calling settings()
* Also set_settings() has been removed. Now apply_settings() must be used.
* The way proxies are stored has changed too.

Everything has been made backwords compatible.

Plus, I took the liberty of getting rid of the cgi module.
cgi.escape() as been deprecated since Python 3.2
So I replaced it with the html module, as recommended from the Python documentation:
 - https://docs.python.org/3.7/library/cgi.html

Fixes #T8885

Reviewers: DaveMDS, kuuko, ProhtMeyhet

Subscribers: ali.alzyod

Differential Revision: https://phab.enlightenment.org/D12276
master
rafspiny 3 years ago committed by Carsten Haitzler (Rasterman)
parent 6b605cea95
commit c7264e9ed5
  1. 84
      epour/gui/Preferences.py
  2. 6
      epour/gui/TorrentProps.py
  3. 4
      epour/gui/__init__.py
  4. 35
      epour/session.py

@ -20,7 +20,7 @@
#
import os
import cgi
import html
import logging
import libtorrent as lt
@ -45,6 +45,7 @@ from efl.evas import Rectangle, EVAS_HINT_EXPAND, EVAS_HINT_FILL
from .Widgets import UnitSpinner, Error, Information, ActSWithLabel, FsButton, \
RangeSpinners
from ..session import lt_version_post_breaking_change, get_session_settings, save_settings
log = logging.getLogger("epour.preferences")
@ -278,34 +279,24 @@ class PreferencesProxy(PreferencesDialog):
proxies = [
[_("Proxy for torrent peer connections"),
session.peer_proxy, session.set_peer_proxy],
session.peer_proxy, session.set_peer_proxy, session],
[_("Proxy for torrent web seed connections"),
session.web_seed_proxy, session.set_web_seed_proxy],
session.web_seed_proxy, session.set_web_seed_proxy, session],
[_("Proxy for tracker connections"),
session.tracker_proxy, session.set_tracker_proxy],
session.tracker_proxy, session.set_tracker_proxy, session],
[_("Proxy for DHT connections"),
session.dht_proxy, session.set_dht_proxy],
session.dht_proxy, session.set_dht_proxy, session],
]
for title, rfunc, wfunc in proxies:
pg = ProxyGroup(self, title, rfunc, wfunc)
for title, rfunc, wfunc, session in proxies:
pg = ProxyGroup(self, title, rfunc, wfunc, session)
pg.show()
self.box.pack_end(pg)
class ProxyGroup(Frame):
proxy_types = {
lt.proxy_type.none.name: lt.proxy_type.none,
lt.proxy_type.socks4.name: lt.proxy_type.socks4,
lt.proxy_type.socks5.name: lt.proxy_type.socks5,
lt.proxy_type.socks5_pw.name: lt.proxy_type.socks5_pw,
lt.proxy_type.http.name: lt.proxy_type.http,
lt.proxy_type.http_pw.name: lt.proxy_type.http_pw,
lt.proxy_type.i2p_proxy.name: lt.proxy_type.i2p_proxy,
}
def __init__(self, parent, title, rfunc, wfunc):
def __init__(self, parent, title, rfunc, wfunc, session):
Frame.__init__(
self, parent, size_hint_weight=EXPAND_HORIZ,
size_hint_align=FILL_HORIZ, text=title
@ -322,9 +313,16 @@ class ProxyGroup(Frame):
l = Label(self, text=_("Proxy type"), size_hint_align=ALIGN_LEFT)
l.show()
ptype = Hoversel(parent, size_hint_align=FILL_HORIZ)
ptype.text = str(lt.proxy_type.values[ps.type])
for n in lt.proxy_type.names.keys():
ptype.item_add(n, callback=lambda x, y, z=n: ptype.text_set(z))
if lt_version_post_breaking_change:
ptype.text = str(ps.type)
for n in lt.proxy_type_t.values:
label = str(lt.proxy_type_t.values[n])
ptype.item_add(label, callback=lambda x, y, z=label: ptype.text_set(z))
else:
ptype.text = str(lt.proxy_type.values[ps.type])
for n in lt.proxy_type.names.keys():
ptype.item_add(n, callback=lambda x, y, z=n: ptype.text_set(z))
ptype.show()
t.pack(l, 0, 0, 1, 1)
t.pack(ptype, 1, 0, 1, 1)
@ -399,17 +397,25 @@ class ProxyGroup(Frame):
def save_conf(self, btn, wfunc, entries):
ptype, phost, pport, puser, ppass, phostlu, ppeer = entries
p = lt.proxy_settings()
if lt_version_post_breaking_change:
if ptype.text not in lt.proxy_type_t.proxy_type.names:
raise ValueError("Value %s is not valid.", ptype.text)
p = lt.proxy_type_t.proxy_settings()
p.type = lt.proxy_type_t.proxy_type.names[ptype.text]
ptype_name = ptype.text
else:
p = lt.proxy_settings()
p.type = lt.proxy_type.names[ptype.text]
ptype_name = ptype
p.hostname = phost.entry.encode("utf-8")
p.username = puser.entry.encode("utf-8")
p.password = ppass.entry.encode("utf-8")
p.type = lt.proxy_type.names[ptype.text]
p.port = int(pport.value)
p.proxy_hostnames = phostlu.state
p.proxy_peer_connections = ppeer.state
Information(self.top_widget, _("%s settings saved") % (ptype))
Information(self.top_widget, _("%s settings saved") % (ptype_name))
wfunc(p)
@ -491,7 +497,7 @@ class PreferencesSession(PreferencesDialog):
#elm_conf = Configuration()
#scale = elm_conf.scale
s = session.settings()
s = get_session_settings(session)
t = Table(
self, padding=(5, 5), homogeneous=True, size_hint_align=FILL_BOTH
@ -507,22 +513,15 @@ class PreferencesSession(PreferencesDialog):
import time
t1 = time.time()
for k in dir(s):
for k in s.keys():
if k.startswith("__"):
continue
try:
if k == "peer_tos" or k == "outgoing_ports":
# XXX: these don't have a C++ -> Python equivalent.
continue
a = getattr(s, k)
if isinstance(a, lt.disk_cache_algo_t):
w = Spinner(t)
w.size_hint_align = FILL_HORIZ
w.min_max = 0, len(lt.disk_cache_algo_t.values) - 1
for name, val in lt.disk_cache_algo_t.names.items():
w.special_value_add(val, name)
w.value = a
elif k == "suggest_mode":
a = s.get(k)
if k == "suggest_mode":
w = Spinner(t)
w.size_hint_align = FILL_HORIZ
w.min_max = 0, len(lt.suggest_mode_t.values) - 1
@ -583,14 +582,14 @@ class PreferencesSession(PreferencesDialog):
w.size_hint_weight = EXPAND_HORIZ
w.single_line = True
w.editable = False
w.entry = cgi.escape(a)
w.entry = html.escape(a)
else:
log.debug("Using string for %s type %s", k, type(a))
w = Entry(t)
w.size_hint_align = FILL_HORIZ
w.size_hint_weight = EXPAND_HORIZ
w.single_line = True
w.entry = cgi.escape(a)
w.entry = html.escape(a)
w.part_text_set("guide", "Enter here")
l = Label(t)
l.text = k.replace("_", " ").capitalize()
@ -616,13 +615,11 @@ class PreferencesSession(PreferencesDialog):
self.box.pack_end(save_btn)
def apply_settings(self, btn, widgets, session):
s = lt.session_settings()
s = get_session_settings(session)
for k, w in widgets.items():
if k == "disk_cache_algorithm":
v = lt.disk_cache_algo_t(w.value)
elif isinstance(w, Spinner):
if isinstance(w, Spinner):
v = int(w.value)
elif isinstance(w, Slider):
v = w.value
@ -633,9 +630,10 @@ class PreferencesSession(PreferencesDialog):
else:
v = None
setattr(s, k, v)
s[k] = v
save_settings(session, s)
session.set_settings(s)
Information(self, "Session settings saved.")

@ -22,7 +22,7 @@
if "long" not in dir(__builtins__):
long = int
import cgi
import html
import sys
import os
import pipes
@ -141,7 +141,7 @@ class TorrentProps(DialogWindow):
self, size_hint_align=FILL_HORIZ, line_wrap=ELM_WRAP_CHAR,
ellipsis=True, scale=2.0
)
tname.text = "{}".format(cgi.escape(h.name()))
tname.text = "{}".format(html.escape(h.name()))
tname.show()
box.pack_end(tname)
@ -385,7 +385,7 @@ class TorrentInfo(Box):
table.pack(l, 0, i, 1, 1)
l.show()
v = Label(table, ellipsis=True, size_hint_align=ALIGN_LEFT)
v.text = cgi.escape(str(w))
v.text = html.escape(str(w))
table.pack(v, 1, i, 1, 1)
v.show()
i += 1

@ -21,7 +21,7 @@
import os
import sys
import cgi
import html
import logging
from datetime import timedelta, datetime
import gettext
@ -285,7 +285,7 @@ class MainInterface(object):
def torrent_finished_cb(a):
msg = _("Torrent {} has finished downloading.").format(
cgi.escape(a.handle.name())
html.escape(a.handle.name())
)
log.info(msg)

@ -38,6 +38,7 @@ from efl.ecore import Timer
from xdg.BaseDirectory import save_data_path, load_data_paths
lt_version = LooseVersion(lt.version)
lt_version_post_breaking_change = lt_version >= LooseVersion("1.2.0.0")
log = logging.getLogger("epour.session")
@ -92,6 +93,28 @@ def lt_compatibility_convert(params):
params[k] = v.to_bytes()
def get_session_settings(session: lt.session) -> dict:
"""
Returns a dictionary containing all the settings pairs (key, value), regardless of the version of libtorrent.
"""
if lt_version_post_breaking_change:
settings = session.get_settings()
else:
settings = session.settings().__dict__
return settings
def save_settings(session: lt.session, settings: dict) -> None:
"""
Save the settings on a session object. It uses the right API according to the libtorrent version.
"""
if lt_version_post_breaking_change:
session.apply_settings(settings)
else:
session.set_settings(settings)
class Session(lt.session):
def __init__(self, conf, shutdown_cb):
@ -239,15 +262,15 @@ class Session(lt.session):
log.info("Session restored from disk.")
break
settings = self.settings()
from epour import __version__ as version
version += ".0"
ver_s = "Epour/{} libtorrent/{}".format(version, lt.version)
settings.user_agent = ver_s
settings = get_session_settings(self)
settings["user_agent"] = ver_s
log.debug("User agent: %s", ver_s)
self.set_settings(settings)
save_settings(self, settings)
def save_state(self):
state = lt.session.save_state(self)
@ -300,7 +323,7 @@ class Session(lt.session):
params_dict["ti"] = ti
if ti:
if lt_version < LooseVersion("1.2.0.0"):
if not lt_version_post_breaking_change:
try:
data = read_resume_data(info_hash)
except Exception:
@ -316,7 +339,7 @@ class Session(lt.session):
else:
params.trackers = list(set(params.trackers))
if lt_version < LooseVersion("1.2.0.0"):
if not lt_version_post_breaking_change:
if params is None:
log.warn("Falling back to < lt 1.2 compatibility handling.")
lt_compatibility_convert(params_dict)

Loading…
Cancel
Save