Merge branch 'master' into autodownloader

This commit is contained in:
Jack 2015-12-14 13:03:17 -05:00
commit 75fbedeeac
7 changed files with 170 additions and 92 deletions

View file

@ -8,7 +8,9 @@ built into LBRYnet.
on Ubuntu: on Ubuntu:
```
sudo apt-get install libgmp3-dev build-essential python-dev python-pip sudo apt-get install libgmp3-dev build-essential python-dev python-pip
```
Getting the source Getting the source
------------------ ------------------
@ -20,15 +22,19 @@ Setting up the environment
It's recommended that you use a virtualenv It's recommended that you use a virtualenv
```
sudo apt-get install python-virtualenv sudo apt-get install python-virtualenv
cd <source base directory> cd <source base directory>
virtualenv . virtualenv .
source bin/activate source bin/activate
```
(to deactivate the virtualenv, enter 'deactivate') (to deactivate the virtualenv, enter 'deactivate')
```
python setup.py install python setup.py install
```
this will install all of the libraries and a few applications this will install all of the libraries and a few applications
For running the file sharing application, see RUNNING For running the file sharing application, see [RUNNING](RUNNING.md)

View file

@ -28,11 +28,11 @@ must first obtain the 'stream descriptor' and then may open it with his 'lbrynet
download all of the chunks by locating peers with the chunks via the DHT, and then combine the download all of the chunks by locating peers with the chunks via the DHT, and then combine the
chunks into the original file, according to the metadata included in the 'stream descriptor'. chunks into the original file, according to the metadata included in the 'stream descriptor'.
To install and use this client, see INSTALL and RUNNING To install and use this client, see [INSTALL](INSTALL.md) and [RUNNING](RUNNING.md)
## Installation ## Installation
See INSTALL See [INSTALL](INSTALL.md)
## Developers ## Developers
@ -47,4 +47,4 @@ Send all support requests to jimmy@lbry.io
## License ## License
See LICENSE See [LICENSE](LICENSE)

View file

@ -8,59 +8,55 @@ Download the file https://raw.githubusercontent.com/lbryio/lbry-setup/master/lbr
Once it's done building, type: Once it's done building, type:
```
./lbrycrd/src/lbrycrdd -server -daemon ./lbrycrd/src/lbrycrdd -server -daemon
lbrynet-gui lbrynet-gui
```
A window should show up with an entry box A window should show up with an entry box
Type wonderfullife into the box, hit go, and choose to stream or save Type wonderfullife into the box, hit go, and choose to stream or save
To stop lbrycrdd: To stop lbrycrdd: `./lbrycrd/src/lbrycrd-cli stop`
./lbrycrd/src/lbrycrd-cli stop
## Slightly longer install guide ## Slightly longer install guide
### Installing lbrycrd from source ### Installing lbrycrd from source
Acquire the LBRYcrd source code from https://github.com/lbryio/lbrycrd ```
git clone --depth=1 https://github.com/lbryio/lbrycrd.git
cd lbrycrd cd lbrycrd
sudo apt-get install build-essential libtool autotools-dev autoconf pkg-config libssl-dev libboost-all-dev libdb-dev libdb++-dev libqt4-dev libprotobuf-dev protobuf-compiler sudo apt-get install build-essential libtool autotools-dev autoconf pkg-config libssl-dev libboost-all-dev libdb-dev libdb++-dev libqt4-dev libprotobuf-dev protobuf-compiler
./autogen.sh ./autogen.sh
./configure --with-incompatible-bdb --without-gui
./configure --with-incompatible-bdb
make make
```
When make has completed, create the directory where LBRYcrd data will be stored. ~/.lbrycrd is where LBRYcrd will look by default and so is recommended. When make has completed, create the directory where LBRYcrd data will be stored. ~/.lbrycrd is where LBRYcrd will look by default and so is recommended.
```
mkdir ~/.lbrycrd mkdir ~/.lbrycrd
echo 'rpcuser=rpcuser
vim ~/.lbrycrd/lbrycrd.conf rpcpassword=rpcpassword' > ~/.lbrycrd/lbrycrd.conf
# (use a long random password if your computer is on a network anyone else has access to. e.g, pwgen -s 20)
Add the following lines to enable the RPC interface, which will be used by lbrynet-console.
rpcuser=rpcuser
rpcpassword=rpcpassword
(use a long random password if your computer is on a network anyone else has access to)
cd .. cd ..
```
### Installing lbrynet from source ### Installing lbrynet from source
Acquire the LBRYnet source code from https://github.com/lbryio/lbry Acquire the LBRYnet source code from https://github.com/lbryio/lbry
```
cd lbry cd lbry
sudo apt-get install libgmp3-dev build-essential python-dev python-pip sudo apt-get install libgmp3-dev build-essential python-dev python-pip
```
(with virtualenv) (with virtualenv)
```
python-virtualenv python-virtualenv
virtualenv . virtualenv .
@ -69,33 +65,45 @@ source bin/activate
python setup.py install python setup.py install
```
to deactivate the virtualenv later: to deactivate the virtualenv later:
```
deactivate deactivate
```
to reactivate it, go to the directory in which you created it and: to reactivate it, go to the directory in which you created it and:
```
source bin/activate source bin/activate
```
(without virtualenv) (without virtualenv)
```
python setup.py build bdist_egg python setup.py build bdist_egg
sudo python setup.py install sudo python setup.py install
```
## Slightly longer running guide ## Slightly longer running guide
In order to use lbrynet-console or lbrynet-gui, lbyrcrdd must be running. ###In order to use lbrynet-console or lbrynet-gui, lbyrcrd must be running.
### Running lbrycrd ### Running lbrycrd
If you ran the easy install script, the lbrycrd folder will be in the directory you ran lbry_setup.sh from. Otherwise it is the root of the cloned lbrycrd repository. Go to that directory. If you ran the easy install script, the lbrycrd folder will be in the directory you ran lbry_setup.sh from. Otherwise it is the root of the cloned lbrycrd repository. Go to that directory.
```
./src/lbrycrdd -server -daemon ./src/lbrycrdd -server -daemon
```
If you want to mine LBC, also use the flag '-gen', so: If you want to mine LBC, also use the flag '-gen', so:
```
./src/lbrycrdd -server -daemon -gen ./src/lbrycrdd -server -daemon -gen
```
It will take a few minutes for your client to download the whole block chain. It will take a few minutes for your client to download the whole block chain.
@ -103,35 +111,31 @@ lbrycrdd must be running in order for lbrynet to function.
To shut lbrycrdd down: from the lbrycrd directory, run To shut lbrycrdd down: from the lbrycrd directory, run
./src/lbrycrd-cli stop ```
./src/lbrycrd-cli stop
```
### Option 1) Running lbrynet-console ### Option 1) Running lbrynet-console
If you used the virtualenv instructions above, make sure the virtualenv is still active. If not, reactivate it according to the instructions above, under "Installing lbrynet from source" If you used the virtualenv instructions above, make sure the virtualenv is still active. If not, reactivate it according to the instructions above, under "Installing lbrynet from source"
In your terminal: In your terminal: `lbrynet-console`
lbrynet-console
You should be presented with a prompt. You should be presented with a prompt.
Watch It's a Wonderful Life via LBRY Watch It's a Wonderful Life via LBRY
Type into the prompt: Type into the prompt: `get wonderfullife`
get wonderfullife To shut it down, press ctrl-c at any time or enter `exit` into the prompt.
To shut it down, type ctrl-c at any time or enter 'exit' into the prompt.
### Option 2) Running lbrynet-gui ### Option 2) Running lbrynet-gui
If you used the virtualenv instructions above, make sure the virtualenv is still active. If not, reactivate it according to the instructions above, under "Installing lbrynet from source" If you used the virtualenv instructions above, make sure the virtualenv is still active. If not, reactivate it according to the instructions above, under "Installing lbrynet from source"
In your terminal: In your terminal: `lbrynet-gui`
lbrynet-gui A window should pop up with an entry box. Type `wonderfullife` into the box, hit go, and then choose to save it or stream it.
A window should pop up with an entry box. Type 'wonderfullife' into the box, hit go, and then choose to save it or stream it.
Enjoy! Enjoy!
Any questions or problems, email jimmy@lbry.io Any questions or problems, email jimmy@lbry.io

View file

@ -275,7 +275,7 @@ class LBRYcrdWallet(object):
value_dict = json.loads(value) value_dict = json.loads(value)
except ValueError: except ValueError:
return Failure(InvalidStreamInfoError(name)) return Failure(InvalidStreamInfoError(name))
known_fields = ['stream_hash', 'name', 'description', 'key_fee', 'key_fee_address'] known_fields = ['stream_hash', 'name', 'description', 'key_fee', 'key_fee_address', 'thumbnail']
for field in known_fields: for field in known_fields:
if field in value_dict: if field in value_dict:
r_dict[field] = value_dict[field] r_dict[field] = value_dict[field]

View file

@ -397,6 +397,8 @@ class LBRYDownloader(object):
stream_frame.show_name(value['name']) stream_frame.show_name(value['name'])
if 'description' in value: if 'description' in value:
stream_frame.show_description(value['description']) stream_frame.show_description(value['description'])
if 'thumbnail' in value:
stream_frame.show_thumbnail(value['thumbnail'])
return value return value
def get_sd_hash(value): def get_sd_hash(value):
@ -437,7 +439,7 @@ class LBRYDownloader(object):
else: else:
estimated_cost = "unknown" estimated_cost = "unknown"
stream_frame.show_stream_metadata(stream_name, stream_size) stream_frame.show_stream_metadata(stream_name, stream_size, estimated_cost)
available_options = metadata.options.get_downloader_options(metadata.validator, available_options = metadata.options.get_downloader_options(metadata.validator,
payment_rate_manager) payment_rate_manager)

View file

@ -56,7 +56,8 @@ class StreamFrame(object):
self.name_frame = ttk.Frame(self.stream_frame_body, style="D.TFrame") self.name_frame = ttk.Frame(self.stream_frame_body, style="D.TFrame")
self.name_frame.grid(sticky=tk.W + tk.E) self.name_frame.grid(sticky=tk.W + tk.E)
self.name_frame.grid_columnconfigure(0, weight=1) self.name_frame.grid_columnconfigure(0, weight=16)
self.name_frame.grid_columnconfigure(1, weight=1)
self.stream_frame_body.grid_columnconfigure(0, weight=1) self.stream_frame_body.grid_columnconfigure(0, weight=1)
@ -69,42 +70,45 @@ class StreamFrame(object):
self.outer_button_frame = ttk.Frame(self.stream_frame_body, style="D.TFrame") self.outer_button_frame = ttk.Frame(self.stream_frame_body, style="D.TFrame")
self.outer_button_frame.grid(sticky=tk.W + tk.E, row=4) self.outer_button_frame.grid(sticky=tk.W + tk.E, row=4)
show_options_picture_file_name = "show_options.gif" #show_options_picture_file_name = "show_options.gif"
if os.name == "nt": #if os.name == "nt":
show_options_picture_file = os.path.join(os.path.dirname(os.path.abspath(sys.argv[0])), # show_options_picture_file = os.path.join(os.path.dirname(os.path.abspath(sys.argv[0])),
"lbrynet", "lbrynet_downloader_gui", # "lbrynet", "lbrynet_downloader_gui",
show_options_picture_file_name) # show_options_picture_file_name)
else: #else:
show_options_picture_file = os.path.join(os.path.dirname(__file__), # show_options_picture_file = os.path.join(os.path.dirname(__file__),
show_options_picture_file_name) # show_options_picture_file_name)
self.show_options_picture = tk.PhotoImage( #self.show_options_picture = tk.PhotoImage(
file=show_options_picture_file # file=show_options_picture_file
) #)
hide_options_picture_file_name = "hide_options.gif" #hide_options_picture_file_name = "hide_options.gif"
if os.name == "nt": #if os.name == "nt":
hide_options_picture_file = os.path.join(os.path.dirname(os.path.abspath(sys.argv[0])), # hide_options_picture_file = os.path.join(os.path.dirname(os.path.abspath(sys.argv[0])),
"lbrynet", "lbrynet_downloader_gui", # "lbrynet", "lbrynet_downloader_gui",
hide_options_picture_file_name) # hide_options_picture_file_name)
else: #else:
hide_options_picture_file = os.path.join(os.path.dirname(__file__), # hide_options_picture_file = os.path.join(os.path.dirname(__file__),
hide_options_picture_file_name) # hide_options_picture_file_name)
self.hide_options_picture = tk.PhotoImage( #self.hide_options_picture = tk.PhotoImage(
file=hide_options_picture_file # file=hide_options_picture_file
) #)
self.show_options_button = None #self.show_options_button = None
self.status_label = None self.status_label = None
self.name_label = None #self.name_label = None
self.name_text = None
self.estimated_cost_frame = None
self.bytes_downloaded_label = None self.bytes_downloaded_label = None
self.button_frame = None self.button_frame = None
self.download_buttons = [] self.download_buttons = []
self.option_frames = [] self.option_frames = []
self.name_font = None self.name_font = None
self.description_label = None self.description_text = None
#self.description_label = None
self.file_name_frame = None self.file_name_frame = None
self.cost_frame = None self.cost_frame = None
self.cost_description = None self.cost_description = None
@ -119,22 +123,72 @@ class StreamFrame(object):
self.stream_frame.destroy() self.stream_frame.destroy()
self.app.stream_removed() self.app.stream_removed()
def _resize_text(self, text_widget):
actual_height = text_widget.tk.call(text_widget._w, "count", "-displaylines", "0.0", "end")
text_widget.config(height=int(actual_height))
def show_name(self, name): def show_name(self, name):
self.name_font = tkFont.Font(size=16) self.name_font = tkFont.Font(size=16)
self.name_label = ttk.Label( #self.name_label = ttk.Label(
self.name_frame, text=name, font=self.name_font # self.name_frame, text=name, font=self.name_font
#)
#self.name_label.grid(row=0, column=0, sticky=tk.W)
self.name_text = tk.Text(
self.name_frame, font=self.name_font, wrap=tk.WORD, relief=tk.FLAT, borderwidth=0,
highlightthickness=0, width=1, height=1
) )
self.name_label.grid(row=0, column=0, sticky=tk.W) self.name_text.insert(tk.INSERT, name)
self.name_text.config(state=tk.DISABLED)
self.name_text.grid(row=0, column=0, sticky=tk.W+tk.E+tk.N+tk.S)
self.name_text.update()
self._resize_text(self.name_text)
def show_description(self, description): def show_description(self, description):
if os.name == "nt": #if os.name == "nt":
wraplength = 580 # wraplength = 580
else: #else:
wraplength = 600 # wraplength = 600
self.description_label = ttk.Label( #self.description_label = ttk.Label(
self.name_frame, text=description, wraplength=wraplength # self.name_frame, text=description, wraplength=wraplength
#)
#self.description_label.grid(row=1, column=0, sticky=tk.W)
self.description_text = tk.Text(
self.name_frame, wrap=tk.WORD, relief=tk.FLAT, borderwidth=0,
highlightthickness=0, width=1, height=1
) )
self.description_label.grid(row=1, column=0, sticky=tk.W) self.description_text.insert(tk.INSERT, description)
self.description_text.config(state=tk.DISABLED)
self.description_text.grid(row=1, column=0, sticky=tk.W+tk.E+tk.N+tk.S)
self.description_text.update()
self._resize_text(self.description_text)
def show_thumbnail(self, url=None):
thumbnail = None
if url is not None:
import urllib2
import base64
response = urllib2.urlopen(url)
thumbnail_data = base64.b64encode(response.read())
thumbnail = tk.PhotoImage(data=thumbnail_data)
current_width = thumbnail.width()
current_height = thumbnail.height()
max_width = 130
max_height = 90
scale_ratio = max(1.0 * current_width / max_width, 1.0 * current_height / max_height)
if scale_ratio < 1:
scale_ratio = 1
else:
scale_ratio = int(scale_ratio + 1)
thumbnail = thumbnail.subsample(scale_ratio)
if thumbnail is not None:
label = ttk.Label(self.name_frame, image=thumbnail)
label.safekeeping = thumbnail
label.grid(row=0, column=1, rowspan=2, sticky=tk.E+tk.N+tk.W+tk.S)
label.update()
self.description_text.update()
self.name_text.update()
self._resize_text(self.description_text)
self._resize_text(self.name_text)
def show_metadata_status(self, value): def show_metadata_status(self, value):
if self.status_label is None: if self.status_label is None:
@ -166,7 +220,7 @@ class StreamFrame(object):
return "%.1f %s" % (round((stream_size * 1.0 / factor), 1), units) return "%.1f %s" % (round((stream_size * 1.0 / factor), 1), units)
return stream_size return stream_size
def show_stream_metadata(self, stream_name, stream_size): def show_stream_metadata(self, stream_name, stream_size, stream_cost):
if self.status_label is not None: if self.status_label is not None:
self.status_label.destroy() self.status_label.destroy()
@ -186,6 +240,17 @@ class StreamFrame(object):
) )
file_name_label.grid(row=0, column=3) file_name_label.grid(row=0, column=3)
self.estimated_cost_frame = ttk.Frame(self.metadata_frame, style="F.TFrame")
self.estimated_cost_frame.grid(row=1, column=0, sticky=tk.W)
estimated_cost_label = ttk.Label(
self.estimated_cost_frame,
text=locale.format_string("%.2f LBC",
(round(stream_cost, 2)), grouping=True),
foreground="red"
)
estimated_cost_label.grid(row=1, column=2)
self.button_frame = ttk.Frame(self.outer_button_frame, style="E.TFrame") self.button_frame = ttk.Frame(self.outer_button_frame, style="E.TFrame")
self.button_frame.grid(row=0, column=1) self.button_frame.grid(row=0, column=1)
@ -309,12 +374,12 @@ class StreamFrame(object):
option_widget = self.get_option_widget(option.option_types[0], choice_frame) option_widget = self.get_option_widget(option.option_types[0], choice_frame)
option_widget.grid(row=0, column=0, sticky=tk.W) option_widget.grid(row=0, column=0, sticky=tk.W)
f.option_widget = option_widget f.option_widget = option_widget
self.show_options_button = ttk.Button( #self.show_options_button = ttk.Button(
self.stream_frame_body, command=self._toggle_show_options, style="Stop.TButton", # self.stream_frame_body, command=self._toggle_show_options, style="Stop.TButton",
cursor=self.button_cursor # cursor=self.button_cursor
) #)
self.show_options_button.config(image=self.show_options_picture) #self.show_options_button.config(image=self.show_options_picture)
self.show_options_button.grid(sticky=tk.W, row=2, column=0) #self.show_options_button.grid(sticky=tk.W, row=2, column=0)
def _get_chosen_option(self, option_type, option_widget): def _get_chosen_option(self, option_type, option_widget):
if option_type.value == float: if option_type.value == float:
@ -337,23 +402,24 @@ class StreamFrame(object):
chosen_options.append(self._get_chosen_option(option_type, option_widget)) chosen_options.append(self._get_chosen_option(option_type, option_widget))
return chosen_options return chosen_options
def _toggle_show_options(self): #def _toggle_show_options(self):
if self.options_frame.winfo_ismapped(): # if self.options_frame.winfo_ismapped():
self.show_options_button.config(image=self.show_options_picture) # self.show_options_button.config(image=self.show_options_picture)
self.options_frame.grid_forget() # self.options_frame.grid_forget()
else: # else:
self.show_options_button.config(image=self.hide_options_picture) # self.show_options_button.config(image=self.hide_options_picture)
self.options_frame.grid(sticky=tk.W + tk.E, row=3) # self.options_frame.grid(sticky=tk.W + tk.E, row=3)
def show_progress(self, total_bytes, bytes_left_to_download, points_paid, def show_progress(self, total_bytes, bytes_left_to_download, points_paid,
points_remaining): points_remaining):
if self.bytes_downloaded_label is None: if self.bytes_downloaded_label is None:
self.remove_download_buttons() self.remove_download_buttons()
self.button_frame.destroy() self.button_frame.destroy()
self.estimated_cost_frame.destroy()
for option, frame in self.option_frames: for option, frame in self.option_frames:
frame.destroy() frame.destroy()
self.options_frame.destroy() self.options_frame.destroy()
self.show_options_button.destroy() #self.show_options_button.destroy()
self.progress_frame = ttk.Frame(self.outer_button_frame, style="F.TFrame") self.progress_frame = ttk.Frame(self.outer_button_frame, style="F.TFrame")
self.progress_frame.grid(row=0, column=0, sticky=tk.W, pady=(0, 8)) self.progress_frame.grid(row=0, column=0, sticky=tk.W, pady=(0, 8))
@ -365,7 +431,7 @@ class StreamFrame(object):
self.bytes_downloaded_label.grid(row=0, column=0) self.bytes_downloaded_label.grid(row=0, column=0)
self.cost_frame = ttk.Frame(self.outer_button_frame, style="F.TFrame") self.cost_frame = ttk.Frame(self.outer_button_frame, style="F.TFrame")
self.cost_frame.grid(row=1, column=0, sticky=tk.W, pady=(0, 7)) self.cost_frame.grid(row=1, column=0, sticky=tk.W, pady=(0, 4))
self.cost_label = ttk.Label( self.cost_label = ttk.Label(
self.cost_frame, self.cost_frame,

View file

@ -8,7 +8,7 @@ from setuptools import setup, find_packages
setup(name='lbrynet', setup(name='lbrynet',
version='0.0.4', version='0.0.4',
packages=find_packages(), packages=find_packages(),
install_requires=['pycrypto', 'twisted', 'miniupnpc', 'yapsy', 'seccure', 'python-bitcoinrpc==0.1', 'txJSON-RPC', 'requests', 'unqlite', 'leveldb'], install_requires=['pycrypto', 'twisted', 'miniupnpc', 'yapsy', 'seccure', 'python-bitcoinrpc==0.1', 'txJSON-RPC', 'requests>=2.4.2', 'unqlite', 'leveldb'],
entry_points={ entry_points={
'console_scripts': [ 'console_scripts': [
'lbrynet-console = lbrynet.lbrynet_console.LBRYConsole:launch_lbry_console', 'lbrynet-console = lbrynet.lbrynet_console.LBRYConsole:launch_lbry_console',