Full Code of lbryio/lbry-sdk for AI

master e7666f489418 cached
318 files
3.2 MB
844.2k tokens
4019 symbols
1 requests
Download .txt
Showing preview only (3,371K chars total). Download the full file or copy to clipboard to get everything.
Repository: lbryio/lbry-sdk
Branch: master
Commit: e7666f489418
Files: 318
Total size: 3.2 MB

Directory structure:
gitextract_scmdz25q/

├── .github/
│   └── workflows/
│       ├── main.yml
│       └── release.yml
├── CHANGELOG.md
├── CONTRIBUTING.md
├── INSTALL.md
├── LICENSE
├── MANIFEST.in
├── Makefile
├── README.md
├── SECURITY.md
├── docker/
│   ├── Dockerfile.dht_node
│   ├── Dockerfile.wallet_server
│   ├── Dockerfile.web
│   ├── README.md
│   ├── docker-compose-wallet-server.yml
│   ├── docker-compose.yml
│   ├── hooks/
│   │   └── build
│   ├── install_choco.ps1
│   ├── set_build.py
│   ├── wallet_server_entrypoint.sh
│   └── webconf.yaml
├── docs/
│   └── api.json
├── example_daemon_settings.yml
├── lbry/
│   ├── .dockerignore
│   ├── __init__.py
│   ├── blob/
│   │   ├── __init__.py
│   │   ├── blob_file.py
│   │   ├── blob_info.py
│   │   ├── blob_manager.py
│   │   ├── disk_space_manager.py
│   │   └── writer.py
│   ├── blob_exchange/
│   │   ├── __init__.py
│   │   ├── client.py
│   │   ├── downloader.py
│   │   ├── serialization.py
│   │   └── server.py
│   ├── build_info.py
│   ├── conf.py
│   ├── connection_manager.py
│   ├── constants.py
│   ├── crypto/
│   │   ├── __init__.py
│   │   ├── base58.py
│   │   ├── crypt.py
│   │   ├── hash.py
│   │   └── util.py
│   ├── dht/
│   │   ├── __init__.py
│   │   ├── blob_announcer.py
│   │   ├── constants.py
│   │   ├── error.py
│   │   ├── node.py
│   │   ├── peer.py
│   │   ├── protocol/
│   │   │   ├── __init__.py
│   │   │   ├── data_store.py
│   │   │   ├── distance.py
│   │   │   ├── iterative_find.py
│   │   │   ├── protocol.py
│   │   │   └── routing_table.py
│   │   └── serialization/
│   │       ├── __init__.py
│   │       ├── bencoding.py
│   │       └── datagram.py
│   ├── error/
│   │   ├── Makefile
│   │   ├── README.md
│   │   ├── __init__.py
│   │   ├── base.py
│   │   └── generate.py
│   ├── extras/
│   │   ├── __init__.py
│   │   ├── cli.py
│   │   ├── daemon/
│   │   │   ├── __init__.py
│   │   │   ├── analytics.py
│   │   │   ├── client.py
│   │   │   ├── component.py
│   │   │   ├── componentmanager.py
│   │   │   ├── components.py
│   │   │   ├── daemon.py
│   │   │   ├── exchange_rate_manager.py
│   │   │   ├── json_response_encoder.py
│   │   │   ├── migrator/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── dbmigrator.py
│   │   │   │   ├── migrate10to11.py
│   │   │   │   ├── migrate11to12.py
│   │   │   │   ├── migrate12to13.py
│   │   │   │   ├── migrate13to14.py
│   │   │   │   ├── migrate14to15.py
│   │   │   │   ├── migrate15to16.py
│   │   │   │   ├── migrate1to2.py
│   │   │   │   ├── migrate2to3.py
│   │   │   │   ├── migrate3to4.py
│   │   │   │   ├── migrate4to5.py
│   │   │   │   ├── migrate5to6.py
│   │   │   │   ├── migrate6to7.py
│   │   │   │   ├── migrate7to8.py
│   │   │   │   ├── migrate8to9.py
│   │   │   │   └── migrate9to10.py
│   │   │   ├── security.py
│   │   │   ├── storage.py
│   │   │   └── undecorated.py
│   │   └── system_info.py
│   ├── file/
│   │   ├── __init__.py
│   │   ├── file_manager.py
│   │   ├── source.py
│   │   └── source_manager.py
│   ├── file_analysis.py
│   ├── prometheus.py
│   ├── schema/
│   │   ├── Makefile
│   │   ├── README.md
│   │   ├── __init__.py
│   │   ├── attrs.py
│   │   ├── base.py
│   │   ├── claim.py
│   │   ├── compat.py
│   │   ├── mime_types.py
│   │   ├── purchase.py
│   │   ├── result.py
│   │   ├── support.py
│   │   ├── tags.py
│   │   ├── types/
│   │   │   ├── __init__.py
│   │   │   ├── v1/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── certificate_pb2.py
│   │   │   │   ├── fee_pb2.py
│   │   │   │   ├── legacy_claim_pb2.py
│   │   │   │   ├── metadata_pb2.py
│   │   │   │   ├── signature_pb2.py
│   │   │   │   ├── source_pb2.py
│   │   │   │   └── stream_pb2.py
│   │   │   └── v2/
│   │   │       ├── __init__.py
│   │   │       ├── claim_pb2.py
│   │   │       ├── purchase_pb2.py
│   │   │       ├── result_pb2.py
│   │   │       ├── support_pb2.py
│   │   │       └── wallet.json
│   │   └── url.py
│   ├── stream/
│   │   ├── __init__.py
│   │   ├── background_downloader.py
│   │   ├── descriptor.py
│   │   ├── downloader.py
│   │   ├── managed_stream.py
│   │   ├── reflector/
│   │   │   ├── __init__.py
│   │   │   ├── client.py
│   │   │   └── server.py
│   │   └── stream_manager.py
│   ├── testcase.py
│   ├── torrent/
│   │   ├── __init__.py
│   │   ├── session.py
│   │   ├── torrent.py
│   │   ├── torrent_manager.py
│   │   └── tracker.py
│   ├── utils.py
│   ├── wallet/
│   │   ├── __init__.py
│   │   ├── account.py
│   │   ├── bcd_data_stream.py
│   │   ├── bip32.py
│   │   ├── checkpoints.py
│   │   ├── claim_proofs.py
│   │   ├── coinselection.py
│   │   ├── constants.py
│   │   ├── database.py
│   │   ├── dewies.py
│   │   ├── hash.py
│   │   ├── header.py
│   │   ├── ledger.py
│   │   ├── manager.py
│   │   ├── mnemonic.py
│   │   ├── network.py
│   │   ├── orchstr8/
│   │   │   ├── __init__.py
│   │   │   ├── cli.py
│   │   │   ├── node.py
│   │   │   └── service.py
│   │   ├── rpc/
│   │   │   ├── __init__.py
│   │   │   ├── framing.py
│   │   │   ├── jsonrpc.py
│   │   │   ├── session.py
│   │   │   ├── socks.py
│   │   │   └── util.py
│   │   ├── script.py
│   │   ├── stream.py
│   │   ├── tasks.py
│   │   ├── transaction.py
│   │   ├── udp.py
│   │   ├── usage_payment.py
│   │   ├── util.py
│   │   ├── wallet.py
│   │   └── words/
│   │       ├── __init__.py
│   │       ├── chinese_simplified.py
│   │       ├── english.py
│   │       ├── japanese.py
│   │       ├── portuguese.py
│   │       └── spanish.py
│   └── winpaths.py
├── scripts/
│   ├── Dockerfile.lbry_orchstr8
│   ├── check_signature.py
│   ├── check_video.py
│   ├── checkpoints.py
│   ├── checktrie.py
│   ├── deploy_dev_wallet_server.sh
│   ├── dht_crawler.py
│   ├── dht_monitor.py
│   ├── dht_node.py
│   ├── download_blob_from_peer.py
│   ├── find_max_server_load.py
│   ├── generate_json_api.py
│   ├── hook-coincurve.py
│   ├── hook-libtorrent.py
│   ├── idea/
│   │   ├── lbry-sdk.iml
│   │   ├── modules.xml
│   │   └── vcs.xml
│   ├── initialize_hub_from_snapshot.sh
│   ├── monitor_slow_queries.py
│   ├── publish_performance.py
│   ├── release.py
│   ├── repair_0_31_1_db.py
│   ├── sd_hash_sampler.py
│   ├── standalone_blob_server.py
│   ├── test_claim_search.py
│   ├── time_to_first_byte.py
│   ├── troubleshoot_p2p_and_dht_webservice.py
│   └── wallet_server_monitor.py
├── setup.cfg
├── setup.py
├── tests/
│   ├── __init__.py
│   ├── dht_mocks.py
│   ├── integration/
│   │   ├── __init__.py
│   │   ├── blockchain/
│   │   │   ├── __init__.py
│   │   │   ├── test_account_commands.py
│   │   │   ├── test_blockchain_reorganization.py
│   │   │   ├── test_network.py
│   │   │   ├── test_purchase_command.py
│   │   │   ├── test_sync.py
│   │   │   ├── test_wallet_commands.py
│   │   │   └── test_wallet_server_sessions.py
│   │   ├── claims/
│   │   │   ├── __init__.py
│   │   │   └── test_claim_commands.py
│   │   ├── datanetwork/
│   │   │   ├── __init__.py
│   │   │   ├── test_dht.py
│   │   │   ├── test_file_commands.py
│   │   │   └── test_streaming.py
│   │   ├── other/
│   │   │   ├── __init__.py
│   │   │   ├── test_chris45.py
│   │   │   ├── test_cli.py
│   │   │   ├── test_exchange_rate_manager.py
│   │   │   ├── test_other_commands.py
│   │   │   └── test_transcoding.py
│   │   ├── takeovers/
│   │   │   ├── __init__.py
│   │   │   └── test_resolve_command.py
│   │   └── transactions/
│   │       ├── __init__.py
│   │       ├── test_internal_transaction_api.py
│   │       ├── test_transaction_commands.py
│   │       └── test_transactions.py
│   ├── test_utils.py
│   └── unit/
│       ├── __init__.py
│       ├── analytics/
│       │   ├── __init__.py
│       │   └── test_track.py
│       ├── blob/
│       │   ├── __init__.py
│       │   ├── test_blob_file.py
│       │   └── test_blob_manager.py
│       ├── blob_exchange/
│       │   ├── __init__.py
│       │   └── test_transfer_blob.py
│       ├── components/
│       │   ├── __init__.py
│       │   └── test_component_manager.py
│       ├── core/
│       │   ├── __init__.py
│       │   └── test_utils.py
│       ├── database/
│       │   ├── __init__.py
│       │   └── test_SQLiteStorage.py
│       ├── dht/
│       │   ├── __init__.py
│       │   ├── protocol/
│       │   │   ├── __init__.py
│       │   │   ├── test_data_store.py
│       │   │   ├── test_distance.py
│       │   │   ├── test_kbucket.py
│       │   │   ├── test_protocol.py
│       │   │   └── test_routing_table.py
│       │   ├── serialization/
│       │   │   ├── __init__.py
│       │   │   ├── test_bencoding.py
│       │   │   └── test_datagram.py
│       │   ├── test_blob_announcer.py
│       │   ├── test_node.py
│       │   └── test_peer.py
│       ├── lbrynet_daemon/
│       │   ├── __init__.py
│       │   ├── test_Daemon.py
│       │   ├── test_allowed_origin.py
│       │   ├── test_exchange_rate_manager.py
│       │   └── test_mime_types.py
│       ├── schema/
│       │   ├── __init__.py
│       │   ├── test_claim_from_bytes.py
│       │   ├── test_mime_types.py
│       │   ├── test_models.py
│       │   ├── test_tags.py
│       │   └── test_url.py
│       ├── stream/
│       │   ├── __init__.py
│       │   ├── test_managed_stream.py
│       │   ├── test_reflector.py
│       │   ├── test_stream_descriptor.py
│       │   └── test_stream_manager.py
│       ├── test_cli.py
│       ├── test_conf.py
│       ├── test_utils.py
│       ├── torrent/
│       │   ├── __init__.py
│       │   └── test_tracker.py
│       └── wallet/
│           ├── __init__.py
│           ├── key_fixtures.py
│           ├── server/
│           │   ├── __init__.py
│           │   └── test_migration.py
│           ├── test_account.py
│           ├── test_bcd_data_stream.py
│           ├── test_bip32.py
│           ├── test_claim_proofs.py
│           ├── test_coinselection.py
│           ├── test_database.py
│           ├── test_dewies.py
│           ├── test_hash.py
│           ├── test_headers.py
│           ├── test_ledger.py
│           ├── test_mnemonic.py
│           ├── test_schema_signing.py
│           ├── test_script.py
│           ├── test_stream_controller.py
│           ├── test_transaction.py
│           ├── test_utils.py
│           └── test_wallet.py
└── tox.ini

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/workflows/main.yml
================================================
name: ci
on: ["push", "pull_request", "workflow_dispatch"]

jobs:

  lint:
    name: lint
    runs-on: ubuntu-20.04
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: '3.9'
      - name: extract pip cache
        uses: actions/cache@v4
        with:
          path: ~/.cache/pip
          key: ${{ runner.os }}-pip-${{ hashFiles('setup.py') }}
          restore-keys: ${{ runner.os }}-pip-
      - run: pip install --user --upgrade pip wheel
      - run: pip install -e .[lint]
      - run: make lint

  tests-unit:
    name: "tests / unit"
    strategy:
      matrix:
        os:
          - ubuntu-20.04
          - macos-13
          - windows-2022
    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: '3.9'
      - name: set pip cache dir
        shell: bash
        run: echo "PIP_CACHE_DIR=$(pip cache dir)" >> $GITHUB_ENV
      - name: extract pip cache
        uses: actions/cache@v4
        with:
          path: ${{ env.PIP_CACHE_DIR }}
          key: ${{ runner.os }}-pip-${{ hashFiles('setup.py') }}
          restore-keys: ${{ runner.os }}-pip-
      - id: os-name
        uses: ASzc/change-string-case-action@v6
        with:
          string: ${{ runner.os }}
      - run: python -m pip install --user --upgrade pip wheel
      - if: startsWith(runner.os, 'linux')
        run: pip install -e .[test]
      - if: startsWith(runner.os, 'linux')
        env:
          HOME: /tmp
        run: make test-unit-coverage
      - if: startsWith(runner.os, 'linux') != true
        run: pip install -e .[test]
      - if: startsWith(runner.os, 'linux') != true
        env:
          HOME: /tmp
        run: coverage run --source=lbry -m unittest tests/unit/test_conf.py
      - name: submit coverage report
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          COVERALLS_FLAG_NAME: tests-unit-${{ steps.os-name.outputs.lowercase }}
          COVERALLS_PARALLEL: true
        run: |
          pip install coveralls
          coveralls --service=github

  tests-integration:
    name: "tests / integration"
    runs-on: ubuntu-20.04
    strategy:
      matrix:
        test:
          - datanetwork
          - blockchain
          - claims
          - takeovers
          - transactions
          - other
    steps:
      - name: Configure sysctl limits
        run: |
          sudo swapoff -a
          sudo sysctl -w vm.swappiness=1
          sudo sysctl -w fs.file-max=262144
          sudo sysctl -w vm.max_map_count=262144
      - name: Runs Elasticsearch
        uses: elastic/elastic-github-actions/elasticsearch@master
        with:
          stack-version: 7.12.1
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: '3.9'
      - if: matrix.test == 'other'
        run: |
          sudo apt-get update
          sudo apt-get install -y --no-install-recommends ffmpeg
      - name: extract pip cache
        uses: actions/cache@v4
        with:
          path: ./.tox
          key: tox-integration-${{ matrix.test }}-${{ hashFiles('setup.py') }}
          restore-keys: txo-integration-${{ matrix.test }}-
      - run: pip install tox coverage coveralls
      - if: matrix.test == 'claims'
        run: rm -rf .tox
      - run: tox -e ${{ matrix.test }}
      - name: submit coverage report
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          COVERALLS_FLAG_NAME: tests-integration-${{ matrix.test }}
          COVERALLS_PARALLEL: true
        run: |
          coverage combine tests
          coveralls --service=github


  coverage:
    needs: ["tests-unit", "tests-integration"]
    runs-on: ubuntu-20.04
    steps:
      - name: finalize coverage report submission
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          pip install coveralls
          coveralls --service=github --finish

  build:
    needs: ["lint", "tests-unit", "tests-integration"]
    name: "build / binary"
    strategy:
      matrix:
        os:
          - ubuntu-20.04
          - macos-13
          - windows-2022
    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: '3.9'
      - id: os-name
        uses: ASzc/change-string-case-action@v6
        with:
          string: ${{ runner.os }}
      - name: set pip cache dir
        shell: bash
        run: echo "PIP_CACHE_DIR=$(pip cache dir)" >> $GITHUB_ENV
      - name: extract pip cache
        uses: actions/cache@v4
        with:
          path: ${{ env.PIP_CACHE_DIR }}
          key: ${{ runner.os }}-pip-${{ hashFiles('setup.py') }}
          restore-keys: ${{ runner.os }}-pip-
      - run: pip install pyinstaller==6.0
      - run: pip install -e .
      - if: startsWith(github.ref, 'refs/tags/v')
        run: python docker/set_build.py
      - if: startsWith(runner.os, 'linux') || startsWith(runner.os, 'mac')
        name: Build & Run (Unix)
        run: |
          pyinstaller --onefile --name lbrynet lbry/extras/cli.py
          dist/lbrynet --version
      - if: startsWith(runner.os, 'windows')
        name: Build & Run (Windows)
        run: |
          pip install pywin32==301
          pyinstaller --additional-hooks-dir=scripts/. --icon=icons/lbry256.ico --onefile --name lbrynet lbry/extras/cli.py
          dist/lbrynet.exe --version
      - uses: actions/upload-artifact@v4
        with:
          name: lbrynet-${{ steps.os-name.outputs.lowercase }}
          path: dist/

  release:
    name: "release"
    if: startsWith(github.ref, 'refs/tags/v')
    needs: ["build"]
    runs-on: ubuntu-20.04
    steps:
      - uses: actions/checkout@v4
      - uses: actions/download-artifact@v4
      - name: upload binaries
        env:
          GITHUB_TOKEN: ${{ secrets.RELEASE_API_TOKEN }}
        run: |
          pip install githubrelease
          chmod +x lbrynet-macos/lbrynet
          chmod +x lbrynet-linux/lbrynet
          zip --junk-paths lbrynet-mac.zip lbrynet-macos/lbrynet
          zip --junk-paths lbrynet-linux.zip lbrynet-linux/lbrynet
          zip --junk-paths lbrynet-windows.zip lbrynet-windows/lbrynet.exe
          ls -lh
          githubrelease release lbryio/lbry-sdk info ${GITHUB_REF#refs/tags/}
          githubrelease asset lbryio/lbry-sdk upload ${GITHUB_REF#refs/tags/} \
            lbrynet-mac.zip lbrynet-linux.zip lbrynet-windows.zip
          githubrelease release lbryio/lbry-sdk publish ${GITHUB_REF#refs/tags/}



================================================
FILE: .github/workflows/release.yml
================================================
name: slack

on:
  release:
    types: [published]

jobs:
  release:
    name: "slack notification"
    runs-on: ubuntu-20.04
    steps:
      - uses: LoveToKnow/slackify-markdown-action@v1.0.0
        id: markdown
        with:
          text: "There is a new SDK release: ${{github.event.release.html_url}}\n${{ github.event.release.body }}"
      - uses: slackapi/slack-github-action@v1.14.0
        env:
          CHANGELOG: '<!channel> ${{ steps.markdown.outputs.text }}'
          SLACK_WEBHOOK_URL: ${{ secrets.SLACK_RELEASE_BOT_WEBHOOK }}
        with:
          payload: '{"type": "mrkdwn", "text": ${{ toJSON(env.CHANGELOG) }} }'



================================================
FILE: CHANGELOG.md
================================================
# Change Log

This changelog is no longer up to date. For release notes, see https://github.com/lbryio/lbry-sdk/releases.


================================================
FILE: CONTRIBUTING.md
================================================
## Contributing to LBRY

https://lbry.tech/contribute


================================================
FILE: INSTALL.md
================================================
# Installing LBRY

If only the JSON-RPC API server is needed, the recommended way to install LBRY is to use a pre-built binary. We provide binaries for all major operating systems. See the [README](README.md)!

These instructions are for installing LBRY from source, which is recommended if you are interested in doing development work or LBRY is not available on your operating system (godspeed, TempleOS users).

Here's a video walkthrough of this setup, which is itself hosted by the LBRY network and provided via [spee.ch](https://github.com/lbryio/spee.ch):
[![Setup for development](https://spee.ch/2018-10-04-17-13-54-017046806.png)](https://spee.ch/967f99344308f1e90f0620d91b6c93e4dfb240e0/lbrynet-dev-setup.mp4)

## Prerequisites

Running `lbrynet` from source requires Python 3.7. Get the installer for your OS [here](https://www.python.org/downloads/release/python-370/).

After installing Python 3.7, you'll need to install some additional libraries depending on your operating system.

Because of [issue #2769](https://github.com/lbryio/lbry-sdk/issues/2769)
at the moment the `lbrynet` daemon will only work correctly with Python 3.7.
If Python 3.8+ is used, the daemon will start but the RPC server
may not accept messages, returning the following:
```
Could not connect to daemon. Are you sure it's running?
```

### macOS

macOS users will need to install [xcode command line tools](https://developer.xamarin.com/guides/testcloud/calabash/configuring/osx/install-xcode-command-line-tools/) and [homebrew](http://brew.sh/).

These environment variables also need to be set:
```
PYTHONUNBUFFERED=1
EVENT_NOKQUEUE=1
```

Remaining dependencies can then be installed by running:
```
brew install python protobuf
```

Assistance installing Python3: https://docs.python-guide.org/starting/install3/osx/.

### Linux

On Ubuntu (we recommend 18.04 or 20.04), install the following:
```
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt-get update
sudo apt-get install build-essential python3.7 python3.7-dev git python3.7-venv libssl-dev python-protobuf
```

The [deadsnakes PPA](https://launchpad.net/~deadsnakes/+archive/ubuntu/ppa) provides Python 3.7
for those Ubuntu distributions that no longer have it in their
official repositories.

On Raspbian, you will also need to install `python-pyparsing`.

If you're running another Linux distro, install the equivalent of the above packages for your system.

## Installation

### Linux/Mac

Clone the repository:
```bash
git clone https://github.com/lbryio/lbry-sdk.git
cd lbry-sdk
```

Create a Python virtual environment for lbry-sdk:
```bash
python3.7 -m venv lbry-venv
```

Activate virtual environment:
```bash
source lbry-venv/bin/activate
```

Make sure you're on Python 3.7+ as default in the virtual environment:
```bash
python --version
```

Install packages:
```bash
make install
```

If you are on Linux and using PyCharm, generates initial configs:
```bash
make idea
```

To verify your installation, `which lbrynet` should return a path inside
of the `lbry-venv` folder.
```bash
(lbry-venv) $ which lbrynet
/opt/lbry-sdk/lbry-venv/bin/lbrynet
```

To exit the virtual environment simply use the command `deactivate`.

### Windows

Clone the repository:
```bash
git clone https://github.com/lbryio/lbry-sdk.git
cd lbry-sdk
```

Create a Python virtual environment for lbry-sdk:
```bash
python -m venv lbry-venv
```

Activate virtual environment:
```bash
lbry-venv\Scripts\activate
```

Install packages:
```bash
pip install -e .
```

## Run the tests
### Elasticsearch

For running integration tests, Elasticsearch is required to be available at localhost:9200/

The easiest way to start it is using docker with:
```bash
make elastic-docker
```

Alternative installation methods are available [at Elasticsearch website](https://www.elastic.co/guide/en/elasticsearch/reference/current/install-elasticsearch.html).

To run the unit and integration tests from the repo directory:
```
python -m unittest discover tests.unit
python -m unittest discover tests.integration
```

## Usage

To start the API server:
```
lbrynet start
```

Whenever the code inside [lbry-sdk/lbry](./lbry)
is modified we should run `make install` to recompile the `lbrynet`
executable with the newest code.

## Development

When developing, remember to enter the environment,
and if you wish start the server interactively.
```bash
$ source lbry-venv/bin/activate

(lbry-venv) $ python lbry/extras/cli.py start
```

Parameters can be passed in the same way.
```bash
(lbry-venv) $ python lbry/extras/cli.py wallet balance
```

If a Python debugger (`pdb` or `ipdb`) is installed we can also start it
in this way, set up break points, and step through the code.
```bash
(lbry-venv) $ pip install ipdb

(lbry-venv) $ ipdb lbry/extras/cli.py
```

Happy hacking!


================================================
FILE: LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2015-2022 LBRY Inc

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the
following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


================================================
FILE: MANIFEST.in
================================================
include README.md
include CHANGELOG.md
include LICENSE
recursive-include lbry *.txt *.py


================================================
FILE: Makefile
================================================
.PHONY: install tools lint test test-unit test-unit-coverage test-integration idea

install:
	pip install -e .

lint:
	pylint --rcfile=setup.cfg lbry
	#mypy --ignore-missing-imports lbry

test: test-unit test-integration

test-unit:
	python -m unittest discover tests.unit

test-unit-coverage:
	coverage run --source=lbry -m unittest discover -vv tests.unit

test-integration:
	tox

idea:
	mkdir -p .idea
	cp -r scripts/idea/* .idea

elastic-docker:
	docker run -d -v lbryhub:/usr/share/elasticsearch/data -p 9200:9200 -p 9300:9300 -e"ES_JAVA_OPTS=-Xms512m -Xmx512m" -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.12.1


================================================
FILE: README.md
================================================
# <img src="https://raw.githubusercontent.com/lbryio/lbry-sdk/master/lbry.png" alt="LBRY" width="48" height="36" /> LBRY SDK [![build](https://github.com/lbryio/lbry-sdk/actions/workflows/main.yml/badge.svg)](https://github.com/lbryio/lbry-sdk/actions/workflows/main.yml) [![coverage](https://coveralls.io/repos/github/lbryio/lbry-sdk/badge.svg)](https://coveralls.io/github/lbryio/lbry-sdk)

LBRY is a decentralized peer-to-peer protocol for publishing and accessing digital content. It utilizes the [LBRY blockchain](https://github.com/lbryio/lbrycrd) as a global namespace and database of digital content. Blockchain entries contain searchable content metadata, identities, rights and access rules. LBRY also provides a data network that consists of peers (seeders) uploading and downloading data from other peers, possibly in exchange for payments, as well as a distributed hash table used by peers to discover other peers.

LBRY SDK for Python is currently the most fully featured implementation of the LBRY Network protocols and includes many useful components and tools for building decentralized applications. Primary features and components include:

 * Built on Python 3.7 and `asyncio`.
 * Kademlia DHT (Distributed Hash Table) implementation for finding peers to download from and announcing to peers what we have to host ([lbry.dht](https://github.com/lbryio/lbry-sdk/tree/master/lbry/dht)).
 * Blob exchange protocol for transferring encrypted blobs of content and negotiating payments ([lbry.blob_exchange](https://github.com/lbryio/lbry-sdk/tree/master/lbry/blob_exchange)).
 * Protobuf schema for encoding and decoding metadata stored on the blockchain ([lbry.schema](https://github.com/lbryio/lbry-sdk/tree/master/lbry/schema)).
 * Wallet implementation for the LBRY blockchain ([lbry.wallet](https://github.com/lbryio/lbry-sdk/tree/master/lbry/wallet)).
 * Daemon with a JSON-RPC API to ease building end user applications in any language and for automating various tasks ([lbry.extras.daemon](https://github.com/lbryio/lbry-sdk/tree/master/lbry/extras/daemon)). 

## Installation

Our [releases page](https://github.com/lbryio/lbry-sdk/releases) contains pre-built binaries of the latest release, pre-releases, and past releases for macOS, Debian-based Linux, and Windows. [Automated travis builds](http://build.lbry.io/daemon/) are also available for testing.

## Usage

Run `lbrynet start` to launch the API server.

By default, `lbrynet` will provide a JSON-RPC server at `http://localhost:5279`. It is easy to interact with via cURL or sane programming languages.

Our [quickstart guide](https://lbry.tech/playground) provides a simple walkthrough and examples for learning.

With the daemon running, `lbrynet commands` will show you a list of commands.

The full API is documented [here](https://lbry.tech/api/sdk).

## Running from source

Installing from source is also relatively painless. Full instructions are in [INSTALL.md](INSTALL.md)

## Contributing

Contributions to this project are welcome, encouraged, and compensated. For more details, please check [this](https://lbry.tech/contribute) link.

## License

This project is MIT licensed. For the full license, see [LICENSE](LICENSE).

## Security

We take security seriously. Please contact security@lbry.com regarding any security issues. [Our PGP key is here](https://lbry.com/faq/pgp-key) if you need it.

## Contact

The primary contact for this project is [@eukreign](mailto:lex@lbry.com).

## Additional information and links

The documentation for the API can be found [here](https://lbry.tech/api/sdk).

Daemon defaults, ports, and other settings are documented [here](https://lbry.tech/resources/daemon-settings).

Settings can be configured using a daemon-settings.yml file. An example can be found [here](https://github.com/lbryio/lbry-sdk/blob/master/example_daemon_settings.yml).


================================================
FILE: SECURITY.md
================================================
# Security Policy

## Supported Versions

While we are not at v1.0 yet, only the latest release will be supported.

## Reporting a Vulnerability

See https://lbry.com/faq/security


================================================
FILE: docker/Dockerfile.dht_node
================================================
FROM debian:10-slim

ARG user=lbry
ARG projects_dir=/home/$user
ARG db_dir=/database

ARG DOCKER_TAG
ARG DOCKER_COMMIT=docker
ENV DOCKER_TAG=$DOCKER_TAG DOCKER_COMMIT=$DOCKER_COMMIT

RUN apt-get update && \
    apt-get -y --no-install-recommends install \
      wget \
      automake libtool \
      tar unzip \
      build-essential \
      pkg-config \
      libleveldb-dev \
      python3.7 \
      python3-dev \
      python3-pip \
      python3-wheel \
      python3-setuptools && \
    update-alternatives --install /usr/bin/pip pip /usr/bin/pip3 1 && \
    rm -rf /var/lib/apt/lists/*

RUN groupadd -g 999 $user && useradd -m -u 999 -g $user $user

COPY . $projects_dir
RUN chown -R $user:$user $projects_dir
RUN mkdir -p $db_dir
RUN chown -R $user:$user $db_dir

USER $user
WORKDIR $projects_dir

RUN python3 -m pip install -U setuptools pip
RUN make install
RUN python3 docker/set_build.py
RUN rm ~/.cache -rf
VOLUME $db_dir
ENTRYPOINT ["python3", "scripts/dht_node.py"]



================================================
FILE: docker/Dockerfile.wallet_server
================================================
FROM debian:10-slim

ARG user=lbry
ARG db_dir=/database
ARG projects_dir=/home/$user

ARG DOCKER_TAG
ARG DOCKER_COMMIT=docker
ENV DOCKER_TAG=$DOCKER_TAG DOCKER_COMMIT=$DOCKER_COMMIT

RUN apt-get update && \
    apt-get -y --no-install-recommends install \
      wget \
      tar unzip \
      build-essential \
      automake libtool \
      pkg-config \
      libleveldb-dev \
      python3.7 \
      python3-dev \
      python3-pip \
      python3-wheel \
      python3-cffi \
      python3-setuptools && \
    update-alternatives --install /usr/bin/pip pip /usr/bin/pip3 1 && \
    rm -rf /var/lib/apt/lists/*

RUN groupadd -g 999 $user && useradd -m -u 999 -g $user $user
RUN mkdir -p $db_dir
RUN chown -R $user:$user $db_dir

COPY . $projects_dir
RUN chown -R $user:$user $projects_dir

USER $user
WORKDIR $projects_dir

RUN pip install uvloop
RUN make install
RUN python3 docker/set_build.py
RUN rm ~/.cache -rf

# entry point
ARG host=0.0.0.0
ARG tcp_port=50001
ARG daemon_url=http://lbry:lbry@localhost:9245/
VOLUME $db_dir
ENV TCP_PORT=$tcp_port
ENV HOST=$host
ENV DAEMON_URL=$daemon_url
ENV DB_DIRECTORY=$db_dir
ENV MAX_SESSIONS=1000000000
ENV MAX_SEND=1000000000000000000
ENV EVENT_LOOP_POLICY=uvloop
COPY ./docker/wallet_server_entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]


================================================
FILE: docker/Dockerfile.web
================================================
FROM debian:10-slim

ARG user=lbry
ARG downloads_dir=/database
ARG projects_dir=/home/$user

ARG DOCKER_TAG
ARG DOCKER_COMMIT=docker
ENV DOCKER_TAG=$DOCKER_TAG DOCKER_COMMIT=$DOCKER_COMMIT

RUN apt-get update && \
    apt-get -y --no-install-recommends install \
      wget \
      automake libtool \
      tar unzip \
      build-essential \
      pkg-config \
      libleveldb-dev \
      python3.7 \
      python3-dev \
      python3-pip \
      python3-wheel \
      python3-setuptools && \
    update-alternatives --install /usr/bin/pip pip /usr/bin/pip3 1 && \
    rm -rf /var/lib/apt/lists/*

RUN groupadd -g 999 $user && useradd -m -u 999 -g $user $user
RUN mkdir -p $downloads_dir
RUN chown -R $user:$user $downloads_dir

COPY . $projects_dir
RUN chown -R $user:$user $projects_dir

USER $user
WORKDIR $projects_dir

RUN pip install uvloop
RUN make install
RUN python3 docker/set_build.py
RUN rm ~/.cache -rf

# entry point
VOLUME $downloads_dir
COPY ./docker/webconf.yaml /webconf.yaml
ENTRYPOINT ["/home/lbry/.local/bin/lbrynet", "start", "--config=/webconf.yaml"]


================================================
FILE: docker/README.md
================================================
### How to run with docker-compose
1. Edit config file and after that fix permissions with
```
sudo chown -R 999:999 webconf.yaml
```
2. Start SDK with
```
docker-compose up -d
```


================================================
FILE: docker/docker-compose-wallet-server.yml
================================================
version: "3"

volumes:
  wallet_server:
  es01:

services:
  wallet_server:
    depends_on: 
      - es01
    image: lbry/wallet-server:${WALLET_SERVER_TAG:-latest-release}
    restart: always
    network_mode: host
    ports:
      - "50001:50001" # rpc port
      - "2112:2112"   # uncomment to enable prometheus
    volumes:
      - "wallet_server:/database"
    environment:
      - DAEMON_URL=http://lbry:lbry@127.0.0.1:9245
      - MAX_QUERY_WORKERS=4
      - CACHE_MB=1024
      - CACHE_ALL_TX_HASHES=
      - CACHE_ALL_CLAIM_TXOS=
      - MAX_SEND=1000000000000000000
      - MAX_RECEIVE=1000000000000000000
      - MAX_SESSIONS=100000
      - HOST=0.0.0.0
      - TCP_PORT=50001
      - PROMETHEUS_PORT=2112
      - FILTERING_CHANNEL_IDS=770bd7ecba84fd2f7607fb15aedd2b172c2e153f 95e5db68a3101df19763f3a5182e4b12ba393ee8
      - BLOCKING_CHANNEL_IDS=dd687b357950f6f271999971f43c785e8067c3a9 06871aa438032244202840ec59a469b303257cad b4a2528f436eca1bf3bf3e10ff3f98c57bd6c4c6
  es01:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.11.0
    container_name: es01
    environment:
      - node.name=es01
      - discovery.type=single-node
      - indices.query.bool.max_clause_count=8192
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms4g -Xmx4g"  # no more than 32, remember to disable swap
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - es01:/usr/share/elasticsearch/data
    ports:
      - 127.0.0.1:9200:9200


================================================
FILE: docker/docker-compose.yml
================================================
version: '3'
services:
    websdk:
        image: vshyba/websdk
        ports:
            - '5279:5279'
            - '5280:5280'
        volumes:
            - ./webconf.yaml:/webconf.yaml


================================================
FILE: docker/hooks/build
================================================
#!/bin/bash

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
cd "$DIR/../.." ## make sure we're in the right place. Docker Hub screws this up sometimes
echo "docker build dir: $(pwd)"

docker build --build-arg DOCKER_TAG=$DOCKER_TAG --build-arg DOCKER_COMMIT=$SOURCE_COMMIT -f $DOCKERFILE_PATH -t $IMAGE_NAME .


================================================
FILE: docker/install_choco.ps1
================================================
# requires powershell and .NET 4+. see https://chocolatey.org/install for more info.

$chocoVersion = powershell choco -v
if(-not($chocoVersion)){
    Write-Output "Chocolatey is not installed, installing now"
    Write-Output "IF YOU KEEP GETTING THIS MESSAGE ON EVERY BUILD, TRY RESTARTING THE GITLAB RUNNER SO IT GETS CHOCO INTO IT'S ENV"
    Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
}
else{
    Write-Output "Chocolatey version $chocoVersion is already installed"
}

================================================
FILE: docker/set_build.py
================================================
import sys
import os
import re
import logging
import lbry.build_info as build_info_mod

log = logging.getLogger()
log.addHandler(logging.StreamHandler())
log.setLevel(logging.DEBUG)


def _check_and_set(d: dict, key: str, value: str):
    try:
        d[key]
    except KeyError:
        raise Exception(f"{key} var does not exist in {build_info_mod.__file__}")
    d[key] = value


def main():
    build_info = {item: build_info_mod.__dict__[item] for item in dir(build_info_mod) if not item.startswith("__")}

    commit_hash = os.getenv('DOCKER_COMMIT', os.getenv('GITHUB_SHA'))
    if commit_hash is None:
        raise ValueError("Commit hash not found in env vars")
    _check_and_set(build_info, "COMMIT_HASH", commit_hash[:6])

    docker_tag = os.getenv('DOCKER_TAG')
    if docker_tag:
        _check_and_set(build_info, "DOCKER_TAG", docker_tag)
        _check_and_set(build_info, "BUILD", "docker")
    else:
        if re.match(r'refs/tags/v\d+\.\d+\.\d+$', str(os.getenv('GITHUB_REF'))):
            _check_and_set(build_info, "BUILD", "release")
        else:
            _check_and_set(build_info, "BUILD", "qa")

    log.debug("build info: %s", ", ".join([f"{k}={v}" for k, v in build_info.items()]))
    with open(build_info_mod.__file__, 'w') as f:
        f.write("\n".join([f"{k} = \"{v}\"" for k, v in build_info.items()]) + "\n")


if __name__ == '__main__':
    sys.exit(main())


================================================
FILE: docker/wallet_server_entrypoint.sh
================================================
#!/bin/bash

# entrypoint for wallet server Docker image

set -euo pipefail

SNAPSHOT_URL="${SNAPSHOT_URL:-}" #off by default. latest snapshot at https://lbry.com/snapshot/wallet

if [[ -n "$SNAPSHOT_URL" ]] && [[ ! -f /database/lbry-leveldb ]]; then
  files="$(ls)"
  echo "Downloading wallet snapshot from $SNAPSHOT_URL"
  wget --no-verbose --trust-server-names --content-disposition "$SNAPSHOT_URL"
  echo "Extracting snapshot..."
  filename="$(grep -vf <(echo "$files") <(ls))" # finds the file that was not there before
  case "$filename" in
    *.tgz|*.tar.gz|*.tar.bz2 )  tar xvf "$filename" --directory /database ;;
    *.zip ) unzip "$filename" -d /database ;;
    * ) echo "Don't know how to extract ${filename}. SNAPSHOT COULD NOT BE LOADED" && exit 1 ;;
  esac
  rm "$filename"
fi

/home/lbry/.local/bin/lbry-hub-elastic-sync
echo 'starting server'
/home/lbry/.local/bin/lbry-hub "$@"


================================================
FILE: docker/webconf.yaml
================================================
allowed_origin: "*"
max_key_fee: "0.0 USD"
save_files: false
save_blobs: false
streaming_server: "0.0.0.0:5280"
api: "0.0.0.0:5279"
data_dir: /tmp
download_dir: /tmp
wallet_dir: /tmp


================================================
FILE: docs/api.json
================================================
{
    "main": {
        "doc": "Ungrouped commands.",
        "commands": [
            {
                "name": "ffmpeg_find",
                "description": "Get ffmpeg installation information",
                "arguments": [],
                "returns": "(dict) Dictionary of ffmpeg information\n    {\n        'available': (bool) found ffmpeg,\n        'which': (str) path to ffmpeg,\n        'analyze_audio_volume': (bool) should ffmpeg analyze audio\n    }",
                "examples": []
            },
            {
                "name": "get",
                "description": "Download stream from a LBRY name.",
                "arguments": [
                    {
                        "name": "uri",
                        "type": "str",
                        "description": "uri of the content to download",
                        "is_required": false
                    },
                    {
                        "name": "file_name",
                        "type": "str",
                        "description": "specified name for the downloaded file, overrides the stream file name",
                        "is_required": false
                    },
                    {
                        "name": "download_directory",
                        "type": "str",
                        "description": "full path to the directory to download into",
                        "is_required": false
                    },
                    {
                        "name": "timeout",
                        "type": "int",
                        "description": "download timeout in number of seconds",
                        "is_required": false
                    },
                    {
                        "name": "save_file",
                        "type": "bool",
                        "description": "save the file to the downloads directory",
                        "is_required": false
                    },
                    {
                        "name": "wallet_id",
                        "type": "str",
                        "description": "wallet to check for claim purchase receipts",
                        "is_required": false
                    }
                ],
                "returns": "            {\n                \"streaming_url\": \"(str) url to stream the file using range requests\",\n                \"completed\": \"(bool) true if download is completed\",\n                \"file_name\": \"(str) name of file\",\n                \"download_directory\": \"(str) download directory\",\n                \"points_paid\": \"(float) credit paid to download file\",\n                \"stopped\": \"(bool) true if download is stopped\",\n                \"stream_hash\": \"(str) stream hash of file\",\n                \"stream_name\": \"(str) stream name\",\n                \"suggested_file_name\": \"(str) suggested file name\",\n                \"sd_hash\": \"(str) sd hash of file\",\n                \"download_path\": \"(str) download path of file\",\n                \"mime_type\": \"(str) mime type of file\",\n                \"key\": \"(str) key attached to file\",\n                \"total_bytes_lower_bound\": \"(int) lower bound file size in bytes\",\n                \"total_bytes\": \"(int) file upper bound size in bytes\",\n                \"written_bytes\": \"(int) written size in bytes\",\n                \"blobs_completed\": \"(int) number of fully downloaded blobs\",\n                \"blobs_in_stream\": \"(int) total blobs on stream\",\n                \"blobs_remaining\": \"(int) total blobs remaining to download\",\n                \"status\": \"(str) downloader status\",\n                \"claim_id\": \"(str) None if claim is not found else the claim id\",\n                \"txid\": \"(str) None if claim is not found else the transaction id\",\n                \"nout\": \"(int) None if claim is not found else the transaction output index\",\n                \"outpoint\": \"(str) None if claim is not found else the tx and output\",\n                \"metadata\": \"(dict) None if claim is not found else the claim metadata\",\n                \"channel_claim_id\": \"(str) None if claim is not found or not signed\",\n                \"channel_name\": \"(str) None if claim is not found or not signed\",\n                \"claim_name\": \"(str) None if claim is not found else the claim name\",\n                \"reflector_progress\": \"(int) reflector upload progress, 0 to 100\",\n                \"uploading_to_reflector\": \"(bool) set to True when currently uploading to reflector\"\n            }",
                "examples": [
                    {
                        "title": "Get a file",
                        "curl": "curl -d'{\"method\": \"get\", \"params\": {\"uri\": \"astream#ad25e05aa7dc5e9994869040c6103f9a8728db46\"}}' http://localhost:5279/",
                        "lbrynet": "lbrynet get astream#ad25e05aa7dc5e9994869040c6103f9a8728db46",
                        "python": "requests.post(\"http://localhost:5279\", json={\"method\": \"get\", \"params\": {\"uri\": \"astream#ad25e05aa7dc5e9994869040c6103f9a8728db46\"}}).json()",
                        "output": "{\n  \"jsonrpc\": \"2.0\",\n  \"result\": {\n    \"added_on\": 1655141677,\n    \"blobs_completed\": 1,\n    \"blobs_in_stream\": 1,\n    \"blobs_remaining\": 0,\n    \"channel_claim_id\": \"595c2e2f0c1f59188628fab7503692b0145779a2\",\n    \"channel_name\": \"@channel\",\n    \"claim_id\": \"ad25e05aa7dc5e9994869040c6103f9a8728db46\",\n    \"claim_name\": \"astream\",\n    \"completed\": true,\n    \"confirmations\": 4,\n    \"content_fee\": null,\n    \"download_directory\": \"/var/folders/46/44w2zhrx16b8gsvff9dxtr640000gq/T/tmpfx0nk2jd\",\n    \"download_path\": \"/var/folders/46/44w2zhrx16b8gsvff9dxtr640000gq/T/tmpfx0nk2jd/tmpr832hp1x\",\n    \"file_name\": \"tmpr832hp1x\",\n    \"height\": 214,\n    \"is_fully_reflected\": false,\n    \"key\": \"66f888fe00cf558494c2fcbd5903d00d\",\n    \"metadata\": {\n      \"source\": {\n        \"hash\": \"fdbd8e75a67f29f701a4e040385e2e23986303ea10239211af907fcbb83578b3e417cb71ce646efd0819dd8c088de1bd\",\n        \"media_type\": \"application/octet-stream\",\n        \"name\": \"tmpr832hp1x\",\n        \"sd_hash\": \"9ddea316b511d9f720b1f67f5958cac381fdac5d1d3beabc754b9a1220a891024e983241e2fc7549f0f89ea0636c6c83\",\n        \"size\": \"11\"\n      },\n      \"stream_type\": \"binary\"\n    },\n    \"mime_type\": \"application/octet-stream\",\n    \"nout\": 0,\n    \"outpoint\": \"7570c487faefe51e7e72ef22896171e151710ff6e8153efcbe51baa49b7f6234:0\",\n    \"points_paid\": 0.0,\n    \"protobuf\": \"01a2795714b0923650b7fa288618591f0c2f2e5c5961baf110460a527e38b68f0653c1c79f2cae1f57ade55c009fb7578175c9d93d7edb0546d1378e1d33d99df8df0d5cfe9e7a5b63053a4e7ce003f95f5890b27f0a90010a8d010a30fdbd8e75a67f29f701a4e040385e2e23986303ea10239211af907fcbb83578b3e417cb71ce646efd0819dd8c088de1bd120b746d707238333268703178180b22186170706c69636174696f6e2f6f637465742d73747265616d32309ddea316b511d9f720b1f67f5958cac381fdac5d1d3beabc754b9a1220a891024e983241e2fc7549f0f89ea0636c6c83\",\n    \"purchase_receipt\": null,\n    \"reflector_progress\": 0,\n    \"sd_hash\": \"9ddea316b511d9f720b1f67f5958cac381fdac5d1d3beabc754b9a1220a891024e983241e2fc7549f0f89ea0636c6c83\",\n    \"status\": \"finished\",\n    \"stopped\": true,\n    \"stream_hash\": \"c48ff9950efbcb78b20d311467b1b0e321069ef5ece96898eb08a27a62d1ef2594cd24f1e8d6993f00c48fd6a4221490\",\n    \"stream_name\": \"tmpr832hp1x\",\n    \"streaming_url\": \"http://localhost:5280/stream/9ddea316b511d9f720b1f67f5958cac381fdac5d1d3beabc754b9a1220a891024e983241e2fc7549f0f89ea0636c6c83\",\n    \"suggested_file_name\": \"tmpr832hp1x\",\n    \"timestamp\": 1655141671,\n    \"total_bytes\": 16,\n    \"total_bytes_lower_bound\": 0,\n    \"txid\": \"7570c487faefe51e7e72ef22896171e151710ff6e8153efcbe51baa49b7f6234\",\n    \"uploading_to_reflector\": false,\n    \"written_bytes\": 11\n  }\n}"
                    }
                ]
            },
            {
                "name": "publish",
                "description": "Create or replace a stream claim at a given name (use 'stream create/update' for more control).",
                "arguments": [
                    {
                        "name": "name",
                        "type": "str",
                        "description": "name of the content (can only consist of a-z A-Z 0-9 and -(dash))",
                        "is_required": true
                    },
                    {
                        "name": "bid",
                        "type": "decimal",
                        "description": "amount to back the claim",
                        "is_required": false
                    },
                    {
                        "name": "file_path",
                        "type": "str",
                        "description": "path to file to be associated with name.",
                        "is_required": false
                    },
                    {
                        "name": "file_name",
                        "type": "str",
                        "description": "name of file to be associated with stream.",
                        "is_required": false
                    },
                    {
                        "name": "file_hash",
                        "type": "str",
                        "description": "hash of file to be associated with stream.",
                        "is_required": false
                    },
                    {
                        "name": "validate_file",
                        "type": "bool",
                        "description": "validate that the video container and encodings match common web browser support or that optimization succeeds if specified. FFmpeg is required",
                        "is_required": false
                    },
                    {
                        "name": "optimize_file",
                        "type": "bool",
                        "description": "transcode the video & audio if necessary to ensure common web browser support. FFmpeg is required",
                        "is_required": false
                    },
                    {
                        "name": "fee_currency",
                        "type": "string",
                        "description": "specify fee currency",
                        "is_required": false
                    },
                    {
                        "name": "fee_amount",
                        "type": "decimal",
                        "description": "content download fee",
                        "is_required": false
                    },
                    {
                        "name": "fee_address",
                        "type": "str",
                        "description": "address where to send fee payments, will use value from --claim_address if not provided",
                        "is_required": false
                    },
                    {
                        "name": "title",
                        "type": "str",
                        "description": "title of the publication",
                        "is_required": false
                    },
                    {
                        "name": "description",
                        "type": "str",
                        "description": "description of the publication",
                        "is_required": false
                    },
                    {
                        "name": "author",
                        "type": "str",
                        "description": "author of the publication. The usage for this field is not the same as for channels. The author field is used to credit an author who is not the publisher and is not represented by the channel. For example, a pdf file of 'The Odyssey' has an author of 'Homer' but may by published to a channel such as '@classics', or to no channel at all",
                        "is_required": false
                    },
                    {
                        "name": "tags",
                        "type": "list",
                        "description": "add content tags",
                        "is_required": false
                    },
                    {
                        "name": "languages",
                        "type": "list",
                        "description": "languages used by the channel, using RFC 5646 format, eg: for English `--languages=en` for Spanish (Spain) `--languages=es-ES` for Spanish (Mexican) `--languages=es-MX` for Chinese (Simplified) `--languages=zh-Hans` for Chinese (Traditional) `--languages=zh-Hant`",
                        "is_required": false
                    },
                    {
                        "name": "locations",
                        "type": "list",
                        "description": "locations relevant to the stream, consisting of 2 letter `country` code and a `state`, `city` and a postal `code` along with a `latitude` and `longitude`. for JSON RPC: pass a dictionary with aforementioned attributes as keys, eg: ... \"locations\": [{'country': 'US', 'state': 'NH'}] ... for command line: pass a colon delimited list with values in the following order: \"COUNTRY:STATE:CITY:CODE:LATITUDE:LONGITUDE\" making sure to include colon for blank values, for example to provide only the city: ... --locations=\"::Manchester\" with all values set: ... --locations=\"US:NH:Manchester:03101:42.990605:-71.460989\" optionally, you can just pass the \"LATITUDE:LONGITUDE\": ... --locations=\"42.990605:-71.460989\" finally, you can also pass JSON string of dictionary on the command line as you would via JSON RPC ... --locations=\"{'country': 'US', 'state': 'NH'}\"",
                        "is_required": false
                    },
                    {
                        "name": "license",
                        "type": "str",
                        "description": "publication license",
                        "is_required": false
                    },
                    {
                        "name": "license_url",
                        "type": "str",
                        "description": "publication license url",
                        "is_required": false
                    },
                    {
                        "name": "thumbnail_url",
                        "type": "str",
                        "description": "thumbnail url",
                        "is_required": false
                    },
                    {
                        "name": "release_time",
                        "type": "int",
                        "description": "original public release of content, seconds since UNIX epoch",
                        "is_required": false
                    },
                    {
                        "name": "width",
                        "type": "int",
                        "description": "image/video width, automatically calculated from media file",
                        "is_required": false
                    },
                    {
                        "name": "height",
                        "type": "int",
                        "description": "image/video height, automatically calculated from media file",
                        "is_required": false
                    },
                    {
                        "name": "duration",
                        "type": "int",
                        "description": "audio/video duration in seconds, automatically calculated",
                        "is_required": false
                    },
                    {
                        "name": "sd_hash",
                        "type": "str",
                        "description": "sd_hash of stream",
                        "is_required": false
                    },
                    {
                        "name": "channel_id",
                        "type": "str",
                        "description": "claim id of the publisher channel",
                        "is_required": false
                    },
                    {
                        "name": "channel_name",
                        "type": "str",
                        "description": "name of publisher channel",
                        "is_required": false
                    },
                    {
                        "name": "channel_account_id",
                        "type": "str",
                        "description": "one or more account ids for accounts to look in for channel certificates, defaults to all accounts.",
                        "is_required": false
                    },
                    {
                        "name": "account_id",
                        "type": "str",
                        "description": "account to use for holding the transaction",
                        "is_required": false
                    },
                    {
                        "name": "wallet_id",
                        "type": "str",
                        "description": "restrict operation to specific wallet",
                        "is_required": false
                    },
                    {
                        "name": "funding_account_ids",
                        "type": "list",
                        "description": "ids of accounts to fund this transaction",
                        "is_required": false
                    },
                    {
                        "name": "claim_address",
                        "type": "str",
                        "description": "address where the claim is sent to, if not specified it will be determined automatically from the account",
                        "is_required": false
                    },
                    {
                        "name": "preview",
                        "type": "bool",
                        "description": "do not broadcast the transaction",
                        "is_required": false
                    },
                    {
                        "name": "blocking",
                        "type": "bool",
                        "description": "wait until transaction is in mempool",
                        "is_required": false
                    }
                ],
                "returns": "            {\n                \"txid\": \"hash of transaction in hex\",\n                \"height\": \"block where transaction was recorded\",\n                \"inputs\": [\n                    {\n                        \"txid\": \"hash of transaction in hex\",\n                        \"nout\": \"position in the transaction\",\n                        \"height\": \"block where transaction was recorded\",\n                        \"amount\": \"value of the txo as a decimal\",\n                        \"address\": \"address of who can spend the txo\",\n                        \"confirmations\": \"number of confirmed blocks\",\n                        \"is_change\": \"payment to change address, only available when it can be determined\",\n                        \"is_received\": \"true if txo was sent from external account to this account\",\n                        \"is_spent\": \"true if txo is spent\",\n                        \"is_mine\": \"payment to one of your accounts, only available when it can be determined\",\n                        \"type\": \"one of 'claim', 'support' or 'purchase'\",\n                        \"name\": \"when type is 'claim' or 'support', this is the claim name\",\n                        \"claim_id\": \"when type is 'claim', 'support' or 'purchase', this is the claim id\",\n                        \"claim_op\": \"when type is 'claim', this determines if it is 'create' or 'update'\",\n                        \"value\": \"when type is 'claim' or 'support' with payload, this is the decoded protobuf payload\",\n                        \"value_type\": \"determines the type of the 'value' field: 'channel', 'stream', etc\",\n                        \"protobuf\": \"hex encoded raw protobuf version of 'value' field\",\n                        \"permanent_url\": \"when type is 'claim' or 'support', this is the long permanent claim URL\",\n                        \"claim\": \"for purchase outputs only, metadata of purchased claim\",\n                        \"reposted_claim\": \"for repost claims only, metadata of claim being reposted\",\n                        \"signing_channel\": \"for signed claims only, metadata of signing channel\",\n                        \"is_channel_signature_valid\": \"for signed claims only, whether signature is valid\",\n                        \"purchase_receipt\": \"metadata for the purchase transaction associated with this claim\"\n                    }\n                ],\n                \"outputs\": [\n                    {\n                        \"txid\": \"hash of transaction in hex\",\n                        \"nout\": \"position in the transaction\",\n                        \"height\": \"block where transaction was recorded\",\n                        \"amount\": \"value of the txo as a decimal\",\n                        \"address\": \"address of who can spend the txo\",\n                        \"confirmations\": \"number of confirmed blocks\",\n                        \"is_change\": \"payment to change address, only available when it can be determined\",\n                        \"is_received\": \"true if txo was sent from external account to this account\",\n                        \"is_spent\": \"true if txo is spent\",\n                        \"is_mine\": \"payment to one of your accounts, only available when it can be determined\",\n                        \"type\": \"one of 'claim', 'support' or 'purchase'\",\n                        \"name\": \"when type is 'claim' or 'support', this is the claim name\",\n                        \"claim_id\": \"when type is 'claim', 'support' or 'purchase', this is the claim id\",\n                        \"claim_op\": \"when type is 'claim', this determines if it is 'create' or 'update'\",\n                        \"value\": \"when type is 'claim' or 'support' with payload, this is the decoded protobuf payload\",\n                        \"value_type\": \"determines the type of the 'value' field: 'channel', 'stream', etc\",\n                        \"protobuf\": \"hex encoded raw protobuf version of 'value' field\",\n                        \"permanent_url\": \"when type is 'claim' or 'support', this is the long permanent claim URL\",\n                        \"claim\": \"for purchase outputs only, metadata of purchased claim\",\n                        \"reposted_claim\": \"for repost claims only, metadata of claim being reposted\",\n                        \"signing_channel\": \"for signed claims only, metadata of signing channel\",\n                        \"is_channel_signature_valid\": \"for signed claims only, whether signature is valid\",\n                        \"purchase_receipt\": \"metadata for the purchase transaction associated with this claim\"\n                    }\n                ],\n                \"total_input\": \"sum of inputs as a decimal\",\n                \"total_output\": \"sum of outputs, sans fee, as a decimal\",\n                \"total_fee\": \"fee amount\",\n                \"hex\": \"entire transaction encoded in hex\"\n            }",
                "examples": [
                    {
                        "title": "Publish a file",
                        "curl": "curl -d'{\"method\": \"publish\", \"params\": {\"name\": \"a-new-stream\", \"bid\": \"1.0\", \"file_path\": \"/var/folders/46/44w2zhrx16b8gsvff9dxtr640000gq/T/tmp1wt4ndjd\", \"validate_file\": false, \"optimize_file\": false, \"tags\": [], \"languages\": [], \"locations\": [], \"channel_account_id\": [], \"funding_account_ids\": [], \"preview\": false, \"blocking\": false}}' http://localhost:5279/",
                        "lbrynet": "lbrynet publish a-new-stream --bid=1.0 --file_path=/var/folders/46/44w2zhrx16b8gsvff9dxtr640000gq/T/tmp1wt4ndjd",
                        "python": "requests.post(\"http://localhost:5279\", json={\"method\": \"publish\", \"params\": {\"name\": \"a-new-stream\", \"bid\": \"1.0\", \"file_path\": \"/var/folders/46/44w2zhrx16b8gsvff9dxtr640000gq/T/tmp1wt4ndjd\", \"validate_file\": false, \"optimize_file\": false, \"tags\": [], \"languages\": [], \"locations\": [], \"channel_account_id\": [], \"funding_account_ids\": [], \"preview\": false, \"blocking\": false}}).json()",
                        "output": "{\n  \"jsonrpc\": \"2.0\",\n  \"result\": {\n    \"height\": -2,\n    \"hex\": \"0100000001c701b5f207fe0b1abd990f0899a8c8bc4bf6c8ce07d0eafc8a59e44bce4f95a9010000006b483045022100fb66c628da4fb63d7f1ae98d3c2bd15b5e4ae4aa7863891b943989f92c1aed0902202362799eb6f3d1cd66bd230c6710fafa248ad48073a7070e1ba51d24b7c7f453012102f272fd093af2228160e96af70d809c329d9c547375b6d838498880f7c3051290ffffffff0200e1f50500000000bfb50c612d6e65772d73747265616d4c94000a90010a8d010a30fdbd8e75a67f29f701a4e040385e2e23986303ea10239211af907fcbb83578b3e417cb71ce646efd0819dd8c088de1bd120b746d70317774346e646a64180b22186170706c69636174696f6e2f6f637465742d73747265616d32304e61ee6b6a7810750982faa6c805323e33b5d21d2798d4add70c7588640ed8c5f70c822382be5fe87fd5ae356e26896e6d7576a9147ec6c9961e0d398d337699d566702f0ffe1ea07888ac54826311000000001976a914bf0468b0a4fd815b9a4bef7d7c3cd59a67e35a9b88ac00000000\",\n    \"inputs\": [\n      {\n        \"address\": \"n2qN5bEHEQ1keWyR6GbNd15dbHE6z1FoZb\",\n        \"amount\": \"3.941448\",\n        \"confirmations\": 3,\n        \"height\": 217,\n        \"nout\": 1,\n        \"timestamp\": 1655141675,\n        \"txid\": \"a9954fce4be4598afcead007cec8f64bbcc8a899080f99bd1a0bfe07f2b501c7\",\n        \"type\": \"payment\"\n      }\n    ],\n    \"outputs\": [\n      {\n        \"address\": \"ms5HaDddaUyAAMczcdCbYuTFkuBdAgQxeY\",\n        \"amount\": \"1.0\",\n        \"claim_id\": \"006db49526758cf95dc2d9cd2354114e67441baa\",\n        \"claim_op\": \"create\",\n        \"confirmations\": -2,\n        \"height\": -2,\n        \"meta\": {},\n        \"name\": \"a-new-stream\",\n        \"normalized_name\": \"a-new-stream\",\n        \"nout\": 0,\n        \"permanent_url\": \"lbry://a-new-stream#006db49526758cf95dc2d9cd2354114e67441baa\",\n        \"timestamp\": null,\n        \"txid\": \"0c646996c6c30899690e4536037c21e1f2190b89be07af626b3b61f17c4fc431\",\n        \"type\": \"claim\",\n        \"value\": {\n          \"source\": {\n            \"hash\": \"fdbd8e75a67f29f701a4e040385e2e23986303ea10239211af907fcbb83578b3e417cb71ce646efd0819dd8c088de1bd\",\n            \"media_type\": \"application/octet-stream\",\n            \"name\": \"tmp1wt4ndjd\",\n            \"sd_hash\": \"4e61ee6b6a7810750982faa6c805323e33b5d21d2798d4add70c7588640ed8c5f70c822382be5fe87fd5ae356e26896e\",\n            \"size\": \"11\"\n          },\n          \"stream_type\": \"binary\"\n        },\n        \"value_type\": \"stream\"\n      },\n      {\n        \"address\": \"mxvxe2qg1xUdSoMWFch86uZKS5X3t2Sj3t\",\n        \"amount\": \"2.917341\",\n        \"confirmations\": -2,\n        \"height\": -2,\n        \"nout\": 1,\n        \"timestamp\": null,\n        \"txid\": \"0c646996c6c30899690e4536037c21e1f2190b89be07af626b3b61f17c4fc431\",\n        \"type\": \"payment\"\n      }\n    ],\n    \"total_fee\": \"0.024107\",\n    \"total_input\": \"3.941448\",\n    \"total_output\": \"3.917341\",\n    \"txid\": \"0c646996c6c30899690e4536037c21e1f2190b89be07af626b3b61f17c4fc431\"\n  }\n}"
                    }
                ]
            },
            {
                "name": "resolve",
                "description": "Get the claim that a URL refers to.",
                "arguments": [
                    {
                        "name": "urls",
                        "type": "str, list",
                        "description": "one or more urls to resolve",
                        "is_required": false
                    },
                    {
                        "name": "wallet_id",
                        "type": "str",
                        "description": "wallet to check for claim purchase receipts",
                        "is_required": false
                    },
                    {
                        "name": "new_sdk_server",
                        "type": "str",
                        "description": "URL of the new SDK server (EXPERIMENTAL)",
                        "is_required": false
                    },
                    {
                        "name": "include_purchase_receipt",
                        "type": "bool",
                        "description": "lookup and include a receipt if this wallet has purchased the claim being resolved",
                        "is_required": false
                    },
                    {
                        "name": "include_is_my_output",
                        "type": "bool",
                        "description": "lookup and include a boolean indicating if claim being resolved is yours",
                        "is_required": false
                    },
                    {
                        "name": "include_sent_supports",
                        "type": "bool",
                        "description": "lookup and sum the total amount of supports you've made to this claim",
                        "is_required": false
                    },
                    {
                        "name": "include_sent_tips",
                        "type": "bool",
                        "description": "lookup and sum the total amount of tips you've made to this claim (only makes sense when claim is not yours)",
                        "is_required": false
                    },
                    {
                        "name": "include_received_tips",
                        "type": "bool",
                        "description": "lookup and sum the total amount of tips you've received to this claim (only makes sense when claim is yours)",
                        "is_required": false
                    }
                ],
                "returns": "Dictionary of results, keyed by url\n    '<url>': {\n            If a resolution error occurs:\n            'error': Error message\n\n            If the url resolves to a channel or a claim in a channel:\n            'certificate': {\n                'address': (str) claim address,\n                'amount': (float) claim amount,\n                'effective_amount': (float) claim amount including supports,\n                'claim_id': (str) claim id,\n                'claim_sequence': (int) claim sequence number (or -1 if unknown),\n                'decoded_claim': (bool) whether or not the claim value was decoded,\n                'height': (int) claim height,\n                'confirmations': (int) claim depth,\n                'timestamp': (int) timestamp of the block that included this claim tx,\n                'has_signature': (bool) included if decoded_claim\n                'name': (str) claim name,\n                'permanent_url': (str) permanent url of the certificate claim,\n                'supports: (list) list of supports [{'txid': (str) txid,\n                                                     'nout': (int) nout,\n                                                     'amount': (float) amount}],\n                'txid': (str) claim txid,\n                'nout': (str) claim nout,\n                'signature_is_valid': (bool), included if has_signature,\n                'value': ClaimDict if decoded, otherwise hex string\n            }\n\n            If the url resolves to a channel:\n            'claims_in_channel': (int) number of claims in the channel,\n\n            If the url resolves to a claim:\n            'claim': {\n                'address': (str) claim address,\n                'amount': (float) claim amount,\n                'effective_amount': (float) claim amount including supports,\n                'claim_id': (str) claim id,\n                'claim_sequence': (int) claim sequence number (or -1 if unknown),\n                'decoded_claim': (bool) whether or not the claim value was decoded,\n                'height': (int) claim height,\n                'depth': (int) claim depth,\n                'has_signature': (bool) included if decoded_claim\n                'name': (str) claim name,\n                'permanent_url': (str) permanent url of the claim,\n                'channel_name': (str) channel name if claim is in a channel\n                'supports: (list) list of supports [{'txid': (str) txid,\n                                                     'nout': (int) nout,\n                                                     'amount': (float) amount}]\n                'txid': (str) claim txid,\n                'nout': (str) claim nout,\n                'signature_is_valid': (bool), included if has_signature,\n                'value': ClaimDict if decoded, otherwise hex string\n            }\n    }",
                "examples": [
                    {
                        "title": "Resolve a claim",
                        "curl": "curl -d'{\"method\": \"resolve\", \"params\": {\"urls\": [\"astream#ad25e05aa7dc5e9994869040c6103f9a8728db46\"], \"include_purchase_receipt\": false, \"include_is_my_output\": false, \"include_sent_supports\": false, \"include_sent_tips\": false, \"include_received_tips\": false}}' http://localhost:5279/",
                        "lbrynet": "lbrynet resolve astream#ad25e05aa7dc5e9994869040c6103f9a8728db46",
                        "python": "requests.post(\"http://localhost:5279\", json={\"method\": \"resolve\", \"params\": {\"urls\": [\"astream#ad25e05aa7dc5e9994869040c6103f9a8728db46\"], \"include_purchase_receipt\": false, \"include_is_my_output\": false, \"include_sent_supports\": false, \"include_sent_tips\": false, \"include_received_tips\": false}}).json()",
                        "output": "{\n  \"jsonrpc\": \"2.0\",\n  \"result\": {\n    \"astream#ad25e05aa7dc5e9994869040c6103f9a8728db46\": {\n      \"address\": \"mm6gzeSV7hiGxtAv3rQjo3sRYtCDGD4t2M\",\n      \"amount\": \"1.0\",\n      \"canonical_url\": \"lbry://@channel#5/astream#a\",\n      \"claim_id\": \"ad25e05aa7dc5e9994869040c6103f9a8728db46\",\n      \"claim_op\": \"update\",\n      \"confirmations\": 4,\n      \"height\": 214,\n      \"is_channel_signature_valid\": true,\n      \"meta\": {\n        \"activation_height\": 214,\n        \"creation_height\": 213,\n        \"creation_timestamp\": 1655141671,\n        \"effective_amount\": \"1.0\",\n        \"expiration_height\": 714,\n        \"is_controlling\": true,\n        \"reposted\": 0,\n        \"support_amount\": \"0.0\",\n        \"take_over_height\": 213\n      },\n      \"name\": \"astream\",\n      \"normalized_name\": \"astream\",\n      \"nout\": 0,\n      \"permanent_url\": \"lbry://astream#ad25e05aa7dc5e9994869040c6103f9a8728db46\",\n      \"short_url\": \"lbry://astream#a\",\n      \"signing_channel\": {\n        \"address\": \"muRaaMs12imkZJQofvBuLbAFYAs6TiQPAQ\",\n        \"amount\": \"1.0\",\n        \"canonical_url\": \"lbry://@channel#5\",\n        \"claim_id\": \"595c2e2f0c1f59188628fab7503692b0145779a2\",\n        \"claim_op\": \"update\",\n        \"confirmations\": 8,\n        \"has_signing_key\": false,\n        \"height\": 210,\n        \"meta\": {\n          \"activation_height\": 210,\n          \"claims_in_channel\": 2,\n          \"creation_height\": 209,\n          \"creation_timestamp\": 1655141670,\n          \"effective_amount\": \"1.0\",\n          \"expiration_height\": 710,\n          \"is_controlling\": true,\n          \"reposted\": 0,\n          \"support_amount\": \"0.0\",\n          \"take_over_height\": 209\n        },\n        \"name\": \"@channel\",\n        \"normalized_name\": \"@channel\",\n        \"nout\": 0,\n        \"permanent_url\": \"lbry://@channel#595c2e2f0c1f59188628fab7503692b0145779a2\",\n        \"short_url\": \"lbry://@channel#5\",\n        \"timestamp\": 1655141670,\n        \"txid\": \"ab8221c5a5404117744d80e5d652dcf04c5caac947f019b5b534e0ccf7cfff64\",\n        \"type\": \"claim\",\n        \"value\": {\n          \"public_key\": \"03bbf11fc85401781301f36897b5b01b0aef440db5d6fb0747900b8c69e40e55e5\",\n          \"public_key_id\": \"moF9EgZauGirwqpwZ7NgVsCAxddcPABTfm\",\n          \"title\": \"New Channel\"\n        },\n        \"value_type\": \"channel\"\n      },\n      \"timestamp\": 1655141671,\n      \"txid\": \"7570c487faefe51e7e72ef22896171e151710ff6e8153efcbe51baa49b7f6234\",\n      \"type\": \"claim\",\n      \"value\": {\n        \"source\": {\n          \"hash\": \"fdbd8e75a67f29f701a4e040385e2e23986303ea10239211af907fcbb83578b3e417cb71ce646efd0819dd8c088de1bd\",\n          \"media_type\": \"application/octet-stream\",\n          \"name\": \"tmpr832hp1x\",\n          \"sd_hash\": \"9ddea316b511d9f720b1f67f5958cac381fdac5d1d3beabc754b9a1220a891024e983241e2fc7549f0f89ea0636c6c83\",\n          \"size\": \"11\"\n        },\n        \"stream_type\": \"binary\"\n      },\n      \"value_type\": \"stream\"\n    }\n  }\n}"
                    }
                ]
            },
            {
                "name": "routing_table_get",
                "description": "Get DHT routing information",
                "arguments": [],
                "returns": "(dict) dictionary containing routing and peer information\n    {\n        \"buckets\": {\n            <bucket index>: [\n                {\n                    \"address\": (str) peer address,\n                    \"udp_port\": (int) peer udp port,\n                    \"tcp_port\": (int) peer tcp port,\n                    \"node_id\": (str) peer node id,\n                }\n            ]\n        },\n        \"node_id\": (str) the local dht node id\n        \"prefix_neighbors_count\": (int) the amount of peers sharing the same byte prefix of the local node id\n    }",
                "examples": []
            },
            {
                "name": "status",
                "description": "Get daemon status",
                "arguments": [],
                "returns": "(dict) lbrynet-daemon status\n    {\n        'installation_id': (str) installation id - base58,\n        'is_running': (bool),\n        'skipped_components': (list) [names of skipped components (str)],\n        'startup_status': { Does not include components which have been skipped\n            'blob_manager': (bool),\n            'blockchain_headers': (bool),\n            'database': (bool),\n            'dht': (bool),\n            'exchange_rate_manager': (bool),\n            'hash_announcer': (bool),\n            'peer_protocol_server': (bool),\n            'file_manager': (bool),\n            'libtorrent_component': (bool),\n            'upnp': (bool),\n            'wallet': (bool),\n        },\n        'connection_status': {\n            'code': (str) connection status code,\n            'message': (str) connection status message\n        },\n        'blockchain_headers': {\n            'downloading_headers': (bool),\n            'download_progress': (float) 0-100.0\n        },\n        'wallet': {\n            'connected': (str) host and port of the connected spv server,\n            'blocks': (int) local blockchain height,\n            'blocks_behind': (int) remote_height - local_height,\n            'best_blockhash': (str) block hash of most recent block,\n            'is_encrypted': (bool),\n            'is_locked': (bool),\n            'connected_servers': (list) [\n                {\n                    'host': (str) server hostname,\n                    'port': (int) server port,\n                    'latency': (int) milliseconds\n                }\n            ],\n        },\n        'libtorrent_component': {\n            'running': (bool) libtorrent was detected and started successfully,\n        },\n        'dht': {\n            'node_id': (str) lbry dht node id - hex encoded,\n            'peers_in_routing_table': (int) the number of peers in the routing table,\n        },\n        'blob_manager': {\n            'finished_blobs': (int) number of finished blobs in the blob manager,\n            'connections': {\n                'incoming_bps': {\n                    <source ip and tcp port>: (int) bytes per second received,\n                },\n                'outgoing_bps': {\n                    <destination ip and tcp port>: (int) bytes per second sent,\n                },\n                'total_outgoing_mps': (float) megabytes per second sent,\n                'total_incoming_mps': (float) megabytes per second received,\n                'max_outgoing_mbs': (float) maximum bandwidth (megabytes per second) sent, since the\n                                    daemon was started\n                'max_incoming_mbs': (float) maximum bandwidth (megabytes per second) received, since the\n                                    daemon was started\n                'total_sent' : (int) total number of bytes sent since the daemon was started\n                'total_received' : (int) total number of bytes received since the daemon was started\n            }\n        },\n        'hash_announcer': {\n            'announce_queue_size': (int) number of blobs currently queued to be announced\n        },\n        'file_manager': {\n            'managed_files': (int) count of files in the stream manager,\n        },\n        'upnp': {\n            'aioupnp_version': (str),\n            'redirects': {\n                <TCP | UDP>: (int) external_port,\n            },\n            'gateway': (str) manufacturer and model,\n            'dht_redirect_set': (bool),\n            'peer_redirect_set': (bool),\n            'external_ip': (str) external ip address,\n        }\n    }",
                "examples": [
                    {
                        "title": "Get status",
                        "curl": "curl -d'{\"method\": \"status\", \"params\": {}}' http://localhost:5279/",
                        "lbrynet": "lbrynet status",
                        "python": "requests.post(\"http://localhost:5279\", json={\"method\": \"status\", \"params\": {}}).json()",
                        "output": "{\n  \"jsonrpc\": \"2.0\",\n  \"result\": {\n    \"background_downloader\": {\n      \"available_free_space_mb\": null,\n      \"ongoing_download\": false,\n      \"running\": false\n    },\n    \"blob_manager\": {\n      \"connections\": {\n        \"incoming_bps\": {},\n        \"max_incoming_mbs\": 0.0,\n        \"max_outgoing_mbs\": 0.0,\n        \"outgoing_bps\": {},\n        \"total_incoming_mbs\": 0.0,\n        \"total_outgoing_mbs\": 0.0,\n        \"total_received\": 0,\n        \"total_sent\": 0\n      },\n      \"finished_blobs\": 0\n    },\n    \"disk_space\": {\n      \"content_blobs_storage_used_mb\": 0,\n      \"published_blobs_storage_used_mb\": 0,\n      \"running\": true,\n      \"seed_blobs_storage_used_mb\": 0,\n      \"total_used_mb\": 0\n    },\n    \"ffmpeg_status\": {\n      \"analyze_audio_volume\": true,\n      \"available\": true,\n      \"which\": \"/opt/homebrew/bin/ffmpeg\"\n    },\n    \"file_manager\": {\n      \"managed_files\": 0\n    },\n    \"installation_id\": \"3a1UGocRVHs9fAYWhNTRGoq2mpi97NqGEbkofcVkZvJei5xqimckTxfDRdjuKt4Hr6\",\n    \"is_running\": true,\n    \"skipped_components\": [\n      \"dht\",\n      \"upnp\",\n      \"hash_announcer\",\n      \"peer_protocol_server\",\n      \"libtorrent_component\"\n    ],\n    \"startup_status\": {\n      \"background_downloader\": true,\n      \"blob_manager\": true,\n      \"database\": true,\n      \"disk_space\": true,\n      \"exchange_rate_manager\": true,\n      \"file_manager\": true,\n      \"tracker_announcer_component\": true,\n      \"wallet\": true,\n      \"wallet_server_payments\": true\n    },\n    \"wallet\": {\n      \"available_servers\": 1,\n      \"best_blockhash\": \"47eb373669435f62580b2855670788eaf07e62551c2d38361e24700f130cab36\",\n      \"blocks\": 206,\n      \"blocks_behind\": 0,\n      \"connected\": \"localhost:50002\",\n      \"connected_features\": {\n        \"daily_fee\": \"0\",\n        \"description\": \"\",\n        \"donation_address\": \"\",\n        \"genesis_hash\": \"6e3fcf1299d4ec5d79c3a4c91d624a4acf9e2e173d95a1a0504f677669687556\",\n        \"hash_function\": \"sha256\",\n        \"hosts\": {},\n        \"payment_address\": \"\",\n        \"protocol_max\": \"0.199.0\",\n        \"protocol_min\": \"0.54.0\",\n        \"pruning\": null,\n        \"server_version\": \"0.107.0\",\n        \"trending_algorithm\": \"fast_ar\"\n      },\n      \"headers_synchronization_progress\": 100,\n      \"known_servers\": 0,\n      \"servers\": [\n        {\n          \"availability\": true,\n          \"host\": \"localhost\",\n          \"latency\": 0.00792012499999828,\n          \"port\": 50002\n        }\n      ]\n    },\n    \"wallet_server_payments\": {\n      \"max_fee\": \"0.0\",\n      \"running\": false\n    }\n  }\n}"
                    }
                ]
            },
            {
                "name": "stop",
                "description": "Stop lbrynet API server.",
                "arguments": [],
                "returns": "(string) Shutdown message",
                "examples": []
            },
            {
                "name": "version",
                "description": "Get lbrynet API server version information",
                "arguments": [],
                "returns": "(dict) Dictionary of lbry version information\n    {\n        'processor': (str) processor type,\n        'python_version': (str) python version,\n        'platform': (str) platform string,\n        'os_release': (str) os release string,\n        'os_system': (str) os name,\n        'version': (str) lbrynet version,\n        'build': (str) \"dev\" | \"qa\" | \"rc\" | \"release\",\n    }",
                "examples": [
                    {
                        "title": "Get version",
                        "curl": "curl -d'{\"method\": \"version\", \"params\": {}}' http://localhost:5279/",
                        "lbrynet": "lbrynet version",
                        "python": "requests.post(\"http://localhost:5279\", json={\"method\": \"version\", \"params\": {}}).json()",
                        "output": "{\n  \"jsonrpc\": \"2.0\",\n  \"result\": {\n    \"build\": \"dev\",\n    \"lbrynet_version\": \"0.109.0\",\n    \"os_release\": \"21.5.0\",\n    \"os_system\": \"Darwin\",\n    \"platform\": \"Darwin-21.5.0-x86_64-i386-64bit\",\n    \"processor\": \"i386\",\n    \"python_version\": \"3.7.13\",\n    \"version\": \"0.109.0\"\n  }\n}"
                    }
                ]
            }
        ]
    },
    "account": {
        "doc": "Create, modify and inspect wallet accounts.",
        "commands": [
            {
                "name": "account_add",
                "description": "Add a previously created account from a seed, private key or public key (read-only).\nSpecify --single_key for single address or vanity address accounts.",
                "arguments": [
                    {
                        "name": "account_name",
                        "type": "str",
                        "description": "name of the account to add",
                        "is_required": true
                    },
                    {
                        "name": "seed",
                        "type": "str",
                        "description": "seed to generate new account from",
                        "is_required": false
                    },
                    {
                        "name": "private_key",
                        "type": "str",
                        "description": "private key for new account",
                        "is_required": false
                    },
                    {
                        "name": "public_key",
                        "type": "str",
                        "description": "public key for new account",
                        "is_required": false
                    },
                    {
                        "name": "single_key",
                        "type": "bool",
                        "description": "create single key account, default is multi-key",
                        "is_required": false
                    },
                    {
                        "name": "wallet_id",
                        "type": "str",
                        "description": "restrict operation to specific wallet",
                        "is_required": false
                    }
                ],
                "returns": "            {\n                \"id\": \"account_id\",\n                \"is_default\": \"this account is used by default\",\n                \"ledger\": \"name of crypto currency and network\",\n                \"name\": \"optional account name\",\n                \"seed\": \"human friendly words from which account can be recreated\",\n                \"encrypted\": \"if account is encrypted\",\n                \"private_key\": \"extended private key\",\n                \"public_key\": \"extended public key\",\n                \"address_generator\": \"settings for generating addresses\",\n                \"modified_on\": \"date of last modification to account settings\"\n            }",
                "examples": [
                    {
                        "title": "Add an account from seed",
                        "curl": "curl -d'{\"method\": \"account_add\", \"params\": {\"account_name\": \"new account\", \"seed\": \"miss ready crop oval canyon such sing powder figure math noodle style\", \"single_key\": false}}' http://localhost:5279/",
                        "lbrynet": "lbrynet account add \"new account\" --seed=\"miss ready crop oval canyon such sing powder figure math noodle style\"",
                        "python": "requests.post(\"http://localhost:5279\", json={\"method\": \"account_add\", \"params\": {\"account_name\": \"new account\", \"seed\": \"miss ready crop oval canyon such sing powder figure math noodle style\", \"single_key\": false}}).json()",
                        "output": "{\n  \"jsonrpc\": \"2.0\",\n  \"result\": {\n    \"address_generator\": {\n      \"change\": {\n        \"gap\": 6,\n        \"maximum_uses_per_address\": 1\n      },\n      \"name\": \"deterministic-chain\",\n      \"receiving\": {\n        \"gap\": 20,\n        \"maximum_uses_per_address\": 1\n      }\n    },\n    \"encrypted\": false,\n    \"id\": \"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\",\n    \"is_default\": false,\n    \"ledger\": \"lbc_regtest\",\n    \"modified_on\": 1655141657,\n    \"name\": \"new account\",\n    \"private_key\": \"tprv8ZgxMBicQKsPdmLUTJtRsfwAeL527nfpJE1GhFFLzKtbuuzwYorQyq8guwgzFCQkqs8EuR2MGLkbh3xuEb1pFuAjx1Web8Vk3RXrrLVKwRU\",\n    \"public_key\": \"tpubD6NzVbkrYhZ4XENGLxZ2H5bHDMaxH7risXc3ymHeQbgzkQFiBCg1AKkZ66UqGohv1bXg5579Z3r4omYeqMEd1Khhyuf4dssfmBzfiEce23o\",\n    \"seed\": \"miss ready crop oval canyon such sing powder figure math noodle style\"\n  }\n}"
                    }
                ]
            },
            {
                "name": "account_balance",
                "description": "Return the balance of an account",
                "arguments": [
                    {
                        "name": "account_id",
                        "type": "str",
                        "description": "If provided only the balance for this account will be given. Otherwise default account.",
                        "is_required": false
                    },
                    {
                        "name": "wallet_id",
                        "type": "str",
                        "description": "balance for specific wallet",
                        "is_required": false
                    },
                    {
                        "name": "confirmations",
                        "type": "int",
                        "description": "Only include transactions with this many confirmed blocks.",
                        "is_required": false
                    }
                ],
                "returns": "(decimal) amount of lbry credits in wallet",
                "examples": [
                    {
                        "title": "Get default account balance",
                        "curl": "curl -d'{\"method\": \"account_balance\", \"params\": {}}' http://localhost:5279/",
                        "lbrynet": "lbrynet account balance",
                        "python": "requests.post(\"http://localhost:5279\", json={\"method\": \"account_balance\", \"params\": {}}).json()",
                        "output": "{\n  \"jsonrpc\": \"2.0\",\n  \"result\": {\n    \"available\": \"7.999876\",\n    \"reserved\": \"0.0\",\n    \"reserved_subtotals\": {\n      \"claims\": \"0.0\",\n      \"supports\": \"0.0\",\n      \"tips\": \"0.0\"\n    },\n    \"total\": \"7.999876\"\n  }\n}"
                    },
                    {
                        "title": "Get balance for specific account by id",
                        "curl": "curl -d'{\"method\": \"account_balance\", \"params\": {\"account_id\": \"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\"}}' http://localhost:5279/",
                        "lbrynet": "lbrynet account balance \"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\"",
                        "python": "requests.post(\"http://localhost:5279\", json={\"method\": \"account_balance\", \"params\": {\"account_id\": \"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\"}}).json()",
                        "output": "{\n  \"jsonrpc\": \"2.0\",\n  \"result\": {\n    \"available\": \"2.0\",\n    \"reserved\": \"0.0\",\n    \"reserved_subtotals\": {\n      \"claims\": \"0.0\",\n      \"supports\": \"0.0\",\n      \"tips\": \"0.0\"\n    },\n    \"total\": \"2.0\"\n  }\n}"
                    }
                ]
            },
            {
                "name": "account_create",
                "description": "Create a new account. Specify --single_key if you want to use\nthe same address for all transactions (not recommended).",
                "arguments": [
                    {
                        "name": "account_name",
                        "type": "str",
                        "description": "name of the account to create",
                        "is_required": true
                    },
                    {
                        "name": "single_key",
                        "type": "bool",
                        "description": "create single key account, default is multi-key",
                        "is_required": false
                    },
                    {
                        "name": "wallet_id",
                        "type": "str",
                        "description": "restrict operation to specific wallet",
                        "is_required": false
                    }
                ],
                "returns": "            {\n                \"id\": \"account_id\",\n                \"is_default\": \"this account is used by default\",\n                \"ledger\": \"name of crypto currency and network\",\n                \"name\": \"optional account name\",\n                \"seed\": \"human friendly words from which account can be recreated\",\n                \"encrypted\": \"if account is encrypted\",\n                \"private_key\": \"extended private key\",\n                \"public_key\": \"extended public key\",\n                \"address_generator\": \"settings for generating addresses\",\n                \"modified_on\": \"date of last modification to account settings\"\n            }",
                "examples": [
                    {
                        "title": "Create an account",
                        "curl": "curl -d'{\"method\": \"account_create\", \"params\": {\"account_name\": \"generated account\", \"single_key\": false}}' http://localhost:5279/",
                        "lbrynet": "lbrynet account create \"generated account\"",
                        "python": "requests.post(\"http://localhost:5279\", json={\"method\": \"account_create\", \"params\": {\"account_name\": \"generated account\", \"single_key\": false}}).json()",
                        "output": "{\n  \"jsonrpc\": \"2.0\",\n  \"result\": {\n    \"address_generator\": {\n      \"change\": {\n        \"gap\": 6,\n        \"maximum_uses_per_address\": 1\n      },\n      \"name\": \"deterministic-chain\",\n      \"receiving\": {\n        \"gap\": 20,\n        \"maximum_uses_per_address\": 1\n      }\n    },\n    \"encrypted\": false,\n    \"id\": \"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\",\n    \"is_default\": false,\n    \"ledger\": \"lbc_regtest\",\n    \"modified_on\": 1655141657,\n    \"name\": \"generated account\",\n    \"private_key\": \"tprv8ZgxMBicQKsPdmLUTJtRsfwAeL527nfpJE1GhFFLzKtbuuzwYorQyq8guwgzFCQkqs8EuR2MGLkbh3xuEb1pFuAjx1Web8Vk3RXrrLVKwRU\",\n    \"public_key\": \"tpubD6NzVbkrYhZ4XENGLxZ2H5bHDMaxH7risXc3ymHeQbgzkQFiBCg1AKkZ66UqGohv1bXg5579Z3r4omYeqMEd1Khhyuf4dssfmBzfiEce23o\",\n    \"seed\": \"miss ready crop oval canyon such sing powder figure math noodle style\"\n  }\n}"
                    }
                ]
            },
            {
                "name": "account_deposit",
                "description": "Spend a time locked transaction into your account.",
                "arguments": [
                    {
                        "name": "txid",
                        "type": "str",
                        "description": "id of the transaction",
                        "is_required": false
                    },
                    {
                        "name": "nout",
                        "type": "int",
                        "description": "output number in the transaction",
                        "is_required": false
                    },
                    {
                        "name": "redeem_script",
                        "type": "str",
                        "description": "redeem script for output",
                        "is_required": false
                    },
                    {
                        "name": "private_key",
                        "type": "str",
                        "description": "private key to sign transaction",
                        "is_required": false
                    },
                    {
                        "name": "to_account",
                        "type": "str",
                        "description": "deposit to this account",
                        "is_required": false
                    },
                    {
                        "name": "wallet_id",
                        "type": "str",
                        "description": "limit operation to specific wallet.",
                        "is_required": false
                    },
                    {
                        "name": "preview",
                        "type": "bool",
                        "description": "do not broadcast the transaction",
                        "is_required": false
                    },
                    {
                        "name": "blocking",
                        "type": "bool",
                        "description": "wait until tx has synced",
                        "is_required": false
                    }
                ],
                "returns": "            {\n                \"txid\": \"hash of transaction in hex\",\n                \"height\": \"block where transaction was recorded\",\n                \"inputs\": [\n                    {\n                        \"txid\": \"hash of transaction in hex\",\n                        \"nout\": \"position in the transaction\",\n                        \"height\": \"block where transaction was recorded\",\n                        \"amount\": \"value of the txo as a decimal\",\n                        \"address\": \"address of who can spend the txo\",\n                        \"confirmations\": \"number of confirmed blocks\",\n                        \"is_change\": \"payment to change address, only available when it can be determined\",\n                        \"is_received\": \"true if txo was sent from external account to this account\",\n                        \"is_spent\": \"true if txo is spent\",\n                        \"is_mine\": \"payment to one of your accounts, only available when it can be determined\",\n                        \"type\": \"one of 'claim', 'support' or 'purchase'\",\n                        \"name\": \"when type is 'claim' or 'support', this is the claim name\",\n                        \"claim_id\": \"when type is 'claim', 'support' or 'purchase', this is the claim id\",\n                        \"claim_op\": \"when type is 'claim', this determines if it is 'create' or 'update'\",\n                        \"value\": \"when type is 'claim' or 'support' with payload, this is the decoded protobuf payload\",\n                        \"value_type\": \"determines the type of the 'value' field: 'channel', 'stream', etc\",\n                        \"protobuf\": \"hex encoded raw protobuf version of 'value' field\",\n                        \"permanent_url\": \"when type is 'claim' or 'support', this is the long permanent claim URL\",\n                        \"claim\": \"for purchase outputs only, metadata of purchased claim\",\n                        \"reposted_claim\": \"for repost claims only, metadata of claim being reposted\",\n                        \"signing_channel\": \"for signed claims only, metadata of signing channel\",\n                        \"is_channel_signature_valid\": \"for signed claims only, whether signature is valid\",\n                        \"purchase_receipt\": \"metadata for the purchase transaction associated with this claim\"\n                    }\n                ],\n                \"outputs\": [\n                    {\n                        \"txid\": \"hash of transaction in hex\",\n                        \"nout\": \"position in the transaction\",\n                        \"height\": \"block where transaction was recorded\",\n                        \"amount\": \"value of the txo as a decimal\",\n                        \"address\": \"address of who can spend the txo\",\n                        \"confirmations\": \"number of confirmed blocks\",\n                        \"is_change\": \"payment to change address, only available when it can be determined\",\n                        \"is_received\": \"true if txo was sent from external account to this account\",\n                        \"is_spent\": \"true if txo is spent\",\n                        \"is_mine\": \"payment to one of your accounts, only available when it can be determined\",\n                        \"type\": \"one of 'claim', 'support' or 'purchase'\",\n                        \"name\": \"when type is 'claim' or 'support', this is the claim name\",\n                        \"claim_id\": \"when type is 'claim', 'support' or 'purchase', this is the claim id\",\n                        \"claim_op\": \"when type is 'claim', this determines if it is 'create' or 'update'\",\n                        \"value\": \"when type is 'claim' or 'support' with payload, this is the decoded protobuf payload\",\n                        \"value_type\": \"determines the type of the 'value' field: 'channel', 'stream', etc\",\n                        \"protobuf\": \"hex encoded raw protobuf version of 'value' field\",\n                        \"permanent_url\": \"when type is 'claim' or 'support', this is the long permanent claim URL\",\n                        \"claim\": \"for purchase outputs only, metadata of purchased claim\",\n                        \"reposted_claim\": \"for repost claims only, metadata of claim being reposted\",\n                        \"signing_channel\": \"for signed claims only, metadata of signing channel\",\n                        \"is_channel_signature_valid\": \"for signed claims only, whether signature is valid\",\n                        \"purchase_receipt\": \"metadata for the purchase transaction associated with this claim\"\n                    }\n                ],\n                \"total_input\": \"sum of inputs as a decimal\",\n                \"total_output\": \"sum of outputs, sans fee, as a decimal\",\n                \"total_fee\": \"fee amount\",\n                \"hex\": \"entire transaction encoded in hex\"\n            }",
                "examples": []
            },
            {
                "name": "account_fund",
                "description": "Transfer some amount (or --everything) to an account from another\naccount (can be the same account). Amounts are interpreted as LBC.\nYou can also spread the transfer across a number of --outputs (cannot\nbe used together with --everything).",
                "arguments": [
                    {
                        "name": "to_account",
                        "type": "str",
                        "description": "send to this account",
                        "is_required": false
                    },
                    {
                        "name": "from_account",
                        "type": "str",
                        "description": "spend from this account",
                        "is_required": false
                    },
                    {
                        "name": "amount",
                        "type": "decimal",
                        "description": "the amount to transfer lbc",
                        "is_required": true
                    },
                    {
                        "name": "everything",
                        "type": "bool",
                        "description": "transfer everything (excluding claims), default: false.",
                        "is_required": false
                    },
                    {
                        "name": "outputs",
                        "type": "int",
                        "description": "split payment across many outputs, default: 1.",
                        "is_required": false
                    },
                    {
                        "name": "wallet_id",
                        "type": "str",
                        "description": "limit operation to specific wallet.",
                        "is_required": false
                    },
                    {
                        "name": "broadcast",
                        "type": "bool",
                        "description": "actually broadcast the transaction, default: false.",
                        "is_required": false
                    }
                ],
                "returns": "            {\n                \"txid\": \"hash of transaction in hex\",\n                \"height\": \"block where transaction was recorded\",\n                \"inputs\": [\n                    {\n                        \"txid\": \"hash of transaction in hex\",\n                        \"nout\": \"position in the transaction\",\n                        \"height\": \"block where transaction was recorded\",\n                        \"amount\": \"value of the txo as a decimal\",\n                        \"address\": \"address of who can spend the txo\",\n                        \"confirmations\": \"number of confirmed blocks\",\n                        \"is_change\": \"payment to change address, only available when it can be determined\",\n                        \"is_received\": \"true if txo was sent from external account to this account\",\n                        \"is_spent\": \"true if txo is spent\",\n                        \"is_mine\": \"payment to one of your accounts, only available when it can be determined\",\n                        \"type\": \"one of 'claim', 'support' or 'purchase'\",\n                        \"name\": \"when type is 'claim' or 'support', this is the claim name\",\n                        \"claim_id\": \"when type is 'claim', 'support' or 'purchase', this is the claim id\",\n                        \"claim_op\": \"when type is 'claim', this determines if it is 'create' or 'update'\",\n                        \"value\": \"when type is 'claim' or 'support' with payload, this is the decoded protobuf payload\",\n                        \"value_type\": \"determines the type of the 'value' field: 'channel', 'stream', etc\",\n                        \"protobuf\": \"hex encoded raw protobuf version of 'value' field\",\n                        \"permanent_url\": \"when type is 'claim' or 'support', this is the long permanent claim URL\",\n                        \"claim\": \"for purchase outputs only, metadata of purchased claim\",\n                        \"reposted_claim\": \"for repost claims only, metadata of claim being reposted\",\n                        \"signing_channel\": \"for signed claims only, metadata of signing channel\",\n                        \"is_channel_signature_valid\": \"for signed claims only, whether signature is valid\",\n                        \"purchase_receipt\": \"metadata for the purchase transaction associated with this claim\"\n                    }\n                ],\n                \"outputs\": [\n                    {\n                        \"txid\": \"hash of transaction in hex\",\n                        \"nout\": \"position in the transaction\",\n                        \"height\": \"block where transaction was recorded\",\n                        \"amount\": \"value of the txo as a decimal\",\n                        \"address\": \"address of who can spend the txo\",\n                        \"confirmations\": \"number of confirmed blocks\",\n                        \"is_change\": \"payment to change address, only available when it can be determined\",\n                        \"is_received\": \"true if txo was sent from external account to this account\",\n                        \"is_spent\": \"true if txo is spent\",\n                        \"is_mine\": \"payment to one of your accounts, only available when it can be determined\",\n                        \"type\": \"one of 'claim', 'support' or 'purchase'\",\n                        \"name\": \"when type is 'claim' or 'support', this is the claim name\",\n                        \"claim_id\": \"when type is 'claim', 'support' or 'purchase', this is the claim id\",\n                        \"claim_op\": \"when type is 'claim', this determines if it is 'create' or 'update'\",\n                        \"value\": \"when type is 'claim' or 'support' with payload, this is the decoded protobuf payload\",\n                        \"value_type\": \"determines the type of the 'value' field: 'channel', 'stream', etc\",\n                        \"protobuf\": \"hex encoded raw protobuf version of 'value' field\",\n                        \"permanent_url\": \"when type is 'claim' or 'support', this is the long permanent claim URL\",\n                        \"claim\": \"for purchase outputs only, metadata of purchased claim\",\n                        \"reposted_claim\": \"for repost claims only, metadata of claim being reposted\",\n                        \"signing_channel\": \"for signed claims only, metadata of signing channel\",\n                        \"is_channel_signature_valid\": \"for signed claims only, whether signature is valid\",\n                        \"purchase_receipt\": \"metadata for the purchase transaction associated with this claim\"\n                    }\n                ],\n                \"total_input\": \"sum of inputs as a decimal\",\n                \"total_output\": \"sum of outputs, sans fee, as a decimal\",\n                \"total_fee\": \"fee amount\",\n                \"hex\": \"entire transaction encoded in hex\"\n            }",
                "examples": [
                    {
                        "title": "Transfer 2 LBC from default account to specific account",
                        "curl": "curl -d'{\"method\": \"account_fund\", \"params\": {\"to_account\": \"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\", \"amount\": \"2.0\", \"everything\": false, \"broadcast\": true}}' http://localhost:5279/",
                        "lbrynet": "lbrynet account fund --to_account=\"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\" --amount=2.0 --broadcast",
                        "python": "requests.post(\"http://localhost:5279\", json={\"method\": \"account_fund\", \"params\": {\"to_account\": \"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\", \"amount\": \"2.0\", \"everything\": false, \"broadcast\": true}}).json()",
                        "output": "{\n  \"jsonrpc\": \"2.0\",\n  \"result\": {\n    \"height\": -2,\n    \"hex\": \"01000000012a489c130efda054091c1e91a258ad57772619a9b42ab5e416768e32334e581c000000006a47304402207fd2ffd9fe8363604a428161ace5ad1bb3bab156e9746dcf4d9b784e90abd8c6022024766cb49008eeac5b963a97de0d63611e8a5d7299776eab95598514b18ad1da0121028a467e50cb5555cc3d4ce66944ffbf5566cfe7b8a553e3bf40d4d214d4cb5233ffffffff0200c2eb0b000000001976a9140e92a8bca34238d407745d94fc5b21f0e39f518888ac90d7ae2f000000001976a914169f2f9502bfb8ee9c1d97c315ef13672721638b88ac00000000\",\n    \"inputs\": [\n      {\n        \"address\": \"mqwYxGxBhfFodPpkCDGXK3eiSHpfRPi6SD\",\n        \"amount\": \"10.0\",\n        \"confirmations\": 6,\n        \"height\": 201,\n        \"nout\": 0,\n        \"timestamp\": 1655141669,\n        \"txid\": \"1c584e33328e7616e4b52ab4a919267757ad58a2911e1c0954a0fd0e139c482a\",\n        \"type\": \"payment\"\n      }\n    ],\n    \"outputs\": [\n      {\n        \"address\": \"mgr1So3484shNr8kNMsavaohFwwRm9AnFU\",\n        \"amount\": \"2.0\",\n        \"confirmations\": -2,\n        \"height\": -2,\n        \"nout\": 0,\n        \"timestamp\": null,\n        \"txid\": \"f03159770e23cab4da7779dcf1a6809f6f518c61ab540d6a452d0bc5509874b8\",\n        \"type\": \"payment\"\n      },\n      {\n        \"address\": \"mhaZrhgfvGv49E47oDupq8wBppSNfhMFam\",\n        \"amount\": \"7.999876\",\n        \"confirmations\": -2,\n        \"height\": -2,\n        \"nout\": 1,\n        \"timestamp\": null,\n        \"txid\": \"f03159770e23cab4da7779dcf1a6809f6f518c61ab540d6a452d0bc5509874b8\",\n        \"type\": \"payment\"\n      }\n    ],\n    \"total_fee\": \"0.000124\",\n    \"total_input\": \"10.0\",\n    \"total_output\": \"9.999876\",\n    \"txid\": \"f03159770e23cab4da7779dcf1a6809f6f518c61ab540d6a452d0bc5509874b8\"\n  }\n}"
                    },
                    {
                        "title": "Spread LBC between multiple addresses",
                        "curl": "curl -d'{\"method\": \"account_fund\", \"params\": {\"to_account\": \"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\", \"from_account\": \"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\", \"amount\": \"1.5\", \"everything\": false, \"outputs\": 2, \"broadcast\": true}}' http://localhost:5279/",
                        "lbrynet": "lbrynet account fund --to_account=\"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\" --from_account=\"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\" --amount=1.5 --outputs=2 --broadcast",
                        "python": "requests.post(\"http://localhost:5279\", json={\"method\": \"account_fund\", \"params\": {\"to_account\": \"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\", \"from_account\": \"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\", \"amount\": \"1.5\", \"everything\": false, \"outputs\": 2, \"broadcast\": true}}).json()",
                        "output": "{\n  \"jsonrpc\": \"2.0\",\n  \"result\": {\n    \"height\": -2,\n    \"hex\": \"0100000001b8749850c50b2d456a0d54ab618c516f9f80a6f1dc7977dab4ca230e775931f0000000006b48304502210087b512d6b2772190e417f1b4252c0905d09c98eab3a229e3a3f2ab3bda11f2c7022030d2be08ee86c4b1e3899cebea7e1a5b68c74022502e57cc7b141c083fac45b401210232b7e745cbafb7b3506b71afe38ba9a1c049aec1426c3e5442b246604a14c5f6ffffffff03c0687804000000001976a9144f694178c5f66475002876866115a8a74177fcba88acc0687804000000001976a9144f694178c5f66475002876866115a8a74177fcba88ac6cb9fa02000000001976a9140e92a8bca34238d407745d94fc5b21f0e39f518888ac00000000\",\n    \"inputs\": [\n      {\n        \"address\": \"mgr1So3484shNr8kNMsavaohFwwRm9AnFU\",\n        \"amount\": \"2.0\",\n        \"confirmations\": 1,\n        \"height\": 207,\n        \"nout\": 0,\n        \"timestamp\": 1655141670,\n        \"txid\": \"f03159770e23cab4da7779dcf1a6809f6f518c61ab540d6a452d0bc5509874b8\",\n        \"type\": \"payment\"\n      }\n    ],\n    \"outputs\": [\n      {\n        \"address\": \"mnkqmWKPUwkeDuq7pndpfrzXFQDmH9QTBo\",\n        \"amount\": \"0.75\",\n        \"confirmations\": -2,\n        \"height\": -2,\n        \"nout\": 0,\n        \"timestamp\": null,\n        \"txid\": \"b1ae061be71d91de2b6e5f6c707547ad109dabb510b7dcddf20b96acb8175561\",\n        \"type\": \"payment\"\n      },\n      {\n        \"address\": \"mnkqmWKPUwkeDuq7pndpfrzXFQDmH9QTBo\",\n        \"amount\": \"0.75\",\n        \"confirmations\": -2,\n        \"height\": -2,\n        \"nout\": 1,\n        \"timestamp\": null,\n        \"txid\": \"b1ae061be71d91de2b6e5f6c707547ad109dabb510b7dcddf20b96acb8175561\",\n        \"type\": \"payment\"\n      },\n      {\n        \"address\": \"mgr1So3484shNr8kNMsavaohFwwRm9AnFU\",\n        \"amount\": \"0.499859\",\n        \"confirmations\": -2,\n        \"height\": -2,\n        \"nout\": 2,\n        \"timestamp\": null,\n        \"txid\": \"b1ae061be71d91de2b6e5f6c707547ad109dabb510b7dcddf20b96acb8175561\",\n        \"type\": \"payment\"\n      }\n    ],\n    \"total_fee\": \"0.000141\",\n    \"total_input\": \"2.0\",\n    \"total_output\": \"1.999859\",\n    \"txid\": \"b1ae061be71d91de2b6e5f6c707547ad109dabb510b7dcddf20b96acb8175561\"\n  }\n}"
                    },
                    {
                        "title": "Transfer all LBC to a specified account",
                        "curl": "curl -d'{\"method\": \"account_fund\", \"params\": {\"from_account\": \"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\", \"everything\": true, \"broadcast\": true}}' http://localhost:5279/",
                        "lbrynet": "lbrynet account fund --from_account=\"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\" --everything --broadcast",
                        "python": "requests.post(\"http://localhost:5279\", json={\"method\": \"account_fund\", \"params\": {\"from_account\": \"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\", \"everything\": true, \"broadcast\": true}}).json()",
                        "output": "{\n  \"jsonrpc\": \"2.0\",\n  \"result\": {\n    \"height\": -2,\n    \"hex\": \"0100000003615517b8ac960bf2dddcb710b5ab9d10ad4775706c5f6e2bde911de71b06aeb1000000006a473044022070ccee08cbef735f798b9b29f5fc0f3e6541c4c32178b8ef5d8f45c3789e29ff02203df22817e856760c6453e7c869832fa385ab5284e8f8bd97815ded9f2b2a14bb012103087f88b56b3724117f595eabb5ac5282b9e73842f11c47ad1d20de6d856e72b5ffffffff615517b8ac960bf2dddcb710b5ab9d10ad4775706c5f6e2bde911de71b06aeb1010000006b483045022100d183c50ecdff7371e9a411e0252bab59d3b55984ddfc0b8adaa32087b67114a8022020003d8932c41cd71006e00eb346fa624d64b634c45ff12b8c1b3a4fd8b38a58012103087f88b56b3724117f595eabb5ac5282b9e73842f11c47ad1d20de6d856e72b5ffffffff615517b8ac960bf2dddcb710b5ab9d10ad4775706c5f6e2bde911de71b06aeb1020000006a473044022072d277ab8cdbcc3bbe4ffdcf6e34c55ab0de334f5ffbb3417690ac6e6cfea20d02206302c2026251b84b420427baaf91edcd93ab26264aff676816bbc80b70e05c3301210232b7e745cbafb7b3506b71afe38ba9a1c049aec1426c3e5442b246604a14c5f6ffffffff015027eb0b000000001976a914d90aac550e652c485f8c75585fa9bdf7b56c0f0c88ac00000000\",\n    \"inputs\": [\n      {\n        \"address\": \"mnkqmWKPUwkeDuq7pndpfrzXFQDmH9QTBo\",\n        \"amount\": \"0.75\",\n        \"confirmations\": 1,\n        \"height\": 208,\n        \"nout\": 0,\n        \"timestamp\": 1655141670,\n        \"txid\": \"b1ae061be71d91de2b6e5f6c707547ad109dabb510b7dcddf20b96acb8175561\",\n        \"type\": \"payment\"\n      },\n      {\n        \"address\": \"mnkqmWKPUwkeDuq7pndpfrzXFQDmH9QTBo\",\n        \"amount\": \"0.75\",\n        \"confirmations\": 1,\n        \"height\": 208,\n        \"nout\": 1,\n        \"timestamp\": 1655141670,\n        \"txid\": \"b1ae061be71d91de2b6e5f6c707547ad109dabb510b7dcddf20b96acb8175561\",\n        \"type\": \"payment\"\n      },\n      {\n        \"address\": \"mgr1So3484shNr8kNMsavaohFwwRm9AnFU\",\n        \"amount\": \"0.499859\",\n        \"confirmations\": 1,\n        \"height\": 208,\n        \"nout\": 2,\n        \"timestamp\": 1655141670,\n        \"txid\": \"b1ae061be71d91de2b6e5f6c707547ad109dabb510b7dcddf20b96acb8175561\",\n        \"type\": \"payment\"\n      }\n    ],\n    \"outputs\": [\n      {\n        \"address\": \"n1JZiGPzhiFUPTysS5PABHjdiRqfWNMSaX\",\n        \"amount\": \"1.999604\",\n        \"confirmations\": -2,\n        \"height\": -2,\n        \"nout\": 0,\n        \"timestamp\": null,\n        \"txid\": \"40747da878033aa34fa25310b12e9625d820cfb9be384254863c59ed6bc3c0e8\",\n        \"type\": \"payment\"\n      }\n    ],\n    \"total_fee\": \"0.000255\",\n    \"total_input\": \"1.999859\",\n    \"total_output\": \"1.999604\",\n    \"txid\": \"40747da878033aa34fa25310b12e9625d820cfb9be384254863c59ed6bc3c0e8\"\n  }\n}"
                    }
                ]
            },
            {
                "name": "account_list",
                "description": "List details of all of the accounts or a specific account.",
                "arguments": [
                    {
                        "name": "account_id",
                        "type": "str",
                        "description": "If provided only the balance for this account will be given",
                        "is_required": false
                    },
                    {
                        "name": "wallet_id",
                        "type": "str",
                        "description": "accounts in specific wallet",
                        "is_required": false
                    },
                    {
                        "name": "confirmations",
                        "type": "int",
                        "description": "required confirmations (default: 0)",
                        "is_required": false
                    },
                    {
                        "name": "include_claims",
                        "type": "bool",
                        "description": "include claims, requires than a LBC account is specified (default: false)",
                        "is_required": false
                    },
                    {
                        "name": "show_seed",
                        "type": "bool",
                        "description": "show the seed for the account",
                        "is_required": false
                    },
                    {
                        "name": "page",
                        "type": "int",
                        "description": "page to return during paginating",
                        "is_required": false
                    },
                    {
                        "name": "page_size",
                        "type": "int",
                        "description": "number of items on page during pagination",
                        "is_required": false
                    }
                ],
                "returns": "            {\n                \"page\": \"Page number of the current items.\",\n                \"page_size\": \"Number of items to show on a page.\",\n                \"total_pages\": \"Total number of pages.\",\n                \"total_items\": \"Total number of items.\",\n                \"items\": [\n                    {\n                        \"id\": \"account_id\",\n                        \"is_default\": \"this account is used by default\",\n                        \"ledger\": \"name of crypto currency and network\",\n                        \"name\": \"optional account name\",\n                        \"seed\": \"human friendly words from which account can be recreated\",\n                        \"encrypted\": \"if account is encrypted\",\n                        \"private_key\": \"extended private key\",\n                        \"public_key\": \"extended public key\",\n                        \"address_generator\": \"settings for generating addresses\",\n                        \"modified_on\": \"date of last modification to account settings\"\n                    }\n                ]\n            }",
                "examples": [
                    {
                        "title": "List your accounts",
                        "curl": "curl -d'{\"method\": \"account_list\", \"params\": {\"include_claims\": false, \"show_seed\": false}}' http://localhost:5279/",
                        "lbrynet": "lbrynet account list",
                        "python": "requests.post(\"http://localhost:5279\", json={\"method\": \"account_list\", \"params\": {\"include_claims\": false, \"show_seed\": false}}).json()",
                        "output": "{\n  \"jsonrpc\": \"2.0\",\n  \"result\": {\n    \"items\": [\n      {\n        \"address_generator\": {\n          \"change\": {\n            \"gap\": 6,\n            \"maximum_uses_per_address\": 1\n          },\n          \"name\": \"deterministic-chain\",\n          \"receiving\": {\n            \"gap\": 20,\n            \"maximum_uses_per_address\": 1\n          }\n        },\n        \"certificates\": 0,\n        \"coins\": 10.0,\n        \"encrypted\": false,\n        \"id\": \"mhjFSotvK8b2eJHZw2Tgf8czVLDsG2tLyu\",\n        \"is_default\": true,\n        \"ledger\": \"lbc_regtest\",\n        \"name\": \"Account #mhjFSotvK8b2eJHZw2Tgf8czVLDsG2tLyu\",\n        \"public_key\": \"tpubD6NzVbkrYhZ4Yj1pAFUmbQ8bvpo4d5aQyWUzVPpagEiAddqLjxzdvfzpxEinbB2JRXCLkHJ8kSSz4scPnw3rnQeYLmXEsr9cXkQLV4ZjwUh\",\n        \"satoshis\": 1000000000\n      }\n    ],\n    \"page\": 1,\n    \"page_size\": 20,\n    \"total_items\": 1,\n    \"total_pages\": 1\n  }\n}"
                    }
                ]
            },
            {
                "name": "account_max_address_gap",
                "description": "Finds ranges of consecutive addresses that are unused and returns the length\nof the longest such range: for change and receiving address chains. This is\nuseful to figure out ideal values to set for 'receiving_gap' and 'change_gap'\naccount settings.",
                "arguments": [
                    {
                        "name": "account_id",
                        "type": "str",
                        "description": "account for which to get max gaps",
                        "is_required": true
                    },
                    {
                        "name": "wallet_id",
                        "type": "str",
                        "description": "restrict operation to specific wallet",
                        "is_required": false
                    }
                ],
                "returns": "(map) maximum gap for change and receiving addresses",
                "examples": []
            },
            {
                "name": "account_remove",
                "description": "Remove an existing account.",
                "arguments": [
                    {
                        "name": "account_id",
                        "type": "str",
                        "description": "id of the account to remove",
                        "is_required": true
                    },
                    {
                        "name": "wallet_id",
                        "type": "str",
                        "description": "restrict operation to specific wallet",
                        "is_required": false
                    }
                ],
                "returns": "            {\n                \"id\": \"account_id\",\n                \"is_default\": \"this account is used by default\",\n                \"ledger\": \"name of crypto currency and network\",\n                \"name\": \"optional account name\",\n                \"seed\": \"human friendly words from which account can be recreated\",\n                \"encrypted\": \"if account is encrypted\",\n                \"private_key\": \"extended private key\",\n                \"public_key\": \"extended public key\",\n                \"address_generator\": \"settings for generating addresses\",\n                \"modified_on\": \"date of last modification to account settings\"\n            }",
                "examples": [
                    {
                        "title": "Remove an account",
                        "curl": "curl -d'{\"method\": \"account_remove\", \"params\": {\"account_id\": \"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\"}}' http://localhost:5279/",
                        "lbrynet": "lbrynet account remove mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn",
                        "python": "requests.post(\"http://localhost:5279\", json={\"method\": \"account_remove\", \"params\": {\"account_id\": \"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\"}}).json()",
                        "output": "{\n  \"jsonrpc\": \"2.0\",\n  \"result\": {\n    \"address_generator\": {\n      \"change\": {\n        \"gap\": 6,\n        \"maximum_uses_per_address\": 1\n      },\n      \"name\": \"deterministic-chain\",\n      \"receiving\": {\n        \"gap\": 20,\n        \"maximum_uses_per_address\": 1\n      }\n    },\n    \"encrypted\": false,\n    \"id\": \"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\",\n    \"is_default\": false,\n    \"ledger\": \"lbc_regtest\",\n    \"modified_on\": 1655141657,\n    \"name\": \"generated account\",\n    \"private_key\": \"tprv8ZgxMBicQKsPdmLUTJtRsfwAeL527nfpJE1GhFFLzKtbuuzwYorQyq8guwgzFCQkqs8EuR2MGLkbh3xuEb1pFuAjx1Web8Vk3RXrrLVKwRU\",\n    \"public_key\": \"tpubD6NzVbkrYhZ4XENGLxZ2H5bHDMaxH7risXc3ymHeQbgzkQFiBCg1AKkZ66UqGohv1bXg5579Z3r4omYeqMEd1Khhyuf4dssfmBzfiEce23o\",\n    \"seed\": \"miss ready crop oval canyon such sing powder figure math noodle style\"\n  }\n}"
                    }
                ]
            },
            {
                "name": "account_send",
                "description": "Send the same number of credits to multiple addresses from a specific account (or default account).",
                "arguments": [
                    {
                        "name": "account_id",
                        "type": "str",
                        "description": "account to fund the transaction",
                        "is_required": false
                    },
                    {
                        "name": "wallet_id",
                        "type": "str",
                        "description": "restrict operation to specific wallet",
                        "is_required": false
                    },
                    {
                        "name": "preview",
                        "type": "bool",
                        "description": "do not broadcast the transaction",
                        "is_required": false
                    },
                    {
                        "name": "blocking",
                        "type": "bool",
                        "description": "wait until tx has synced",
                        "is_required": false
                    }
                ],
                "returns": "            {\n                \"txid\": \"hash of transaction in hex\",\n                \"height\": \"block where transaction was recorded\",\n                \"inputs\": [\n                    {\n                        \"txid\": \"hash of transaction in hex\",\n                        \"nout\": \"position in the transaction\",\n                        \"height\": \"block where transaction was recorded\",\n                        \"amount\": \"value of the txo as a decimal\",\n                        \"address\": \"address of who can spend the txo\",\n                        \"confirmations\": \"number of confirmed blocks\",\n                        \"is_change\": \"payment to change address, only available when it can be determined\",\n                        \"is_received\": \"true if txo was sent from external account to this account\",\n                        \"is_spent\": \"true if txo is spent\",\n                        \"is_mine\": \"payment to one of your accounts, only available when it can be determined\",\n                        \"type\": \"one of 'claim', 'support' or 'purchase'\",\n                        \"name\": \"when type is 'claim' or 'support', this is the claim name\",\n                        \"claim_id\": \"when type is 'claim', 'support' or 'purchase', this is the claim id\",\n                        \"claim_op\": \"when type is 'claim', this determines if it is 'create' or 'update'\",\n                        \"value\": \"when type is 'claim' or 'support' with payload, this is the decoded protobuf payload\",\n                        \"value_type\": \"determines the type of the 'value' field: 'channel', 'stream', etc\",\n                        \"protobuf\": \"hex encoded raw protobuf version of 'value' field\",\n                        \"permanent_url\": \"when type is 'claim' or 'support', this is the long permanent claim URL\",\n                        \"claim\": \"for purchase outputs only, metadata of purchased claim\",\n                        \"reposted_claim\": \"for repost claims only, metadata of claim being reposted\",\n                        \"signing_channel\": \"for signed claims only, metadata of signing channel\",\n                        \"is_channel_signature_valid\": \"for signed claims only, whether signature is valid\",\n                        \"purchase_receipt\": \"metadata for the purchase transaction associated with this claim\"\n                    }\n                ],\n                \"outputs\": [\n                    {\n                        \"txid\": \"hash of transaction in hex\",\n                        \"nout\": \"position in the transaction\",\n                        \"height\": \"block where transaction was recorded\",\n                        \"amount\": \"value of the txo as a decimal\",\n                        \"address\": \"address of who can spend the txo\",\n                        \"confirmations\": \"number of confirmed blocks\",\n                        \"is_change\": \"payment to change address, only available when it can be determined\",\n                        \"is_received\": \"true if txo was sent from external account to this account\",\n                        \"is_spent\": \"true if txo is spent\",\n                        \"is_mine\": \"payment to one of your accounts, only available when it can be determined\",\n                        \"type\": \"one of 'claim', 'support' or 'purchase'\",\n                        \"name\": \"when type is 'claim' or 'support', this is the claim name\",\n                        \"claim_id\": \"when type is 'claim', 'support' or 'purchase', this is the claim id\",\n                        \"claim_op\": \"when type is 'claim', this determines if it is 'create' or 'update'\",\n                        \"value\": \"when type is 'claim' or 'support' with payload, this is the decoded protobuf payload\",\n                        \"value_type\": \"determines the type of the 'value' field: 'channel', 'stream', etc\",\n                        \"protobuf\": \"hex encoded raw protobuf version of 'value' field\",\n                        \"permanent_url\": \"when type is 'claim' or 'support', this is the long permanent claim URL\",\n                        \"claim\": \"for purchase outputs only, metadata of purchased claim\",\n                        \"reposted_claim\": \"for repost claims only, metadata of claim being reposted\",\n                        \"signing_channel\": \"for signed claims only, metadata of signing channel\",\n                        \"is_channel_signature_valid\": \"for signed claims only, whether signature is valid\",\n                        \"purchase_receipt\": \"metadata for the purchase transaction associated with this claim\"\n                    }\n                ],\n                \"total_input\": \"sum of inputs as a decimal\",\n                \"total_output\": \"sum of outputs, sans fee, as a decimal\",\n                \"total_fee\": \"fee amount\",\n                \"hex\": \"entire transaction encoded in hex\"\n            }",
                "examples": []
            },
            {
                "name": "account_set",
                "description": "Change various settings on an account.",
                "arguments": [
                    {
                        "name": "account_id",
                        "type": "str",
                        "description": "id of the account to change",
                        "is_required": true
                    },
                    {
                        "name": "wallet_id",
                        "type": "str",
                        "description": "restrict operation to specific wallet",
                        "is_required": false
                    },
                    {
                        "name": "default",
                        "type": "bool",
                        "description": "make this account the default",
                        "is_required": false
                    },
                    {
                        "name": "new_name",
                        "type": "str",
                        "description": "new name for the account",
                        "is_required": false
                    },
                    {
                        "name": "receiving_gap",
                        "type": "int",
                        "description": "set the gap for receiving addresses",
                        "is_required": false
                    },
                    {
                        "name": "receiving_max_uses",
                        "type": "int",
                        "description": "set the maximum number of times to use a receiving address",
                        "is_required": false
                    },
                    {
                        "name": "change_gap",
                        "type": "int",
                        "description": "set the gap for change addresses",
                        "is_required": false
                    },
                    {
                        "name": "change_max_uses",
                        "type": "int",
                        "description": "set the maximum number of times to use a change address",
                        "is_required": false
                    }
                ],
                "returns": "            {\n                \"id\": \"account_id\",\n                \"is_default\": \"this account is used by default\",\n                \"ledger\": \"name of crypto currency and network\",\n                \"name\": \"optional account name\",\n                \"seed\": \"human friendly words from which account can be recreated\",\n                \"encrypted\": \"if account is encrypted\",\n                \"private_key\": \"extended private key\",\n                \"public_key\": \"extended public key\",\n                \"address_generator\": \"settings for generating addresses\",\n                \"modified_on\": \"date of last modification to account settings\"\n            }",
                "examples": [
                    {
                        "title": "Modify maximum number of times a change address can be reused",
                        "curl": "curl -d'{\"method\": \"account_set\", \"params\": {\"account_id\": \"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\", \"default\": false, \"change_max_uses\": 10}}' http://localhost:5279/",
                        "lbrynet": "lbrynet account set mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn --change_max_uses=10",
                        "python": "requests.post(\"http://localhost:5279\", json={\"method\": \"account_set\", \"params\": {\"account_id\": \"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\", \"default\": false, \"change_max_uses\": 10}}).json()",
                        "output": "{\n  \"jsonrpc\": \"2.0\",\n  \"result\": {\n    \"address_generator\": {\n      \"change\": {\n        \"gap\": 6,\n        \"maximum_uses_per_address\": 10\n      },\n      \"name\": \"deterministic-chain\",\n      \"receiving\": {\n        \"gap\": 20,\n        \"maximum_uses_per_address\": 1\n      }\n    },\n    \"encrypted\": false,\n    \"id\": \"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\",\n    \"is_default\": false,\n    \"ledger\": \"lbc_regtest\",\n    \"modified_on\": 1655141657,\n    \"name\": \"new account\",\n    \"private_key\": \"tprv8ZgxMBicQKsPdmLUTJtRsfwAeL527nfpJE1GhFFLzKtbuuzwYorQyq8guwgzFCQkqs8EuR2MGLkbh3xuEb1pFuAjx1Web8Vk3RXrrLVKwRU\",\n    \"public_key\": \"tpubD6NzVbkrYhZ4XENGLxZ2H5bHDMaxH7risXc3ymHeQbgzkQFiBCg1AKkZ66UqGohv1bXg5579Z3r4omYeqMEd1Khhyuf4dssfmBzfiEce23o\",\n    \"seed\": \"miss ready crop oval canyon such sing powder figure math noodle style\"\n  }\n}"
                    }
                ]
            }
        ]
    },
    "address": {
        "doc": "List, generate and verify addresses.",
        "commands": [
            {
                "name": "address_is_mine",
                "description": "Checks if an address is associated with the current wallet.",
                "arguments": [
                    {
                        "name": "address",
                        "type": "str",
                        "description": "address to check",
                        "is_required": true
                    },
                    {
                        "name": "account_id",
                        "type": "str",
                        "description": "id of the account to use",
                        "is_required": false
                    },
                    {
                        "name": "wallet_id",
                        "type": "str",
                        "description": "restrict operation to specific wallet",
                        "is_required": false
                    }
                ],
                "returns": "(bool) true, if address is associated with current wallet",
                "examples": [
                    {
                        "title": "Check if address is mine",
                        "curl": "curl -d'{\"method\": \"address_is_mine\", \"params\": {\"address\": \"muRaaMs12imkZJQofvBuLbAFYAs6TiQPAQ\"}}' http://localhost:5279/",
                        "lbrynet": "lbrynet address is_mine muRaaMs12imkZJQofvBuLbAFYAs6TiQPAQ",
                        "python": "requests.post(\"http://localhost:5279\", json={\"method\": \"address_is_mine\", \"params\": {\"address\": \"muRaaMs12imkZJQofvBuLbAFYAs6TiQPAQ\"}}).json()",
                        "output": "{\n  \"jsonrpc\": \"2.0\",\n  \"result\": true\n}"
                    }
                ]
            },
            {
                "name": "address_list",
                "description": "List account addresses or details of single address.",
                "arguments": [
                    {
                        "name": "address",
                        "type": "str",
                        "description": "just show details for single address",
                        "is_required": false
                    },
                    {
                        "name": "account_id",
                        "type": "str",
                        "description": "id of the account to use",
                        "is_required": false
                    },
                    {
                        "name": "wallet_id",
                        "type": "str",
                        "description": "restrict operation to specific wallet",
                        "is_required": false
                    },
                    {
                        "name": "page",
                        "type": "int",
                        "description": "page to return during paginating",
                        "is_required": false
                    },
                    {
                        "name": "page_size",
                        "type": "int",
                        "description": "number of items on page during pagination",
                        "is_required": false
                    }
                ],
                "returns": "            {\n                \"page\": \"Page number of the current items.\",\n                \"page_size\": \"Number of items to show on a page.\",\n                \"total_pages\": \"Total number of pages.\",\n                \"total_items\": \"Total number of items.\",\n                \"items\": [\n                    \"an address in base58\"\n                ]\n            }",
                "examples": [
                    {
                        "title": "List addresses in default account",
                        "curl": "curl -d'{\"method\": \"address_list\", \"params\": {}}' http://localhost:5279/",
                        "lbrynet": "lbrynet address list",
                        "python": "requests.post(\"http://localhost:5279\", json={\"method\": \"address_list\", \"params\": {}}).json()",
                        "output": "{\n  \"jsonrpc\": \"2.0\",\n  \"result\": {\n    \"items\": [\n      {\n        \"account\": \"mhjFSotvK8b2eJHZw2Tgf8czVLDsG2tLyu\",\n        \"address\": \"mhSwvz7Qfuh343S8WrXpPoPcaxbtw7QM5W\",\n        \"pubkey\": \"tpubDA9GDAntyJu4NnUS2eNJcNYev2VpQi2g9SJZHw9jwfJLVkCvDqtTNJCxS2c25i4BbBZwGZWFBHgAbrQ77qzN2vAiqxwj2w7rTEsxFHv1oKV\",\n        \"used_times\": 0\n      },\n      {\n        \"account\": \"mhjFSotvK8b2eJHZw2Tgf8czVLDsG2tLyu\",\n        \"address\": \"mhaZrhgfvGv49E47oDupq8wBppSNfhMFam\",\n        \"pubkey\": \"tpubDA9GDAntyJu4H7sF54p2y2XUQKZecnakxWYJpSzRAnKgMxNip8xJVz7piyaZUwivQvz4RxbGpyn8NQPHqJmHsGDfkwXeHFsgJAHWP6Sqpxq\",\n        \"used_times\": 0\n      },\n      {\n        \"account\": \"mhjFSotvK8b2eJHZw2Tgf8czVLDsG2tLyu\",\n        \"address\": \"miK8WKVbTb25PHkuzGtgjMkUrmrWZe4d7U\",\n        \"pubkey\": \"tpubDA9GDAntyJu4Vt4X61z35Cr2HxGTr4PDUpmX5abtbGQ2Zs5EJJ3kAwwhdyCC1EGx4NqiErEXzictM4SxnfQng7jEhiKofkQHkgysqQb6VyQ\",\n        \"used_times\": 0\n      },\n      {\n        \"account\": \"mhjFSotvK8b2eJHZw2Tgf8czVLDsG2tLyu\",\n        \"address\": \"miihJtUK4WKc6u3gxirkNmKTbPBvFUxt81\",\n        \"pubkey\": \"tpubDA9GDAntyJu4JbNXGCuV83JHncjaq7VvaxuGBNNEuMRdk8aXKLQ7xNPncmrtzS5kjKqWQhW79YCve3EfUAvE6dsVn9DQXdWjq9KZQcn1cZs\",\n        \"used_times\": 0\n      },\n      {\n        \"account\": \"mhjFSotvK8b2eJHZw2Tgf8czVLDsG2tLyu\",\n        \"address\": \"mm6gzeSV7hiGxtAv3rQjo3sRYtCDGD4t2M\",\n        \"pubkey\": \"tpubDA9GDAntyJu4K82qyamAJ31vsRiLmGAGQAvvjMWbyHf5yJFDQt8sVpGCftFYMmhME5bRYSXzogRbJkthKhHLsgxJURfNofnNiJbNKDiNQLk\",\n        \"used_times\": 0\n      },\n      {\n        \"account\": \"mhjFSotvK8b2eJHZw2Tgf8czVLDsG2tLyu\",\n        \"address\": \"mnHsWiDjPYw27jPzMfqUFM9scdsgHQ6NJg\",\n        \"pubkey\": \"tpubDA9GDAntyJu4mwA4W8hg3Wsf5PH3YWgbcoB4dr3Cf77KELoQeD8WfN4avxprcKKd2E4ivZGTJ45ntCimLTrQibBcanGxudpvqCiDfvCocM1\",\n        \"used_times\": 0\n      },\n      {\n        \"account\": \"mhjFSotvK8b2eJHZw2Tgf8czVLDsG2tLyu\",\n        \"address\": \"mp2RdZPTyBs9WrtPodcrSf9rTBSRKCTBqR\",\n        \"pubkey\": \"tpubDA9GDAntyJu4ftNy5YcBuVWmiCNsjsEtZHDi45Q3TKDqgaRsQTMCq1STgCV3KhcM3VWANdk2gPaSmF4Acf39WGgcwRjsbfYgCPUDGfkn5cQ\",\n        \"used_times\": 0\n      },\n      {\n        \"account\": \"mhjFSotvK8b2eJHZw2Tgf8czVLDsG2tLyu\",\n        \"address\": \"mpKoa7UDF5mD7bupzZpdnyXxo13vPHAPAj\",\n        \"pubkey\": \"tpubDA9GDAntyJu4ygvkf9qDcakZPBDGQzqZ3qkQLWT7odrTx3sEKwMU8S5YRs1siZVLGEGBkya6oMPKB4DDJ8idy78mMujvCJ9xg8MbRDn2zFk\",\n        \"used_times\": 0\n      },\n      {\n        \"account\": \"mhjFSotvK8b2eJHZw2Tgf8czVLDsG2tLyu\",\n        \"address\": \"mqaQqa8sxKjoPtSiacuKZX61v2TASZiK7e\",\n        \"pubkey\": \"tpubDA9GDAntyJu56YFCUSaYZTbzDQmLUtpKMhxLFP3BgnRa7QUEQnbZVEYUBSQ8yiMbUhA83Pt72b18NnyWE7EvFP7Nf2gY1ZDq9xTBM9cRcar\",\n        \"used_times\": 0\n      },\n      {\n        \"account\": \"mhjFSotvK8b2eJHZw2Tgf8czVLDsG2tLyu\",\n        \"address\": \"mqdwaA91Fe888P29tm8XqDbutdq4jfmKzV\",\n        \"pubkey\": \"tpubDA9GDAntyJu4tKNwyo8vLQ2KTvSTteofqjM4YDEgUxUd1n4o5iBme1QcYF799H7Svi1MiUkQsgsehfEoELY9zY5me6JuALY7fcDTdpL4Kks\",\n        \"used_times\": 0\n      },\n      {\n        \"account\": \"mhjFSotvK8b2eJHZw2Tgf8czVLDsG2tLyu\",\n        \"address\": \"mqwYxGxBhfFodPpkCDGXK3eiSHpfRPi6SD\",\n        \"pubkey\": \"tpubDA9GDAntyJu4EExRfNAiaX8BF4aMZodvmbW6fyohsh2KrJtEpsA3RYGpHadnFW2XNQ3AM8rMnrF8XzDett9gYAqcwgX5NfB7aGwZUzFnY7G\",\n        \"used_times\": 1\n      },\n      {\n        \"account\": \"mhjFSotvK8b2eJHZw2Tgf8czVLDsG2tLyu\",\n        \"address\": \"ms5HaDddaUyAAMczcdCbYuTFkuBdAgQxeY\",\n        \"pubkey\": \"tpubDA9GDAntyJu4djXrpu7QzDQyq3L9vYpePKx7oxhBnhb9iogFm5yhr35v6hY6F2nbTC1cNtNPMj9mdCGAzgRAPcp314RMpdu1vdZ8HbKGzsg\",\n        \"used_times\": 0\n      },\n      {\n        \"account\": \"mhjFSotvK8b2eJHZw2Tgf8czVLDsG2tLyu\",\n        \"address\": \"mtq45ABFdcEBnuG8VjRfyhRW35rzWZa7U9\",\n        \"pubkey\": \"tpubDA9GDAntyJu4cfSnoTMmBNQG7PS9nYkWih6c9DdVQ4BsdcYh77xvCqRnYfxUSzEepHt3CbRVQjknCpX3e7di9UdvZB2eUHDrp33EeudNqGW\",\n        \"used_times\": 0\n      },\n      {\n        \"account\": \"mhjFSotvK8b2eJHZw2Tgf8czVLDsG2tLyu\",\n        \"address\": \"mtvRgoqoAZdrqrsTdGYmqKzByKuerqgupK\",\n        \"pubkey\": \"tpubDA9GDAntyJu52jLmREuYqCNJmX1uzsAxWsYME8PoUK4wG9KrdDrNRdGwmSwB7XZewgBJ9wu31TeL1cWMwegUc5QzF6xtGcPhPXsuSBtu1DE\",\n        \"used_times\": 0\n      },\n      {\n        \"account\": \"mhjFSotvK8b2eJHZw2Tgf8czVLDsG2tLyu\",\n        \"address\": \"mtwm7SVcxtxXHgkxwLfrPodkuo14wKgNrz\",\n        \"pubkey\": \"tpubDA9GDAntyJu4YkkdNxGKiUABfQ1phUrbuQaVS7u7bE7xjKEMMfJ9ga1pb3kijvY6v7TuV9nTDCkng1XJcgBda3btMCh3Fwt9ngGwHRDXm2Z\",\n        \"used_times\": 0\n      },\n      {\n        \"account\": \"mhjFSotvK8b2eJHZw2Tgf8czVLDsG2tLyu\",\n        \"address\": \"muRaaMs12imkZJQofvBuLbAFYAs6TiQPAQ\",\n        \"pubkey\": \"tpubDA9GDAntyJu4MyJWHNPKXbWDmkmg1VVMSxumiRmBHQfQKqfr7BGiHRrP4pHXexmorYAXjHkzB4naVB8qp6Cr5JZBuBoD9QGWYmAM9NcQZqP\",\n        \"used_times\": 0\n      },\n      {\n        \"account\": \"mhjFSotvK8b2eJHZw2Tgf8czVLDsG2tLyu\",\n        \"address\": \"mur916Vn2bk7ASmHqtVs294wgU6KeHVxmq\",\n        \"pubkey\": \"tpubDA9GDAntyJu4Eixz66KLYzFsprgwbQ1CsTEZjy48cRRHt4Md4mfgJ8ps8h8sp8dg35rD3GD5WuUes9GB5ceVKJehHsZUCtcUxDbExrozfN1\",\n        \"used_times\": 0\n      },\n      {\n        \"account\": \"mhjFSotvK8b2eJHZw2Tgf8czVLDsG2tLyu\",\n        \"address\": \"mv4KFMYgTdH3c2etDRvyybzKAxfCk3rHi5\",\n        \"pubkey\": \"tpubDA9GDAntyJu4UuzqvQhgnXkPz2wJNL7zUWZLE7HYP7woQ62wuJnBNt6QLGw2Gc1WRJZ3sa558CsedMJEaFuMa6zUaVmoQysF6WwwT7yuhaF\",\n        \"used_times\": 0\n      },\n      {\n        \"account\": \"mhjFSotvK8b2eJHZw2Tgf8czVLDsG2tLyu\",\n        \"address\": \"mvJRJRn2ZvdLwLsKuAyenCpBkY9QxbegGF\",\n        \"pubkey\": \"tpubDA9GDAntyJu4qkyiyr8CRDo12dohq2BcBCY8M7qRELp6xXJncbhjdx4eMZNhSfHd5SWa2qYm4Aupot866XqZ9G2UznaN5PtWF1faNKqBxT4\",\n        \"used_times\": 0\n      },\n      {\n        \"account\": \"mhjFSotvK8b2eJHZw2Tgf8czVLDsG2tLyu\",\n        \"address\": \"mwSmsEyeJE7CxzLvwoGqoHLWmd4r7nQeeJ\",\n        \"pubkey\": \"tpubDA9GDAntyJu4S7YgeBYbzaaCUPadcuhYmgR2Ugrj7yuvkfpGt1qRYkA9uQE8ekfkN2cSU7ywTqRSXmYVm4DBxQM5PbfLE1FGh7vrfyTDZDv\",\n        \"used_times\": 0\n      }\n    ],\n    \"page\": 1,\n    \"page_size\": 20,\n    \"total_items\": 53,\n    \"total_pages\": 3\n  }\n}"
                    },
                    {
                        "title": "List addresses in specified account",
                        "curl": "curl -d'{\"method\": \"address_list\", \"params\": {\"account_id\": \"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\"}}' http://localhost:5279/",
                        "lbrynet": "lbrynet address list --account_id=\"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\"",
                        "python": "requests.post(\"http://localhost:5279\", json={\"method\": \"address_list\", \"params\": {\"account_id\": \"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\"}}).json()",
                        "output": "{\n  \"jsonrpc\": \"2.0\",\n  \"result\": {\n    \"items\": [\n      {\n        \"account\": \"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\",\n        \"address\": \"mgPgMEPSvErRFvVihFmUrSD6W84u4TA7Hv\",\n        \"pubkey\": \"tpubDA9GDAntyJu4VrQXCBni5u3bPJu4qHp6SPKn4eanRKvXfRgQSXHPTT5fW74hcEG68sg2eUPpA1HZeqEQaHJgNZFBuDi6pGenPASE9rwpPkt\",\n        \"used_times\": 0\n      },\n      {\n        \"account\": \"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\",\n        \"address\": \"mgr1So3484shNr8kNMsavaohFwwRm9AnFU\",\n        \"pubkey\": \"tpubDA9GDAntyJu4GoY24GN59DWm4A3uux8Gv71kD1fw85Nt7o4ZtdACNjM5ZE2gSN1GYrGYXoz8mzXoQRbPUQs4JTqARTSt5Faco4HM41rJTgf\",\n        \"used_times\": 0\n      },\n      {\n        \"account\": \"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\",\n        \"address\": \"mguUfyvvbYuEWiXxKWCWp8dsvphC374QKC\",\n        \"pubkey\": \"tpubDA9GDAntyJu4MQvij6HQg6Wc2Q2uWj7CAVoMnqsueh118giBDp2TYv1fXdgV2tPPvmXtwDqf99RNrcSn5YXXcELhd9msNEPw9hLPucG6CpE\",\n        \"used_times\": 0\n      },\n      {\n        \"account\": \"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\",\n        \"address\": \"mhBjCUYvnJw7pLYyfyG3xzDohfJmwMjntM\",\n        \"pubkey\": \"tpubDA9GDAntyJu4Jgaa9TzJ652wFyuLwBgMgaDKNFbMGhu7oNTpkuuB36ALmtRvtFCkozkSrZogj4dcuW246R9m3Nsm2d69oacBzbeiuyPCtQt\",\n        \"used_times\": 0\n      },\n      {\n        \"account\": \"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\",\n        \"address\": \"mhfBgZWfPDF7wD6h97admwDYdaNs1SXafX\",\n        \"pubkey\": \"tpubDA9GDAntyJu4zZ1UjFJcgC2zx8okqHedbh1scNYtEThVR53SJKr32oGq2LjUoz35Q7gBqQRcv67JiLVjtes5jpuQbjiaEio9iUmHDyQQCfK\",\n        \"used_times\": 0\n      },\n      {\n        \"account\": \"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\",\n        \"address\": \"mi2aTSX87vtAg1QJoW6sP61cByjWgmv9sf\",\n        \"pubkey\": \"tpubDA9GDAntyJu4MqkRoL5tDyCk12Mah17UjSYoev1pGqe9M5ZsbdmNDpDCpadXX3sgSKfarF7EDoitqnr5ixCvr6ReAF6wdaKMKJnsrVdeNL4\",\n        \"used_times\": 0\n      },\n      {\n        \"account\": \"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\",\n        \"address\": \"mjPQuMg9VLMfJBRMTLkK5tc1F4v83EZuSG\",\n        \"pubkey\": \"tpubDA9GDAntyJu4REycnhURTm9svTtCshEKdSKfA2hdmDWaM4Nh13NbppVuQ37G5rPQ26B5rfEw8fMQk3hPGnZ62bCB2Qq7b7wXLnnGqqFTNcT\",\n        \"used_times\": 0\n      },\n      {\n        \"account\": \"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\",\n        \"address\": \"mjwhcGupeMHK5vPM3SftKjyPycFbFLYw9E\",\n        \"pubkey\": \"tpubDA9GDAntyJu4oKFXbsX3iGqRfBiVZqQKinVB28dzjTYJWwP4bEURX6ogBUhvXwUqTDXX84v1Z6gBeoKQxTs3XKt55fk72NHf1VyRYmWco44\",\n        \"used_times\": 0\n      },\n      {\n        \"account\": \"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\",\n        \"address\": \"mm29WyoMPQPJq7QVJGjtbxTvmPW1jL4KbF\",\n        \"pubkey\": \"tpubDA9GDAntyJu4etnuFGKHEnL5VnoeExkX3o1KxcFyQQGYgRRSmKSYGGQcZjwH4GSpjnLSVhguac3aBRQYqB1C3c2GcD63EeWo4JtMZhExRpe\",\n        \"used_times\": 0\n      },\n      {\n        \"account\": \"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\",\n        \"address\": \"mm6ju92EAUoX3Kx8yKMRDvV1Yw8fnMCbwJ\",\n        \"pubkey\": \"tpubDA9GDAntyJu4NNzPx3B2mGLM3eqA8ocs77UZeA15ny7XLE3gCJoYCFpF8i6UU5UQc2qDZVwnhmwyUpriaaTCTNWBqZVpKbaCEjKFfvaJuog\",\n        \"used_times\": 0\n      },\n      {\n        \"account\": \"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\",\n        \"address\": \"mnBXVNxS4Xs8xg3AzrQbfcjtBSmivXoh4n\",\n        \"pubkey\": \"tpubDA9GDAntyJu4TV1sWBpVyD9DWnsH4m6vLKsv7ZurM71veSumgBymKN7BGT7DqCd2udCpDEaeRLX2A9XfD8h84yaJTpCvBiQs9gnQDXKNgi1\",\n        \"used_times\": 0\n      },\n      {\n        \"account\": \"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\",\n        \"address\": \"mpPkZYKWvde2ycPeBwCPW4n1ZC4Z9dti8f\",\n        \"pubkey\": \"tpubDA9GDAntyJu4F6uszUizCBJBZLn78LwFFXQkcJ6PpqBouLU2iFKVwZ4GPY6r4QvYjrvJ8UPJ8hyemLcxecveUmFeEJmH27ZBC3xkabgfaPn\",\n        \"used_times\": 0\n      },\n      {\n        \"account\": \"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\",\n        \"address\": \"mpURY7Y9WPTf4yStztmtdiqnJEip3rzKdz\",\n        \"pubkey\": \"tpubDA9GDAntyJu522u6TeHwazDETcpokjNqmmoJkdVDzqrYp6HGDo5RQAWpgBFAM18D9dfrqdoT3SXYShDneC8RLqZySidcuFfh85LaAtTXHaq\",\n        \"used_times\": 0\n      },\n      {\n        \"account\": \"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\",\n        \"address\": \"mpaJaBdSVWmhvAx5M1DaHt5zZTbXhFiiLE\",\n        \"pubkey\": \"tpubDA9GDAntyJu4sqMt3KuJpS1jL77fsZq2on7goPwczD4kTRCZHaMSFdggg7NsrrJgRUnyPq2t4WmW9EEbf9j5hTbW8ZVQK5hvkxxnWkQW9zY\",\n        \"used_times\": 0\n      },\n      {\n        \"account\": \"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\",\n        \"address\": \"mszRRxz2VQZKsAKthY9heSB5xwdakZ6gkw\",\n        \"pubkey\": \"tpubDA9GDAntyJu4xMmBekaRLedHLNdx6ksxZajRv7imPf5XFpciQKXDRPCv5rJ9oUDWX2oGp8JccjG4p3TY66wVhxXd77sDD3qDGjnMWJ9ZyFs\",\n        \"used_times\": 0\n      },\n      {\n        \"account\": \"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\",\n        \"address\": \"mu6r6EMyp6nnwmydoFDaokhsaKndxxW4HY\",\n        \"pubkey\": \"tpubDA9GDAntyJu4LXiLsMzUnVbqkRZv2aVv83v3PrhKatPww5wMr1H6t2bGSNBxTaTbr2Bhf1Ppm8AiE6jnQemf4rrYv5Fz6XujqBQADAm1k74\",\n        \"used_times\": 0\n      },\n      {\n        \"account\": \"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\",\n        \"address\": \"mykwrnckz6sZ2KEe5Wpagt7SjPJdXF6m2V\",\n        \"pubkey\": \"tpubDA9GDAntyJu4FiP8EBnyFjKgM7BzYai8Q5HZSr2Z4SRy3j2Zs47ivz1KvNZKDqF33Ljs3mrBUFgKycnqKHNY3AKe3WKZj8kyEAuBZNuPtvH\",\n        \"used_times\": 0\n      },\n      {\n        \"account\": \"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\",\n        \"address\": \"myqynCQQm83z7bjz1rJpFzv8aZxheNoosq\",\n        \"pubkey\": \"tpubDA9GDAntyJu4YzqpSUC4UfUEEgWMowZmbpJRhRFS6WyLnN1hADYUty5dWxnUg6NccpNmQFL9kBWnoBiLEMoJuSdjbNZwr3tA8LZgh5byreV\",\n        \"used_times\": 0\n      },\n      {\n        \"account\": \"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\",\n        \"address\": \"mzSzaNd9c3QoGiXESZcxv9vmwP2V7ujZJg\",\n        \"pubkey\": \"tpubDA9GDAntyJu4iUzB1QVZ9ckBNHsM1WTHubjkDHpvCmeJYXvMdw6WABx9uJWQ8nFpEz8gd6sWDxSkkh9wbTTx4QH1XaNN4KSxtqxB3BQcM9V\",\n        \"used_times\": 0\n      },\n      {\n        \"account\": \"mqVK8Df2cBxZgUnxGXXd8JhTm1LHvPofdn\",\n        \"address\": \"mzjHGbQvE5orzqRjmJxsbKN7jedNGmv4QD\",\n        \"pubkey\": \"tpubDA9GDAntyJu4SzcUV91pjutvrUw1m5gRyzDC5BZbhgzMCZ5tCcMPuH9Ej3BoHv4RdVB1U4LbahzGTUdVZFSHqPng2eg9PLVbde4w8J17nGW\",\n        \"used_times\": 0\n      }\n    ],\n    \"page\": 1,\n    \"page_size\": 20,\n    \"total_items\": 26,\n    \"total_pages\": 2\n  }\n}"
                    }
                ]
            },
            {
                "name": "address_unused",
                "description": "Return an address containing no balance, will create\na new address if there is none.",
                "arguments": [
                    {
                        "name": "account_id",
                        "type": "str",
                        "description": "id of the account to use",
                        "is_required": false
                    },
                    {
                        "name": "wallet_id",
                        "type": "str",
                        "description": "restrict operation to specific wallet",
                        "is_required": false
                    }
                ],
                "returns": "            \"an address in base58\"",
                "examples": [
                    {
                        "title": "Get an unused address",
                        "curl": "curl -d'{\"method\": \"address_unused\", \"params\": {}}' http://localhost:5279/",
                        "lbrynet": "lbrynet address unused",
                        "python": "requests.post(\"http://localhost:5279\", json={\"method\": \"address_unused\", \"params\": {}}).json()",
                        "output": "{\n  \"jsonrpc\": \"2.0\",\n  \"result\": \"muRaaMs12imkZJQofvBuLbAFYAs6TiQPAQ\"\n}"
                    }
                ]
            }
        ]
    },
    "blob": {
        "doc": "Blob management.",
        "commands": [
            {
                "name": "blob_announce",
                "description": "Announce blobs to the DHT",
                "arguments": [
                    {
                        "name": "blob_hash",
                        "type": "str",
                        "description": "announce a blob, specified by blob_hash",
                        "is_required": false
                    },
                    {
                        "name": "stream_hash",
                        "type": "str",
                        "description": "announce all blobs associated with stream_hash",
                        "is_required": false
                    },
                    {
                        "name": "sd_hash",
                        "type": "str",
                        "description": "announce all blobs associated with sd_hash and the sd_hash itself",
                        "is_required": false
                    }
                ],
                "returns": "(bool) true if successful",
                "examples": []
            },
            {
                "name": "blob_clean",
                "description": "Deletes blobs to cleanup disk space",
                "arguments": [],
                "returns": "(bool) true if successful",
                "examples": []
            },
            {
                "name": "blob_delete",
                "description": "Delete a blob",
                "arguments": [
                    {
                        "name": "blob_hash",
                        "type": "str",
                        "description": "blob hash of the blob to delete",
                        "is_required": true
                    }
                ],
                "returns": "(str) Success/fail message",
                "examples": [
                    {
                        "title": "Delete a blob",
                        "curl": "curl -d'{\"method\": \"blob_delete\", \"params\": {\"blob_hash\": \"d221fe243afed69b84e6cbc32448260a187449c5123bfa89d33af05af2c8f195a7bbac2bfe02d4a2ba472af217af3996\"}}' http://localhost:5279/",
                        "lbrynet": "lbrynet blob delete d221fe243afed69b84e6cbc32448260a187449c5123bfa89d33af05af2c8f195a7bbac2bfe02d4a2ba472af217af3996",
                        "python": "requests.post(\"http://localhost:5279\", json={\"method\": \"blob_delete\", \"params\": {\"blob_hash\": \"d221fe243afed69b84e6cbc32448260a187449c5123bfa89d33af05af2c8f195a7bbac2bfe02d4a2ba472af217af3996\"}}).json()",
                        "output": "{\n  \"jsonrpc\": \"2.0\",\n  \"result\": \"Deleted d221fe243afed69b84e6cbc32448260a187449c5123bfa89d33af05af2c8f195a7bbac2bfe02d4a2ba472af217af3996\"\n}"
                    }
                ]
            },
            {
                "name": "blob_get",
                "description": "Download and return a blob",
                "arguments": [
                    {
                        "name": "blob_hash",
                        "type": "str",
                        "description": "blob hash of the blob to get",
                        "is_required": true
                    },
                    {
                        "name": "timeout",
                        "type": "int",
                        "description": "timeout in number of seconds",
                        "is_required": false
                    }
                ],
                "returns": "(str) Success/Fail message or (dict) decoded data",
                "examples": []
            },
            {
                "name": "blob_list",
                "description": "Returns blob hashes. If not given filters, returns all blobs known by the blob manager",
                "arguments": [
                    {
                        "name": "needed",
                        "type": "bool",
                        "description": "only return needed blobs",
                        "is_required": false
                    },
                    {
                        "name": "finished",
                        "type": "bool",
                        "description": "only return finished blobs",
                        "is_required": false
                    },
                    {
                        "name": "uri",
                        "type": "str",
                        "description": "filter blobs by stream in a uri",
                        "is_required": false
                    },
                    {
                        "name": "stream_hash",
                        "type": "str",
                        "description": "filter blobs by stream hash",
                        "is_required": false
                    },
                    {
                        "name": "sd_hash",
                        "type": "str",
                        "description": "filter blobs in a stream by sd hash, ie the hash of the stream descriptor blob for a stream that has been downloaded",
                        "is_required": false
                    },
                    {
                        "name": "page",
                        "type": "int",
                        "description": "page to return during paginating",
                        "is_required": false
                    },
                    {
                        "name": "page_size",
                        "type": "int",
                        "description": "number of items on page during pagination",
                        "is_required": false
                    }
                ],
                "returns": "(list) List of blob hashes",
                "examples": [
                    {
                        "title": "List your local blobs",
                        "curl": "curl -d'{\"method\": \"blob_list\", \"params\": {\"needed\": false, \"finished\": false}}' http://localhost:5279/",
                        "lbrynet": "lbrynet blob list",
                        "python": "requests.post(\"http://localhost:5279\", json={\"method\": \"blob_list\", \"params\": {\"needed\": false, \"finished\": false}}).json()",
                        "output": "{\n  \"jsonrpc\": \"2.0\",\n  \"result\": {\n    \"items\": [\n      \"d221fe243afed69b84e6cbc32448260a187449c5123bfa89d33af05af2c8f195a7bbac2bfe02d4a2ba472af217af3996\",\n      \"3413d65026fcabc798f477a457e205e96b3ac921176df62f79a9d90b9c5bed665bb3ad849c8b472c27d13cfbc6440e9f\",\n      \"9ddea316b511d9f720b1f67f5958cac381fdac5d1d3beabc754b9a1220a891024e983241e2fc7549f0f89ea0636c6c83\",\n      \"536763bbb86446ef57a8a45493b12503ea4c74d865692343ff60c3b40431b5a8624341ae1e48aaf601057071cb25b7c3\"\n    ],\n    \"page\": 1,\n    \"page_size\": 20,\n    \"total_items\": 4,\n    \"total_pages\": 1\n  }\n}"
                    }
                ]
            },
            {
                "name": "blob_reflect",
                "description": "Reflects specified blobs",
                "arguments": [
                    {
                        "name": "reflector_server",
                        "type": "str",
                        "description": "reflector address",
                        "is_required": false
                    }
                ],
                "returns": "(list) reflected blob hashes",
                "examples": []
            },
            {
                "name": "blob_reflect_all",
                "description": "Reflects all saved blobs",
                "arguments": [],
                "returns": "(bool) true if successful",
                "examples": []
            }
        ]
    },
    "channel": {
        "doc": "Create, update, abandon and list your channel claims.",
        "commands": [
            {
                "name": "channel_abandon",
                "description": "Abandon one of my channel claims.",
                "arguments": [
                    {
                        "name": "claim_id",
                        "type": "str",
                        "description": "claim_id of the claim to abandon",
                        "is_required": false
                    },
                    {
                        "name": "txid",
                        "type": "str",
                        "description": "txid of the claim to abandon",
                        "is_required": false
                    },
                    {
                        "name": "nout",
                        "type": "int",
                        "description": "nout of the claim to abandon",
                        "is_required": false
                    },
                    {
                        "name": "account_id",
                        "type": "str",
                        "description": "id of the account to use",
                        "is_required": false
                    },
                    {
                        "name": "wallet_id",
                        "type": "str",
                        "description": "restrict operation to specific wallet",
                        "is_required": false
                    },
                    {
                        "name": "preview",
                        "type": "bool",
                        "description": "do not broadcast the transaction",
                        "is_required": false
                    },
                    {
                        "name": "blocking",
                        "type": "bool",
                        "description": "wait until abandon is in mempool",
                        "is_required": false
                    }
                ],
                "returns": "            {\n                \"txid\": \"hash of transaction in hex\",\n                \"height\": \"block where transaction was recorded\",\n                \"inputs\": [\n                    {\n                        \"txid\": \"hash of transaction in hex\",\n                        \"nout\": \"position in the transaction\",\n                        \"height\": \"block where transaction was recorded\",\n                        \"amount\": \"value of the txo as a decimal\",\n                        \"address\": \"address of who can spend the txo\",\n                        \"confirmations\": \"number of confirmed blocks\",\n                        \"is_change\": \"payment to change address, only available when it can be determined\",\n                        \"is_received\": \"true if txo was sent from external account to this account\",\n                        \"is_spent\": \"true if txo is spent\",\n                        \"is_mine\": \"payment to one of your accounts, only available when it can be determined\",\n                        \"type\": \"one of 'claim', 'support' or 'purchase'\",\n                        \"name\": \"when type is 'claim' or 'support', this is the claim name\",\n                        \"claim_id\": \"when type is 'claim', 'support' or 'purchase', this is the claim id\",\n                        \"claim_op\": \"when type is 'claim', this determines if it is 'create' or 'update'\",\n                        \"value\": \"when type is 'claim' or 'support' with payload, this is the decoded protobuf payload\",\n                        \"value_type\": \"determines the type of the 'value' field: 'channel', 'stream', etc\",\n                        \"protobuf\": \"hex encoded raw protobuf version of 'value' field\",\n                        \"permanent_url\": \"when type is 'claim' or 'support', this is the long permanent claim URL\",\n                        \"claim\": \"for purchase outputs only, metadata of purchased claim\",\n                        \"reposted_claim\": \"for repost claims only, metadata of claim being reposted\",\n                        \"signing_channel\": \"for signed claims only, metadata of signing channel\",\n                        \"is_channel_signature_valid\": \"for signed claims only, whether signature is valid\",\n                        \"purchase_receipt\": \"metadata for the purchase transaction associated with this claim\"\n                    }\n                ],\n                \"outputs\": [\n                    {\n                        \"txid\": \"hash of transaction in hex\",\n                        \"nout\": \"position in the transaction\",\n                        \"height\": \"block where transaction was recorded\",\n                        \"amount\": \"value of the txo as a decimal\",\n                        \"address\": \"address of who can spend the txo\",\n                        \"confirmations\": \"number of confirmed blocks\",\n                        \"is_change\": \"payment to change address, only available when it can be determined\",\n                        \"is_received\": \"true if txo was sent from external account to this account\",\n                        \"is_spent\": \"true if txo is spent\",\n                        \"is_mine\": \"payment to one of your accounts, only available when it can be determined\",\n                        \"type\": \"one of 'claim', 'support' or 'purchase'\",\n                        \"name\": \"when type is 'claim' or 'support', this is the claim name\",\n                        \"claim_id\": \"when type is 'claim', 'support' or 'purchase', this is the claim id\",\n                        \"claim_op\": \"when type is 'claim', this determines if it is 'create' or 'update'\",\n                        \"value\": \"when type is 'claim' or 'support' with payload, this is the decoded protobuf payload\",\n                        \"value_type\": \"determines the type of the 'value' field: 'channel', 'stream', etc\",\n                        \"protobuf\": \"hex encoded raw protobuf version of 'value' field\",\n                        \"permanent_url\": \"when type is 'claim' or 'support', this is the long permanent claim URL\",\n                        \"claim\": \"for purchase outputs only, metadata of purchased claim\",\n                        \"reposted_claim\": \"for repost claims only, metadata of claim being reposted\",\n                        \"signing_channel\": \"for signed claims only, metadata of signing channel\",\n                        \"is_channel_signature_valid\": \"for signed claims only, whether signature is valid\",\n                        \"purchase_receipt\": \"metadata for the purchase transaction associated with this claim\"\n                    }\n                ],\n                \"total_input\": \"sum of inputs as a decimal\",\n                \"total_output\": \"sum of outputs, sans fee, as a decimal\",\n                \"total_fee\": \"fee amount\",\n                \"hex\": \"entire transaction encoded in hex\"\n            }",
                "examples": [
                    {
                        "title": "Abandon a channel claim",
                        "curl": "curl -d'{\"method\": \"channel_abandon\", \"params\": {\"claim_id\": \"595c2e2f0c1f59188628fab7503692b0145779a2\", \"preview\": false, \"blocking\": false}}' http://localhost:5279/",
                        "lbrynet": "lbrynet channel abandon 595c2e2f0c1f59188628fab7503692b0145779a2",
                        "python": "requests.post(\"http://localhost:5279\", json={\"method\": \"channel_abandon\", \"params\": {\"claim_id\": \"595c2e2f0c1f59188628fab7503692b0145779a2\", \"preview\": false, \"blocking\": false}}).json()",
                        "output": "{\n  \"jsonrpc\": \"2.0\",\n  \"result\": {\n    \"height\": -2,\n    \"hex\": \"010000000164ffcff7cce034b5b519f047c9aa5c4cf0dc52d6e5804d74174140a5c52182ab000000006a4730440220554a49624aa9ba48ff6f6ea0e747e3f0fce88e9fbdaef0ec8336e8367dc8552802203988c9dc46b066b699fe7f93bd2fcad05cd86b309846f65b85c3b32ba98667c6012103687cff1a4970d2e992ba0035de7251dd822cb495c17ec0c5c4543a514227cd65ffffffff0134b7f505000000001976a91406c0b5a2fea95e096d4406846d1eb01a1993d5a388ac00000000\",\n    \"inputs\": [\n      {\n        \"address\": \"muRaaMs12imkZJQofvBuLbAFYAs6TiQPAQ\",\n        \"amount\": \"1.0\",\n        \"claim_id\": \"595c2e2f0c1f59188628fab7503692b0145779a2\",\n        \"claim_op\": \"update\",\n        \"confirmations\": 9,\n        \"has_signing_key\": true,\n        \"height\": 210,\n        \"meta\": {},\n        \"name\": \"@channel\",\n        \"normalized_name\": \"@channel\",\n        \"nout\": 0,\n        \"permanent_url\": \"lbry://@channel#595c2e2f0c1f59188628fab7503692b0145779a2\",\n        \"timestamp\": 1655141670,\n        \"txid\": \"ab8221c5a5404117744d80e5d652dcf04c5caac947f019b5b534e0ccf7cfff64\",\n        \"type\": \"claim\",\n        \"value\": {\n          \"public_key\": \"03bbf11fc85401781301f36897b5b01b0aef440db5d6fb0747900b8c69e40e55e5\",\n          \"public_key_id\": \"moF9EgZauGirwqpwZ7NgVsCAxddcPABTfm\",\n          \"title\": \"New Channel\"\n        },\n        \"value_type\": \"channel\"\n      }\n    ],\n    \"outputs\": [\n      {\n        \"address\": \"mg8fCtz1uf7aZe8UVgzMcBPw1V3yEu4Qry\",\n        \"amount\": \"0.999893\",\n        \"confirmations\": -2,\n        \"height\": -2,\n        \"nout\": 0,\n        \"timestamp\": null,\n        \"txid\": \"3691918e1a838c00b759609bfc89effdfab93860a9bc68d06edcc6ee0bb566d5\",\n        \"type\": \"payment\"\n      }\n    ],\n    \"total_fee\": \"0.000107\",\n    \"total_input\": \"1.0\",\n    \"total_output\": \"0.999893\",\n    \"txid\": \"3691918e1a838c00b759609bfc89effdfab93860a9bc68d06edcc6ee0bb566d5\"\n  }\n}"
                    }
                ]
            },
            {
                "name": "channel_create",
                "description": "Create a new channel by generating a channel private key and establishing an '@' prefixed claim.",
                "arguments": [
                    {
                        "name": "name",
                        "type": "str",
                        "description": "name of the channel prefixed with '@'",
                        "is_required": true
                    },
                    {
                        "name": "bid",
                        "type": "decimal",
                        "description": "amount to back the claim",
                        "is_required": true
                    },
                    {
                        "name": "allow_duplicate_name",
                        "type": "bool",
                        "description": "create new channel even if one already exists with given name. default: false.",
                        "is_required": false
                    },
                    {
                        "name": "title",
                        "type": "str",
                        "description": "title of the publication",
                        "is_required": false
                    },
                    {
                        "name": "description",
                        "type": "str",
                        "description": "description of the publication",
                        "is_required": false
                    },
                    {
                        "name": "email",
                        "type": "str",
                        "description": "email of channel owner",
                        "is_required": false
                    },
                    {
                        "name": "website_url",
                        "type": "str",
                        "description": "website url",
                        "is_required": false
                    },
                    {
                        "name": "featured",
                        "type": "list",
                        "description": "claim_ids of featured content in channel",
                        "is_required": false
                    },
                    {
                        "name": "tags",
                        "type": "list",
                        "description": "content tags",
                        "is_required": false
                    },
                    {
                        "name": "languages",
                        "type": "list",
                        "description": "languages used by the channel, using RFC 5646 format, eg: for English `--languages=en` for Spanish (Spain) `--languages=es-ES` for Spanish (Mexican) `--languages=es-MX` for Chinese (Simplified) `--languages=zh-Hans` for Chinese (Traditional) `--languages=zh-Hant`",
                        "is_required": false
                    },
                    {
                        "name": "locations",
                        "type": "list",
                        "description": "locations of the channel, consisting of 2 letter `country` code and a `state`, `city` and a postal `code` along with a `latitude` and `longitude`. for JSON RPC: pass a dictionary with aforementioned attributes as keys, eg: ... \"locations\": [{'country': 'US', 'state': 'NH'}] ... for command line: pass a colon delimited list with values in the following order: \"COUNTRY:STATE:CITY:CODE:LATITUDE:LONGITUDE\" making sure to include colon for blank values, for example to provide only the city: ... --locations=\"::Manchester\" with all values set: ... --locations=\"US:NH:Manchester:03101:42.990605:-71.460989\" optionally, you can just pass the \"LATITUDE:LONGITUDE\": ... --locations=\"42.990605:-71.460989\" finally, you can also pass JSON string of dictionary on the command line as you would via JSON RPC ... --locations=\"{'country': 'US', 'state': 'NH'}\"",
                        "is_required": false
                    },
                    {
                        "name": "thumbnail_url",
                        "type": "str",
                        "description": "thumbnail url",
                        "is_required": false
                    },
                    {
                        "name": "cover_url",
                        "type": "str",
                        "description": "url of cover image",
                        "is_required": false
                    },
                    {
                        "name": "account_id",
                        "type": "str",
                        "description": "account to use for holding the transaction",
                        "is_required": false
                    },
                    {
                        "name": "wallet_id",
                        "type": "str",
                        "description": "restrict operation to specific wallet",
                        "is_required": false
                    },
                    {
                        "name": "funding_account_ids",
                        "type": "list",
                        "description": "ids of accounts to fund this transaction",
                        "is_required": false
                    },
                    {
                        "name": "claim_address",
                        "type": "str",
                        "description": "address where the channel is sent to, if not specified it will be determined automatically from the account",
                        "is_required": false
                    },
                    {
                        "name": "preview",
                        "type": "bool",
                        "description": "do not broadcast the transaction",
                        "is_required": false
                    },
                    {
                        "name": "blocking",
                        "type": "bool",
                        "description": "wait until transaction is in mempool",
                        "is_required": false
                    }
                ],
                "returns": "            {\n                \"txid\": \"hash of transaction in hex\",\n                \"height\": \"block where transaction was recorded\",\n                \"inputs\": [\n                    {\n                        \"txid\": \"hash of transaction in hex\",\n                        \"nout\": \"position in the transaction\",\n                        \"height\": \"block where transaction was recorded\",\n                        \"amount\": \"value of the txo as a decimal\",\n                        \"address\": \"address of who can spend the txo\",\n                        \"confirmations\": \"number of confirmed blocks\",\n                        \"is_change\": \"payment to change address, only available when it can be determined\",\n                        \"is_received\": \"true if txo was sent from external account to this account\",\n                        \"is_spent\": \"true if txo is spent\",\n                        \"is_mine\": \"payment to one of your accounts, only available when it can be determined\",\n                        \"type\": \"one of 'claim', 'support' or 'purchase'\",\n                        \"name\": \"when type is 'claim' or 'support', this is the claim name\",\n                        \"claim_id\": \"when type is 'claim', 'support' or 'purchase', this is the claim id\",\n                        \"claim_op\": \"when type is 'claim', this determines if it is 'create' or 'update'\",\n                        \"value\": \"when type is 'claim' or 'support' with payload, this is the decoded protobuf payload\",\n                        \"value_type\": \"determines the type of the 'value' field: 'channel', 'stream', etc\",\n                        \"protobuf\": \"hex encoded raw protobuf version of 'value' field\",\n                        \"permanent_url\": \"when type is 'claim' or 'support', this is the long permanent claim URL\",\n                        \"claim\": \"for purchase outputs only, metadata of purchased claim\",\n                        \"reposted_claim\": \"for repost claims only, metadata of claim being reposted\",\n                        \"signing_channel\": \"for signed claims only, metadata of signing channel\",\n                        \"is_channel_signature_valid\": \"for signed claims only, whether signature is valid\",\n                        \"purchase_receipt\": \"metadata for the purchase transaction associated with this claim\"\n                    }\n                ],\n                \"outputs\": [\n                    {\n                        \"txid\": \"hash of transaction in hex\",\n                        \"nout\": \"position in the transaction\",\n                        \"height\": \"block where transaction was recorded\",\n                        \"amount\": \"value of the txo as a decimal\",\n                        \"address\": \"address of who can spend the txo\",\n                        \"confirmations\": \"number of confirmed blocks\",\n                        \"is_change\": \"payment to change address, only available when it can be determined\",\n                        \"is_received\": \"true if txo was sent from external account to this account\",\n                        \"is_spent\": \"true if txo is spent\",\n                        \"is_mine\": \"payment to one of your accounts, only available when it can be determined\",\n                        \"type\": \"one of 'claim', 'support' or 'purchase'\",\n                        \"name\": \"when type is 'claim' or 'support', this is the claim name\",\n                        \"claim_id\": \"when type is 'claim', 'support' or 'purchase', this is the claim id\",\n                        \"claim_op\": \"when type is 'claim', this determines if it is 'create' or 'update'\",\n                        \"value\": \"when type is 'claim' or 'support' with payload, this is the decoded protobuf payload\",\n                        \"value_type\": \"determines the type of the 'value' field: 'channel', 'stream', etc\",\n                        \"protobuf\": \"hex encoded raw protobuf version of 'value' field\",\n                        \"permanent_url\": \"when type is 'claim' or 'support', this is the long permanent claim URL\",\n                        \"claim\": \"for purchase outputs only, metadata of purchased claim\",\n                        \"reposted_claim\": \"for repost claims only, metadata of claim being reposted\",\n                        \"signing_channel\": \"for signed claims only, metadata of signing channel\",\n                        \"is_channel_signature_valid\": \"for signed claims only, whether signature is valid\",\n                        \"purchase_receipt\": \"metadata for the purchase transaction associated with this claim\"\n                    }\n                ],\n                \"total_input\": \"sum of inputs as a decimal\",\n                \"total_output\": \"sum of outputs, sans fee, as a decimal\",\n                \"total_fee\": \"fee amount\",\n                \"hex\": \"entire transaction encoded in hex\"\n            }",
                "examples": [
                    {
                        "title": "Create a channel claim without metadata",
                        "curl": "curl -d'{\"method\": \"channel_create\", \"params\": {\"name\": \"@channel\", \"bid\": \"1.0\", \"featured\": [], \"tags\": [], \"languages\": [], \"locations\": [], \"funding_account_ids\": [], \"preview\": false, \"blocking\": false}}' http://localhost:5279/",
                        "lbrynet": "lbrynet channel create @channel 1.0",
                        "python": "requests.post(\"http://localhost:5279\", json={\"method\": \"channel_create\", \"params\": {\"name\": \"@channel\", \"bid\": \"1.0\", \"featured\": [], \"tags\": [], \"languages\": [], \"locations\": [], \"funding_account_ids\": [], \"preview\": false, \"blocking\": false}}).json()",
                        "output": "{\n  \"jsonrpc\": \"2.0\",\n  \"result\": {\n    \"height\": -2,\n    \"hex\": \"0100000001b8749850c50b2d456a0d54ab618c516f9f80a6f1dc7977dab4ca230e775931f0010000006a473044022041b5434aab5d73b41aad02687a657c9b99e1ef83fa8eabb08407359cbe6731e30220293f3f8ac7bf6ade85f4a181920b20d6d55b04acbce1edffc9ef7d1f94a88fdc012102ebd9926866ffd2ea504ee0ec7affe0f85f76e8a3c55149680ff74a63bd655123ffffffff0200e1f505000000004cb508406368616e6e656c260012230a2103bbf11fc85401781301f36897b5b01b0aef440db5d6fb0747900b8c69e40e55e56d7576a914988d8d19fed515ed8e9d60a1c31c8aed750e441d88acc462a029000000001976a914b3aa073545c0d148feed1b89f24a3c7302c2f53188ac00000000\",\n    \"inputs\": [\n      {\n        \"address\": \"mhaZrhgfvGv49E47oDupq8wBppSNfhMFam\",\n        \"amount\": \"7.999876\",\n        \"confirmations\": 2,\n        \"height\": 207,\n        \"nout\": 1,\n        \"timestamp\": 1655141670,\n        \"txid\": \"f03159770e23cab4da7779dcf1a6809f6f518c61ab540d6a452d0bc5509874b8\",\n        \"type\": \"payment\"\n      }\n    ],\n    \"outputs\": [\n      {\n        \"address\": \"muRaaMs12imkZJQofvBuLbAFYAs6TiQPAQ\",\n        \"amount\": \"1.0\",\n        \"claim_id\": \"595c2e2f0c1f59188628fab7503692b0145779a2\",\n        \"claim_op\": \"create\",\n        \"confirmations\": -2,\n        \"has_signing_key\": true,\n        \"height\": -2,\n        \"meta\": {},\n        \"name\": \"@channel\",\n        \"normalized_name\": \"@channel\",\n        \"nout\": 0,\n        \"permanent_url\": \"lbry://@channel#595c2e2f0c1f59188628fab7503692b0145779a2\",\n        \"timestamp\": null,\n        \"txid\": \"de80e8db728f73b499eb384e3bd5688d66d522a3f516de4bf60e9fda2ba91964\",\n        \"type\": \"claim\",\n        \"value\": {\n          \"public_key\": \"03bbf11fc85401781301f36897b5b01b0aef440db5d6fb0747900b8c69e40e55e5\",\n          \"public_key_id\": \"moF9EgZauGirwqpwZ7NgVsCAxddcPABTfm\"\n        },\n        \"value_type\": \"channel\"\n      },\n      {\n        \"address\": \"mwtvw9x13nsVo6xkkrt3RFkk5h6TAjgPdK\",\n        \"amount\": \"6.983769\",\n        \"confirmations\": -2,\n        \"height\": -2,\n        \"nout\": 1,\n        \"timestamp\": null,\n        \"txid\": \"de80e8db728f73b499eb384e3bd5688d66d522a3f516de4bf60e9fda2ba91964\",\n        \"type\": \"payment\"\n      }\n    ],\n    \"total_fee\": \"0.016107\",\n    \"total_input\": \"7.999876\",\n    \"total_output\": \"7.983769\",\n    \"txid\": \"de80e8db728f73b499eb384e3bd5688d66d522a3f516de4bf60e9fda2ba91964\"\n  }\n}"
                    },
                    {
                        "title": "Create a channel claim with all metadata",
                        "curl": "curl -d'{\"method\": \"channel_create\", \"params\": {\"name\": \"@bigchannel\", \"bid\": \"1.0\", \"title\": \"Big Channel\", \"description\": \"A channel with lots of videos.\", \"email\": \"creator@smallmedia.com\", \"website_url\": \"http://smallmedia.com\", \"featured\": [], \"tags\": [\"music\", \"art\"], \"languages\": [\"pt-BR\", \"uk\"], \"locations\": [\"BR\", \"UA::Kiyv\"], \"thumbnail_url\": \"http://smallmedia.com/logo.jpg\", \"cover_url\": \"http://smallmedia.com/logo.jpg\", \"funding_account_ids\": [], \"preview\": false, \"blocking\": false}}' http://localhost:5279/",
                        "lbrynet": "lbrynet channel create @bigchannel 1.0 --title=\"Big Channel\" --description=\"A channel with lots of videos.\" --email=\"creator@smallmedia.com\" --tags=music --tags=art --languages=pt-BR --languages=uk --locations=BR --locations=UA::Kiyv --website_url=\"http://smallmedia.com\" --thumbnail_url=\"http://smallmedia.com/logo.jpg\" --cover_url=\"http://smallmedia.com/logo.jpg\"",
                        "python": "requests.post(\"http://localhost:5279\", json={\"method\": \"channel_create\", \"params\": {\"name\": \"@bigchannel\", \"bid\": \"1.0\", \"title\": \"Big Channel\", \"description\": \"A channel with lots of videos.\", \"email\": \"creator@smallmedia.com\", \"website_url\": \"http://smallmedia.com\", \"featured\": [], \"tags\": [\"music\", \"art\"], \"languages\": [\"pt-BR\", \"uk\"], \"locations\": [\"BR\", \"UA::Kiyv\"], \"thumbnail_url\": \"http://smallmedia.com/logo.jpg\", \"cover_url\": \"http://smallmedia.com/logo.jpg\", \"funding_account_ids\": [], \"preview\": false, \"blocking\": false}}).json()",
                        "output": "{\n  \"jsonrpc\": \"2.0\",\n  \"result\": {\n    \"height\": -2,\n    \"hex\": \"010000000164ffcff7cce034b5b519f047c9aa5c4cf0dc52d6e5804d74174140a5c52182ab010000006b483045022100d26fb9b49ef1a48d33c8639425c1bf216127a45b416ec6a51cb4e81bc8d3a4f002205b38ec4db4ac5e80801203b10b4d31e25775f259163b3f79e78da68eb5ba2b180121036a4e85fba940e22e77dae155444e4f11fa6b9436456a668f00cee5560e48eb36ffffffff0200e1f50500000000fd1701b50b406269676368616e6e656c4ced0012740a2102354550c6c7c2b7c777410102a90b1c3ffa1073517c1f60aa43306490a64a1089121663726561746f7240736d616c6c6d656469612e636f6d1a15687474703a2f2f736d616c6c6d656469612e636f6d22202a1e687474703a2f2f736d616c6c6d656469612e636f6d2f6c6f676f2e6a7067420b426967204368616e6e656c4a1e41206368616e6e656c2077697468206c6f7473206f6620766964656f732e52202a1e687474703a2f2f736d616c6c6d656469612e636f6d2f6c6f676f2e6a70675a056d757369635a0361727462050883011820620308ab016a0208206a0908e9011a044b6979766d7576a9149205f209a3c3a7d6025acbbded70700b686f948488acd22cd305000000001976a91499bb3c59d341b872794cea2524fd2884f83c655e88ac00000000\",\n    \"inputs\": [\n      {\n        \"address\": \"mnTTF4Sw8SGHi58DRCRSpYXJosZ61nPijQ\",\n        \"amount\": \"1.9993635\",\n        \"confirmations\": 1,\n        \"height\": 210,\n        \"nout\": 1,\n        \"timestamp\": 1655141670,\n        \"txid\": \"ab8221c5a5404117744d80e5d652dcf04c5caac947f019b5b534e0ccf7cfff64\",\n        \"type\": \"payment\"\n      }\n    ],\n    \"outputs\": [\n      {\n        \"address\": \"mtq45ABFdcEBnuG8VjRfyhRW35rzWZa7U9\",\n        \"amount\": \"1.0\",\n        \"claim_id\": \"6e536ae75030d1293b52d056a9bac51b3b02ed2a\",\n        \"claim_op\": \"create\",\n        \"confirmations\": -2,\n        \"has_signing_key\": true,\n        \"height\": -2,\n        \"meta\": {},\n        \"name\": \"@bigchannel\",\n        \"normalized_name\": \"@bigchannel\",\n        \"nout\": 0,\n        \"permanent_url\": \"lbry://@bigchannel#6e536ae75030d1293b52d056a9bac51b3b02ed2a\",\n        \"timestamp\": null,\n        \"txid\": \"acba29e905f1a37d12f8371a77e1b6f92c1a45c7ed396b1eceea97c154e9d2e3\",\n        \"type\": \"claim\",\n        \"value\": {\n          \"cover\": {\n            \"url\": \"http://smallmedia.com/logo.jpg\"\n          },\n          \"description\": \"A channel with lots of videos.\",\n          \"email\": \"creator@smallmedia.com\",\n          \"languages\": [\n            \"pt-BR\",\n            \"uk\"\n          ],\n          \"locations\": [\n            {\n              \"country\": \"BR\"\n            },\n            {\n              \"city\": \"Kiyv\",\n              \"country\": \"UA\"\n            }\n          ],\n          \"public_key\": \"02354550c6c7c2b7c777410102a90b1c3ffa1073517c1f60aa43306490a64a1089\",\n          \"public_key_id\": \"mpJbNo6rzLmfViJkVay6kxdqCrAfB1BDbe\",\n          \"tags\": [\n            \"music\",\n            \"art\"\n          ],\n          \"thumbnail\": {\n            \"url\": \"http://smallmedia.com/logo.jpg\"\n          },\n          \"title\": \"Big Channel\",\n          \"website_url\": \"http://smallmedia.com\"\n        },\n        \"value_type\": \"channel\"\n      },\n      {\n        \"address\": \"muXoymiRVLaS1FXJSgPjieSedrWPgUgEkK\",\n        \"amount\": \"0.9772565\",\n        \"confirmations\": -2,\n        \"height\": -2,\n        \"nout\": 1,\n        \"timestamp\": null,\n        \"txid\": \"acba29e905f1a37d12f8371a77e1b6f92c1a45c7ed396b1eceea97c154e9d2e3\",\n        \"type\": \"payment\"\n      }\n    ],\n    \"total_fee\": \"0.022107\",\n    \"total_input\": \"1.9993635\",\n    \"total_output\": \"1.9772565\",\n    \"txid\": \"acba29e905f1a37d12f8371a77e1b6f92c1a45c7ed396b1eceea97c154e9d2e3\"\n  }\n}"
                    }
                ]
            },
            {
                "name": "channel_export",
                "description": "Export channel private key.",
                "arguments": [
                    {
                        "name": "channel_id",
                        "type": "str",
                        "description": "claim id of channel to export",
                        "is_required": true
                    },
                    {
                        "name": "channel_name",
                        "type": "str",
                        "description": "name of channel to export",
                        "is_required": false
                    },
                    {
                        "name": "account_id",
                        "type": "str",
                        "description": "one or more account ids for accounts to look in for channels, defaults to all accounts.",
                        "is_required": false
                    },
                    {
                        "name": "wallet_id",
                        "type": "str",
                        "description": "restrict operation to specific wallet",
                        "is_required": false
                    }
                ],
                "returns": "(str) serialized channel private key",
                "examples": []
            },
            {
                "name": "channel_import",
                "description": "Import serialized channel private key (to allow signing new streams to the channel)",
                "arguments": [
                    {
                        "name": "channel_data",
                        "type": "str",
                        "description": "serialized channel, as exported by channel export",
                        "is_required": true
                    },
                    {
                        "name": "wallet_id",
                        "type": "str",
                        "description": "import into specific wallet",
                        "is_required": false
                    }
                ],
                "returns": "(dict) Result dictionary",
                "examples": []
            },
            {
                "name": "channel_list",
                "description": "List my channel claims.",
                "arguments": [
                    {
                        "name": "name",
                        "type": "str or list",
                        "description": "channel name",
                        "is_required": false
                    },
                    {
                        "name": "claim_id",
                        "type": "str or list",
                        "description": "channel id",
                        "is_required": false
                    },
                    {
                        "name": "is_spent",
                        "type": "bool",
                        "description": "shows previous channel updates and abandons",
                        "is_required": false
                    },
                    {
                        "name": "account_id",
                        "type": "str",
                        "description": "id of the account to use",
                        "is_required": false
                    },
                    {
                        "name": "wallet_id",
                        "type": "str",
                        "description": "restrict results to specific wallet",
                        "is_required": false
                    },
                    {
                        "name": "page",
                        "type": "int",
                        "description": "page to return during paginating",
                        "is_required": false
                    },
                    {
                        "name": "page_size",
                        "type": "int",
                        "description": "number of items on page during pagination",
                        "is_required": false
                    },
                    {
                        "name": "resolve",
                        "type": "bool",
                        "description": "resolves each channel to provide additional metadata",
                        "is_required": false
                    },
                    {
                        "name": "no_totals",
                        "type": "bool",
                        "description": "do not calculate the total number of pages and items in result set (significant performance boost)",
                        "is_required": false
                    }
                ],
                "returns": "            {\n                \"page\": \"Page number of the current items.\",\n                \"page_size\": \"Number of items to show on a page.\",\n                \"total_pages\": \"Total number of pages.\",\n                \"total_items\": \"Total number of items.\",\n                \"items\": [\n                    {\n                        \"txid\": \"hash of transaction in hex\",\n                        \"nout\": \"position in the transaction\",\n                        \"height\": \"block where transaction was recorded\",\n                        \"amount\": \"value of the txo as a decimal\",\n                        \"address\": \"address of who can spend the txo\",\n                        \"confirmations\": \"number of confirmed blocks\",\n                        \"is_change\": \"payment to change address, only available when it can be determined\",\n                        \"is_received\": \"true if txo was sent from external account to this account\",\n                        \"is_spent\": \"true if txo is spent\",\n                        \"is_mine\": \"payment to one of your accounts, only available when it can be determined\",\n                        \"type\": \"one of 'claim', 'support' or 'purchase'\",\n                        \"name\": \"when type is 'claim' or 'support', this is the claim name\",\n                        \"claim_id\": \"when type is 'claim', 'support' or 'purchase', this is the claim id\",\n                        \"claim_op\": \"when type is 'claim', this determines if it is 'create' or 'update'\",\n                        \"value\": \"when type is 'claim' or 'support' with payload, this is the decoded protobuf payload\",\n                        \"value_type\": \"determines the type of the 'value' field: 'channel', 'stream', etc\",\n                        \"protobuf\": \"hex encoded raw protobuf version of 'value' field\",\n                        \"permanent_url\": \"when type is 'claim' or 'support', this is the long permanent claim URL\",\n                        \"claim\": \"for purchase outputs only, metadata of purchased claim\",\n                        \"reposted_claim\": \"for repost claims only, metadata of claim being reposted\",\n                        \"signing_channel\": \"for signed claims only, metadata of signing channel\",\n                        \"is_channel_signature_valid\": \"for signed claims only, whether signature is valid\",\n                        \"purchase_receipt\": \"metadata for the purchase transaction associated with this claim\"\n                    }\n                ]\n            }",
                "examples": [
                    {
                        "title": "List your channel claims",
                        "curl": "curl -d'{\"method\": \"channel_list\", \"params\": {\"name\": [], \"claim_id\": [], \"is_spent\": false, \"resolve\": false, \"no_totals\": false}}' http://localhost:5279/",
                        "lbrynet": "lbrynet channel list",
                        "python": "requests.post(\"http://localhost:5279\", json={\"method\": \"channel_list\", \"params\": {\"name\": [], \"claim_id\": [], \"is_spent\": false, \"resolve\": false, \"no_totals\": false}}).json()",
                        "output": "{\n  \"jsonrpc\": \"2.0\",\n  \"result\": {\n    \"items\": [\n      {\n        \"address\": \"muRaaMs12imkZJQofvBuLbAFYAs6TiQPAQ\",\n        \"amount\": \"1.0\",\n        \"claim_id\": \"595c2e2f0c1f59188628fab7503692b0145779a2\",\n        \"claim_op\": \"create\",\n        \"confirmations\": 1,\n        \"has_signing_key\": true,\n        \"height\": 209,\n        \"is_internal_transfer\": false,\n        \"is_my_input\": true,\n        \"is_my_output\": true,\n        \"is_spent\": false,\n        \"meta\": {},\n        \"name\": \"@channel\",\n        \"normalized_name\": \"@channel\",\n        \"nout\": 0,\n        \"permanent_url\": \"lbry://@channel#595c2e2f0c1f59188628fab7503692b0145779a2\",\n        \"timestamp\": 1655141670,\n        \"txid\": \"de80e8db728f73b499eb384e3bd5688d66d522a3f516de4bf60e9fda2ba91964\",\n        \"type\": \"claim\",\n        \"value\": {\n          \"public_key\": \"03bbf11fc85401781301f36897b5b01b0aef440db5d6fb0747900b8c69e40e55e5\",\n          \"public_key_id\": \"moF9EgZauGirwqpwZ7NgVsCAxddcPABTfm\"\n        },\n        \"value_type\": \"channel\"\n      }\n    ],\n    \"page\": 1,\n    \"page_size\": 20,\n    \"total_items\": 1,\n    \"total_pages\": 1\n  }\n}"
                    },
                    {
                        "title": "Paginate your channel claims",
                        "curl": "curl -d'{\"method\": \"channel_list\", \"params\": {\"name\": [], \"claim_id\": [], \"is_spent\": false, \"page\": 1, \"page_size\": 20, \"resolve\": false, \"no_totals\": false}}' http://localhost:5279/",
                        "lbrynet": "lbrynet channel list --page=1 --page_size=20",
                        "python": "requests.post(\"http://localhost:5279\", json={\"method\": \"channel_list\", \"params\": {\"name\": [], \"claim_id\": [], \"is_spent\": false, \"page\": 1, \"page_size\": 20, \"resolve\": false, \"no_totals\": false}}).json()",
                        "output": "{\n  \"jsonrpc\": \"2.0\",\n  \"result\": {\n    \"items\": [\n      {\n        \"address\": \"muRaaMs12imkZJQofvBuLbAFYAs6TiQPAQ\",\n        \"amount\": \"1.0\",\n        \"claim_id\": \"595c2e2f0c1f59188628fab7503692b0145779a2\",\n        \"claim_op\": \"create\",\n        \"confirmations\": 1,\n        \"has_signing_key\": true,\n        \"height\": 209,\n        \"is_internal_transfer\": false,\n        \"is_my_input\": true,\n        \"is_my_output\": true,\n        \"is_spent\": false,\n        \"meta\": {},\n        \"name\": \"@channel\",\n        \"normalized_name\": \"@channel\",\n        \"nout\": 0,\n        \"permanent_url\": \"lbry://@channel#595c2e2f0c1f59188628fab7503692b0145779a2\",\n        \"timestamp\": 1655141670,\n        \"txid\": \"de80e8db728f73b499eb384e3bd5688d66d522a3f516de4bf60e9fda2ba91964\",\n        \"type\": \"claim\",\n        \"value\": {\n          \"public_key\": \"03bbf11fc85401781301f36897b5b01b0aef440db5d6fb0747900b8c69e40e55e5\",\n          \"public_key_id\": \"moF9EgZauGirwqpwZ7NgVsCAxddcPABTfm\"\n        },\n        \"value_type\": \"channel\"\n      }\n    ],\n    \"page\": 1,\n    \"page_size\": 20,\n    \"total_items\": 1,\n    \"total_pages\": 1\n  }\n}"
                    }
                ]
            },
            {
                "name": "channel_sign",
                "description": "Signs data using the specified channel signing key.",
                "arguments": [
                    {
                        "name": "channel_name",
                        "type": "str",
                        "description": "name of channel used to sign (or use channel id)",
                        "is_required": false
                    },
                    {
                        "name": "channel_id",
                        "type": "str",
                        "description": "claim id of channel used to sign (or use channel name)",
                        "is_required": false
                    },
                    {
                        "name": "hexdata",
                        "type": "str",
                        "description": "data to sign, encoded as hexadecimal",
                        "is_required": false
                    },
                    {
                        "name": "channel_account_id",
                        "type": "str",
                        "description": "one or more account ids for accounts to look in for channel certificates, defaults to all accounts.",
                        "is_required": false
                    },
                    {
                        "name": "wallet_id",
                        "type": "str",
                        "description": "restrict operation to specific wallet",
                        "is_required": false
                    }
                ],
                "returns": "(dict) Signature if successfully made, (None) or an error otherwise\n    {\n        \"signature\":    (str) The signature of the comment,\n        \"signing_ts\":   (str) The timestamp used to sign the comment,\n    }",
                "examples": [
Download .txt
gitextract_scmdz25q/

├── .github/
│   └── workflows/
│       ├── main.yml
│       └── release.yml
├── CHANGELOG.md
├── CONTRIBUTING.md
├── INSTALL.md
├── LICENSE
├── MANIFEST.in
├── Makefile
├── README.md
├── SECURITY.md
├── docker/
│   ├── Dockerfile.dht_node
│   ├── Dockerfile.wallet_server
│   ├── Dockerfile.web
│   ├── README.md
│   ├── docker-compose-wallet-server.yml
│   ├── docker-compose.yml
│   ├── hooks/
│   │   └── build
│   ├── install_choco.ps1
│   ├── set_build.py
│   ├── wallet_server_entrypoint.sh
│   └── webconf.yaml
├── docs/
│   └── api.json
├── example_daemon_settings.yml
├── lbry/
│   ├── .dockerignore
│   ├── __init__.py
│   ├── blob/
│   │   ├── __init__.py
│   │   ├── blob_file.py
│   │   ├── blob_info.py
│   │   ├── blob_manager.py
│   │   ├── disk_space_manager.py
│   │   └── writer.py
│   ├── blob_exchange/
│   │   ├── __init__.py
│   │   ├── client.py
│   │   ├── downloader.py
│   │   ├── serialization.py
│   │   └── server.py
│   ├── build_info.py
│   ├── conf.py
│   ├── connection_manager.py
│   ├── constants.py
│   ├── crypto/
│   │   ├── __init__.py
│   │   ├── base58.py
│   │   ├── crypt.py
│   │   ├── hash.py
│   │   └── util.py
│   ├── dht/
│   │   ├── __init__.py
│   │   ├── blob_announcer.py
│   │   ├── constants.py
│   │   ├── error.py
│   │   ├── node.py
│   │   ├── peer.py
│   │   ├── protocol/
│   │   │   ├── __init__.py
│   │   │   ├── data_store.py
│   │   │   ├── distance.py
│   │   │   ├── iterative_find.py
│   │   │   ├── protocol.py
│   │   │   └── routing_table.py
│   │   └── serialization/
│   │       ├── __init__.py
│   │       ├── bencoding.py
│   │       └── datagram.py
│   ├── error/
│   │   ├── Makefile
│   │   ├── README.md
│   │   ├── __init__.py
│   │   ├── base.py
│   │   └── generate.py
│   ├── extras/
│   │   ├── __init__.py
│   │   ├── cli.py
│   │   ├── daemon/
│   │   │   ├── __init__.py
│   │   │   ├── analytics.py
│   │   │   ├── client.py
│   │   │   ├── component.py
│   │   │   ├── componentmanager.py
│   │   │   ├── components.py
│   │   │   ├── daemon.py
│   │   │   ├── exchange_rate_manager.py
│   │   │   ├── json_response_encoder.py
│   │   │   ├── migrator/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── dbmigrator.py
│   │   │   │   ├── migrate10to11.py
│   │   │   │   ├── migrate11to12.py
│   │   │   │   ├── migrate12to13.py
│   │   │   │   ├── migrate13to14.py
│   │   │   │   ├── migrate14to15.py
│   │   │   │   ├── migrate15to16.py
│   │   │   │   ├── migrate1to2.py
│   │   │   │   ├── migrate2to3.py
│   │   │   │   ├── migrate3to4.py
│   │   │   │   ├── migrate4to5.py
│   │   │   │   ├── migrate5to6.py
│   │   │   │   ├── migrate6to7.py
│   │   │   │   ├── migrate7to8.py
│   │   │   │   ├── migrate8to9.py
│   │   │   │   └── migrate9to10.py
│   │   │   ├── security.py
│   │   │   ├── storage.py
│   │   │   └── undecorated.py
│   │   └── system_info.py
│   ├── file/
│   │   ├── __init__.py
│   │   ├── file_manager.py
│   │   ├── source.py
│   │   └── source_manager.py
│   ├── file_analysis.py
│   ├── prometheus.py
│   ├── schema/
│   │   ├── Makefile
│   │   ├── README.md
│   │   ├── __init__.py
│   │   ├── attrs.py
│   │   ├── base.py
│   │   ├── claim.py
│   │   ├── compat.py
│   │   ├── mime_types.py
│   │   ├── purchase.py
│   │   ├── result.py
│   │   ├── support.py
│   │   ├── tags.py
│   │   ├── types/
│   │   │   ├── __init__.py
│   │   │   ├── v1/
│   │   │   │   ├── __init__.py
│   │   │   │   ├── certificate_pb2.py
│   │   │   │   ├── fee_pb2.py
│   │   │   │   ├── legacy_claim_pb2.py
│   │   │   │   ├── metadata_pb2.py
│   │   │   │   ├── signature_pb2.py
│   │   │   │   ├── source_pb2.py
│   │   │   │   └── stream_pb2.py
│   │   │   └── v2/
│   │   │       ├── __init__.py
│   │   │       ├── claim_pb2.py
│   │   │       ├── purchase_pb2.py
│   │   │       ├── result_pb2.py
│   │   │       ├── support_pb2.py
│   │   │       └── wallet.json
│   │   └── url.py
│   ├── stream/
│   │   ├── __init__.py
│   │   ├── background_downloader.py
│   │   ├── descriptor.py
│   │   ├── downloader.py
│   │   ├── managed_stream.py
│   │   ├── reflector/
│   │   │   ├── __init__.py
│   │   │   ├── client.py
│   │   │   └── server.py
│   │   └── stream_manager.py
│   ├── testcase.py
│   ├── torrent/
│   │   ├── __init__.py
│   │   ├── session.py
│   │   ├── torrent.py
│   │   ├── torrent_manager.py
│   │   └── tracker.py
│   ├── utils.py
│   ├── wallet/
│   │   ├── __init__.py
│   │   ├── account.py
│   │   ├── bcd_data_stream.py
│   │   ├── bip32.py
│   │   ├── checkpoints.py
│   │   ├── claim_proofs.py
│   │   ├── coinselection.py
│   │   ├── constants.py
│   │   ├── database.py
│   │   ├── dewies.py
│   │   ├── hash.py
│   │   ├── header.py
│   │   ├── ledger.py
│   │   ├── manager.py
│   │   ├── mnemonic.py
│   │   ├── network.py
│   │   ├── orchstr8/
│   │   │   ├── __init__.py
│   │   │   ├── cli.py
│   │   │   ├── node.py
│   │   │   └── service.py
│   │   ├── rpc/
│   │   │   ├── __init__.py
│   │   │   ├── framing.py
│   │   │   ├── jsonrpc.py
│   │   │   ├── session.py
│   │   │   ├── socks.py
│   │   │   └── util.py
│   │   ├── script.py
│   │   ├── stream.py
│   │   ├── tasks.py
│   │   ├── transaction.py
│   │   ├── udp.py
│   │   ├── usage_payment.py
│   │   ├── util.py
│   │   ├── wallet.py
│   │   └── words/
│   │       ├── __init__.py
│   │       ├── chinese_simplified.py
│   │       ├── english.py
│   │       ├── japanese.py
│   │       ├── portuguese.py
│   │       └── spanish.py
│   └── winpaths.py
├── scripts/
│   ├── Dockerfile.lbry_orchstr8
│   ├── check_signature.py
│   ├── check_video.py
│   ├── checkpoints.py
│   ├── checktrie.py
│   ├── deploy_dev_wallet_server.sh
│   ├── dht_crawler.py
│   ├── dht_monitor.py
│   ├── dht_node.py
│   ├── download_blob_from_peer.py
│   ├── find_max_server_load.py
│   ├── generate_json_api.py
│   ├── hook-coincurve.py
│   ├── hook-libtorrent.py
│   ├── idea/
│   │   ├── lbry-sdk.iml
│   │   ├── modules.xml
│   │   └── vcs.xml
│   ├── initialize_hub_from_snapshot.sh
│   ├── monitor_slow_queries.py
│   ├── publish_performance.py
│   ├── release.py
│   ├── repair_0_31_1_db.py
│   ├── sd_hash_sampler.py
│   ├── standalone_blob_server.py
│   ├── test_claim_search.py
│   ├── time_to_first_byte.py
│   ├── troubleshoot_p2p_and_dht_webservice.py
│   └── wallet_server_monitor.py
├── setup.cfg
├── setup.py
├── tests/
│   ├── __init__.py
│   ├── dht_mocks.py
│   ├── integration/
│   │   ├── __init__.py
│   │   ├── blockchain/
│   │   │   ├── __init__.py
│   │   │   ├── test_account_commands.py
│   │   │   ├── test_blockchain_reorganization.py
│   │   │   ├── test_network.py
│   │   │   ├── test_purchase_command.py
│   │   │   ├── test_sync.py
│   │   │   ├── test_wallet_commands.py
│   │   │   └── test_wallet_server_sessions.py
│   │   ├── claims/
│   │   │   ├── __init__.py
│   │   │   └── test_claim_commands.py
│   │   ├── datanetwork/
│   │   │   ├── __init__.py
│   │   │   ├── test_dht.py
│   │   │   ├── test_file_commands.py
│   │   │   └── test_streaming.py
│   │   ├── other/
│   │   │   ├── __init__.py
│   │   │   ├── test_chris45.py
│   │   │   ├── test_cli.py
│   │   │   ├── test_exchange_rate_manager.py
│   │   │   ├── test_other_commands.py
│   │   │   └── test_transcoding.py
│   │   ├── takeovers/
│   │   │   ├── __init__.py
│   │   │   └── test_resolve_command.py
│   │   └── transactions/
│   │       ├── __init__.py
│   │       ├── test_internal_transaction_api.py
│   │       ├── test_transaction_commands.py
│   │       └── test_transactions.py
│   ├── test_utils.py
│   └── unit/
│       ├── __init__.py
│       ├── analytics/
│       │   ├── __init__.py
│       │   └── test_track.py
│       ├── blob/
│       │   ├── __init__.py
│       │   ├── test_blob_file.py
│       │   └── test_blob_manager.py
│       ├── blob_exchange/
│       │   ├── __init__.py
│       │   └── test_transfer_blob.py
│       ├── components/
│       │   ├── __init__.py
│       │   └── test_component_manager.py
│       ├── core/
│       │   ├── __init__.py
│       │   └── test_utils.py
│       ├── database/
│       │   ├── __init__.py
│       │   └── test_SQLiteStorage.py
│       ├── dht/
│       │   ├── __init__.py
│       │   ├── protocol/
│       │   │   ├── __init__.py
│       │   │   ├── test_data_store.py
│       │   │   ├── test_distance.py
│       │   │   ├── test_kbucket.py
│       │   │   ├── test_protocol.py
│       │   │   └── test_routing_table.py
│       │   ├── serialization/
│       │   │   ├── __init__.py
│       │   │   ├── test_bencoding.py
│       │   │   └── test_datagram.py
│       │   ├── test_blob_announcer.py
│       │   ├── test_node.py
│       │   └── test_peer.py
│       ├── lbrynet_daemon/
│       │   ├── __init__.py
│       │   ├── test_Daemon.py
│       │   ├── test_allowed_origin.py
│       │   ├── test_exchange_rate_manager.py
│       │   └── test_mime_types.py
│       ├── schema/
│       │   ├── __init__.py
│       │   ├── test_claim_from_bytes.py
│       │   ├── test_mime_types.py
│       │   ├── test_models.py
│       │   ├── test_tags.py
│       │   └── test_url.py
│       ├── stream/
│       │   ├── __init__.py
│       │   ├── test_managed_stream.py
│       │   ├── test_reflector.py
│       │   ├── test_stream_descriptor.py
│       │   └── test_stream_manager.py
│       ├── test_cli.py
│       ├── test_conf.py
│       ├── test_utils.py
│       ├── torrent/
│       │   ├── __init__.py
│       │   └── test_tracker.py
│       └── wallet/
│           ├── __init__.py
│           ├── key_fixtures.py
│           ├── server/
│           │   ├── __init__.py
│           │   └── test_migration.py
│           ├── test_account.py
│           ├── test_bcd_data_stream.py
│           ├── test_bip32.py
│           ├── test_claim_proofs.py
│           ├── test_coinselection.py
│           ├── test_database.py
│           ├── test_dewies.py
│           ├── test_hash.py
│           ├── test_headers.py
│           ├── test_ledger.py
│           ├── test_mnemonic.py
│           ├── test_schema_signing.py
│           ├── test_script.py
│           ├── test_stream_controller.py
│           ├── test_transaction.py
│           ├── test_utils.py
│           └── test_wallet.py
└── tox.ini
Download .txt
Showing preview only (331K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (4019 symbols across 212 files)

FILE: docker/set_build.py
  function _check_and_set (line 12) | def _check_and_set(d: dict, key: str, value: str):
  function main (line 20) | def main():

FILE: lbry/blob/blob_file.py
  function is_valid_blobhash (line 29) | def is_valid_blobhash(blobhash: str) -> bool:
  function encrypt_blob_bytes (line 40) | def encrypt_blob_bytes(key: bytes, iv: bytes, unencrypted: bytes) -> typ...
  function decrypt_blob_bytes (line 50) | def decrypt_blob_bytes(data: bytes, length: int, key: bytes, iv: bytes) ...
  class AbstractBlob (line 59) | class AbstractBlob:
    method __init__ (line 79) | def __init__(
    method __del__ (line 99) | def __del__(self):
    method _reader_context (line 105) | def _reader_context(self) -> typing.ContextManager[typing.BinaryIO]:
    method reader_context (line 109) | def reader_context(self) -> typing.ContextManager[typing.BinaryIO]:
    method _write_blob (line 120) | def _write_blob(self, blob_bytes: bytes) -> asyncio.Task:
    method set_length (line 123) | def set_length(self, length) -> None:
    method get_length (line 131) | def get_length(self) -> typing.Optional[int]:
    method get_is_verified (line 134) | def get_is_verified(self) -> bool:
    method is_readable (line 137) | def is_readable(self) -> bool:
    method is_writeable (line 140) | def is_writeable(self) -> bool:
    method write_blob (line 143) | def write_blob(self, blob_bytes: bytes):
    method close (line 152) | def close(self):
    method delete (line 162) | def delete(self):
    method sendfile (line 167) | async def sendfile(self, writer: asyncio.StreamWriter) -> int:
    method decrypt (line 180) | def decrypt(self, key: bytes, iv: bytes) -> bytes:
    method create_from_unencrypted (line 189) | async def create_from_unencrypted(
    method save_verified_blob (line 206) | def save_verified_blob(self, verified_bytes: bytes):
    method get_blob_writer (line 221) | def get_blob_writer(self, peer_address: typing.Optional[str] = None,
  class BlobBuffer (line 255) | class BlobBuffer(AbstractBlob):
    method __init__ (line 259) | def __init__(
    method _reader_context (line 268) | def _reader_context(self) -> typing.ContextManager[typing.BinaryIO]:
    method _write_blob (line 279) | def _write_blob(self, blob_bytes: bytes):
    method delete (line 286) | def delete(self):
    method __del__ (line 292) | def __del__(self):
  class BlobFile (line 298) | class BlobFile(AbstractBlob):
    method __init__ (line 302) | def __init__(
    method file_exists (line 321) | def file_exists(self):
    method is_writeable (line 324) | def is_writeable(self) -> bool:
    method get_blob_writer (line 327) | def get_blob_writer(self, peer_address: typing.Optional[str] = None,
    method _reader_context (line 334) | def _reader_context(self) -> typing.ContextManager[typing.BinaryIO]:
    method _write_blob (line 341) | def _write_blob(self, blob_bytes: bytes):
    method delete (line 351) | def delete(self):
    method create_from_unencrypted (line 357) | async def create_from_unencrypted(

FILE: lbry/blob/blob_info.py
  class BlobInfo (line 4) | class BlobInfo:
    method __init__ (line 14) | def __init__(
    method as_dict (line 24) | def as_dict(self) -> typing.Dict:

FILE: lbry/blob/blob_manager.py
  class BlobManager (line 18) | class BlobManager:
    method __init__ (line 19) | def __init__(self, loop: asyncio.AbstractEventLoop, blob_dir: str, sto...
    method _get_blob (line 39) | def _get_blob(self, blob_hash: str, length: typing.Optional[int] = Non...
    method get_blob (line 49) | def get_blob(self, blob_hash, length: typing.Optional[int] = None, is_...
    method is_blob_verified (line 65) | def is_blob_verified(self, blob_hash: str, length: typing.Optional[int...
    method setup (line 74) | async def setup(self) -> bool:
    method stop (line 92) | def stop(self):
    method get_stream_descriptor (line 99) | def get_stream_descriptor(self, sd_hash):
    method blob_completed (line 102) | def blob_completed(self, blob: AbstractBlob) -> asyncio.Task:
    method ensure_completed_blobs_status (line 118) | async def ensure_completed_blobs_status(self, blob_hashes: typing.Iter...
    method delete_blob (line 131) | def delete_blob(self, blob_hash: str):
    method delete_blobs (line 143) | async def delete_blobs(self, blob_hashes: typing.List[str], delete_fro...

FILE: lbry/blob/disk_space_manager.py
  class DiskSpaceManager (line 7) | class DiskSpaceManager:
    method __init__ (line 9) | def __init__(self, config, db, blob_manager, cleaning_interval=30 * 60...
    method get_free_space_mb (line 19) | async def get_free_space_mb(self, is_network_blob=False):
    method get_space_used_bytes (line 25) | async def get_space_used_bytes(self):
    method get_space_used_mb (line 29) | async def get_space_used_mb(self, cached=True):
    method clean (line 34) | async def clean(self):
    method _clean (line 38) | async def _clean(self, is_network_blob=False):
    method cleaning_loop (line 64) | async def cleaning_loop(self):
    method start (line 69) | async def start(self):
    method stop (line 74) | async def stop(self):

FILE: lbry/blob/writer.py
  class HashBlobWriter (line 11) | class HashBlobWriter:
    method __init__ (line 12) | def __init__(self, expected_blob_hash: str, get_length: typing.Callabl...
    method __del__ (line 22) | def __del__(self):
    method calculate_blob_hash (line 27) | def calculate_blob_hash(self) -> str:
    method closed (line 30) | def closed(self):
    method write (line 33) | def write(self, data: bytes):
    method close_handle (line 63) | def close_handle(self):

FILE: lbry/blob_exchange/client.py
  class BlobExchangeClientProtocol (line 18) | class BlobExchangeClientProtocol(asyncio.Protocol):
    method __init__ (line 19) | def __init__(self, loop: asyncio.AbstractEventLoop, peer_timeout: typi...
    method data_received (line 37) | def data_received(self, data: bytes):
    method _write (line 82) | def _write(self, data: bytes):
    method _download_blob (line 98) | async def _download_blob(self) -> typing.Tuple[int, Optional['BlobExch...
    method close (line 168) | def close(self):
    method download_blob (line 182) | async def download_blob(self, blob: 'AbstractBlob') -> typing.Tuple[in...
    method connection_made (line 210) | def connection_made(self, transport: asyncio.Transport):
    method connection_lost (line 218) | def connection_lost(self, exc):
  function request_blob (line 227) | async def request_blob(loop: asyncio.AbstractEventLoop, blob: Optional['...

FILE: lbry/blob_exchange/downloader.py
  class BlobDownloader (line 18) | class BlobDownloader:
    method __init__ (line 21) | def __init__(self, loop: asyncio.AbstractEventLoop, config: 'Config', ...
    method should_race_continue (line 35) | def should_race_continue(self, blob: 'AbstractBlob'):
    method request_blob_from_peer (line 41) | async def request_blob_from_peer(self, blob: 'AbstractBlob', peer: 'Ka...
    method new_peer_or_finished (line 66) | async def new_peer_or_finished(self):
    method cleanup_active (line 70) | def cleanup_active(self):
    method clearbanned (line 77) | def clearbanned(self):
    method download_blob (line 85) | async def download_blob(self, blob_hash: str, length: typing.Optional[...
    method close (line 118) | def close(self):
  function download_blob (line 127) | async def download_blob(loop, config: 'Config', blob_manager: 'BlobManag...

FILE: lbry/blob_exchange/serialization.py
  class BlobMessage (line 8) | class BlobMessage:
    method to_dict (line 11) | def to_dict(self) -> typing.Dict:
  class BlobPriceRequest (line 15) | class BlobPriceRequest(BlobMessage):
    method __init__ (line 18) | def __init__(self, blob_data_payment_rate: float, **kwargs) -> None:
    method to_dict (line 21) | def to_dict(self) -> typing.Dict:
  class BlobPriceResponse (line 27) | class BlobPriceResponse(BlobMessage):
    method __init__ (line 33) | def __init__(self, blob_data_payment_rate: str, **kwargs) -> None:
    method to_dict (line 38) | def to_dict(self) -> typing.Dict:
  class BlobAvailabilityRequest (line 44) | class BlobAvailabilityRequest(BlobMessage):
    method __init__ (line 47) | def __init__(self, requested_blobs: typing.List[str], lbrycrd_address:...
    method to_dict (line 53) | def to_dict(self) -> typing.Dict:
  class BlobAvailabilityResponse (line 60) | class BlobAvailabilityResponse(BlobMessage):
    method __init__ (line 63) | def __init__(self, available_blobs: typing.List[str], lbrycrd_address:...
    method to_dict (line 68) | def to_dict(self) -> typing.Dict:
  class BlobDownloadRequest (line 77) | class BlobDownloadRequest(BlobMessage):
    method __init__ (line 80) | def __init__(self, requested_blob: str, **kwargs) -> None:
    method to_dict (line 83) | def to_dict(self) -> typing.Dict:
  class BlobDownloadResponse (line 89) | class BlobDownloadResponse(BlobMessage):
    method __init__ (line 92) | def __init__(self, **response: typing.Dict) -> None:
    method to_dict (line 103) | def to_dict(self) -> typing.Dict:
  class BlobPaymentAddressRequest (line 109) | class BlobPaymentAddressRequest(BlobMessage):
    method __init__ (line 112) | def __init__(self, lbrycrd_address: str, **kwargs) -> None:
    method to_dict (line 115) | def to_dict(self) -> typing.Dict:
  class BlobPaymentAddressResponse (line 121) | class BlobPaymentAddressResponse(BlobPaymentAddressRequest):
  class BlobErrorResponse (line 125) | class BlobErrorResponse(BlobMessage):
    method __init__ (line 128) | def __init__(self, error: str, **kwargs) -> None:
    method to_dict (line 131) | def to_dict(self) -> typing.Dict:
  function _parse_blob_response (line 143) | def _parse_blob_response(response_msg: bytes) -> typing.Tuple[typing.Opt...
  class BlobRequest (line 171) | class BlobRequest:
    method __init__ (line 172) | def __init__(self, requests: typing.List[blob_request_types]) -> None:
    method to_dict (line 175) | def to_dict(self):
    method _get_request (line 181) | def _get_request(self, request_type: blob_request_types):
    method get_availability_request (line 186) | def get_availability_request(self) -> typing.Optional[BlobAvailability...
    method get_price_request (line 191) | def get_price_request(self) -> typing.Optional[BlobPriceRequest]:
    method get_blob_request (line 196) | def get_blob_request(self) -> typing.Optional[BlobDownloadRequest]:
    method get_address_request (line 201) | def get_address_request(self) -> typing.Optional[BlobPaymentAddressReq...
    method serialize (line 206) | def serialize(self) -> bytes:
    method deserialize (line 210) | def deserialize(cls, data: bytes) -> 'BlobRequest':
    method make_request_for_blob_hash (line 220) | def make_request_for_blob_hash(cls, blob_hash: str) -> 'BlobRequest':
  class BlobResponse (line 226) | class BlobResponse:
    method __init__ (line 227) | def __init__(self, responses: typing.List[blob_response_types], blob_d...
    method to_dict (line 231) | def to_dict(self):
    method _get_response (line 237) | def _get_response(self, response_type: blob_response_types):
    method get_error_response (line 242) | def get_error_response(self) -> typing.Optional[BlobErrorResponse]:
    method get_availability_response (line 248) | def get_availability_response(self) -> typing.Optional[BlobAvailabilit...
    method get_price_response (line 253) | def get_price_response(self) -> typing.Optional[BlobPriceResponse]:
    method get_blob_response (line 258) | def get_blob_response(self) -> typing.Optional[BlobDownloadResponse]:
    method get_address_response (line 263) | def get_address_response(self) -> typing.Optional[BlobPaymentAddressRe...
    method serialize (line 268) | def serialize(self) -> bytes:
    method deserialize (line 272) | def deserialize(cls, data: bytes) -> 'BlobResponse':

FILE: lbry/blob_exchange/server.py
  class BlobServerProtocol (line 20) | class BlobServerProtocol(asyncio.Protocol):
    method __init__ (line 21) | def __init__(self, loop: asyncio.AbstractEventLoop, blob_manager: 'Blo...
    method close_on_idle (line 37) | async def close_on_idle(self):
    method close (line 48) | def close(self):
    method connection_made (line 52) | def connection_made(self, transport):
    method connection_lost (line 59) | def connection_lost(self, exc: typing.Optional[Exception]) -> None:
    method send_response (line 67) | def send_response(self, responses: typing.List[blob_response_types]):
    method handle_request (line 75) | async def handle_request(self, request: BlobRequest):
    method data_received (line 126) | def data_received(self, data):
  class BlobServer (line 154) | class BlobServer:
    method __init__ (line 155) | def __init__(self, loop: asyncio.AbstractEventLoop, blob_manager: 'Blo...
    method start_server (line 166) | def start_server(self, port: int, interface: typing.Optional[str] = '0...
    method stop_server (line 190) | def stop_server(self):

FILE: lbry/conf.py
  class Setting (line 27) | class Setting(Generic[T]):
    method __init__ (line 29) | def __init__(self, doc: str, default: Optional[T] = None,
    method __set_name__ (line 37) | def __set_name__(self, owner, name):
    method cli_name (line 41) | def cli_name(self):
    method no_cli_name (line 45) | def no_cli_name(self):
    method __get__ (line 48) | def __get__(self, obj: Optional['BaseConfig'], owner) -> T:
    method __set__ (line 56) | def __set__(self, obj: 'BaseConfig', val: Union[T, NOT_SET]):
    method is_set (line 66) | def is_set(self, obj: 'BaseConfig') -> bool:
    method is_set_to_default (line 72) | def is_set_to_default(self, obj: 'BaseConfig') -> bool:
    method validate (line 78) | def validate(self, value):
    method deserialize (line 81) | def deserialize(self, value):  # pylint: disable=no-self-use
    method serialize (line 84) | def serialize(self, value):  # pylint: disable=no-self-use
    method contribute_to_argparse (line 87) | def contribute_to_argparse(self, parser: ArgumentParser):
  class String (line 96) | class String(Setting[str]):
    method validate (line 97) | def validate(self, value):
    method __get__ (line 102) | def __get__(self, obj: Optional['BaseConfig'], owner) -> str:  # pylin...
  class Integer (line 106) | class Integer(Setting[int]):
    method validate (line 107) | def validate(self, value):
    method deserialize (line 111) | def deserialize(self, value):
  class Float (line 115) | class Float(Setting[float]):
    method validate (line 116) | def validate(self, value):
    method deserialize (line 120) | def deserialize(self, value):
  class Toggle (line 124) | class Toggle(Setting[bool]):
    method validate (line 125) | def validate(self, value):
    method contribute_to_argparse (line 129) | def contribute_to_argparse(self, parser: ArgumentParser):
  class Path (line 145) | class Path(String):
    method __init__ (line 146) | def __init__(self, doc: str, *args, default: str = '', **kwargs):
    method __get__ (line 149) | def __get__(self, obj, owner) -> str:
  class MaxKeyFee (line 156) | class MaxKeyFee(Setting[dict]):
    method validate (line 158) | def validate(self, value):
    method _parse_list (line 166) | def _parse_list(l):
    method deserialize (line 182) | def deserialize(self, value):
    method contribute_to_argparse (line 196) | def contribute_to_argparse(self, parser: ArgumentParser):
  class StringChoice (line 214) | class StringChoice(String):
    method __init__ (line 215) | def __init__(self, doc: str, valid_values: List[str], default: str, *a...
    method validate (line 223) | def validate(self, value):
  class ListSetting (line 229) | class ListSetting(Setting[list]):
    method validate (line 231) | def validate(self, value):
    method contribute_to_argparse (line 235) | def contribute_to_argparse(self, parser: ArgumentParser):
  class Servers (line 243) | class Servers(ListSetting):
    method validate (line 245) | def validate(self, value):
    method deserialize (line 259) | def deserialize(self, value):
    method serialize (line 271) | def serialize(self, value):
  class Strings (line 277) | class Strings(ListSetting):
    method validate (line 279) | def validate(self, value):
  class KnownHubsList (line 288) | class KnownHubsList:
    method __init__ (line 290) | def __init__(self, config: 'Config' = None, file_name: str = 'known_hu...
    method exists (line 298) | def exists(self):
    method serialized (line 302) | def serialized(self) -> Dict[str, Dict]:
    method filter (line 305) | def filter(self, match_none=False, **kwargs):
    method load (line 317) | def load(self):
    method save (line 324) | def save(self):
    method set (line 329) | def set(self, hub: str, details: Dict):
    method add_hubs (line 337) | def add_hubs(self, hubs: List[str]):
    method items (line 344) | def items(self):
    method __bool__ (line 347) | def __bool__(self):
    method __len__ (line 350) | def __len__(self):
    method __iter__ (line 353) | def __iter__(self):
  class EnvironmentAccess (line 357) | class EnvironmentAccess:
    method __init__ (line 360) | def __init__(self, config: 'BaseConfig', environ: dict):
    method load (line 366) | def load(self, environ):
    method __contains__ (line 372) | def __contains__(self, item: str):
    method __getitem__ (line 375) | def __getitem__(self, item: str):
  class ArgumentAccess (line 379) | class ArgumentAccess:
    method __init__ (line 381) | def __init__(self, config: 'BaseConfig', args: dict):
    method load (line 387) | def load(self, args):
    method __contains__ (line 393) | def __contains__(self, item: str):
    method __getitem__ (line 396) | def __getitem__(self, item: str):
  class ConfigFileAccess (line 400) | class ConfigFileAccess:
    method __init__ (line 402) | def __init__(self, config: 'BaseConfig', path: str):
    method exists (line 410) | def exists(self):
    method load (line 413) | def load(self):
    method save (line 428) | def save(self):
    method upgrade (line 437) | def upgrade(self) -> bool:
    method __contains__ (line 448) | def __contains__(self, item: str):
    method __getitem__ (line 451) | def __getitem__(self, item: str):
    method __setitem__ (line 454) | def __setitem__(self, key, value):
    method __delitem__ (line 457) | def __delitem__(self, key):
  class BaseConfig (line 464) | class BaseConfig:
    method __init__ (line 468) | def __init__(self, **kwargs):
    method update_config (line 478) | def update_config(self):
    method modify_order (line 486) | def modify_order(self):
    method search_order (line 493) | def search_order(self):
    method get_settings (line 502) | def get_settings(cls):
    method settings (line 509) | def settings(self):
    method settings_dict (line 513) | def settings_dict(self):
    method create_from_arguments (line 519) | def create_from_arguments(cls, args) -> TBC:
    method contribute_to_argparse (line 527) | def contribute_to_argparse(cls, parser: ArgumentParser):
    method set_arguments (line 531) | def set_arguments(self, args):
    method set_environment (line 534) | def set_environment(self, environ=None):
    method set_persisted (line 537) | def set_persisted(self, config_file_path=None):
  class TranscodeConfig (line 554) | class TranscodeConfig(BaseConfig):
  class CLIConfig (line 574) | class CLIConfig(TranscodeConfig):
    method api_connection_url (line 579) | def api_connection_url(self) -> str:
    method api_host (line 583) | def api_host(self):
    method api_port (line 587) | def api_port(self):
  class Config (line 591) | class Config(CLIConfig):
    method streaming_host (line 755) | def streaming_host(self):
    method streaming_port (line 759) | def streaming_port(self):
    method __init__ (line 762) | def __init__(self, **kwargs):
    method set_default_paths (line 767) | def set_default_paths(self):
    method log_file_path (line 783) | def log_file_path(self):
  function get_windows_directories (line 787) | def get_windows_directories() -> Tuple[str, str, str]:
  function get_darwin_directories (line 809) | def get_darwin_directories() -> Tuple[str, str, str]:
  function get_linux_directories (line 816) | def get_linux_directories() -> Tuple[str, str, str]:

FILE: lbry/connection_manager.py
  class ConnectionManager (line 15) | class ConnectionManager:
    method __init__ (line 16) | def __init__(self, loop: asyncio.AbstractEventLoop):
    method status (line 29) | def status(self):
    method sent_data (line 32) | def sent_data(self, host_and_port: str, size: int):
    method received_data (line 36) | def received_data(self, host_and_port: str, size: int):
    method connection_made (line 40) | def connection_made(self, host_and_port: str):
    method connection_received (line 44) | def connection_received(self, host_and_port: str):
    method outgoing_connection_lost (line 48) | def outgoing_connection_lost(self, host_and_port: str):
    method incoming_connection_lost (line 52) | def incoming_connection_lost(self, host_and_port: str):
    method _update (line 56) | async def _update(self):
    method stop (line 91) | def stop(self):
    method start (line 102) | def start(self):

FILE: lbry/crypto/base58.py
  class Base58Error (line 5) | class Base58Error(Exception):
  class Base58 (line 9) | class Base58:
    method char_value (line 17) | def char_value(cls, c):
    method decode (line 24) | def decode(cls, txt):
    method encode (line 56) | def encode(cls, be_bytes):
    method decode_check (line 73) | def decode_check(cls, txt, hash_fn=double_sha256):
    method encode_check (line 82) | def encode_check(cls, payload, hash_fn=double_sha256):

FILE: lbry/crypto/crypt.py
  function aes_encrypt (line 14) | def aes_encrypt(secret: str, value: str, init_vector: bytes = None) -> str:
  function aes_decrypt (line 27) | def aes_decrypt(secret: str, value: str) -> typing.Tuple[str, bytes]:
  function better_aes_encrypt (line 44) | def better_aes_encrypt(secret: str, value: bytes) -> bytes:
  function better_aes_decrypt (line 54) | def better_aes_decrypt(secret: str, value: bytes) -> bytes:
  function scrypt (line 69) | def scrypt(passphrase, salt, scrypt_n=1<<13, scrypt_r=16, scrypt_p=1):

FILE: lbry/crypto/hash.py
  function sha256 (line 6) | def sha256(x):
  function sha512 (line 11) | def sha512(x):
  function ripemd160 (line 16) | def ripemd160(x):
  function double_sha256 (line 23) | def double_sha256(x):
  function hmac_sha512 (line 28) | def hmac_sha512(key, msg):
  function hash160 (line 33) | def hash160(x):
  function hash_to_hex_str (line 39) | def hash_to_hex_str(x):
  function hex_str_to_hash (line 45) | def hex_str_to_hash(x):

FILE: lbry/crypto/util.py
  function bytes_to_int (line 4) | def bytes_to_int(be_bytes):
  function int_to_bytes (line 9) | def int_to_bytes(value):

FILE: lbry/dht/blob_announcer.py
  class BlobAnnouncer (line 14) | class BlobAnnouncer:
    method __init__ (line 24) | def __init__(self, loop: asyncio.AbstractEventLoop, node: 'Node', stor...
    method _run_consumer (line 33) | async def _run_consumer(self):
    method _announce (line 47) | async def _announce(self, batch_size: typing.Optional[int] = 10):
    method start (line 69) | def start(self, batch_size: typing.Optional[int] = 10):
    method stop (line 73) | def stop(self):
    method wait (line 77) | def wait(self):

FILE: lbry/dht/constants.py
  function digest (line 26) | def digest(data: bytes) -> bytes:
  function generate_id (line 32) | def generate_id(num=None) -> bytes:
  function generate_rpc_id (line 39) | def generate_rpc_id(num=None) -> bytes:

FILE: lbry/dht/error.py
  class BaseKademliaException (line 1) | class BaseKademliaException(Exception):
  class DecodeError (line 5) | class DecodeError(BaseKademliaException):
  class BucketFull (line 12) | class BucketFull(BaseKademliaException):
  class RemoteException (line 18) | class RemoteException(BaseKademliaException):
  class TransportNotConnected (line 22) | class TransportNotConnected(BaseKademliaException):

FILE: lbry/dht/node.py
  class Node (line 22) | class Node:
    method __init__ (line 31) | def __init__(self, loop: asyncio.AbstractEventLoop, peer_manager: 'Pee...
    method stored_blob_hashes (line 46) | def stored_blob_hashes(self):
    method refresh_node (line 49) | async def refresh_node(self, force_once=False):
    method announce_blob (line 100) | async def announce_blob(self, blob_hash: str) -> typing.List[bytes]:
    method stop (line 123) | def stop(self) -> None:
    method start_listening (line 139) | async def start_listening(self, interface: str = '0.0.0.0') -> None:
    method join_network (line 149) | async def join_network(self, interface: str = '0.0.0.0',
    method start (line 194) | def start(self, interface: str, known_node_urls: typing.Optional[typin...
    method get_iterative_node_finder (line 197) | def get_iterative_node_finder(self, key: bytes, shortlist: typing.Opti...
    method get_iterative_value_finder (line 202) | def get_iterative_value_finder(self, key: bytes, shortlist: typing.Opt...
    method peer_search (line 207) | async def peer_search(self, node_id: bytes, count=constants.K, max_res...
    method _accumulate_peers_for_value (line 219) | async def _accumulate_peers_for_value(self, search_queue: asyncio.Queu...
    method _peers_for_value_producer (line 229) | async def _peers_for_value_producer(self, blob_hash: str, result_queue...
    method accumulate_peers (line 271) | def accumulate_peers(self, search_queue: asyncio.Queue,
  function get_kademlia_peers_from_hosts (line 278) | async def get_kademlia_peers_from_hosts(peer_list: typing.List[typing.Tu...

FILE: lbry/dht/peer.py
  function make_kademlia_peer (line 19) | def make_kademlia_peer(node_id: typing.Optional[bytes], address: typing....
  function is_valid_public_ipv4 (line 26) | def is_valid_public_ipv4(address, allow_localhost: bool = False):
  class PeerManager (line 31) | class PeerManager:
    method __init__ (line 36) | def __init__(self, loop: asyncio.AbstractEventLoop):
    method count_cache_keys (line 48) | def count_cache_keys(self):
    method reset (line 53) | def reset(self):
    method report_failure (line 57) | def report_failure(self, address: str, udp_port: int):
    method report_last_sent (line 62) | def report_last_sent(self, address: str, udp_port: int):
    method report_last_replied (line 66) | def report_last_replied(self, address: str, udp_port: int):
    method report_last_requested (line 70) | def report_last_requested(self, address: str, udp_port: int):
    method clear_token (line 74) | def clear_token(self, node_id: bytes):
    method update_token (line 77) | def update_token(self, node_id: bytes, token: bytes):
    method get_node_token (line 81) | def get_node_token(self, node_id: bytes) -> typing.Optional[bytes]:
    method get_last_replied (line 86) | def get_last_replied(self, address: str, udp_port: int) -> typing.Opti...
    method update_contact_triple (line 89) | def update_contact_triple(self, node_id: bytes, address: str, udp_port...
    method get_node_id_for_endpoint (line 103) | def get_node_id_for_endpoint(self, address, port):
    method prune (line 106) | def prune(self):  # TODO: periodically call this
    method contact_triple_is_good (line 121) | def contact_triple_is_good(self, node_id: bytes, address: str, udp_por...
    method peer_is_good (line 153) | def peer_is_good(self, peer: 'KademliaPeer'):
  function decode_tcp_peer_from_compact_address (line 157) | def decode_tcp_peer_from_compact_address(compact_address: bytes) -> 'Kad...
  class KademliaPeer (line 163) | class KademliaPeer:
    method __post_init__ (line 171) | def __post_init__(self):
    method update_tcp_port (line 182) | def update_tcp_port(self, tcp_port: int):
    method node_id (line 186) | def node_id(self) -> bytes:
    method compact_address_udp (line 189) | def compact_address_udp(self) -> bytearray:
    method compact_address_tcp (line 192) | def compact_address_tcp(self) -> bytearray:
    method compact_ip (line 195) | def compact_ip(self):
    method __str__ (line 198) | def __str__(self):

FILE: lbry/dht/protocol/data_store.py
  class DictDataStore (line 9) | class DictDataStore:
    method __init__ (line 10) | def __init__(self, loop: asyncio.AbstractEventLoop, peer_manager: 'Pee...
    method keys (line 19) | def keys(self):
    method __len__ (line 22) | def __len__(self):
    method removed_expired_peers (line 25) | def removed_expired_peers(self):
    method filter_bad_and_expired_peers (line 38) | def filter_bad_and_expired_peers(self, key: bytes) -> typing.Iterator[...
    method filter_expired_peers (line 46) | def filter_expired_peers(self, key: bytes) -> typing.Iterator['Kademli...
    method has_peers_for_blob (line 55) | def has_peers_for_blob(self, key: bytes) -> bool:
    method add_peer_to_blob (line 58) | def add_peer_to_blob(self, contact: 'KademliaPeer', key: bytes) -> None:
    method get_peers_for_blob (line 69) | def get_peers_for_blob(self, key: bytes) -> typing.List['KademliaPeer']:
    method get_storing_contacts (line 72) | def get_storing_contacts(self) -> typing.List['KademliaPeer']:

FILE: lbry/dht/protocol/distance.py
  class Distance (line 4) | class Distance:
    method __init__ (line 11) | def __init__(self, key: bytes):
    method __call__ (line 17) | def __call__(self, key_two: bytes) -> int:
    method is_closer (line 23) | def is_closer(self, key_a: bytes, key_b: bytes) -> bool:

FILE: lbry/dht/protocol/iterative_find.py
  class FindResponse (line 21) | class FindResponse:
    method found (line 23) | def found(self) -> bool:
    method get_close_triples (line 26) | def get_close_triples(self) -> typing.List[typing.Tuple[bytes, str, in...
    method get_close_kademlia_peers (line 29) | def get_close_kademlia_peers(self, peer_info) -> typing.Generator[typi...
  class FindNodeResponse (line 39) | class FindNodeResponse(FindResponse):
    method __init__ (line 40) | def __init__(self, key: bytes, close_triples: typing.List[typing.Tuple...
    method found (line 45) | def found(self) -> bool:
    method get_close_triples (line 48) | def get_close_triples(self) -> typing.List[typing.Tuple[bytes, str, in...
  class FindValueResponse (line 52) | class FindValueResponse(FindResponse):
    method __init__ (line 53) | def __init__(self, key: bytes, result_dict: typing.Dict):
    method found (line 61) | def found(self) -> bool:
    method get_close_triples (line 64) | def get_close_triples(self) -> typing.List[typing.Tuple[bytes, str, in...
  class IterativeFinder (line 68) | class IterativeFinder(AsyncIterator):
    method __init__ (line 69) | def __init__(self, loop: asyncio.AbstractEventLoop,
    method send_probe (line 99) | async def send_probe(self, peer: 'KademliaPeer') -> FindResponse:
    method search_exhausted (line 105) | def search_exhausted(self):
    method check_result_ready (line 112) | def check_result_ready(self, response: FindResponse):
    method get_initial_result (line 119) | def get_initial_result(self) -> typing.List['KademliaPeer']:  #pylint:...
    method _add_active (line 126) | def _add_active(self, peer, force=False):
    method _handle_probe_result (line 135) | async def _handle_probe_result(self, peer: 'KademliaPeer', response: F...
    method _reset_closest (line 142) | def _reset_closest(self, peer):
    method _send_probe (line 146) | async def _send_probe(self, peer: 'KademliaPeer'):
    method _search_round (line 168) | def _search_round(self):
    method _schedule_probe (line 201) | def _schedule_probe(self, peer: 'KademliaPeer'):
    method _log_state (line 214) | def _log_state(self, reason="?"):
    method __aiter__ (line 220) | def __aiter__(self):
    method __anext__ (line 227) | async def __anext__(self) -> typing.List['KademliaPeer']:
    method _aclose (line 244) | async def _aclose(self, reason="?"):
    method aclose (line 256) | async def aclose(self):
  class IterativeNodeFinder (line 262) | class IterativeNodeFinder(IterativeFinder):
    method __init__ (line 263) | def __init__(self, loop: asyncio.AbstractEventLoop,
    method send_probe (line 270) | async def send_probe(self, peer: 'KademliaPeer') -> FindNodeResponse:
    method search_exhausted (line 276) | def search_exhausted(self):
    method put_result (line 279) | def put_result(self, from_iter: typing.Iterable['KademliaPeer'], finis...
    method check_result_ready (line 294) | def check_result_ready(self, response: FindNodeResponse):
  class IterativeValueFinder (line 302) | class IterativeValueFinder(IterativeFinder):
    method __init__ (line 303) | def __init__(self, loop: asyncio.AbstractEventLoop,
    method send_probe (line 314) | async def send_probe(self, peer: 'KademliaPeer') -> FindValueResponse:
    method check_result_ready (line 346) | def check_result_ready(self, response: FindValueResponse):
    method get_initial_result (line 358) | def get_initial_result(self) -> typing.List['KademliaPeer']:

FILE: lbry/dht/protocol/protocol.py
  class KademliaRPC (line 35) | class KademliaRPC:
    method __init__ (line 41) | def __init__(self, protocol: 'KademliaProtocol', loop: asyncio.Abstrac...
    method compact_address (line 48) | def compact_address(self):
    method ping (line 55) | def ping():
    method store (line 58) | def store(self, rpc_contact: 'KademliaPeer', blob_hash: bytes, token: ...
    method find_node (line 75) | def find_node(self, rpc_contact: 'KademliaPeer', key: bytes) -> typing...
    method find_value (line 85) | def find_value(self, rpc_contact: 'KademliaPeer', key: bytes, page: in...
    method refresh_token (line 120) | def refresh_token(self):  # TODO: this needs to be called periodically
    method make_token (line 124) | def make_token(self, compact_ip):
    method verify_token (line 129) | def verify_token(self, token, compact_ip):
  class RemoteKademliaRPC (line 140) | class RemoteKademliaRPC:
    method __init__ (line 145) | def __init__(self, loop: asyncio.AbstractEventLoop, peer_tracker: 'Pee...
    method ping (line 152) | async def ping(self) -> bytes:
    method store (line 161) | async def store(self, blob_hash: bytes) -> bytes:
    method find_node (line 179) | async def find_node(self, key: bytes) -> typing.List[typing.Tuple[byte...
    method find_value (line 190) | async def find_value(self, key: bytes, page: int = 0) -> typing.Union[...
  class PingQueue (line 207) | class PingQueue:
    method __init__ (line 208) | def __init__(self, loop: asyncio.AbstractEventLoop, protocol: 'Kademli...
    method running (line 218) | def running(self):
    method busy (line 222) | def busy(self):
    method enqueue_maybe_ping (line 225) | def enqueue_maybe_ping(self, *peers: 'KademliaPeer', delay: typing.Opt...
    method maybe_ping (line 232) | def maybe_ping(self, peer: 'KademliaPeer'):
    method _process (line 247) | async def _process(self):  # send up to 1 ping per second
    method start (line 258) | def start(self):
    method stop (line 264) | def stop(self):
  class KademliaProtocol (line 274) | class KademliaProtocol(DatagramProtocol):
    method __init__ (line 299) | def __init__(self, loop: asyncio.AbstractEventLoop, peer_manager: 'Pee...
    method get_rpc_peer (line 329) | def get_rpc_peer(self, peer: 'KademliaPeer') -> RemoteKademliaRPC:
    method start (line 332) | def start(self):
    method stop (line 335) | def stop(self):
    method disconnect (line 341) | def disconnect(self):
    method connection_made (line 344) | def connection_made(self, transport: DatagramTransport):
    method connection_lost (line 347) | def connection_lost(self, exc):
    method _migrate_incoming_rpc_args (line 351) | def _migrate_incoming_rpc_args(peer: 'KademliaPeer', method: bytes, *a...
    method _add_peer (line 363) | async def _add_peer(self, peer: 'KademliaPeer'):
    method add_peer (line 369) | def add_peer(self, peer: 'KademliaPeer'):
    method remove_peer (line 375) | def remove_peer(self, peer: 'KademliaPeer'):
    method routing_table_task (line 379) | async def routing_table_task(self):
    method _handle_rpc (line 391) | def _handle_rpc(self, sender_contact: 'KademliaPeer', message: Request...
    method handle_request_datagram (line 423) | def handle_request_datagram(self, address: typing.Tuple[str, int], req...
    method handle_response_datagram (line 463) | def handle_response_datagram(self, address: typing.Tuple[str, int], re...
    method handle_error_datagram (line 494) | def handle_error_datagram(self, address, error_datagram: ErrorDatagram):
    method datagram_received (line 533) | def datagram_received(self, datagram: bytes, address: typing.Tuple[str...
    method send_request (line 549) | async def send_request(self, peer: 'KademliaPeer', request: RequestDat...
    method send_response (line 571) | def send_response(self, peer: 'KademliaPeer', response: ResponseDatagr...
    method send_error (line 574) | def send_error(self, peer: 'KademliaPeer', error: ErrorDatagram):
    method _send (line 577) | def _send(self, peer: 'KademliaPeer', message: typing.Union[RequestDat...
    method change_token (line 622) | def change_token(self):
    method make_token (line 626) | def make_token(self, compact_ip):
    method verify_token (line 629) | def verify_token(self, token, compact_ip):
    method store_to_peer (line 639) | async def store_to_peer(self, hash_value: bytes, peer: 'KademliaPeer',...

FILE: lbry/dht/protocol/routing_table.py
  class KBucket (line 19) | class KBucket:
    method __init__ (line 32) | def __init__(self, peer_manager: 'PeerManager', range_min: int, range_...
    method add_peer (line 48) | def add_peer(self, peer: 'KademliaPeer') -> bool:
    method get_peer (line 82) | def get_peer(self, node_id: bytes) -> 'KademliaPeer':
    method get_peers (line 87) | def get_peers(self, count=-1, exclude_contact=None, sort_distance_to=N...
    method get_bad_or_unknown_peers (line 133) | def get_bad_or_unknown_peers(self) -> typing.List['KademliaPeer']:
    method remove_peer (line 140) | def remove_peer(self, peer: 'KademliaPeer') -> None:
    method key_in_range (line 146) | def key_in_range(self, key: bytes) -> bool:
    method __len__ (line 161) | def __len__(self) -> int:
    method __contains__ (line 164) | def __contains__(self, item) -> bool:
  class TreeRoutingTable (line 168) | class TreeRoutingTable:
    method __init__ (line 195) | def __init__(self, loop: asyncio.AbstractEventLoop, peer_manager: 'Pee...
    method get_peers (line 208) | def get_peers(self) -> typing.List['KademliaPeer']:
    method _should_split (line 211) | def _should_split(self, bucket_index: int, to_add: bytes) -> bool:
    method find_close_peers (line 221) | def find_close_peers(self, key: bytes, count: typing.Optional[int] = N...
    method get_peer (line 235) | def get_peer(self, contact_id: bytes) -> 'KademliaPeer':
    method get_refresh_list (line 238) | def get_refresh_list(self, start_index: int = 0, force: bool = False) ...
    method remove_peer (line 251) | def remove_peer(self, peer: 'KademliaPeer') -> None:
    method _kbucket_index (line 261) | def _kbucket_index(self, key: bytes) -> int:
    method _random_id_in_bucket_range (line 270) | def _random_id_in_bucket_range(self, bucket_index: int) -> bytes:
    method _midpoint_id_in_bucket_range (line 276) | def _midpoint_id_in_bucket_range(self, bucket_index: int) -> bytes:
    method _split_bucket (line 282) | def _split_bucket(self, old_bucket_index: int) -> None:
    method _join_buckets (line 307) | def _join_buckets(self):
    method buckets_with_contacts (line 332) | def buckets_with_contacts(self) -> int:
    method add_peer (line 339) | async def add_peer(self, peer: 'KademliaPeer', probe: typing.Callable[...

FILE: lbry/dht/serialization/bencoding.py
  function _bencode (line 5) | def _bencode(data: typing.Union[int, bytes, bytearray, str, list, tuple,...
  function _bdecode (line 28) | def _bdecode(data: bytes, start_index: int = 0) -> typing.Tuple[typing.U...
  function bencode (line 58) | def bencode(data: typing.Dict) -> bytes:
  function bdecode (line 64) | def bdecode(data: bytes, allow_non_dict_return: typing.Optional[bool] = ...

FILE: lbry/dht/serialization/datagram.py
  class KademliaDatagramBase (line 18) | class KademliaDatagramBase:
    method __init__ (line 33) | def __init__(self, packet_type: int, rpc_id: bytes, node_id: bytes):
    method bencode (line 44) | def bencode(self) -> bytes:
  class RequestDatagram (line 55) | class RequestDatagram(KademliaDatagramBase):
    method __init__ (line 66) | def __init__(self, packet_type: int, rpc_id: bytes, node_id: bytes, me...
    method make_ping (line 79) | def make_ping(cls, from_node_id: bytes, rpc_id: typing.Optional[bytes]...
    method make_store (line 84) | def make_store(cls, from_node_id: bytes, blob_hash: bytes, token: byte...
    method make_find_node (line 97) | def make_find_node(cls, from_node_id: bytes, key: bytes,
    method make_find_value (line 105) | def make_find_value(cls, from_node_id: bytes, key: bytes,
  class ResponseDatagram (line 115) | class ResponseDatagram(KademliaDatagramBase):
    method __init__ (line 125) | def __init__(self, packet_type: int, rpc_id: bytes, node_id: bytes, re...
  class ErrorDatagram (line 130) | class ErrorDatagram(KademliaDatagramBase):
    method __init__ (line 141) | def __init__(self, packet_type: int, rpc_id: bytes, node_id: bytes, ex...
  function _decode_datagram (line 147) | def _decode_datagram(datagram: bytes):
  function decode_datagram (line 176) | def decode_datagram(datagram: bytes) -> typing.Union[RequestDatagram, Re...
  function make_compact_ip (line 181) | def make_compact_ip(address: str) -> bytearray:
  function make_compact_address (line 188) | def make_compact_address(node_id: bytes, address: str, port: int) -> byt...
  function decode_compact_address (line 197) | def decode_compact_address(compact_address: bytes) -> typing.Tuple[bytes...

FILE: lbry/error/__init__.py
  class UserInputError (line 4) | class UserInputError(BaseError):
  class CommandError (line 10) | class CommandError(UserInputError):
  class CommandDoesNotExistError (line 16) | class CommandDoesNotExistError(CommandError):
    method __init__ (line 18) | def __init__(self, command):
  class CommandDeprecatedError (line 23) | class CommandDeprecatedError(CommandError):
    method __init__ (line 25) | def __init__(self, command):
  class CommandInvalidArgumentError (line 30) | class CommandInvalidArgumentError(CommandError):
    method __init__ (line 32) | def __init__(self, argument, command):
  class CommandTemporarilyUnavailableError (line 38) | class CommandTemporarilyUnavailableError(CommandError):
    method __init__ (line 43) | def __init__(self, command):
  class CommandPermanentlyUnavailableError (line 48) | class CommandPermanentlyUnavailableError(CommandError):
    method __init__ (line 53) | def __init__(self, command):
  class InputValueError (line 58) | class InputValueError(UserInputError, ValueError):
  class GenericInputValueError (line 64) | class GenericInputValueError(InputValueError):
    method __init__ (line 66) | def __init__(self, value, argument):
  class InputValueIsNoneError (line 72) | class InputValueIsNoneError(InputValueError):
    method __init__ (line 74) | def __init__(self, argument):
  class ConflictingInputValueError (line 79) | class ConflictingInputValueError(InputValueError):
    method __init__ (line 81) | def __init__(self, first_argument, second_argument):
  class InputStringIsBlankError (line 87) | class InputStringIsBlankError(InputValueError):
    method __init__ (line 89) | def __init__(self, argument):
  class EmptyPublishedFileError (line 94) | class EmptyPublishedFileError(InputValueError):
    method __init__ (line 96) | def __init__(self, file_path):
  class MissingPublishedFileError (line 101) | class MissingPublishedFileError(InputValueError):
    method __init__ (line 103) | def __init__(self, file_path):
  class InvalidStreamURLError (line 108) | class InvalidStreamURLError(InputValueError):
    method __init__ (line 113) | def __init__(self, url):
  class ConfigurationError (line 118) | class ConfigurationError(BaseError):
  class ConfigWriteError (line 124) | class ConfigWriteError(ConfigurationError):
    method __init__ (line 129) | def __init__(self, path):
  class ConfigReadError (line 134) | class ConfigReadError(ConfigurationError):
    method __init__ (line 139) | def __init__(self, path):
  class ConfigParseError (line 144) | class ConfigParseError(ConfigurationError):
    method __init__ (line 149) | def __init__(self, path):
  class ConfigMissingError (line 154) | class ConfigMissingError(ConfigurationError):
    method __init__ (line 156) | def __init__(self, path):
  class ConfigInvalidError (line 161) | class ConfigInvalidError(ConfigurationError):
    method __init__ (line 163) | def __init__(self, path):
  class NetworkError (line 168) | class NetworkError(BaseError):
  class NoInternetError (line 174) | class NoInternetError(NetworkError):
    method __init__ (line 176) | def __init__(self):
  class NoUPnPSupportError (line 180) | class NoUPnPSupportError(NetworkError):
    method __init__ (line 182) | def __init__(self):
  class WalletError (line 186) | class WalletError(BaseError):
  class TransactionRejectedError (line 192) | class TransactionRejectedError(WalletError):
    method __init__ (line 194) | def __init__(self):
  class TransactionFeeTooLowError (line 198) | class TransactionFeeTooLowError(WalletError):
    method __init__ (line 200) | def __init__(self):
  class TransactionInvalidSignatureError (line 204) | class TransactionInvalidSignatureError(WalletError):
    method __init__ (line 206) | def __init__(self):
  class InsufficientFundsError (line 210) | class InsufficientFundsError(WalletError):
    method __init__ (line 216) | def __init__(self):
  class ChannelKeyNotFoundError (line 220) | class ChannelKeyNotFoundError(WalletError):
    method __init__ (line 222) | def __init__(self):
  class ChannelKeyInvalidError (line 226) | class ChannelKeyInvalidError(WalletError):
    method __init__ (line 231) | def __init__(self):
  class DataDownloadError (line 235) | class DataDownloadError(WalletError):
    method __init__ (line 237) | def __init__(self):
  class PrivateKeyNotFoundError (line 241) | class PrivateKeyNotFoundError(WalletError):
    method __init__ (line 243) | def __init__(self, key, value):
  class ResolveError (line 249) | class ResolveError(WalletError):
    method __init__ (line 251) | def __init__(self, url):
  class ResolveTimeoutError (line 256) | class ResolveTimeoutError(WalletError):
    method __init__ (line 258) | def __init__(self, url):
  class ResolveCensoredError (line 263) | class ResolveCensoredError(WalletError):
    method __init__ (line 265) | def __init__(self, url, censor_id, censor_row):
  class KeyFeeAboveMaxAllowedError (line 272) | class KeyFeeAboveMaxAllowedError(WalletError):
    method __init__ (line 274) | def __init__(self, message):
  class InvalidPasswordError (line 279) | class InvalidPasswordError(WalletError):
    method __init__ (line 281) | def __init__(self):
  class IncompatibleWalletServerError (line 285) | class IncompatibleWalletServerError(WalletError):
    method __init__ (line 287) | def __init__(self, server, port):
  class TooManyClaimSearchParametersError (line 293) | class TooManyClaimSearchParametersError(WalletError):
    method __init__ (line 295) | def __init__(self, key, limit):
  class AlreadyPurchasedError (line 301) | class AlreadyPurchasedError(WalletError):
    method __init__ (line 306) | def __init__(self, claim_id_hex):
  class ServerPaymentInvalidAddressError (line 311) | class ServerPaymentInvalidAddressError(WalletError):
    method __init__ (line 313) | def __init__(self, address):
  class ServerPaymentWalletLockedError (line 318) | class ServerPaymentWalletLockedError(WalletError):
    method __init__ (line 320) | def __init__(self):
  class ServerPaymentFeeAboveMaxAllowedError (line 324) | class ServerPaymentFeeAboveMaxAllowedError(WalletError):
    method __init__ (line 326) | def __init__(self, daily_fee, max_fee):
  class WalletNotLoadedError (line 332) | class WalletNotLoadedError(WalletError):
    method __init__ (line 334) | def __init__(self, wallet_id):
  class WalletAlreadyLoadedError (line 339) | class WalletAlreadyLoadedError(WalletError):
    method __init__ (line 341) | def __init__(self, wallet_path):
  class WalletNotFoundError (line 346) | class WalletNotFoundError(WalletError):
    method __init__ (line 348) | def __init__(self, wallet_path):
  class WalletAlreadyExistsError (line 353) | class WalletAlreadyExistsError(WalletError):
    method __init__ (line 355) | def __init__(self, wallet_path):
  class BlobError (line 360) | class BlobError(BaseError):
  class BlobNotFoundError (line 366) | class BlobNotFoundError(BlobError):
    method __init__ (line 368) | def __init__(self):
  class BlobPermissionDeniedError (line 372) | class BlobPermissionDeniedError(BlobError):
    method __init__ (line 374) | def __init__(self):
  class BlobTooBigError (line 378) | class BlobTooBigError(BlobError):
    method __init__ (line 380) | def __init__(self):
  class BlobEmptyError (line 384) | class BlobEmptyError(BlobError):
    method __init__ (line 386) | def __init__(self):
  class BlobFailedDecryptionError (line 390) | class BlobFailedDecryptionError(BlobError):
    method __init__ (line 392) | def __init__(self):
  class CorruptBlobError (line 396) | class CorruptBlobError(BlobError):
    method __init__ (line 398) | def __init__(self):
  class BlobFailedEncryptionError (line 402) | class BlobFailedEncryptionError(BlobError):
    method __init__ (line 404) | def __init__(self):
  class DownloadCancelledError (line 408) | class DownloadCancelledError(BlobError):
    method __init__ (line 410) | def __init__(self):
  class DownloadSDTimeoutError (line 414) | class DownloadSDTimeoutError(BlobError):
    method __init__ (line 416) | def __init__(self, download):
  class DownloadDataTimeoutError (line 421) | class DownloadDataTimeoutError(BlobError):
    method __init__ (line 423) | def __init__(self, download):
  class InvalidStreamDescriptorError (line 428) | class InvalidStreamDescriptorError(BlobError):
    method __init__ (line 430) | def __init__(self, message):
  class InvalidDataError (line 435) | class InvalidDataError(BlobError):
    method __init__ (line 437) | def __init__(self, message):
  class InvalidBlobHashError (line 442) | class InvalidBlobHashError(BlobError):
    method __init__ (line 444) | def __init__(self, message):
  class ComponentError (line 449) | class ComponentError(BaseError):
  class ComponentStartConditionNotMetError (line 455) | class ComponentStartConditionNotMetError(ComponentError):
    method __init__ (line 457) | def __init__(self, components):
  class ComponentsNotStartedError (line 462) | class ComponentsNotStartedError(ComponentError):
    method __init__ (line 464) | def __init__(self, message):
  class CurrencyExchangeError (line 469) | class CurrencyExchangeError(BaseError):
  class InvalidExchangeRateResponseError (line 475) | class InvalidExchangeRateResponseError(CurrencyExchangeError):
    method __init__ (line 477) | def __init__(self, source, reason):
  class CurrencyConversionError (line 483) | class CurrencyConversionError(CurrencyExchangeError):
    method __init__ (line 485) | def __init__(self, message):
  class InvalidCurrencyError (line 490) | class InvalidCurrencyError(CurrencyExchangeError):
    method __init__ (line 492) | def __init__(self, currency):

FILE: lbry/error/base.py
  function claim_id (line 4) | def claim_id(claim_hash):
  class BaseError (line 8) | class BaseError(Exception):

FILE: lbry/error/generate.py
  class ErrorClass (line 23) | class ErrorClass:
    method __init__ (line 25) | def __init__(self, hierarchy, name, message):
    method is_leaf (line 42) | def is_leaf(self):
    method code (line 46) | def code(self):
    method parent_codes (line 50) | def parent_codes(self):
    method get_arguments (line 53) | def get_arguments(self):
    method get_fields (line 64) | def get_fields(args):
    method get_doc_string (line 70) | def get_doc_string(doc):
    method render (line 75) | def render(self, out, parent):
  function get_errors (line 95) | def get_errors():
  function find_parent (line 110) | def find_parent(stack, child):
  function generate (line 117) | def generate(out):
  function analyze (line 127) | def analyze():
  function main (line 156) | def main():

FILE: lbry/extras/cli.py
  function display (line 23) | def display(data):
  function execute_command (line 27) | async def execute_command(conf, method, params, callback=display):
  function normalize_value (line 44) | def normalize_value(x, key=None):
  function remove_brackets (line 58) | def remove_brackets(key):
  function set_kwargs (line 64) | def set_kwargs(parsed_args):
  function split_subparser_argument (line 78) | def split_subparser_argument(parent, original, name, condition):
  class ArgumentParser (line 94) | class ArgumentParser(argparse.ArgumentParser):
    method __init__ (line 95) | def __init__(self, *args, group_name=None, **kwargs):
    method format_help (line 112) | def format_help(self):
    method _granular_action_groups (line 130) | def _granular_action_groups(self):
    method error (line 143) | def error(self, message):
  class HelpFormatter (line 148) | class HelpFormatter(argparse.HelpFormatter):
    method add_usage (line 150) | def add_usage(self, usage, actions, groups, prefix='Usage:  '):
  function add_command_parser (line 156) | def add_command_parser(parent, command):
  function get_argument_parser (line 169) | def get_argument_parser():
  function ensure_directory_exists (line 226) | def ensure_directory_exists(path: str):
  function setup_logging (line 237) | def setup_logging(logger: logging.Logger, args: argparse.Namespace, conf...
  function run_daemon (line 261) | def run_daemon(args: argparse.Namespace, conf: Config):
  function main (line 291) | def main(argv=None):

FILE: lbry/extras/daemon/analytics.py
  function _event_properties (line 36) | def _event_properties(installation_id: str, session_id: str,
  function _download_properties (line 46) | def _download_properties(conf: Config, external_ip: str, resolve_duratio...
  function _make_context (line 88) | def _make_context(platform):
  class AnalyticsManager (line 108) | class AnalyticsManager:
    method __init__ (line 109) | def __init__(self, conf: Config, installation_id: str, session_id: str):
    method enabled (line 122) | def enabled(self):
    method is_started (line 126) | def is_started(self):
    method start (line 129) | async def start(self):
    method run (line 133) | async def run(self):
    method stop (line 140) | def stop(self):
    method _post (line 144) | async def _post(self, data: typing.Dict):
    method track (line 159) | async def track(self, event: typing.Dict):
    method send_upnp_setup_success_fail (line 165) | async def send_upnp_setup_success_fail(self, success, status):
    method send_disk_space_used (line 173) | async def send_disk_space_used(self, storage_used, storage_limit, is_f...
    method send_server_startup (line 182) | async def send_server_startup(self):
    method send_server_startup_success (line 185) | async def send_server_startup_success(self):
    method send_server_startup_error (line 188) | async def send_server_startup_error(self, message):
    method send_time_to_first_bytes (line 191) | async def send_time_to_first_bytes(self, resolve_duration: typing.Opti...
    method send_download_finished (line 213) | async def send_download_finished(self, download_id, name, sd_hash):
    method send_claim_action (line 224) | async def send_claim_action(self, action):
    method send_new_channel (line 227) | async def send_new_channel(self):
    method send_credits_sent (line 230) | async def send_credits_sent(self):
    method _send_heartbeat (line 233) | async def _send_heartbeat(self):
    method _event (line 236) | def _event(self, event, properties: typing.Optional[typing.Dict] = None):

FILE: lbry/extras/daemon/client.py
  function daemon_rpc (line 5) | def daemon_rpc(conf: Config, method: str, **kwargs):

FILE: lbry/extras/daemon/component.py
  class ComponentType (line 9) | class ComponentType(type):
    method __new__ (line 10) | def __new__(mcs, name, bases, newattrs):
  class Component (line 17) | class Component(metaclass=ComponentType):
    method __init__ (line 28) | def __init__(self, component_manager):
    method __lt__ (line 33) | def __lt__(self, other):
    method running (line 37) | def running(self):
    method get_status (line 40) | async def get_status(self): # pylint: disable=no-self-use
    method start (line 43) | async def start(self):
    method stop (line 46) | async def stop(self):
    method component (line 50) | def component(self):
    method _setup (line 53) | async def _setup(self):
    method _stop (line 65) | async def _stop(self):

FILE: lbry/extras/daemon/componentmanager.py
  class RegisteredConditions (line 10) | class RegisteredConditions:
  class RequiredConditionType (line 14) | class RequiredConditionType(type):
    method __new__ (line 15) | def __new__(mcs, name, bases, newattrs):
  class RequiredCondition (line 24) | class RequiredCondition(metaclass=RequiredConditionType):
    method evaluate (line 30) | def evaluate(component):
  class ComponentManager (line 34) | class ComponentManager:
    method __init__ (line 37) | def __init__(self, conf: Config, analytics_manager=None, skip_componen...
    method evaluate_condition (line 60) | def evaluate_condition(self, condition_name):
    method sort_components (line 72) | def sort_components(self, reverse=False):
    method start (line 114) | async def start(self):
    method stop (line 124) | async def stop(self):
    method all_components_running (line 136) | def all_components_running(self, *component_names):
    method get_components_status (line 150) | def get_components_status(self):
    method get_actual_component (line 161) | def get_actual_component(self, component_name):
    method get_component (line 167) | def get_component(self, component_name):
    method has_component (line 170) | def has_component(self, component_name):

FILE: lbry/extras/daemon/components.py
  class DatabaseComponent (line 53) | class DatabaseComponent(Component):
    method __init__ (line 56) | def __init__(self, component_manager):
    method component (line 61) | def component(self):
    method get_current_db_revision (line 65) | def get_current_db_revision():
    method revision_filename (line 69) | def revision_filename(self):
    method _write_db_revision_file (line 72) | def _write_db_revision_file(self, version_num):
    method start (line 76) | async def start(self):
    method stop (line 106) | async def stop(self):
  class WalletComponent (line 111) | class WalletComponent(Component):
    method __init__ (line 115) | def __init__(self, component_manager):
    method component (line 120) | def component(self):
    method get_status (line 123) | async def get_status(self):
    method start (line 168) | async def start(self):
    method stop (line 173) | async def stop(self):
  class WalletServerPaymentsComponent (line 178) | class WalletServerPaymentsComponent(Component):
    method __init__ (line 182) | def __init__(self, component_manager):
    method component (line 189) | def component(self) -> typing.Optional[WalletServerPayer]:
    method start (line 192) | async def start(self):
    method stop (line 196) | async def stop(self):
    method get_status (line 199) | async def get_status(self):
  class BlobComponent (line 206) | class BlobComponent(Component):
    method __init__ (line 210) | def __init__(self, component_manager):
    method component (line 215) | def component(self) -> typing.Optional[BlobManager]:
    method start (line 218) | async def start(self):
    method stop (line 231) | async def stop(self):
    method get_status (line 234) | async def get_status(self):
  class DHTComponent (line 244) | class DHTComponent(Component):
    method __init__ (line 248) | def __init__(self, component_manager):
    method component (line 255) | def component(self) -> typing.Optional[Node]:
    method get_status (line 258) | async def get_status(self):
    method get_node_id (line 264) | def get_node_id(self):
    method start (line 274) | async def start(self):
    method stop (line 302) | async def stop(self):
  class HashAnnouncerComponent (line 306) | class HashAnnouncerComponent(Component):
    method __init__ (line 310) | def __init__(self, component_manager):
    method component (line 315) | def component(self) -> typing.Optional[BlobAnnouncer]:
    method start (line 318) | async def start(self):
    method stop (line 325) | async def stop(self):
    method get_status (line 329) | async def get_status(self):
  class FileManagerComponent (line 335) | class FileManagerComponent(Component):
    method __init__ (line 339) | def __init__(self, component_manager):
    method component (line 344) | def component(self) -> typing.Optional[FileManager]:
    method get_status (line 347) | async def get_status(self):
    method start (line 354) | async def start(self):
    method stop (line 376) | async def stop(self):
  class BackgroundDownloaderComponent (line 380) | class BackgroundDownloaderComponent(Component):
    method __init__ (line 385) | def __init__(self, component_manager):
    method is_busy (line 397) | def is_busy(self):
    method component (line 401) | def component(self) -> 'BackgroundDownloaderComponent':
    method get_status (line 404) | async def get_status(self):
    method download_blobs_in_background (line 409) | async def download_blobs_in_background(self):
    method _download_next_close_blob_hash (line 416) | def _download_next_close_blob_hash(self):
    method start (line 425) | async def start(self):
    method stop (line 435) | async def stop(self):
  class DiskSpaceComponent (line 442) | class DiskSpaceComponent(Component):
    method __init__ (line 446) | def __init__(self, component_manager):
    method component (line 451) | def component(self) -> typing.Optional[DiskSpaceManager]:
    method get_status (line 454) | async def get_status(self):
    method start (line 466) | async def start(self):
    method stop (line 475) | async def stop(self):
  class TorrentComponent (line 479) | class TorrentComponent(Component):
    method __init__ (line 482) | def __init__(self, component_manager):
    method component (line 487) | def component(self) -> typing.Optional[TorrentSession]:
    method get_status (line 490) | async def get_status(self):
    method start (line 497) | async def start(self):
    method stop (line 501) | async def stop(self):
  class PeerProtocolServerComponent (line 506) | class PeerProtocolServerComponent(Component):
    method __init__ (line 510) | def __init__(self, component_manager):
    method component (line 515) | def component(self) -> typing.Optional[BlobServer]:
    method start (line 518) | async def start(self):
    method stop (line 528) | async def stop(self):
  class UPnPComponent (line 533) | class UPnPComponent(Component):
    method __init__ (line 536) | def __init__(self, component_manager):
    method component (line 547) | def component(self) -> 'UPnPComponent':
    method _repeatedly_maintain_redirects (line 550) | async def _repeatedly_maintain_redirects(self, now=True):
    method _maintain_redirects (line 556) | async def _maintain_redirects(self):
    method start (line 636) | async def start(self):
    method stop (line 669) | async def stop(self):
    method get_status (line 678) | async def get_status(self):
  class ExchangeRateManagerComponent (line 689) | class ExchangeRateManagerComponent(Component):
    method __init__ (line 692) | def __init__(self, component_manager):
    method component (line 697) | def component(self) -> ExchangeRateManager:
    method start (line 700) | async def start(self):
    method stop (line 703) | async def stop(self):
  class TrackerAnnouncerComponent (line 707) | class TrackerAnnouncerComponent(Component):
    method __init__ (line 711) | def __init__(self, component_manager):
    method component (line 718) | def component(self):
    method running (line 722) | def running(self):
    method announce_forever (line 725) | async def announce_forever(self):
    method start (line 736) | async def start(self):
    method stop (line 745) | async def stop(self):

FILE: lbry/extras/daemon/daemon.py
  function is_transactional_function (line 94) | def is_transactional_function(name):
  function requires (line 100) | def requires(*components, **conditions):
  function deprecated (line 124) | def deprecated(new_command=None):
  function encode_pagination_doc (line 155) | def encode_pagination_doc(items):
  function paginate_rows (line 165) | async def paginate_rows(get_records: Callable, get_record_count: Optiona...
  function paginate_list (line 182) | def paginate_list(items: List, page: Optional[int], page_size: Optional[...
  class DHTHasContacts (line 201) | class DHTHasContacts(RequiredCondition):
    method evaluate (line 207) | def evaluate(component):
  class JSONRPCError (line 211) | class JSONRPCError:
    method __init__ (line 240) | def __init__(self, code: int, message: str, data: dict = None):
    method to_dict (line 248) | def to_dict(self):
    method filter_traceback (line 256) | def filter_traceback(traceback):
    method create_command_exception (line 268) | def create_command_exception(cls, command, args, kwargs, exception, tr...
  class UnknownAPIMethodError (line 282) | class UnknownAPIMethodError(Exception):
  function jsonrpc_dumps_pretty (line 286) | def jsonrpc_dumps_pretty(obj, **kwargs):
  function trap (line 294) | def trap(err, *to_trap):
  class JSONRPCServerType (line 298) | class JSONRPCServerType(type):
    method __new__ (line 299) | def __new__(mcs, name, bases, newattrs):
  class Daemon (line 319) | class Daemon(metaclass=JSONRPCServerType):
    method __init__ (line 348) | def __init__(self, conf: Config, component_manager: typing.Optional[Co...
    method dht_node (line 381) | def dht_node(self) -> typing.Optional['Node']:
    method wallet_manager (line 385) | def wallet_manager(self) -> typing.Optional['WalletManager']:
    method storage (line 389) | def storage(self) -> typing.Optional['SQLiteStorage']:
    method file_manager (line 393) | def file_manager(self) -> typing.Optional['FileManager']:
    method exchange_rate_manager (line 397) | def exchange_rate_manager(self) -> typing.Optional['ExchangeRateManage...
    method blob_manager (line 401) | def blob_manager(self) -> typing.Optional['BlobManager']:
    method disk_space_manager (line 405) | def disk_space_manager(self) -> typing.Optional['DiskSpaceManager']:
    method upnp (line 409) | def upnp(self) -> typing.Optional['UPnPComponent']:
    method get_api_definitions (line 413) | def get_api_definitions(cls):
    method db_revision_file_path (line 457) | def db_revision_file_path(self):
    method installation_id (line 461) | def installation_id(self):
    method ensure_data_dir (line 473) | def ensure_data_dir(self):
    method ensure_wallet_dir (line 480) | def ensure_wallet_dir(self):
    method ensure_download_dir (line 484) | def ensure_download_dir(self):
    method start (line 488) | async def start(self):
    method initialize (line 541) | async def initialize(self):
    method stop (line 550) | async def stop(self):
    method add_cors_headers (line 573) | async def add_cors_headers(self, request):
    method handle_old_jsonrpc (line 584) | async def handle_old_jsonrpc(self, request):
    method handle_metrics_get_request (line 618) | async def handle_metrics_get_request(request: web.Request):
    method handle_stream_get_request (line 628) | async def handle_stream_get_request(self, request: web.Request):
    method handle_stream_range_request (line 645) | async def handle_stream_range_request(self, request: web.Request):
    method _handle_stream_range_request (line 661) | async def _handle_stream_range_request(self, request: web.Request):
    method _process_rpc_call (line 669) | async def _process_rpc_call(self, data):
    method _verify_method_is_callable (line 743) | def _verify_method_is_callable(self, function_path):
    method _get_jsonrpc_method (line 747) | def _get_jsonrpc_method(self, function_path):
    method _check_params (line 757) | def _check_params(function, args_tup, args_dict):
    method ledger (line 789) | def ledger(self) -> Optional['Ledger']:
    method get_est_cost_from_uri (line 795) | async def get_est_cost_from_uri(self, uri: str) -> typing.Optional[flo...
    method jsonrpc_stop (line 825) | def jsonrpc_stop(self):  # pylint: disable=no-self-use
    method jsonrpc_ffmpeg_find (line 846) | async def jsonrpc_ffmpeg_find(self):
    method jsonrpc_status (line 866) | async def jsonrpc_status(self):
    method jsonrpc_version (line 977) | def jsonrpc_version(self):  # pylint: disable=no-self-use
    method jsonrpc_resolve (line 1002) | async def jsonrpc_resolve(self, urls: typing.Union[str, list], wallet_...
    method jsonrpc_get (line 1113) | async def jsonrpc_get(
    method jsonrpc_settings_get (line 1154) | def jsonrpc_settings_get(self):
    method jsonrpc_settings_set (line 1170) | def jsonrpc_settings_set(self, key, value):
    method jsonrpc_settings_clear (line 1191) | def jsonrpc_settings_clear(self, key):
    method jsonrpc_preference_get (line 1212) | def jsonrpc_preference_get(self, key=None, wallet_id=None):
    method jsonrpc_preference_set (line 1233) | def jsonrpc_preference_set(self, key, value, wallet_id=None):
    method jsonrpc_wallet_list (line 1260) | def jsonrpc_wallet_list(self, wallet_id=None, page=None, page_size=None):
    method jsonrpc_wallet_reconnect (line 1278) | def jsonrpc_wallet_reconnect(self):
    method jsonrpc_wallet_create (line 1292) | async def jsonrpc_wallet_create(
    method jsonrpc_wallet_export (line 1332) | async def jsonrpc_wallet_export(self, password=None, wallet_id=None):
    method jsonrpc_wallet_import (line 1355) | async def jsonrpc_wallet_import(self, data, password=None, wallet_id=N...
    method jsonrpc_wallet_add (line 1391) | async def jsonrpc_wallet_add(self, wallet_id):
    method jsonrpc_wallet_remove (line 1416) | async def jsonrpc_wallet_remove(self, wallet_id):
    method jsonrpc_wallet_balance (line 1435) | async def jsonrpc_wallet_balance(self, wallet_id=None, confirmations=0):
    method jsonrpc_wallet_status (line 1456) | def jsonrpc_wallet_status(self, wallet_id=None):
    method jsonrpc_wallet_unlock (line 1479) | def jsonrpc_wallet_unlock(self, password, wallet_id=None):
    method jsonrpc_wallet_lock (line 1496) | def jsonrpc_wallet_lock(self, wallet_id=None):
    method jsonrpc_wallet_decrypt (line 1512) | def jsonrpc_wallet_decrypt(self, wallet_id=None):
    method jsonrpc_wallet_encrypt (line 1528) | def jsonrpc_wallet_encrypt(self, new_password, wallet_id=None):
    method jsonrpc_wallet_send (line 1546) | async def jsonrpc_wallet_send(
    method jsonrpc_account_list (line 1610) | async def jsonrpc_account_list(
    method jsonrpc_account_balance (line 1646) | async def jsonrpc_account_balance(self, account_id=None, wallet_id=Non...
    method jsonrpc_account_add (line 1672) | async def jsonrpc_account_add(
    method jsonrpc_account_create (line 1712) | async def jsonrpc_account_create(self, account_name, single_key=False,...
    method jsonrpc_account_remove (line 1740) | def jsonrpc_account_remove(self, account_id, wallet_id=None):
    method jsonrpc_account_set (line 1760) | def jsonrpc_account_set(
    method jsonrpc_account_max_address_gap (line 1818) | def jsonrpc_account_max_address_gap(self, account_id, wallet_id=None):
    method jsonrpc_account_fund (line 1840) | def jsonrpc_account_fund(self, to_account=None, from_account=None, amo...
    method jsonrpc_account_deposit (line 1882) | async def jsonrpc_account_deposit(
    method jsonrpc_account_send (line 1924) | def jsonrpc_account_send(self, amount, addresses, account_id=None, wal...
    method jsonrpc_sync_hash (line 1951) | def jsonrpc_sync_hash(self, wallet_id=None):
    method jsonrpc_sync_apply (line 1968) | async def jsonrpc_sync_apply(self, password, data=None, wallet_id=None...
    method jsonrpc_address_is_mine (line 2022) | async def jsonrpc_address_is_mine(self, address, account_id=None, wall...
    method jsonrpc_address_list (line 2046) | def jsonrpc_address_list(self, address=None, account_id=None, wallet_i...
    method jsonrpc_address_unused (line 2080) | def jsonrpc_address_unused(self, account_id=None, wallet_id=None):
    method jsonrpc_file_list (line 2102) | async def jsonrpc_file_list(self, sort=None, reverse=False, comparison...
    method jsonrpc_file_set_status (line 2168) | async def jsonrpc_file_set_status(self, status, **kwargs):
    method jsonrpc_file_delete (line 2213) | async def jsonrpc_file_delete(self, delete_from_download_dir=False, de...
    method jsonrpc_file_save (line 2267) | async def jsonrpc_file_save(self, file_name=None, download_directory=N...
    method jsonrpc_purchase_list (line 2312) | def jsonrpc_purchase_list(
    method jsonrpc_purchase_create (line 2347) | async def jsonrpc_purchase_create(
    method jsonrpc_claim_list (line 2407) | def jsonrpc_claim_list(self, claim_type=None, **kwargs):
    method jsonrpc_support_sum (line 2444) | async def jsonrpc_support_sum(self, claim_id, new_sdk_server, include_...
    method jsonrpc_claim_search (line 2480) | async def jsonrpc_claim_search(self, **kwargs):
    method jsonrpc_channel_new (line 2663) | def jsonrpc_channel_new(self):
    method jsonrpc_channel_create (line 2667) | async def jsonrpc_channel_create(
    method jsonrpc_channel_update (line 2787) | async def jsonrpc_channel_update(
    method jsonrpc_channel_sign (line 2946) | async def jsonrpc_channel_sign(
    method jsonrpc_channel_abandon (line 2988) | async def jsonrpc_channel_abandon(
    method jsonrpc_channel_list (line 3049) | def jsonrpc_channel_list(self, *args, **kwargs):
    method jsonrpc_channel_export (line 3078) | async def jsonrpc_channel_export(self, channel_id=None, channel_name=N...
    method jsonrpc_channel_import (line 3114) | async def jsonrpc_channel_import(self, channel_data, wallet_id=None):
    method jsonrpc_publish (line 3177) | async def jsonrpc_publish(self, name, **kwargs):
    method jsonrpc_stream_repost (line 3302) | async def jsonrpc_stream_repost(
    method jsonrpc_stream_create (line 3382) | async def jsonrpc_stream_create(
    method jsonrpc_stream_update (line 3553) | async def jsonrpc_stream_update(
    method jsonrpc_stream_abandon (line 3790) | async def jsonrpc_stream_abandon(
    method jsonrpc_stream_list (line 3851) | def jsonrpc_stream_list(self, *args, **kwargs):
    method jsonrpc_stream_cost_estimate (line 3881) | def jsonrpc_stream_cost_estimate(self, uri):
    method jsonrpc_collection_create (line 3902) | async def jsonrpc_collection_create(
    method jsonrpc_collection_update (line 4023) | async def jsonrpc_collection_update(
    method jsonrpc_collection_abandon (line 4179) | async def jsonrpc_collection_abandon(self, *args, **kwargs):
    method jsonrpc_collection_list (line 4203) | def jsonrpc_collection_list(
    method jsonrpc_collection_resolve (line 4236) | async def jsonrpc_collection_resolve(
    method jsonrpc_support_create (line 4287) | async def jsonrpc_support_create(
    method jsonrpc_support_list (line 4356) | def jsonrpc_support_list(self, *args, received=False, sent=False, stak...
    method jsonrpc_support_abandon (line 4400) | async def jsonrpc_support_abandon(
    method jsonrpc_transaction_list (line 4479) | def jsonrpc_transaction_list(self, account_id=None, wallet_id=None, pa...
    method jsonrpc_transaction_show (line 4552) | def jsonrpc_transaction_show(self, txid):
    method _constrain_txo_from_kwargs (line 4571) | def _constrain_txo_from_kwargs(
    method jsonrpc_txo_list (line 4610) | def jsonrpc_txo_list(
    method jsonrpc_txo_spend (line 4687) | async def jsonrpc_txo_spend(
    method jsonrpc_txo_sum (line 4748) | def jsonrpc_txo_sum(self, account_id=None, wallet_id=None, **kwargs):
    method jsonrpc_txo_plot (line 4795) | async def jsonrpc_txo_plot(
    method jsonrpc_utxo_list (line 4862) | def jsonrpc_utxo_list(self, *args, **kwargs):
    method jsonrpc_utxo_release (line 4883) | async def jsonrpc_utxo_release(self, account_id=None, wallet_id=None):
    method jsonrpc_blob_get (line 4913) | async def jsonrpc_blob_get(self, blob_hash, timeout=None, read=False):
    method jsonrpc_blob_delete (line 4938) | async def jsonrpc_blob_delete(self, blob_hash):
    method jsonrpc_peer_list (line 4964) | async def jsonrpc_peer_list(self, blob_hash, page=None, page_size=None):
    method jsonrpc_blob_announce (line 5010) | async def jsonrpc_blob_announce(self, blob_hash=None, stream_hash=None...
    method jsonrpc_blob_list (line 5046) | async def jsonrpc_blob_list(self, uri=None, stream_hash=None, sd_hash=...
    method jsonrpc_blob_reflect (line 5096) | async def jsonrpc_blob_reflect(self, blob_hashes, reflector_server=None):
    method jsonrpc_blob_reflect_all (line 5113) | async def jsonrpc_blob_reflect_all(self):
    method jsonrpc_blob_clean (line 5130) | async def jsonrpc_blob_clean(self):
    method jsonrpc_file_reflect (line 5146) | async def jsonrpc_file_reflect(self, **kwargs):
    method jsonrpc_peer_ping (line 5183) | async def jsonrpc_peer_ping(self, node_id, address, port):
    method jsonrpc_routing_table_get (line 5208) | def jsonrpc_routing_table_get(self):
    method jsonrpc_tracemalloc_enable (line 5259) | def jsonrpc_tracemalloc_enable(self):  # pylint: disable=no-self-use
    method jsonrpc_tracemalloc_disable (line 5275) | def jsonrpc_tracemalloc_disable(self):  # pylint: disable=no-self-use
    method jsonrpc_tracemalloc_top (line 5291) | def jsonrpc_tracemalloc_top(self, items: int = 10):  # pylint: disable...
    method broadcast_or_release (line 5335) | async def broadcast_or_release(self, tx, blocking=False):
    method valid_address_or_error (line 5338) | def valid_address_or_error(self, address, allow_script_address=False):
    method valid_stream_name_or_error (line 5348) | def valid_stream_name_or_error(name: str):
    method valid_collection_name_or_error (line 5366) | def valid_collection_name_or_error(name: str):
    method valid_channel_name_or_error (line 5385) | def valid_channel_name_or_error(name: str):
    method get_fee_address (line 5403) | def get_fee_address(self, kwargs: dict, claim_address: str) -> str:
    method get_receiving_address (line 5410) | async def get_receiving_address(self, address: str, account: Optional[...
    method get_channel_or_none (line 5416) | async def get_channel_or_none(
    method get_channel_or_error (line 5424) | async def get_channel_or_error(
    method get_dewies_or_error (line 5453) | def get_dewies_or_error(argument: str, lbc: str, positive_value=False):
    method resolve (line 5464) | async def resolve(self, accounts, urls, **kwargs):
    method _old_get_temp_claim_info (line 5477) | def _old_get_temp_claim_info(tx, txo, address, claim_dict, name):
  function loggly_time_string (line 5491) | def loggly_time_string(date):
  function get_loggly_query_string (line 5497) | def get_loggly_query_string(installation_id):

FILE: lbry/extras/daemon/exchange_rate_manager.py
  class ExchangeRate (line 16) | class ExchangeRate:
    method __init__ (line 17) | def __init__(self, market, spot, ts):
    method __repr__ (line 26) | def __repr__(self):
    method as_dict (line 29) | def as_dict(self):
  class MarketFeed (line 33) | class MarketFeed:
    method __init__ (line 43) | def __init__(self):
    method has_rate (line 51) | def has_rate(self):
    method is_online (line 55) | def is_online(self):
    method get_rate_from_response (line 58) | def get_rate_from_response(self, json_response):
    method get_response (line 61) | async def get_response(self):
    method get_rate (line 74) | async def get_rate(self):
    method keep_updated (line 98) | async def keep_updated(self):
    method start (line 103) | def start(self):
    method stop (line 107) | def stop(self):
  class BaseBittrexFeed (line 114) | class BaseBittrexFeed(MarketFeed):
    method get_rate_from_response (line 120) | def get_rate_from_response(self, json_response):
  class BittrexBTCFeed (line 126) | class BittrexBTCFeed(BaseBittrexFeed):
  class BittrexUSDFeed (line 131) | class BittrexUSDFeed(BaseBittrexFeed):
  class BaseCoinExFeed (line 136) | class BaseCoinExFeed(MarketFeed):
    method get_rate_from_response (line 141) | def get_rate_from_response(self, json_response):
  class CoinExBTCFeed (line 149) | class CoinExBTCFeed(BaseCoinExFeed):
  class CoinExUSDFeed (line 154) | class CoinExUSDFeed(BaseCoinExFeed):
  class BaseHotbitFeed (line 159) | class BaseHotbitFeed(MarketFeed):
    method get_rate_from_response (line 164) | def get_rate_from_response(self, json_response):
  class HotbitBTCFeed (line 170) | class HotbitBTCFeed(BaseHotbitFeed):
  class HotbitUSDFeed (line 175) | class HotbitUSDFeed(BaseHotbitFeed):
  class UPbitBTCFeed (line 180) | class UPbitBTCFeed(MarketFeed):
    method get_rate_from_response (line 186) | def get_rate_from_response(self, json_response):
  class ExchangeRateManager (line 203) | class ExchangeRateManager:
    method __init__ (line 204) | def __init__(self, feeds=FEEDS):
    method wait (line 207) | def wait(self):
    method start (line 212) | def start(self):
    method stop (line 217) | def stop(self):
    method convert_currency (line 222) | def convert_currency(self, from_currency, to_currency, amount):
    method to_dewies (line 243) | def to_dewies(self, currency, amount) -> int:
    method fee_dict (line 247) | def fee_dict(self):

FILE: lbry/extras/daemon/json_response_encoder.py
  function encode_txo_doc (line 21) | def encode_txo_doc():
  function encode_tx_doc (line 49) | def encode_tx_doc():
  function encode_account_doc (line 62) | def encode_account_doc():
  function encode_wallet_doc (line 77) | def encode_wallet_doc():
  function encode_file_doc (line 84) | def encode_file_doc():
  class JSONResponseEncoder (line 119) | class JSONResponseEncoder(JSONEncoder):
    method __init__ (line 121) | def __init__(self, *args, ledger: Ledger, include_protobuf=False, **kw...
    method default (line 126) | def default(self, obj):  # pylint: disable=method-hidden,arguments-ren...
    method encode_transaction (line 151) | def encode_transaction(self, tx):
    method encode_output (line 163) | def encode_output(self, txo, check_signature=True):
    method encode_claim_meta (line 248) | def encode_claim_meta(self, meta):
    method encode_input (line 257) | def encode_input(self, txi):
    method encode_account (line 263) | def encode_account(self, account):
    method encode_wallet (line 271) | def encode_wallet(wallet):
    method encode_file (line 277) | def encode_file(self, managed_stream):
    method encode_claim (line 355) | def encode_claim(self, claim):

FILE: lbry/extras/daemon/migrator/dbmigrator.py
  function migrate_db (line 9) | def migrate_db(conf, start, end):
  function run_migration_script (line 65) | def run_migration_script():

FILE: lbry/extras/daemon/migrator/migrate10to11.py
  function do_migration (line 6) | def do_migration(conf):

FILE: lbry/extras/daemon/migrator/migrate11to12.py
  function do_migration (line 6) | def do_migration(conf):

FILE: lbry/extras/daemon/migrator/migrate12to13.py
  function do_migration (line 5) | def do_migration(conf):

FILE: lbry/extras/daemon/migrator/migrate13to14.py
  function do_migration (line 5) | def do_migration(conf):

FILE: lbry/extras/daemon/migrator/migrate14to15.py
  function do_migration (line 5) | def do_migration(conf):

FILE: lbry/extras/daemon/migrator/migrate15to16.py
  function do_migration (line 5) | def do_migration(conf):

FILE: lbry/extras/daemon/migrator/migrate1to2.py
  function do_migration (line 8) | def do_migration(conf):
  function migrate_blockchainname_db (line 14) | def migrate_blockchainname_db(db_dir):

FILE: lbry/extras/daemon/migrator/migrate2to3.py
  function do_migration (line 8) | def do_migration(conf):
  function migrate_blockchainname_db (line 14) | def migrate_blockchainname_db(db_dir):

FILE: lbry/extras/daemon/migrator/migrate3to4.py
  function do_migration (line 8) | def do_migration(conf):
  function migrate_blobs_db (line 14) | def migrate_blobs_db(db_dir):

FILE: lbry/extras/daemon/migrator/migrate4to5.py
  function do_migration (line 8) | def do_migration(conf):
  function add_lbry_file_metadata (line 14) | def add_lbry_file_metadata(db_dir):

FILE: lbry/extras/daemon/migrator/migrate5to6.py
  function run_operation (line 73) | def run_operation(db):
  function verify_sd_blob (line 88) | def verify_sd_blob(sd_hash, blob_dir):
  function do_migration (line 106) | def do_migration(conf):

FILE: lbry/extras/daemon/migrator/migrate6to7.py
  function do_migration (line 5) | def do_migration(conf):

FILE: lbry/extras/daemon/migrator/migrate7to8.py
  function do_migration (line 5) | def do_migration(conf):

FILE: lbry/extras/daemon/migrator/migrate8to9.py
  function do_migration (line 10) | def do_migration(conf):
  function delete_stream (line 37) | def delete_stream(transaction, stream_hash, sd_hash, blob_hashes, blob_d...

FILE: lbry/extras/daemon/migrator/migrate9to10.py
  function do_migration (line 5) | def do_migration(conf):

FILE: lbry/extras/daemon/security.py
  function ensure_request_allowed (line 7) | def ensure_request_allowed(request, conf):
  function is_request_allowed (line 25) | def is_request_allowed(request, conf) -> bool:

FILE: lbry/extras/daemon/storage.py
  function calculate_effective_amount (line 24) | def calculate_effective_amount(amount: str, supports: typing.Optional[ty...
  class StoredContentClaim (line 30) | class StoredContentClaim:
    method __init__ (line 31) | def __init__(self, outpoint: Optional[str] = None, claim_id: Optional[...
    method txid (line 49) | def txid(self) -> typing.Optional[str]:
    method nout (line 53) | def nout(self) -> typing.Optional[int]:
    method as_dict (line 56) | def as_dict(self) -> typing.Dict:
  function _get_content_claims (line 72) | def _get_content_claims(transaction: sqlite3.Connection, query: str,
  function get_claims_from_stream_hashes (line 80) | def get_claims_from_stream_hashes(transaction: sqlite3.Connection,
  function get_claims_from_torrent_info_hashes (line 93) | def get_claims_from_torrent_info_hashes(transaction: sqlite3.Connection,
  function _batched_select (line 106) | def _batched_select(transaction, query, parameters, batch_size=900):
  function _get_lbry_file_stream_dict (line 113) | def _get_lbry_file_stream_dict(rowid, added_on, stream_hash, file_name, ...
  function get_all_lbry_files (line 137) | def get_all_lbry_files(transaction: sqlite3.Connection) -> typing.List[t...
  function store_stream (line 170) | def store_stream(transaction: sqlite3.Connection, sd_blob: 'BlobFile', d...
  function delete_stream (line 195) | def delete_stream(transaction: sqlite3.Connection, descriptor: 'StreamDe...
  function delete_torrent (line 205) | def delete_torrent(transaction: sqlite3.Connection, bt_infohash: str):
  function store_file (line 214) | def store_file(transaction: sqlite3.Connection, stream_hash: str, file_n...
  class SQLiteStorage (line 233) | class SQLiteStorage(SQLiteMixin):
    method __init__ (line 343) | def __init__(self, conf: Config, path, loop=None, time_getter: typing....
    method run_and_return_one_or_none (line 350) | async def run_and_return_one_or_none(self, query, *args):
    method run_and_return_list (line 356) | async def run_and_return_list(self, query, *args):
    method add_blobs (line 362) | async def add_blobs(self, *blob_hashes_and_lengths: typing.Tuple[str, ...
    method get_blob_status (line 379) | def get_blob_status(self, blob_hash: str):
    method set_announce (line 384) | def set_announce(self, *blob_hashes):
    method update_last_announced_blobs (line 389) | def update_last_announced_blobs(self, blob_hashes: typing.List[str]):
    method should_single_announce_blobs (line 400) | def should_single_announce_blobs(self, blob_hashes, immediate=False):
    method get_blobs_to_announce (line 415) | def get_blobs_to_announce(self):
    method delete_blobs_from_db (line 436) | def delete_blobs_from_db(self, blob_hashes):
    method get_all_blob_hashes (line 443) | def get_all_blob_hashes(self):
    method get_stored_blobs (line 446) | async def get_stored_blobs(self, is_mine: bool, is_network_blob=False):
    method get_stored_blob_disk_usage (line 472) | async def get_stored_blob_disk_usage(self):
    method update_blob_ownership (line 494) | async def update_blob_ownership(self, sd_hash, is_mine: bool):
    method sync_missing_blobs (line 502) | def sync_missing_blobs(self, blob_files: typing.Set[str]) -> typing.Aw...
    method stream_exists (line 520) | async def stream_exists(self, sd_hash: str) -> bool:
    method file_exists (line 524) | async def file_exists(self, sd_hash: str) -> bool:
    method store_stream (line 530) | def store_stream(self, sd_blob: 'BlobFile', descriptor: 'StreamDescrip...
    method get_blobs_for_stream (line 533) | def get_blobs_for_stream(self, stream_hash, only_completed=False) -> t...
    method get_sd_blob_hash_for_stream (line 567) | def get_sd_blob_hash_for_stream(self, stream_hash):
    method get_stream_hash_for_sd_hash (line 572) | def get_stream_hash_for_sd_hash(self, sd_blob_hash):
    method delete_stream (line 577) | def delete_stream(self, descriptor: 'StreamDescriptor'):
    method delete_torrent (line 580) | async def delete_torrent(self, bt_infohash: str):
    method save_downloaded_file (line 585) | def save_downloaded_file(self, stream_hash: str, file_name: typing.Opt...
    method save_published_file (line 594) | def save_published_file(self, stream_hash: str, file_name: typing.Opti...
    method update_manually_removed_files_since_last_run (line 602) | async def update_manually_removed_files_since_last_run(self):
    method get_all_lbry_files (line 632) | def get_all_lbry_files(self) -> typing.Awaitable[typing.List[typing.Di...
    method change_file_status (line 635) | def change_file_status(self, stream_hash: str, new_status: str):
    method stop_all_files (line 639) | def stop_all_files(self):
    method change_file_download_dir_and_file_name (line 643) | async def change_file_download_dir_and_file_name(self, stream_hash: st...
    method save_content_fee (line 654) | async def save_content_fee(self, stream_hash: str, content_fee: Transa...
    method set_saved_file (line 659) | async def set_saved_file(self, stream_hash: str):
    method clear_saved_file (line 664) | async def clear_saved_file(self, stream_hash: str):
    method recover_streams (line 669) | async def recover_streams(self, descriptors_and_sds: typing.List[typin...
    method get_all_stream_hashes (line 695) | def get_all_stream_hashes(self):
    method save_supports (line 700) | def save_supports(self, claim_id_to_supports: dict):
    method get_supports (line 716) | def get_supports(self, *claim_ids):
    method save_claims (line 740) | async def save_claims(self, claim_infos):
    method save_claim_from_output (line 800) | def save_claim_from_output(self, ledger, *outputs: Output):
    method save_claims_for_resolve (line 813) | def save_claims_for_resolve(self, claim_infos):
    method _save_content_claim (line 826) | def _save_content_claim(transaction, claim_outpoint, stream_hash=None,...
    method save_content_claim (line 869) | async def save_content_claim(self, stream_hash, claim_outpoint):
    method save_torrent_content_claim (line 875) | async def save_torrent_content_claim(self, bt_infohash, claim_outpoint...
    method get_content_claim (line 888) | async def get_content_claim(self, stream_hash: str, include_supports: ...
    method get_content_claim_for_torrent (line 899) | async def get_content_claim_for_torrent(self, bt_infohash):
    method update_reflected_stream (line 905) | def update_reflected_stream(self, sd_hash, reflector_address, success=...
    method get_streams_to_re_reflect (line 916) | def get_streams_to_re_reflect(self):
    method get_persisted_kademlia_peers (line 925) | async def get_persisted_kademlia_peers(self) -> typing.List[typing.Tup...
    method save_kademlia_peers (line 929) | async def save_kademlia_peers(self, peers: typing.List['KademliaPeer']):

FILE: lbry/extras/daemon/undecorated.py
  function undecorated (line 23) | def undecorated(o):
  function looks_like_a_decorator (line 61) | def looks_like_a_decorator(a):

FILE: lbry/extras/system_info.py
  function get_platform (line 10) | def get_platform() -> dict:

FILE: lbry/file/file_manager.py
  class FileManager (line 27) | class FileManager:
    method __init__ (line 28) | def __init__(self, loop: asyncio.AbstractEventLoop, config: 'Config', ...
    method streams (line 39) | def streams(self):
    method create_stream (line 42) | async def create_stream(self, file_path: str, key: Optional[bytes] = N...
    method start (line 47) | async def start(self):
    method stop (line 53) | async def stop(self):
    method download_from_uri (line 60) | async def download_from_uri(self, uri, exchange_rate_manager: 'Exchang...
    method stream_partial_content (line 291) | async def stream_partial_content(self, request: Request, sd_hash: str):
    method get_filtered (line 294) | def get_filtered(self, *args, **kwargs) -> typing.List[ManagedDownload...
    method delete (line 305) | async def delete(self, source: ManagedDownloadSource, delete_file=False):

FILE: lbry/file/source.py
  class ManagedDownloadSource (line 19) | class ManagedDownloadSource:
    method __init__ (line 27) | def __init__(self, loop: asyncio.AbstractEventLoop, config: 'Config', ...
    method start (line 61) | async def start(self, timeout: Optional[float] = None, save_now: Optio...
    method stop (line 64) | async def stop(self, finished: bool = False):
    method save_file (line 67) | async def save_file(self, file_name: Optional[str] = None, download_di...
    method stop_tasks (line 70) | async def stop_tasks(self):
    method set_claim (line 73) | def set_claim(self, claim_info: typing.Dict, claim: 'Claim'):
    method file_name (line 87) | def file_name(self) -> Optional[str]:
    method added_on (line 91) | def added_on(self) -> Optional[int]:
    method status (line 95) | def status(self) -> str:
    method completed (line 99) | def completed(self):
    method finished (line 107) | def finished(self) -> bool:
    method running (line 111) | def running(self) -> bool:
    method claim_id (line 115) | def claim_id(self) -> Optional[str]:
    method txid (line 119) | def txid(self) -> Optional[str]:
    method nout (line 123) | def nout(self) -> Optional[int]:
    method outpoint (line 127) | def outpoint(self) -> Optional[str]:
    method claim_height (line 131) | def claim_height(self) -> Optional[int]:
    method channel_claim_id (line 135) | def channel_claim_id(self) -> Optional[str]:
    method channel_name (line 139) | def channel_name(self) -> Optional[str]:
    method claim_name (line 143) | def claim_name(self) -> Optional[str]:
    method metadata (line 147) | def metadata(self) -> Optional[typing.Dict]:
    method metadata_protobuf (line 151) | def metadata_protobuf(self) -> bytes:
    method full_path (line 156) | def full_path(self) -> Optional[str]:
    method output_file_exists (line 161) | def output_file_exists(self):

FILE: lbry/file/source_manager.py
  class SourceManager (line 24) | class SourceManager:
    method __init__ (line 50) | def __init__(self, loop: asyncio.AbstractEventLoop, config: 'Config', ...
    method add (line 59) | def add(self, source: ManagedDownloadSource):
    method remove (line 62) | async def remove(self, source: ManagedDownloadSource):
    method initialize_from_database (line 68) | async def initialize_from_database(self):
    method start (line 71) | async def start(self):
    method stop (line 75) | async def stop(self):
    method create (line 81) | async def create(self, file_path: str, key: Optional[bytes] = None,
    method delete (line 85) | async def delete(self, source: ManagedDownloadSource, delete_file: Opt...
    method get_filtered (line 90) | def get_filtered(self, sort_by: Optional[str] = None, reverse: Optiona...

FILE: lbry/file_analysis.py
  class VideoFileAnalyzer (line 19) | class VideoFileAnalyzer:
    method _replace_or_pop_env (line 21) | def _replace_or_pop_env(self, variable):
    method __init__ (line 27) | def __init__(self, conf: TranscodeConfig):
    method _execute (line 40) | def _execute(command, environment):
    method _execute_ffmpeg (line 55) | async def _execute_ffmpeg(self, arguments):
    method _execute_ffprobe (line 59) | async def _execute_ffprobe(self, arguments):
    method _verify_executables (line 63) | async def _verify_executables(self):
    method _which_ffmpeg_and_ffmprobe (line 78) | def _which_ffmpeg_and_ffmprobe(path):
    method _verify_ffmpeg_installed (line 81) | async def _verify_ffmpeg_installed(self):
    method status (line 104) | async def status(self, reset=False, recheck=False):
    method _verify_container (line 123) | def _verify_container(scan_data: json):
    method _verify_video_encoding (line 147) | def _verify_video_encoding(scan_data: json):
    method _verify_bitrate (line 163) | def _verify_bitrate(self, scan_data: json, file_path):
    method _verify_fast_start (line 181) | async def _verify_fast_start(self, scan_data: json, video_file):
    method _verify_audio_encoding (line 193) | def _verify_audio_encoding(scan_data: json):
    method _verify_audio_volume (line 207) | async def _verify_audio_volume(self, seconds, video_file):
    method _compute_crf (line 234) | def _compute_crf(scan_data):
    method _get_video_scaler (line 243) | def _get_video_scaler(self):
    method _get_video_encoder (line 246) | async def _get_video_encoder(self, scan_data):
    method _get_audio_encoder (line 277) | async def _get_audio_encoder(self, extension):
    method _get_best_container_extension (line 310) | def _get_best_container_extension(scan_data, video_encoder):
    method _get_scan_data (line 334) | async def _get_scan_data(self, validate, file_path):
    method _build_spec (line 354) | def _build_spec(scan_data):
    method verify_or_repair (line 375) | async def verify_or_repair(self, validate, repair, file_path, ignore_n...

FILE: lbry/prometheus.py
  function get_loop_metrics (line 16) | def get_loop_metrics(delay=1):
  class PrometheusServer (line 34) | class PrometheusServer:
    method __init__ (line 35) | def __init__(self, logger=None):
    method start (line 40) | async def start(self, interface: str, port: int):
    method handle_metrics_get_request (line 54) | async def handle_metrics_get_request(self, request: web.Request):
    method stop (line 64) | async def stop(self):

FILE: lbry/schema/attrs.py
  function calculate_sha384_file_hash (line 28) | def calculate_sha384_file_hash(file_path):
  function country_int_to_str (line 36) | def country_int_to_str(country: int) -> str:
  function country_str_to_int (line 41) | def country_str_to_int(country: str) -> int:
  class Dimmensional (line 47) | class Dimmensional(Metadata):
    method width (line 52) | def width(self) -> int:
    method width (line 56) | def width(self, width: int):
    method height (line 60) | def height(self) -> int:
    method height (line 64) | def height(self, height: int):
    method dimensions (line 68) | def dimensions(self) -> Tuple[int, int]:
    method dimensions (line 72) | def dimensions(self, dimensions: Tuple[int, int]):
    method _extract (line 75) | def _extract(self, file_metadata, field):
    method update (line 81) | def update(self, file_metadata=None, height=None, width=None):
  class Playable (line 93) | class Playable(Metadata):
    method duration (line 98) | def duration(self) -> int:
    method duration (line 102) | def duration(self, duration: int):
    method update (line 105) | def update(self, file_metadata=None, duration=None):
  class Image (line 115) | class Image(Dimmensional):
  class Audio (line 120) | class Audio(Playable):
  class Video (line 125) | class Video(Dimmensional, Playable):
    method update (line 129) | def update(self, file_metadata=None, height=None, width=None, duration...
  class Source (line 134) | class Source(Metadata):
    method update (line 138) | def update(self, file_path=None):
    method name (line 151) | def name(self) -> str:
    method name (line 155) | def name(self, name: str):
    method size (line 159) | def size(self) -> int:
    method size (line 163) | def size(self, size: int):
    method media_type (line 167) | def media_type(self) -> str:
    method media_type (line 171) | def media_type(self, media_type: str):
    method file_hash (line 175) | def file_hash(self) -> str:
    method file_hash (line 179) | def file_hash(self, file_hash: str):
    method file_hash_bytes (line 183) | def file_hash_bytes(self) -> bytes:
    method file_hash_bytes (line 187) | def file_hash_bytes(self, file_hash_bytes: bytes):
    method sd_hash (line 191) | def sd_hash(self) -> str:
    method sd_hash (line 195) | def sd_hash(self, sd_hash: str):
    method sd_hash_bytes (line 199) | def sd_hash_bytes(self) -> bytes:
    method sd_hash_bytes (line 203) | def sd_hash_bytes(self, sd_hash: bytes):
    method bt_infohash (line 207) | def bt_infohash(self) -> str:
    method bt_infohash (line 211) | def bt_infohash(self, bt_infohash: str):
    method bt_infohash_bytes (line 215) | def bt_infohash_bytes(self) -> bytes:
    method bt_infohash_bytes (line 219) | def bt_infohash_bytes(self, bt_infohash: bytes):
    method url (line 223) | def url(self) -> str:
    method url (line 227) | def url(self, url: str):
  class Fee (line 231) | class Fee(Metadata):
    method update (line 235) | def update(self, address: str = None, currency: str = None, amount=None):
    method currency (line 251) | def currency(self) -> str:
    method address (line 256) | def address(self) -> str:
    method address (line 261) | def address(self, address: str):
    method address_bytes (line 265) | def address_bytes(self) -> bytes:
    method address_bytes (line 269) | def address_bytes(self, address: bytes):
    method amount (line 273) | def amount(self) -> Decimal:
    method lbc (line 284) | def lbc(self) -> Decimal:
    method lbc (line 290) | def lbc(self, amount: Decimal):
    method dewies (line 294) | def dewies(self) -> int:
    method dewies (line 300) | def dewies(self, amount: int):
    method btc (line 307) | def btc(self) -> Decimal:
    method btc (line 313) | def btc(self, amount: Decimal):
    method satoshis (line 317) | def satoshis(self) -> int:
    method satoshis (line 323) | def satoshis(self, amount: int):
    method usd (line 331) | def usd(self) -> Decimal:
    method usd (line 337) | def usd(self, amount: Decimal):
    method pennies (line 341) | def pennies(self) -> int:
    method pennies (line 347) | def pennies(self, amount: int):
  class ClaimReference (line 352) | class ClaimReference(Metadata):
    method claim_id (line 357) | def claim_id(self) -> str:
    method claim_id (line 361) | def claim_id(self, claim_id: str):
    method claim_hash (line 365) | def claim_hash(self) -> bytes:
    method claim_hash (line 369) | def claim_hash(self, claim_hash: bytes):
  class ClaimList (line 373) | class ClaimList(BaseMessageList[ClaimReference]):
    method _message (line 379) | def _message(self):
    method append (line 382) | def append(self, value):
    method ids (line 386) | def ids(self) -> List[str]:
  class Language (line 390) | class Language(Metadata):
    method langtag (line 395) | def langtag(self) -> str:
    method langtag (line 406) | def langtag(self, langtag: str):
    method language (line 418) | def language(self) -> str:
    method language (line 423) | def language(self, language: str):
    method script (line 427) | def script(self) -> str:
    method script (line 432) | def script(self, script: str):
    method region (line 436) | def region(self) -> str:
    method region (line 441) | def region(self, region: str):
  class LanguageList (line 445) | class LanguageList(BaseMessageList[Language]):
    method append (line 449) | def append(self, value: str):
  class Location (line 453) | class Location(Metadata):
    method from_value (line 457) | def from_value(self, value):
    method to_dict (line 490) | def to_dict(self):
    method country (line 499) | def country(self) -> str:
    method country (line 504) | def country(self, country: str):
    method state (line 508) | def state(self) -> str:
    method state (line 512) | def state(self, state: str):
    method city (line 516) | def city(self) -> str:
    method city (line 520) | def city(self, city: str):
    method code (line 524) | def code(self) -> str:
    method code (line 528) | def code(self, code: str):
    method latitude (line 534) | def latitude(self) -> str:
    method latitude (line 539) | def latitude(self, latitude: str):
    method longitude (line 545) | def longitude(self) -> str:
    method longitude (line 550) | def longitude(self, longitude: str):
  class LocationList (line 556) | class LocationList(BaseMessageList[Location]):
    method append (line 560) | def append(self, value):
  class TagList (line 564) | class TagList(BaseMessageList[str]):
    method append (line 568) | def append(self, tag: str):

FILE: lbry/schema/base.py
  class Signable (line 8) | class Signable:
    method __init__ (line 17) | def __init__(self, message=None):
    method clear_signature (line 25) | def clear_signature(self):
    method signing_channel_id (line 31) | def signing_channel_id(self):
    method signing_channel_id (line 35) | def signing_channel_id(self, channel_id: str):
    method is_signed (line 39) | def is_signed(self):
    method to_dict (line 42) | def to_dict(self):
    method to_message_bytes (line 45) | def to_message_bytes(self) -> bytes:
    method to_bytes (line 48) | def to_bytes(self) -> bytes:
    method from_bytes (line 60) | def from_bytes(cls, data: bytes):
    method __len__ (line 72) | def __len__(self):
    method __bytes__ (line 75) | def __bytes__(self):
  class Metadata (line 79) | class Metadata:
    method __init__ (line 83) | def __init__(self, message):
  class BaseMessageList (line 90) | class BaseMessageList(Metadata, Generic[I]):
    method _message (line 97) | def _message(self):
    method add (line 100) | def add(self) -> I:
    method extend (line 103) | def extend(self, values: List[str]):
    method append (line 107) | def append(self, value: str):
    method __len__ (line 110) | def __len__(self):
    method __iter__ (line 113) | def __iter__(self) -> Iterator[I]:
    method __getitem__ (line 117) | def __getitem__(self, item) -> I:
    method __delitem__ (line 120) | def __delitem__(self, key):
    method __eq__ (line 123) | def __eq__(self, other) -> bool:

FILE: lbry/schema/claim.py
  class Claim (line 29) | class Claim(Signable):
    method claim_type (line 41) | def claim_type(self) -> str:
    method get_message (line 44) | def get_message(self, type_name):
    method is_stream (line 53) | def is_stream(self):
    method stream (line 57) | def stream(self) -> 'Stream':
    method is_channel (line 61) | def is_channel(self):
    method channel (line 65) | def channel(self) -> 'Channel':
    method is_repost (line 69) | def is_repost(self):
    method repost (line 73) | def repost(self) -> 'Repost':
    method is_collection (line 77) | def is_collection(self):
    method collection (line 81) | def collection(self) -> 'Collection':
    method from_bytes (line 85) | def from_bytes(cls, data: bytes) -> 'Claim':
  class BaseClaim (line 101) | class BaseClaim:
    method __init__ (line 109) | def __init__(self, claim: Claim = None):
    method to_dict (line 113) | def to_dict(self):
    method none_check (line 122) | def none_check(self, kwargs):
    method update (line 127) | def update(self, **kwargs):
    method title (line 154) | def title(self) -> str:
    method title (line 158) | def title(self, title: str):
    method description (line 162) | def description(self) -> str:
    method description (line 166) | def description(self, description: str):
    method thumbnail (line 170) | def thumbnail(self) -> Source:
    method tags (line 174) | def tags(self) -> List[str]:
    method languages (line 178) | def languages(self) -> LanguageList:
    method langtags (line 182) | def langtags(self) -> List[str]:
    method locations (line 186) | def locations(self) -> LocationList:
  class Stream (line 190) | class Stream(BaseClaim):
    method to_dict (line 198) | def to_dict(self):
    method update (line 216) | def update(self, file_path=None, height=None, width=None, duration=Non...
    method author (line 270) | def author(self) -> str:
    method author (line 274) | def author(self, author: str):
    method license (line 278) | def license(self) -> str:
    method license (line 282) | def license(self, license: str):
    method license_url (line 286) | def license_url(self) -> str:
    method license_url (line 290) | def license_url(self, license_url: str):
    method release_time (line 294) | def release_time(self) -> int:
    method release_time (line 298) | def release_time(self, release_time: int):
    method fee (line 302) | def fee(self) -> Fee:
    method has_fee (line 306) | def has_fee(self) -> bool:
    method has_source (line 310) | def has_source(self) -> bool:
    method source (line 314) | def source(self) -> Source:
    method stream_type (line 318) | def stream_type(self) -> str:
    method image (line 322) | def image(self) -> Image:
    method video (line 326) | def video(self) -> Video:
    method audio (line 330) | def audio(self) -> Audio:
  class Channel (line 334) | class Channel(BaseClaim):
    method to_dict (line 343) | def to_dict(self):
    method public_key (line 351) | def public_key(self) -> str:
    method public_key (line 355) | def public_key(self, sd_public_key: str):
    method public_key_bytes (line 359) | def public_key_bytes(self) -> bytes:
    method public_key_bytes (line 367) | def public_key_bytes(self, public_key: bytes):
    method email (line 371) | def email(self) -> str:
    method email (line 375) | def email(self, email: str):
    method website_url (line 379) | def website_url(self) -> str:
    method website_url (line 383) | def website_url(self, website_url: str):
    method cover (line 387) | def cover(self) -> Source:
    method featured (line 391) | def featured(self) -> ClaimList:
  class Repost (line 395) | class Repost(BaseClaim):
    method to_dict (line 401) | def to_dict(self):
    method reference (line 408) | def reference(self) -> ClaimReference:
  class Collection (line 412) | class Collection(BaseClaim):
    method to_dict (line 420) | def to_dict(self):
    method claims (line 427) | def claims(self) -> ClaimList:

FILE: lbry/schema/compat.py
  function from_old_json_schema (line 11) | def from_old_json_schema(claim, payload: bytes):
  function from_types_v1 (line 54) | def from_types_v1(claim, payload: bytes):

FILE: lbry/schema/mime_types.py
  function guess_media_type (line 182) | def guess_media_type(path):
  function guess_stream_type (line 210) | def guess_stream_type(media_type):

FILE: lbry/schema/purchase.py
  class Purchase (line 7) | class Purchase(ClaimReference):
    method __init__ (line 13) | def __init__(self, claim_id=None):
    method to_dict (line 18) | def to_dict(self):
    method to_message_bytes (line 21) | def to_message_bytes(self) -> bytes:
    method to_bytes (line 24) | def to_bytes(self) -> bytes:
    method has_start_byte (line 31) | def has_start_byte(cls, data: bytes):
    method from_bytes (line 35) | def from_bytes(cls, data: bytes):
    method __len__ (line 43) | def __len__(self):
    method __bytes__ (line 46) | def __bytes__(self):

FILE: lbry/schema/result.py
  function set_reference (line 15) | def set_reference(reference, claim_hash, rows):
  class ResolveResult (line 25) | class ResolveResult(NamedTuple):
  class Censor (line 50) | class Censor:
    method __init__ (line 58) | def __init__(self, censor_type):
    method is_censored (line 62) | def is_censored(self, row):
    method apply (line 65) | def apply(self, rows):
    method censor (line 68) | def censor(self, row) -> Optional[bytes]:
    method to_message (line 76) | def to_message(self, outputs: OutputsMessage, extra_txo_rows: dict):
  class Outputs (line 84) | class Outputs:
    method __init__ (line 88) | def __init__(self, txos: List, extra_txos: List, txs: set,
    method inflate (line 98) | def inflate(self, txs):
    method inflate_blocked (line 105) | def inflate_blocked(self, tx_map):
    method message_to_txo (line 114) | def message_to_txo(self, txo_message, tx_map):
    method from_base64 (line 162) | def from_base64(cls, data: str) -> 'Outputs':
    method from_bytes (line 166) | def from_bytes(cls, data: bytes) -> 'Outputs':
    method to_base64 (line 181) | def to_base64(cls, txo_rows, extra_txo_rows, offset=0, total=None, blo...
    method to_bytes (line 185) | def to_bytes(cls, txo_rows, extra_txo_rows, offset=0, total=None, bloc...
    method encode_txo (line 215) | def encode_txo(cls, txo_message, resolve_result: Union['ResolveResult'...

FILE: lbry/schema/support.py
  class Support (line 5) | class Support(Signable):
    method emoji (line 10) | def emoji(self) -> str:
    method emoji (line 14) | def emoji(self, emoji: str):
    method comment (line 18) | def comment(self) -> str:
    method comment (line 22) | def comment(self, comment: str):

FILE: lbry/schema/tags.py
  function normalize_tag (line 8) | def normalize_tag(tag: str):
  function clean_tags (line 12) | def clean_tags(tags: List[str]):

FILE: lbry/schema/url.py
  function _create_url_regex (line 6) | def _create_url_regex():
  function normalize_name (line 45) | def normalize_name(name):
  class PathSegment (line 49) | class PathSegment(NamedTuple):
    method normalized (line 55) | def normalized(self):
    method is_shortid (line 59) | def is_shortid(self):
    method is_fullid (line 63) | def is_fullid(self):
    method to_dict (line 66) | def to_dict(self):
    method __str__ (line 74) | def __str__(self):
  class URL (line 82) | class URL(NamedTuple):
    method has_channel (line 87) | def has_channel(self):
    method has_stream (line 91) | def has_stream(self):
    method has_stream_in_channel (line 95) | def has_stream_in_channel(self):
    method parts (line 99) | def parts(self) -> Tuple:
    method __str__ (line 106) | def __str__(self):
    method parse (line 110) | def parse(cls, url):

FILE: lbry/stream/background_downloader.py
  class BackgroundDownloader (line 10) | class BackgroundDownloader:
    method __init__ (line 11) | def __init__(self, conf, storage, blob_manager, dht_node=None):
    method download_blobs (line 17) | async def download_blobs(self, sd_hash):

FILE: lbry/stream/descriptor.py
  function format_sd_info (line 31) | def format_sd_info(stream_name: str, key: str, suggested_file_name: str,...
  function random_iv_generator (line 43) | def random_iv_generator() -> typing.Generator[bytes, None, None]:
  function read_bytes (line 48) | def read_bytes(file_path: str, offset: int, to_read: int):
  function file_reader (line 54) | async def file_reader(file_path: str):
  function sanitize_file_name (line 69) | def sanitize_file_name(dirty_name: str, default_file_name: str = 'lbry_d...
  class StreamDescriptor (line 83) | class StreamDescriptor:
    method __init__ (line 95) | def __init__(self, loop: asyncio.AbstractEventLoop, blob_dir: str, str...
    method length (line 108) | def length(self) -> int:
    method get_stream_hash (line 111) | def get_stream_hash(self) -> str:
    method calculate_sd_hash (line 118) | def calculate_sd_hash(self) -> str:
    method as_json (line 123) | def as_json(self) -> bytes:
    method old_sort_json (line 131) | def old_sort_json(self) -> bytes:
    method calculate_old_sort_sd_hash (line 151) | def calculate_old_sort_sd_hash(self) -> str:
    method make_sd_blob (line 156) | async def make_sd_blob(
    method _from_stream_descriptor_blob (line 180) | def _from_stream_descriptor_blob(cls, loop: asyncio.AbstractEventLoop,...
    method from_stream_descriptor_blob (line 213) | async def from_stream_descriptor_blob(cls, loop: asyncio.AbstractEvent...
    method get_blob_hashsum (line 220) | def get_blob_hashsum(blob_dict: typing.Dict):
    method calculate_stream_hash (line 237) | def calculate_stream_hash(hex_stream_name: bytes, key: bytes, hex_sugg...
    method create_stream (line 250) | async def create_stream(
    method lower_bound_decrypted_length (line 283) | def lower_bound_decrypted_length(self) -> int:
    method upper_bound_decrypted_length (line 287) | def upper_bound_decrypted_length(self) -> int:
    method recover (line 291) | async def recover(cls, blob_dir: str, sd_blob: 'AbstractBlob', stream_...

FILE: lbry/stream/downloader.py
  class StreamDownloader (line 23) | class StreamDownloader:
    method __init__ (line 24) | def __init__(self, loop: asyncio.AbstractEventLoop, config: 'Config', ...
    method add_fixed_peers (line 52) | async def add_fixed_peers(self):
    method load_descriptor (line 67) | async def load_descriptor(self, connection_id: int = 0):
    method start (line 88) | async def start(self, node: typing.Optional['Node'] = None, connection...
    method download_stream_blob (line 109) | async def download_stream_blob(self, blob_info: 'BlobInfo', connection...
    method decrypt_blob (line 118) | def decrypt_blob(self, blob_info: 'BlobInfo', blob: 'AbstractBlob') ->...
    method read_blob (line 123) | async def read_blob(self, blob_info: 'BlobInfo', connection_id: int = ...
    method stop (line 133) | def stop(self):

FILE: lbry/stream/managed_stream.py
  function _get_next_available_file_name (line 27) | def _get_next_available_file_name(download_directory: str, file_name: st...
  function get_next_available_file_name (line 37) | async def get_next_available_file_name(loop: asyncio.AbstractEventLoop, ...
  class ManagedStream (line 41) | class ManagedStream(ManagedDownloadSource):
    method __init__ (line 42) | def __init__(self, loop: asyncio.AbstractEventLoop, config: 'Config', ...
    method sd_hash (line 68) | def sd_hash(self) -> str:
    method is_fully_reflected (line 72) | def is_fully_reflected(self) -> bool:
    method descriptor (line 76) | def descriptor(self) -> StreamDescriptor:
    method stream_hash (line 80) | def stream_hash(self) -> str:
    method file_name (line 84) | def file_name(self) -> Optional[str]:
    method suggested_file_name (line 88) | def suggested_file_name(self) -> Optional[str]:
    method stream_name (line 94) | def stream_name(self) -> Optional[str]:
    method written_bytes (line 100) | def written_bytes(self) -> int:
    method completed (line 104) | def completed(self):
    method stream_url (line 108) | def stream_url(self):
    method update_status (line 111) | async def update_status(self, status: str):
    method blobs_completed (line 117) | def blobs_completed(self) -> int:
    method blobs_in_stream (line 122) | def blobs_in_stream(self) -> int:
    method blobs_remaining (line 126) | def blobs_remaining(self) -> int:
    method mime_type (line 130) | def mime_type(self):
    method download_path (line 134) | def download_path(self):
    method start (line 156) | async def start(self, timeout: Optional[float] = None,
    method stop (line 189) | async def stop(self, finished: bool = False):
    method _aiter_read_stream (line 198) | async def _aiter_read_stream(self, start_blob_num: Optional[int] = 0, ...
    method stream_file (line 210) | async def stream_file(self, request: Request) -> StreamResponse:
    method _write_decrypted_blob (line 254) | def _write_decrypted_blob(output_path: str, data: bytes):
    method _save_file (line 259) | async def _save_file(self, output_path: str):
    method save_file (line 302) | async def save_file(self, file_name: Optional[str] = None, download_di...
    method stop_tasks (line 330) | async def stop_tasks(self):
    method upload_to_reflector (line 342) | async def upload_to_reflector(self, host: str, port: int) -> typing.Li...
    method update_content_claim (line 388) | async def update_content_claim(self, claim_info: Optional[typing.Dict]...
    method _delayed_stop (line 393) | async def _delayed_stop(self):
    method _prepare_range_response_headers (line 407) | def _prepare_range_response_headers(self, get_range: str) -> typing.Tu...

FILE: lbry/stream/reflector/client.py
  class StreamReflectorClient (line 18) | class StreamReflectorClient(asyncio.Protocol):
    method __init__ (line 19) | def __init__(self, blob_manager: 'BlobManager', descriptor: 'StreamDes...
    method connection_made (line 30) | def connection_made(self, transport):
    method connection_lost (line 35) | def connection_lost(self, exc: typing.Optional[Exception]):
    method data_received (line 43) | def data_received(self, data):
    method send_request (line 61) | async def send_request(self, request_dict: typing.Dict, timeout: int =...
    method send_handshake (line 76) | async def send_handshake(self) -> None:
    method send_descriptor (line 85) | async def send_descriptor(self) -> typing.Tuple[bool, typing.List[str]...
    method send_blob (line 119) | async def send_blob(self, blob_hash: str):

FILE: lbry/stream/reflector/server.py
  class ReflectorServerProtocol (line 17) | class ReflectorServerProtocol(asyncio.Protocol):
    method __init__ (line 18) | def __init__(self, blob_manager: 'BlobManager', response_chunk_size: i...
    method wait_for_stop (line 39) | async def wait_for_stop(self):
    method connection_made (line 44) | def connection_made(self, transport):
    method connection_lost (line 48) | def connection_lost(self, exc):
    method data_received (line 53) | def data_received(self, data: bytes):
    method send_response (line 67) | def send_response(self, response: typing.Dict):
    method handle_request (line 78) | async def handle_request(self, request: typing.Dict):  # pylint: disab...
  class ReflectorServer (line 158) | class ReflectorServer:
    method __init__ (line 159) | def __init__(self, blob_manager: 'BlobManager', response_chunk_size: i...
    method start_server (line 173) | def start_server(self, port: int, interface: typing.Optional[str] = '0...
    method stop_server (line 195) | def stop_server(self):

FILE: lbry/stream/stream_manager.py
  function path_or_none (line 26) | def path_or_none(encoded_path) -> Optional[str]:
  class StreamManager (line 32) | class StreamManager(SourceManager):
    method __init__ (line 46) | def __init__(self, loop: asyncio.AbstractEventLoop, config: 'Config', ...
    method streams (line 60) | def streams(self):
    method add (line 63) | def add(self, source: ManagedStream):
    method _update_content_claim (line 67) | async def _update_content_claim(self, stream: ManagedStream):
    method recover_streams (line 71) | async def recover_streams(self, file_infos: typing.List[typing.Dict]):
    method _load_stream (line 104) | async def _load_stream(self, rowid: int, sd_hash: str, file_name: Opti...
    method initialize_from_database (line 122) | async def initialize_from_database(self):
    method reflect_streams (line 164) | async def reflect_streams(self):
    method _reflect_streams (line 170) | async def _reflect_streams(self):
    method start (line 195) | async def start(self):
    method stop (line 199) | async def stop(self):
    method reflect_stream (line 213) | def reflect_stream(self, stream: ManagedStream, server: Optional[str] ...
    method _retriable_reflect_stream (line 228) | async def _retriable_reflect_stream(stream, host, port):
    method create (line 235) | async def create(self, file_path: str, key: Optional[bytes] = None,
    method delete (line 258) | async def delete(self, source: ManagedDownloadSource, delete_file: Opt...
    method stream_partial_content (line 272) | async def stream_partial_content(self, request: Request, sd_hash: str):

FILE: lbry/testcase.py
  class ColorHandler (line 42) | class ColorHandler(logging.StreamHandler):
    method emit (line 64) | def emit(self, record):
  class AsyncioTestCase (line 84) | class AsyncioTestCase(unittest.TestCase):
    method asyncSetUp (line 93) | async def asyncSetUp(self):  # pylint: disable=C0103
    method asyncTearDown (line 96) | async def asyncTearDown(self):  # pylint: disable=C0103
    method run (line 99) | def run(self, result=None):  # pylint: disable=R0915
    method doAsyncCleanups (line 189) | def doAsyncCleanups(self):  # pylint: disable=C0103
    method cancel (line 199) | def cancel(self):
    method add_timeout (line 205) | def add_timeout(self):
    method check_timeout (line 209) | def check_timeout(self, started):
  class AdvanceTimeTestCase (line 216) | class AdvanceTimeTestCase(AsyncioTestCase):
    method asyncSetUp (line 218) | async def asyncSetUp(self):
    method advance (line 223) | async def advance(self, seconds):
  class IntegrationTestCase (line 232) | class IntegrationTestCase(AsyncioTestCase):
    method __init__ (line 236) | def __init__(self, *args, **kwargs):
    method asyncSetUp (line 246) | async def asyncSetUp(self):
    method assertBalance (line 263) | async def assertBalance(self, account, expected_balance: str):  # pyli...
    method broadcast (line 267) | def broadcast(self, tx):
    method broadcast_and_confirm (line 270) | async def broadcast_and_confirm(self, tx, ledger=None):
    method on_header (line 277) | async def on_header(self, height):
    method send_to_address_and_wait (line 284) | async def send_to_address_and_wait(self, address, amount, blocks_to_ge...
    method generate_and_wait (line 299) | async def generate_and_wait(self, blocks_to_generate, txids, ledger=No...
    method on_address_update (line 307) | def on_address_update(self, address):
    method on_transaction_address (line 312) | def on_transaction_address(self, tx, address):
    method generate (line 317) | async def generate(self, blocks):
  class FakeExchangeRateManager (line 334) | class FakeExchangeRateManager(ExchangeRateManager):
    method __init__ (line 336) | def __init__(self, market_feeds, rates):  # pylint: disable=super-init...
    method start (line 342) | def start(self):
    method stop (line 345) | def stop(self):
  function get_fake_exchange_rate_manager (line 349) | def get_fake_exchange_rate_manager(rates=None):
  class ExchangeRateManagerComponent (line 356) | class ExchangeRateManagerComponent(Component):
    method __init__ (line 359) | def __init__(self, component_manager, rates=None):
    method component (line 364) | def component(self) -> ExchangeRateManager:
    method start (line 367) | async def start(self):
    method stop (line 370) | async def stop(self):
  class CommandTestCase (line 374) | class CommandTestCase(IntegrationTestCase):
    method __init__ (line 379) | def __init__(self, *args, **kwargs):
    method asyncSetUp (line 392) | async def asyncSetUp(self):
    method asyncTearDown (line 429) | async def asyncTearDown(self):
    method add_daemon (line 437) | async def add_daemon(self, wallet_node=None, seed=None):
    method confirm_tx (line 500) | async def confirm_tx(self, txid, ledger=None):
    method on_transaction_dict (line 512) | async def on_transaction_dict(self, tx):
    method get_all_addresses (line 516) | def get_all_addresses(tx):
    method blockchain_claim_name (line 524) | async def blockchain_claim_name(self, name: str, value: str, amount: s...
    method blockchain_update_name (line 530) | async def blockchain_update_name(self, txid: str, value: str, amount: ...
    method out (line 536) | async def out(self, awaitable):
    method sout (line 540) | def sout(self, value):
    method confirm_and_render (line 544) | async def confirm_and_render(self, awaitable, confirm, return_tx=False...
    method create_nondeterministic_channel (line 554) | async def create_nondeterministic_channel(self, name, price, pubkey_by...
    method create_upload_file (line 567) | def create_upload_file(self, data, prefix=None, suffix=None):
    method stream_create (line 574) | async def stream_create(
    method stream_update (line 583) | async def stream_update(
    method stream_repost (line 594) | async def stream_repost(self, claim_id, name='repost', bid='1.0', conf...
    method stream_abandon (line 599) | async def stream_abandon(self, *args, confirm=True, **kwargs):
    method purchase_create (line 606) | async def purchase_create(self, *args, confirm=True, **kwargs):
    method publish (line 611) | async def publish(self, name, *args, confirm=True, **kwargs):
    method channel_create (line 616) | async def channel_create(self, name='@arena', bid='1.0', confirm=True,...
    method channel_update (line 621) | async def channel_update(self, claim_id, confirm=True, **kwargs):
    method channel_abandon (line 626) | async def channel_abandon(self, *args, confirm=True, **kwargs):
    method collection_create (line 633) | async def collection_create(
    method collection_update (line 639) | async def collection_update(
    method collection_abandon (line 645) | async def collection_abandon(self, *args, confirm=True, **kwargs):
    method support_create (line 652) | async def support_create(self, claim_id, bid='1.0', confirm=True, **kw...
    method support_abandon (line 657) | async def support_abandon(self, *args, confirm=True, **kwargs):
    method account_send (line 664) | async def account_send(self, *args, confirm=True, **kwargs):
    method wallet_send (line 669) | async def wallet_send(self, *args, confirm=True, **kwargs):
    method txo_spend (line 674) | async def txo_spend(self, *args, confirm=True, **kwargs):
    method blob_clean (line 682) | async def blob_clean(self):
    method status (line 685) | async def status(self):
    method resolve (line 688) | async def resolve(self, uri, **kwargs):
    method claim_search (line 691) | async def claim_search(self, **kwargs):
    method get_claim_by_claim_id (line 694) | async def get_claim_by_claim_id(self, claim_id):
    method file_list (line 697) | async def file_list(self, *args, **kwargs):
    method txo_list (line 700) | async def txo_list(self, *args, **kwargs):
    method txo_sum (line 703) | async def txo_sum(self, *args, **kwargs):
    method txo_plot (line 706) | async def txo_plot(self, *args, **kwargs):
    method claim_list (line 709) | async def claim_list(self, *args, **kwargs):
    method stream_list (line 712) | async def stream_list(self, *args, **kwargs):
    method channel_list (line 715) | async def channel_list(self, *args, **kwargs):
    method transaction_list (line 718) | async def transaction_list(self, *args, **kwargs):
    method blob_list (line 721) | async def blob_list(self, *args, **kwargs):
    method get_claim_id (line 725) | def get_claim_id(tx):
    method assertItemCount (line 728) | def assertItemCount(self, result, count):  # pylint: disable=invalid-name

FILE: lbry/torrent/session.py
  class TorrentHandle (line 20) | class TorrentHandle:
    method __init__ (line 21) | def __init__(self, loop, executor, handle):
    method largest_file (line 37) | def largest_file(self) -> Optional[str]:
    method largest_file_index (line 44) | def largest_file_index(self):
    method stop_tasks (line 52) | def stop_tasks(self):
    method _show_status (line 56) | def _show_status(self):
    method status_loop (line 85) | async def status_loop(self):
    method pause (line 92) | async def pause(self):
    method resume (line 97) | async def resume(self):
  class TorrentSession (line 103) | class TorrentSession:
    method __init__ (line 104) | def __init__(self, loop, executor):
    method add_fake_torrent (line 112) | async def add_fake_torrent(self):
    method bind (line 122) | async def bind(self, interface: str = '0.0.0.0', port: int = 10889):
    method stop (line 133) | def stop(self):
    method _pop_alerts (line 144) | def _pop_alerts(self):
    method process_alerts (line 148) | async def process_alerts(self):
    method pause (line 155) | async def pause(self):
    method resume (line 163) | async def resume(self):
    method _add_torrent (line 168) | def _add_torrent(self, btih: str, download_directory: Optional[str]):
    method full_path (line 176) | def full_path(self, btih):
    method add_torrent (line 179) | async def add_torrent(self, btih, download_path):
    method remove_torrent (line 189) | def remove_torrent(self, btih, remove_files=False):
    method save_file (line 196) | async def save_file(self, btih, download_directory):
    method get_size (line 200) | def get_size(self, btih):
    method get_name (line 203) | def get_name(self, btih):
    method get_downloaded (line 206) | def get_downloaded(self, btih):
    method is_completed (line 209) | def is_completed(self, btih):
  function get_magnet_uri (line 213) | def get_magnet_uri(btih):
  function _create_fake_torrent (line 217) | def _create_fake_torrent(tmpdir):
  function main (line 231) | async def main():

FILE: lbry/torrent/torrent.py
  class TorrentInfo (line 9) | class TorrentInfo:
    method __init__ (line 12) | def __init__(self, dht_seeds: typing.Tuple[typing.Tuple[str, int]],
    method from_libtorrent_info (line 21) | def from_libtorrent_info(cls, torrent_info):
  class Torrent (line 35) | class Torrent:
    method __init__ (line 36) | def __init__(self, loop, handle):
    method _threaded_update_status (line 41) | def _threaded_update_status(self):
    method wait_for_finished (line 52) | async def wait_for_finished(self):
    method pause (line 63) | async def pause(self):
    method resume (line 69) | async def resume(self):

FILE: lbry/torrent/torrent_manager.py
  function path_or_none (line 22) | def path_or_none(encoded_path) -> Optional[str]:
  class TorrentSource (line 28) | class TorrentSource(ManagedDownloadSource):
    method __init__ (line 35) | def __init__(self, loop: asyncio.AbstractEventLoop, config: 'Config', ...
    method full_path (line 47) | def full_path(self) -> Optional[str]:
    method start (line 52) | async def start(self, timeout: Optional[float] = None, save_now: Optio...
    method stop (line 55) | async def stop(self, finished: bool = False):
    method save_file (line 58) | async def save_file(self, file_name: Optional[str] = None, download_di...
    method torrent_length (line 62) | def torrent_length(self):
    method written_bytes (line 66) | def written_bytes(self):
    method torrent_name (line 70) | def torrent_name(self):
    method bt_infohash (line 74) | def bt_infohash(self):
    method stop_tasks (line 77) | async def stop_tasks(self):
    method completed (line 81) | def completed(self):
  class TorrentManager (line 85) | class TorrentManager(SourceManager):
    method __init__ (line 95) | def __init__(self, loop: asyncio.AbstractEventLoop, config: 'Config', ...
    method recover_streams (line 100) | async def recover_streams(self, file_infos: typing.List[typing.Dict]):
    method _load_stream (line 103) | async def _load_stream(self, rowid: int, bt_infohash: str, file_name: ...
    method initialize_from_database (line 115) | async def initialize_from_database(self):
    method start (line 118) | async def start(self):
    method stop (line 121) | async def stop(self):
    method delete (line 125) | async def delete(self, source: ManagedDownloadSource, delete_file: Opt...
    method create (line 129) | async def create(self, file_path: str, key: Optional[bytes] = None,
    method _delete (line 133) | async def _delete(self, source: ManagedDownloadSource, delete_file: Op...
    method stream_partial_content (line 139) | async def stream_partial_content(self, request: Request, sd_hash: str):

FILE: lbry/torrent/tracker.py
  function decode (line 49) | def decode(cls, data, offset=0):
  function encode (line 62) | def encode(obj):
  function make_peer_id (line 72) | def make_peer_id(random_part: Optional[str] = None) -> bytes:
  class UDPTrackerClientProtocol (line 79) | class UDPTrackerClientProtocol(asyncio.DatagramProtocol):
    method __init__ (line 80) | def __init__(self, timeout: float = DEFAULT_TIMEOUT_SECONDS):
    method connection_made (line 86) | def connection_made(self, transport: asyncio.DatagramTransport) -> None:
    method request (line 89) | async def request(self, obj, tracker_ip, tracker_port):
    method connect (line 98) | async def connect(self, tracker_ip, tracker_port):
    method ensure_connection_id (line 105) | async def ensure_connection_id(self, peer_id, tracker_ip, tracker_port):
    method announce (line 109) | async def announce(self, info_hash, peer_id, port, tracker_ip, tracker...
    method scrape (line 118) | async def scrape(self, infohashes, tracker_ip, tracker_port, connectio...
    method datagram_received (line 125) | def datagram_received(self, data: bytes, addr: (str, int)) -> None:
    method connection_lost (line 136) | def connection_lost(self, exc: Exception = None) -> None:
  class TrackerClient (line 140) | class TrackerClient:
    method __init__ (line 143) | def __init__(self, node_id, announce_port, get_servers, timeout=10.0):
    method start (line 152) | async def start(self):
    method stop (line 158) | def stop(self):
    method on_hash (line 167) | def on_hash(self, info_hash, on_announcement=None):
    method announce_many (line 173) | async def announce_many(self, *info_hashes, stopped=False):
    method _announce_many (line 178) | async def _announce_many(self, server, info_hashes, stopped=False):
    method get_peer_list (line 192) | async def get_peer_list(self, info_hash, stopped=False, on_announcemen...
    method get_kademlia_peer_list (line 202) | async def get_kademlia_peer_list(self, info_hash):
    method _probe_server (line 206) | async def _probe_server(self, info_hash, tracker_host, tracker_port, s...
  function enqueue_tracker_search (line 230) | def enqueue_tracker_search(info_hash: bytes, peer_q: asyncio.Queue):
  function announcement_to_kademlia_peers (line 238) | def announcement_to_kademlia_peers(*announcements: AnnounceResponse):
  class UDPTrackerServerProtocol (line 246) | class UDPTrackerServerProtocol(asyncio.DatagramProtocol):  # for testing...
    method __init__ (line 247) | def __init__(self):
    method connection_made (line 252) | def connection_made(self, transport: asyncio.DatagramTransport) -> None:
    method add_peer (line 255) | def add_peer(self, info_hash, ip_address: str, port: int):
    method datagram_received (line 259) | def datagram_received(self, data: bytes, addr: (str, int)) -> None:
  function encode_peer (line 283) | def encode_peer(ip_address: str, port: int):

FILE: lbry/utils.py
  function now (line 31) | def now():
  function utcnow (line 35) | def utcnow():
  function isonow (line 39) | def isonow():
  function today (line 44) | def today():
  function timedelta (line 48) | def timedelta(**kwargs):
  function datetime_obj (line 52) | def datetime_obj(*args, **kwargs):
  function get_lbry_hash_obj (line 56) | def get_lbry_hash_obj():
  function generate_id (line 60) | def generate_id(num=None):
  function version_is_greater_than (line 69) | def version_is_greater_than(version_a, version_b):
  function rot13 (line 74) | def rot13(some_str):
  function deobfuscate (line 78) | def deobfuscate(obfustacated):
  function obfuscate (line 82) | def obfuscate(plain):
  function check_connection (line 86) | def check_connection(server="lbry.com", port=80, timeout=5) -> bool:
  function random_string (line 107) | def random_string(length=10, chars=string.ascii_lowercase):
  function short_hash (line 111) | def short_hash(hash_str):
  function get_sd_hash (line 115) | def get_sd_hash(stream_info):
  function json_dumps_pretty (line 130) | def json_dumps_pretty(obj, **kwargs):
  function aclosing (line 138) | async def aclosing(thing):
  function async_timed_cache (line 144) | def async_timed_cache(duration: int):
  function cache_concurrent (line 163) | def cache_concurrent(async_fn):
  function resolve_host (line 182) | async def resolve_host(url: str, port: int, proto: str) -> str:
  class LRUCacheWithMetrics (line 201) | class LRUCacheWithMetrics:
    method __init__ (line 210) | def __init__(self, capacity: int, metric_name: typing.Optional[str] = ...
    method get (line 230) | def get(self, key, default=None):
    method set (line 242) | def set(self, key, value):
    method clear (line 250) | def clear(self):
    method pop (line 253) | def pop(self, key):
    method __setitem__ (line 256) | def __setitem__(self, key, value):
    method __getitem__ (line 259) | def __getitem__(self, item):
    method __contains__ (line 262) | def __contains__(self, item) -> bool:
    method __len__ (line 265) | def __len__(self):
    method __delitem__ (line 268) | def __delitem__(self, key):
    method __del__ (line 271) | def __del__(self):
  class LRUCache (line 275) | class LRUCache:
    method __init__ (line 281) | def __init__(self, capacity: int):
    method get (line 285) | def get(self, key, default=None):
    method set (line 293) | def set(self, key, value):
    method items (line 301) | def items(self):
    method clear (line 304) | def clear(self):
    method pop (line 307) | def pop(self, key, default=None):
    method __setitem__ (line 310) | def __setitem__(self, key, value):
    method __getitem__ (line 313) | def __getitem__(self, item):
    method __contains__ (line 316) | def __contains__(self, item) -> bool:
    method __len__ (line 319) | def __len__(self):
    method __delitem__ (line 322) | def __delitem__(self, key):
    method __del__ (line 325) | def __del__(self):
  function lru_cache_concurrent (line 329) | def lru_cache_concurrent(cache_size: typing.Optional[int] = None,
  function get_ssl_context (line 356) | def get_ssl_context() -> ssl.SSLContext:
  function aiohttp_request (line 363) | async def aiohttp_request(method, url, **kwargs) -> typing.AsyncContextM...
  function is_valid_public_ipv4 (line 374) | def is_valid_public_ipv4(address, allow_localhost: bool = False, allow_l...
  function fallback_get_external_ip (line 391) | async def fallback_get_external_ip():  # used if spv servers can't be us...
  function _get_external_ip (line 401) | async def _get_external_ip(default_servers) -> typing.Tuple[typing.Optio...
  function get_external_ip (line 440) | async def get_external_ip(default_servers) -> typing.Tuple[typing.Option...
  function is_running_from_bundle (line 447) | def is_running_from_bundle():
  class LockWithMetrics (line 452) | class LockWithMetrics(asyncio.Lock):
    method __init__ (line 453) | def __init__(self, acquire_metric, held_time_metric):
    method acquire (line 459) | async def acquire(self):
    method release (line 467) | def release(self):
  function get_colliding_prefix_bits (line 474) | def get_colliding_prefix_bits(first_value: bytes, second_value: bytes):

FILE: lbry/wallet/account.py
  function validate_claim_id (line 27) | def validate_claim_id(claim_id):
  class DeterministicChannelKeyManager (line 36) | class DeterministicChannelKeyManager:
    method __init__ (line 38) | def __init__(self, account: 'Account'):
    method private_key (line 45) | def private_key(self):
    method maybe_generate_deterministic_key_for_channel (line 51) | def maybe_generate_deterministic_key_for_channel(self, txo):
    method ensure_cache_primed (line 61) | async def ensure_cache_primed(self):
    method generate_next_key (line 65) | async def generate_next_key(self) -> PrivateKey:
    method get_private_key_from_pubkey_hash (line 75) | def get_private_key_from_pubkey_hash(self, pubkey_hash) -> PrivateKey:
  class AddressManager (line 79) | class AddressManager:
    method __init__ (line 85) | def __init__(self, account, public_key, chain_number):
    method from_dict (line 92) | def from_dict(cls, account: 'Account', d: dict) \
    method to_dict (line 97) | def to_dict(cls, receiving: 'AddressManager', change: 'AddressManager'...
    method merge (line 107) | def merge(self, d: dict):
    method to_dict_instance (line 110) | def to_dict_instance(self) -> Optional[dict]:
    method _query_addresses (line 113) | def _query_addresses(self, **constraints):
    method get_private_key (line 121) | def get_private_key(self, index: int) -> PrivateKey:
    method get_public_key (line 124) | def get_public_key(self, index: int) -> PublicKey:
    method get_max_gap (line 127) | async def get_max_gap(self):
    method ensure_address_gap (line 130) | async def ensure_address_gap(self):
    method get_address_records (line 133) | def get_address_records(self, only_usable: bool = False, **constraints):
    method get_addresses (line 136) | async def get_addresses(self, only_usable: bool = False, **constraints...
    method get_or_create_usable_address (line 140) | async def get_or_create_usable_address(self) -> str:
  class HierarchicalDeterministic (line 149) | class HierarchicalDeterministic(AddressManager):
    method __init__ (line 156) | def __init__(self, account: 'Account', chain: int, gap: int, maximum_u...
    method from_dict (line 162) | def from_dict(cls, account: 'Account', d: dict) -> Tuple[AddressManage...
    method merge (line 168) | def merge(self, d: dict):
    method to_dict_instance (line 172) | def to_dict_instance(self):
    method get_private_key (line 175) | def get_private_key(self, index: int) -> PrivateKey:
    method get_public_key (line 178) | def get_public_key(self, index: int) -> PublicKey:
    method get_max_gap (line 181) | async def get_max_gap(self) -> int:
    method ensure_address_gap (line 193) | async def ensure_address_gap(self) -> List[str]:
    method _generate_keys (line 213) | async def _generate_keys(self, start: int, end: int) -> List[str]:
    method get_address_records (line 220) | def get_address_records(self, only_usable: bool = False, **constraints):
  class SingleKey (line 228) | class SingleKey(AddressManager):
    method from_dict (line 236) | def from_dict(cls, account: 'Account', d: dict) \
    method to_dict_instance (line 241) | def to_dict_instance(self):
    method get_private_key (line 244) | def get_private_key(self, index: int) -> PrivateKey:
    method get_public_key (line 247) | def get_public_key(self, index: int) -> PublicKey:
    method get_max_gap (line 250) | async def get_max_gap(self) -> int:
    method ensure_address_gap (line 253) | async def ensure_address_gap(self) -> List[str]:
    method get_address_records (line 263) | def get_address_records(self, only_usable: bool = False, **constraints):
  class Account (line 267) | class Account:
    method __init__ (line 274) | def __init__(self, ledger: 'Ledger', wallet: 'Wallet', name: str,
    method get_init_vector (line 298) | def get_init_vector(self, key) -> Optional[bytes]:
    method generate (line 305) | def generate(cls, ledger: 'Ledger', wallet: 'Wallet',
    method get_private_key_from_seed (line 314) | def get_private_key_from_seed(cls, ledger: 'Ledger', seed: str, passwo...
    method keys_from_dict (line 320) | def keys_from_dict(cls, ledger: 'Ledger', d: dict) \
    method from_dict (line 339) | def from_dict(cls, ledger: 'Ledger', wallet: 'Wallet', d: dict):
    method to_dict (line 358) | def to_dict(self, encrypt_password: str = None, include_channel_keys: ...
    method merge (line 383) | def merge(self, d: dict):
    method hash (line 395) | def hash(self) -> bytes:
    method get_details (line 402) | async def get_details(self, show_seed=False, **kwargs):
    method decrypt (line 419) | def decrypt(self, password: str) -> bool:
    method _decrypt_private_key_string (line 435) | def _decrypt_private_key_string(self, password: str) -> Optional[Priva...
    method _decrypt_seed (line 445) | def _decrypt_seed(self, password: str) -> str:
    method encrypt (line 459) | def encrypt(self, password: str) -> bool:
    method ensure_address_gap (line 471) | async def ensure_address_gap(self):
    method get_addresses (line 478) | async def get_addresses(self, read_only=False, **constraints) -> List[...
    method get_address_records (line 482) | def get_address_records(self, **constraints):
    method get_address_count (line 485) | def get_address_count(self, **constraints):
    method get_private_key (line 488) | def get_private_key(self, chain: int, index: int) -> PrivateKey:
    method get_public_key (line 492) | def get_public_key(self, chain: int, index: int) -> PublicKey:
    method get_balance (line 495) | def get_balance(self, confirmations=0, include_claims=False, read_only...
    method get_max_gap (line 503) | async def get_max_gap(self):
    method get_txos (line 511) | def get_txos(self, **constraints):
    method get_txo_count (line 514) | def get_txo_count(self, **constraints):
    method get_utxos (line 517) | def get_utxos(self, **constraints):
    method get_utxo_count (line 520) | def get_utxo_count(self, **constraints):
    method get_transactions (line 523) | def get_transactions(self, **constraints):
    method get_transaction_count (line 526) | def get_transaction_count(self, **constraints):
    method fund (line 529) | async def fund(self, to_account, amount=None, everything=False,
    method generate_channel_private_key (line 563) | async def generate_channel_private_key(self):
    method add_channel_private_key (line 566) | def add_channel_private_key(self, private_key: PrivateKey):
    method get_channel_private_key (line 569) | async def get_channel_private_key(self, public_key_bytes) -> PrivateKey:
    method maybe_migrate_certificates (line 576) | async def maybe_migrate_certificates(self):
    method save_max_gap (line 591) | async def save_max_gap(self):
    method get_detailed_balance (line 606) | async def get_detailed_balance(self, confirmations=0, read_only=False):
    method get_transaction_history (line 615) | def get_transaction_history(self, read_only=False, **constraints):
    method get_transaction_history_count (line 620) | def get_transaction_history_count(self, read_only=False, **constraints):
    method get_claims (line 625) | def get_claims(self, **constraints):
    method get_claim_count (line 628) | def get_claim_count(self, **constraints):
    method get_streams (line 631) | def get_streams(self, **constraints):
    method get_stream_count (line 634) | def get_stream_count(self, **constraints):
    method get_channels (line 637) | def get_channels(self, **constraints):
    method get_channel_count (line 640) | def get_channel_count(self, **constraints):
    method get_collections (line 643) | def get_collections(self, **constraints):
    method get_collection_count (line 646) | def get_collection_count(self, **constraints):
    method get_supports (line 649) | def get_supports(self, **constraints):
    method get_support_count (line 652) | def get_support_count(self, **constraints):
    method get_support_summary (line 655) | def get_support_summary(self):
    method release_all_outputs (line 658) | async def release_all_outputs(self):

FILE: lbry/wallet/bcd_data_stream.py
  class BCDataStream (line 5) | class BCDataStream:
    method __init__ (line 7) | def __init__(self, data=None):
    method reset (line 10) | def reset(self):
    method get_bytes (line 13) | def get_bytes(self):
    method read (line 16) | def read(self, size):
    method write (line 19) | def write(self, data):
    method write_many (line 22) | def write_many(self, many):
    method read_string (line 25) | def read_string(self):
    method write_string (line 28) | def write_string(self, s):
    method read_compact_size (line 32) | def read_compact_size(self):
    method write_compact_size (line 43) | def write_compact_size(self, size):
    method read_boolean (line 56) | def read_boolean(self):
    method write_boolean (line 59) | def write_boolean(self, val):
    method _read_struct (line 71) | def _read_struct(self, fmt):
    method read_int8 (line 76) | def read_int8(self):
    method read_uint8 (line 79) | def read_uint8(self):
    method read_int16 (line 82) | def read_int16(self):
    method read_uint16 (line 85) | def read_uint16(self):
    method read_int32 (line 88) | def read_int32(self):
    method read_uint32 (line 91) | def read_uint32(self):
    method read_int64 (line 94) | def read_int64(self):
    method read_uint64 (line 97) | def read_uint64(self):
    method write_int8 (line 100) | def write_int8(self, val):
    method write_uint8 (line 103) | def write_uint8(self, val):
    method write_int16 (line 106) | def write_int16(self, val):
    method write_uint16 (line 109) | def write_uint16(self, val):
    method write_int32 (line 112) | def write_int32(self, val):
    method write_uint32 (line 115) | def write_uint32(self, val):
    method write_int64 (line 118) | def write_int64(self, val):
    method write_uint64 (line 121) | def write_uint64(self, val):

FILE: lbry/wallet/bip32.py
  class KeyPath (line 13) | class KeyPath:
  class DerivationError (line 19) | class DerivationError(Exception):
  class _KeyBase (line 23) | class _KeyBase:
    method __init__ (line 26) | def __init__(self, ledger, chain_code, n, depth, parent):
    method _hmac_sha512 (line 44) | def _hmac_sha512(self, msg):
    method _extended_key (line 49) | def _extended_key(self, ver_bytes, raw_serkey):
    method identifier (line 66) | def identifier(self):
    method extended_key (line 69) | def extended_key(self):
    method fingerprint (line 72) | def fingerprint(self):
    method parent_fingerprint (line 76) | def parent_fingerprint(self):
    method extended_key_string (line 80) | def extended_key_string(self):
  class PublicKey (line 85) | class PublicKey(_KeyBase):
    method __init__ (line 88) | def __init__(self, ledger, pubkey, chain_code, n, depth, parent=None):
    method from_compressed (line 96) | def from_compressed(cls, public_key_bytes, ledger=None) -> 'PublicKey':
    method _verifying_key_from_pubkey (line 100) | def _verifying_key_from_pubkey(cls, pubkey):
    method pubkey_bytes (line 111) | def pubkey_bytes(self):
    method address (line 116) | def address(self):
    method ec_point (line 120) | def ec_point(self):
    method child (line 123) | def child(self, n: int) -> 'PublicKey':
    method identifier (line 133) | def identifier(self):
    method extended_key (line 137) | def extended_key(self):
    method verify (line 144) | def verify(self, signature, digest) -> bool:
  class PrivateKey (line 175) | class PrivateKey(_KeyBase):
    method __init__ (line 180) | def __init__(self, ledger, privkey, chain_code, n, depth, parent=None):
    method _signing_key_from_privkey (line 188) | def _signing_key_from_privkey(cls, private_key):
    method _private_key_secret_exponent (line 193) | def _private_key_secret_exponent(cls, private_key):
    method from_seed (line 202) | def from_seed(cls, ledger, seed) -> 'PrivateKey':
    method from_pem (line 209) | def from_pem(cls, ledger, pem) -> 'PrivateKey':
    method from_bytes (line 219) | def from_bytes(cls, ledger, key_bytes) -> 'PrivateKey':
    method private_key_bytes (line 223) | def private_key_bytes(self):
    method public_key (line 228) | def public_key(self) -> PublicKey:
    method ec_point (line 237) | def ec_point(self):
    method secret_exponent (line 240) | def secret_exponent(self):
    method wif (line 244) | def wif(self):
    method address (line 249) | def address(self):
    method child (line 253) | def child(self, n) -> 'PrivateKey':
    method sign (line 268) | def sign(self, data):
    method sign_compact (line 272) | def sign_compact(self, digest):
    method identifier (line 294) | def identifier(self):
    method extended_key (line 298) | def extended_key(self):
    method to_pem (line 305) | def to_pem(self):
  function _from_extended_key (line 309) | def _from_extended_key(ledger, ekey):
  function from_extended_key_string (line 334) | def from_extended_key_string(ledger, ekey_str):

FILE: lbry/wallet/claim_proofs.py
  class InvalidProofError (line 6) | class InvalidProofError(Exception):
  function get_hash_for_outpoint (line 10) | def get_hash_for_outpoint(txhash, nout, height_of_last_takeover):
  function verify_proof (line 19) | def verify_proof(proof, root_hash, name):

FILE: lbry/wallet/coinselection.py
  function strategy (line 11) | def strategy(method):
  class CoinSelector (line 16) | class CoinSelector:
    method __init__ (line 18) | def __init__(self, target: int, cost_of_change: int, seed: str = None)...
    method select (line 27) | def select(
    method prefer_confirmed (line 38) | def prefer_confirmed(self, txos: List[OutputEffectiveAmountEstimator],
    method only_confirmed (line 46) | def only_confirmed(self, txos: List[OutputEffectiveAmountEstimator],
    method standard (line 57) | def standard(self, txos: List[OutputEffectiveAmountEstimator],
    method branch_and_bound (line 66) | def branch_and_bound(self, txos: List[OutputEffectiveAmountEstimator],
    method closest_match (line 126) | def closest_match(self, txos: List[OutputEffectiveAmountEstimator],
    method random_draw (line 140) | def random_draw(self, txos: List[OutputEffectiveAmountEstimator],

FILE: lbry/wallet/database.py
  class ReaderProcessState (line 37) | class ReaderProcessState:
  function initializer (line 44) | def initializer(path):
  function run_read_only_fetchall (line 52) | def run_read_only_fetchall(sql, params):
  function run_read_only_fetchone (line 61) | def run_read_only_fetchone(sql, params):
  class AIOSQLite (line 70) | class AIOSQLite:
    method __init__ (line 93) | def __init__(self):
    method connect (line 105) | async def connect(cls, path: Union[bytes, str], *args, **kwargs):
    method close (line 121) | async def close(self):
    method executemany (line 137) | def executemany(self, sql: str, params: Iterable):
    method executescript (line 142) | def executescript(self, script: str) -> Awaitable:
    method _execute_fetch (line 145) | async def _execute_fetch(self, sql: str, parameters: Iterable = None,
    method execute_fetchall (line 177) | async def execute_fetchall(self, sql: str, parameters: Iterable = None,
    method execute_fetchone (line 181) | async def execute_fetchone(self, sql: str, parameters: Iterable = None,
    method execute (line 185) | def execute(self, sql: str, parameters: Iterable = None) -> Awaitable[...
    method run (line 189) | async def run(self, fun, *args, **kwargs):
    method __run_transaction (line 219) | def __run_transaction(self, fun: Callable[[sqlite3.Connection, Any, An...
    method run_with_foreign_keys_disabled (line 232) | async def run_with_foreign_keys_disabled(self, fun, *args, **kwargs):
    method __run_transaction_with_foreign_keys_disabled (line 255) | def __run_transaction_with_foreign_keys_disabled(self,
  function constraints_to_sql (line 268) | def constraints_to_sql(constraints, joiner=' AND ', prepend_key=''):
  function query (line 341) | def query(select, **constraints) -> Tuple[str, Dict[str, Any]]:
  function interpolate (line 378) | def interpolate(sql, values):
  function constrain_single_or_list (line 391) | def constrain_single_or_list(constraints, column, value, convert=lambda ...
  class SQLiteMixin (line 421) | class SQLiteMixin:
    method __init__ (line 433) | def __init__(self, path):
    method open (line 438) | async def open(self):
    method close (line 461) | async def close(self):
    method _insert_sql (line 465) | def _insert_sql(table: str, data: dict, ignore_duplicate: bool = False,
    method _update_sql (line 482) | def _update_sql(table: str, data: dict, where: str,
  function dict_row_factory (line 495) | def dict_row_factory(cursor, row):
  function _get_spendable_utxos (line 505) | def _get_spendable_utxos(transaction: sqlite3.Connection, accounts: List...
  function get_and_reserve_spendable_utxos (line 563) | def get_and_reserve_spendable_utxos(transaction: sqlite3.Connection, acc...
  class Database (line 598) | class Database(SQLiteMixin):
    method open (line 688) | async def open(self):
    method txo_to_row (line 692) | def txo_to_row(self, tx, txo):
    method tx_to_row (line 728) | def tx_to_row(self, tx):
    method insert_transaction (line 743) | async def insert_transaction(self, tx):
    method update_transaction (line 746) | async def update_transaction(self, tx):
    method _transaction_io (line 751) | def _transaction_io(self, conn: sqlite3.Connection, tx: Transaction, a...
    method save_transaction_io (line 778) | def save_transaction_io(self, tx: Transaction, address, txhash, history):
    method save_transaction_io_batch (line 781) | def save_transaction_io_batch(self, txs: Iterable[Transaction], addres...
    method reserve_outputs (line 794) | async def reserve_outputs(self, txos, is_reserved=True):
    method release_outputs (line 798) | async def release_outputs(self, txos):
    method rewind_blockchain (line 801) | async def rewind_blockchain(self, above_height):  # pylint: disable=no...
    method get_spendable_utxos (line 807) | async def get_spendable_utxos(self, ledger, reserve_amount, accounts: ...
    method select_transactions (line 821) | async def select_transactions(self, cols, accounts=None, read_only=Fal...
    method get_transactions (line 839) | async def get_transactions(self, wallet=None, **constraints):
    method get_transaction_count (line 907) | async def get_transaction_count(self, **constraints):
    method get_transaction (line 915) | async def get_transaction(self, **constraints):
    method select_txos (line 920) | async def select_txos(
    method get_txos (line 979) | async def get_txos(
    method _clean_txo_constraints_for_aggregation (line 1101) | def _clean_txo_constraints_for_aggregation(constraints):
    method get_txo_count (line 1112) | async def get_txo_count(self, **constraints):
    method get_txo_sum (line 1117) | async def get_txo_sum(self, **constraints):
    method get_txo_plot (line 1122) | async def get_txo_plot(self, start_day=None, days_back=0, end_day=None...
    method get_utxos (line 1143) | def get_utxos(self, read_only=False, **constraints):
    method get_utxo_count (line 1146) | def get_utxo_count(self, **constraints):
    method get_balance (line 1149) | async def get_balance(self, wallet=None, accounts=None, read_only=Fals...
    method get_detailed_balance (line 1158) | async def get_detailed_balance(self, accounts, read_only=False, **cons...
    method select_addresses (line 1193) | async def select_addresses(self, cols, read_only=False, **constraints):
    method get_addresses (line 1199) | async def get_addresses(self, cols=None, read_only=False, **constraints):
    method get_address_count (line 1213) | async def get_address_count(self, cols=None, read_only=False, **constr...
    method get_address (line 1218) | async def get_address(self, read_only=False, **constraints):
    method add_keys (line 1223) | async def add_keys(self, account, chain, pubkeys):
    method _set_address_history (line 1239) | async def _set_address_history(self, address, history):
    method set_address_history (line 1245) | async def set_address_history(self, address, history):
    method is_channel_key_used (line 1248) | async def is_channel_key_used(self, account, key: PublicKey):
    method constrain_purchases (line 1261) | def constrain_purchases(constraints):
    method get_purchases (line 1275) | async def get_purchases(self, **constraints):
    method get_purchase_count (line 1279) | def get_purchase_count(self, **constraints):
    method constrain_claims (line 1284) | def constrain_claims(constraints):
    method get_claims (line 1295) | async def get_claims(self, read_only=False, **constraints) -> List[Out...
    method get_claim_count (line 1299) | def get_claim_count(self, **constraints):
    method constrain_streams (line 1304) | def constrain_streams(constraints):
    method get_streams (line 1307) | def get_streams(self, read_only=False, **constraints):
    method get_stream_count (line 1311) | def get_stream_count(self, **constraints):
    method constrain_channels (line 1316) | def constrain_channels(constraints):
    method get_channels (line 1319) | def get_channels(self, **constraints):
    method get_channel_count (line 1323) | def get_channel_count(self, **constraints):
    method constrain_supports (line 1328) | def constrain_supports(constraints):
    method get_supports (line 1331) | def get_supports(self, **constraints):
    method get_support_count (line 1335) | def get_support_count(self, **constraints):
    method constrain_collections (line 1340) | def constrain_collections(constraints):
    method get_collections (line 1343) | def get_collections(self, **constraints):
    method get_collection_count (line 1347) | def get_collection_count(self, **constraints):
    method release_all_outputs (line 1351) | async def release_all_outputs(self, account=None):
    method get_supports_summary (line 1362) | def get_supports_summary(self, read_only=False, **constraints):

FILE: lbry/wallet/dewies.py
  function lbc_to_dewies (line 5) | def lbc_to_dewies(lbc: str) -> int:
  function dewies_to_lbc (line 32) | def dewies_to_lbc(dewies) -> str:
  function dict_values_to_lbc (line 36) | def dict_values_to_lbc(d):

FILE: lbry/wallet/hash.py
  class TXRef (line 5) | class TXRef:
    method __init__ (line 9) | def __init__(self):
    method id (line 14) | def id(self):
    method hash (line 18) | def hash(self):
    method height (line 22) | def height(self):
    method is_null (line 26) | def is_null(self):
  class TXRefImmutable (line 30) | class TXRefImmutable(TXRef):
    method __init__ (line 34) | def __init__(self):
    method from_hash (line 39) | def from_hash(cls, tx_hash: bytes, height: int) -> 'TXRefImmutable':
    method from_id (line 47) | def from_id(cls, tx_id: str, height: int) -> 'TXRefImmutable':
    method height (line 55) | def height(self):

FILE: lbry/wallet/header.py
  class InvalidHeader (line 21) | class InvalidHeader(Exception):
    method __init__ (line 23) | def __init__(self, height, message):
  class Headers (line 29) | class Headers:
    method __init__ (line 43) | def __init__(self, path) -> None:
    method open (line 51) | async def open(self):
    method close (line 72) | async def close(self):
    method serialize (line 83) | def serialize(header):
    method deserialize (line 93) | def deserialize(height, header):
    method get_next_chunk_target (line 107) | def get_next_chunk_target(self, chunk: int) -> ArithUint256:
    method get_next_block_target (line 110) | def get_next_block_target(self, max_target: ArithUint256, previous: Op...
    method __len__ (line 126) | def __len__(self) -> int:
    method __bool__ (line 129) | def __bool__(self):
    method get (line 132) | async def get(self, height) -> dict:
    method estimated_timestamp (line 140) | def estimated_timestamp(self, height, try_real_headers=True):
    method estimated_julian_day (line 148) | def estimated_julian_day(self, height):
    method get_raw_header (line 151) | async def get_raw_header(self, height) -> bytes:
    method _read (line 158) | def _read(self, height, count=1):
    method chunk_hash (line 162) | def chunk_hash(self, start, count):
    method ensure_checkpointed_size (line 165) | async def ensure_checkpointed_size(self):
    method ensure_chunk_at (line 170) | async def ensure_chunk_at(self, height):
    method fetch_chunk (line 177) | async def fetch_chunk(self, height):
    method has_header (line 196) | def has_header(self, height):
    method get_all_missing_headers (line 205) | async def get_all_missing_headers(self):
    method height (line 215) | def height(self) -> int:
    method bytes_size (line 219) | def bytes_size(self):
    method hash (line 222) | async def hash(self, height=None) -> bytes:
    method hash_header (line 228) | def hash_header(header: bytes) -> bytes:
    method connect (line 233) | async def connect(self, start: int, headers: bytes) -> int:
    method _write (line 249) | def _write(self, height, verified_chunk):
    method validate_chunk (line 259) | async def validate_chunk(self, height, chunk):
    method validate_header (line 275) | def validate_header(self, height: int, current_hash: bytes,
    method repair (line 305) | async def repair(self, start_height=0):
    method get_proof_of_work (line 333) | def get_proof_of_work(cls, header_hash: bytes):
    method _iterate_chunks (line 336) | def _iterate_chunks(self, height: int, headers: bytes) -> Iterator[Tup...
    method _iterate_headers (line 345) | def _iterate_headers(self, height: int, headers: bytes) -> Iterator[Tu...
    method header_hash_to_pow_hash (line 353) | def header_hash_to_pow_hash(header_hash: bytes):
  class UnvalidatedHeaders (line 363) | class UnvalidatedHeaders(Headers):

FILE: lbry/wallet/ledger.py
  class LedgerRegistry (line 37) | class LedgerRegistry(type):
    method __new__ (line 41) | def __new__(mcs, name, bases, attrs):
    method get_ledger_class (line 51) | def get_ledger_class(mcs, ledger_id: str) -> LedgerType:
  class TransactionEvent (line 55) | class TransactionEvent(NamedTuple):
  class AddressesGeneratedEvent (line 60) | class AddressesGeneratedEvent(NamedTuple):
  class BlockHeightEvent (line 65) | class BlockHeightEvent(NamedTuple):
  class TransactionCacheItem (line 70) | class TransactionCacheItem:
    method __init__ (line 73) | def __init__(self, tx: Optional[Transaction] = None, lock: Optional[as...
    method tx (line 80) | def tx(self) -> Optional[Transaction]:
    method tx (line 84) | def tx(self, tx: Transaction):
  class Ledger (line 90) | class Ledger(metaclass=LedgerRegistry):
    method __init__ (line 113) | def __init__(self, config=None):
    method get_id (line 173) | def get_id(cls):
    method hash160_to_address (line 177) | def hash160_to_address(cls, h160):
    method hash160_to_script_address (line 182) | def hash160_to_script_address(cls, h160):
    method address_to_hash160 (line 187) | def address_to_hash160(address):
    method is_pubkey_address (line 191) | def is_pubkey_address(cls, address):
    method is_script_address (line 196) | def is_script_address(cls, address):
    method public_key_to_address (line 201) | def public_key_to_address(cls, public_key):
    method private_key_to_wif (line 205) | def private_key_to_wif(private_key):
    method path (line 209) | def path(self):
    method add_account (line 212) | def add_account(self, account: Account):
    method _get_account_and_address_info_for_address (line 215) | async def _get_account_and_address_info_for_address(self, wallet, addr...
    method get_private_key_for_address (line 222) | async def get_private_key_for_address(self, wallet, address) -> Option...
    method get_public_key_for_address (line 229) | async def get_public_key_for_address(self, wallet, address) -> Optiona...
    method get_account_for_address (line 236) | async def get_account_for_address(self, wallet, address):
    method get_effective_amount_estimators (line 241) | async def get_effective_amount_estimators(self, funding_accounts: Iter...
    method get_addresses (line 249) | async def get_addresses(self, **constraints):
    method get_address_count (line 252) | def get_address_count(self, **constraints):
    method get_spendable_utxos (line 255) | async def get_spendable_utxos(self, amount: int, funding_accounts: Opt...
    method reserve_outputs (line 269) | def reserve_outputs(self, txos):
    method release_outputs (line 272) | def release_outputs(self, txos):
    method release_tx (line 275) | def release_tx(self, tx):
    method get_utxos (line 278) | def get_utxos(self, **constraints):
    method get_utxo_count (line 282) | def get_utxo_count(self, **constraints):
    method get_txos (line 286) | async def get_txos(self, resolve=False, **constraints) -> List[Output]:
    method get_txo_count (line 292) | def get_txo_count(self, **constraints):
    method get_txo_sum (line 295) | def get_txo_sum(self, **constraints):
    method get_txo_plot (line 298) | def get_txo_plot(self, **constraints):
    method get_transactions (line 301) | def get_transactions(self, **constraints):
    method get_transaction_count (line 304) | def get_transaction_count(self, **constraints):
    method get_local_status_and_history (line 307) | async def get_local_status_and_history(self, address, history=None):
    method get_root_of_merkle_tree (line 318) | def get_root_of_merkle_tree(branches, branch_positions, working_branch):
    method start (line 329) | async def start(self):
    method join_network (line 353) | async def join_network(self, *_):
    method stop (line 359) | async def stop(self):
    method tasks_are_done (line 368) | async def tasks_are_done(self):
    method local_height_including_downloaded_height (line 373) | def local_height_including_downloaded_height(self):
    method initial_headers_sync (line 376) | async def initial_headers_sync(self):
    method update_headers (line 387) | async def update_headers(self, height=None, headers=None, subscription...
    method receive_header (line 459) | async def receive_header(self, response):
    method subscribe_accounts (line 466) | async def subscribe_accounts(self):
    method subscribe_account (line 473) | async def subscribe_account(self, account: Account):
    method unsubscribe_account (line 479) | async def unsubscribe_account(self, account: Account):
    method announce_addresses (line 483) | async def announce_addresses(self, address_manager: AddressManager, ad...
    method subscribe_addresses (line 489) | async def subscribe_addresses(self, address_manager: AddressManager, a...
    method process_status_update (line 507) | def process_status_update(self, update):
    method update_history (line 511) | async def update_history(self, address, remote_status, address_manager...
    method maybe_verify_transaction (line 612) | async def maybe_verify_transaction(self, tx, remote_height, merkle=None):
    method maybe_has_channel_key (line 626) | def maybe_has_channel_key(self, tx):
    method request_transactions (line 632) | async def request_transactions(self, to_request: Tuple[Tuple[str, int]...
    method request_synced_transactions (line 662) | async def request_synced_transactions(self, to_request, remote_history...
    method _single_batch (line 668) | async def _single_batch(self, batch, remote_heights):
    method _sync_and_save_batch (line 680) | async def _sync_and_save_batch(self, address, remote_history, pending_...
    method _sync (line 688) | async def _sync(self, tx, remote_history, pending_txs):
    method get_address_manager_for_address (line 718) | async def get_address_manager_for_address(self, address) -> Optional[A...
    method broadcast_or_release (line 725) | async def broadcast_or_release(self, tx, blocking=False):
    method broadcast (line 734) | def broadcast(self, tx):
    method wait (line 738) | async def wait(self, tx: Transaction, height=-1, timeout=1):
    method _wait_round (line 757) | async def _wait_round(self, tx: Transaction, height: int, addresses: I...
    method _inflate_outputs (line 786) | async def _inflate_outputs(
    method resolve (line 870) | async def resolve(self, accounts, urls, **kwargs):
    method sum_supports (line 894) | async def sum_supports(self, new_sdk_server, **kwargs) -> List[Dict]:
    method claim_search (line 897) | async def claim_search(
    method get_claim_by_claim_id (line 911) | async def get_claim_by_claim_id(self, claim_id, accounts=None, include...
    method _report_state (line 924) | async def _report_state(self):
    method _reset_balance_cache (line 946) | async def _reset_balance_cache(self, e: TransactionEvent):
    method constraint_spending_utxos (line 955) | def constraint_spending_utxos(constraints):
    method get_purchases (line 958) | async def get_purchases(self, resolve=False, **constraints):
    method get_purchase_count (line 972) | def get_purchase_count(self, resolve=False, **constraints):
    method _resolve_for_local_results (line 975) | async def _resolve_for_local_results(self, accounts, txos):
    method _resolve_for_local_claim_results (line 980) | async def _resolve_for_local_claim_results(self, accounts, txos):
    method _resolve_for_local_support_results (line 996) | async def _resolve_for_local_support_results(self, accounts, txos):
    method get_claims (line 1013) | async def get_claims(self, resolve=False, **constraints):
    method get_claim_count (line 1019) | def get_claim_count(self, **constraints):
    method get_streams (line 1022) | async def get_streams(self, resolve=False, **constraints):
    method get_stream_count (line 1028) | def get_stream_count(self, **constraints):
    method get_channels (line 1031) | async def get_channels(self, resolve=False, **constraints):
    method get_channel_count (line 1037) | def get_channel_count(self, **constraints):
    method resolve_collection (line 1040) | async def resolve_collection(self, collection, offset=0, page_size=1):
    method get_collections (line 1059) | async def get_collections(self, resolve_claims=0, resolve=False, **con...
    method get_collection_count (line 1068) | def get_collection_count(self, resolve_claims=0, **constraints):
    method get_supports (line 1071) | def get_supports(self, **constraints):
    method get_support_count (line 1074) | def get_support_count(self, **constraints):
    method get_transaction_history (line 1077) | async def get_transaction_history(self, read_only=False, **constraints):
    method get_transaction_history_count (line 1190) | def get_transaction_history_count(self, read_only=False, **constraints):
    method get_detailed_balance (line 1193) | async def get_detailed_balance(self, accounts, confirmations=0):
  class TestNetLedger (line 1218) | class TestNetLedger(Ledger):
  class RegTestLedger (line 1227) | class RegTestLedger(Ledger):

FILE: lbry/wallet/manager.py
  class WalletManager (line 29) | class WalletManager:
    method __init__ (line 31) | def __init__(self, wallets: MutableSequence[Wallet] = None,
    method from_config (line 39) | def from_config(cls, config: dict) -> 'WalletManager':
    method get_or_create_ledger (line 49) | def get_or_create_ledger(self, ledger_id, ledger_config=None):
    method import_wallet (line 57) | def import_wallet(self, path):
    method default_wallet (line 64) | def default_wallet(self):
    method default_account (line 69) | def default_account(self):
    method accounts (line 74) | def accounts(self):
    method start (line 78) | async def start(self):
    method stop (line 84) | async def stop(self):
    method get_wallet_or_default (line 90) | def get_wallet_or_default(self, wallet_id: Optional[str]) -> Wallet:
    method get_wallet_or_error (line 95) | def get_wallet_or_error(self, wallet_id: str) -> Wallet:
    method get_balance (line 102) | def get_balance(wallet):
    method ledger (line 109) | def ledger(self) -> Ledger:
    method db (line 113) | def db(self) -> Database:
    method check_locked (line 116) | def check_locked(self):
    method migrate_lbryum_to_torba (line 120) | def migrate_lbryum_to_torba(path):
    method from_lbrynet_config (line 176) | async def from_lbrynet_config(cls, config: Config):
    method reset (line 237) | async def reset(self):
    method _migrate_addresses (line 253) | async def _migrate_addresses(self, receiving_addresses: set, change_ad...
    method get_best_blockhash (line 271) | async def get_best_blockhash(self):
    method get_unused_address (line 276) | def get_unused_address(self):
    method get_transaction (line 279) | async def get_transaction(self, txid: str):
    method create_purchase_transaction (line 295) | async def create_purchase_transaction(
    method broadcast_or_release (line 319) | async def broadcast_or_release(self, tx, blocking=False):

FILE: lbry/wallet/mnemonic.py
  function is_cjk (line 57) | def is_cjk(c):
  function normalize_text (line 65) | def normalize_text(seed):
  function load_words (line 80) | def load_words(language_name):
  class Mnemonic (line 99) | class Mnemonic:
    method __init__ (line 103) | def __init__(self, lang='en'):
    method mnemonic_to_seed (line 108) | def mnemonic_to_seed(mnemonic, passphrase=''):
    method mnemonic_encode (line 116) | def mnemonic_encode(self, i):
    method mnemonic_decode (line 125) | def mnemonic_decode(self, seed):
    method make_seed (line 135) | def make_seed(self, prefix=SEED_PREFIX, num_bits=132):
  function is_new_seed (line 156) | def is_new_seed(seed, prefix):

FILE: lbry/wallet/network.py
  class ClientSession (line 22) | class ClientSession(BaseClientSession):
    method __init__ (line 23) | def __init__(self, *args, network: 'Network', server, timeout=30, conc...
    method concurrency (line 36) | def concurrency(self):
    method available (line 40) | def available(self):
    method server_address_and_port (line 44) | def server_address_and_port(self) -> Optional[Tuple[str, int]]:
    method send_timed_server_version_request (line 49) | async def send_timed_server_version_request(self, args=(), timeout=None):
    method send_request (line 62) | async def send_request(self, method, args=()):
    method ensure_server_version (line 101) | async def ensure_server_version(self, required=None, timeout=3):
    method keepalive_loop (line 110) | async def keepalive_loop(self, timeout=3, max_idle=60):
    method create_connection (line 129) | async def create_connection(self, timeout=6):
    method handle_request (line 135) | async def handle_request(self, request):
    method connection_lost (line 139) | def connection_lost(self, exc):
  class Network (line 150) | class Network:
    method __init__ (line 158) | def __init__(self, ledger):
    method config (line 190) | def config(self):
    method known_hubs (line 194) | def known_hubs(self):
    method jurisdiction (line 200) | def jurisdiction(self):
    method disconnect (line 203) | def disconnect(self):
    method start (line 208) | async def start(self):
    method resolve_spv_dns (line 226) | async def resolve_spv_dns(self):
    method get_n_fastest_spvs (line 250) | async def get_n_fastest_spvs(self, timeout=3.0) -> Dict[Tuple[str, int...
    method connect_to_fastest (line 296) | async def connect_to_fastest(self) -> Optional[ClientSession]:
    method network_loop (line 314) | async def network_loop(self):
    method stop (line 363) | async def stop(self):
    method is_connected (line 374) | def is_connected(self):
    method rpc (line 377) | def rpc(self, list_or_method, args, restricted=True, session: Optional...
    method retriable_call (line 385) | async def retriable_call(self, function, *args, **kwargs):
    method _update_remote_height (line 399) | def _update_remote_height(self, header_args):
    method _update_hubs (line 402) | async def _update_hubs(self, hubs):
    method get_transaction (line 410) | def get_transaction(self, tx_hash, known_height=None):
    method get_transaction_batch (line 415) | def get_transaction_batch(self, txids, restricted=True):
    method get_transaction_and_merkle (line 419) | def get_transaction_and_merkle(self, tx_hash, known_height=None):
    method get_transaction_height (line 424) | def get_transaction_height(self, tx_hash, known_height=None):
    method get_merkle (line 428) | def get_merkle(self, tx_hash, height):
    method get_headers (line 432) | def get_headers(self, height, count=10000, b64=False):
    method get_history (line 437) | def get_history(self, address):
    method broadcast (line 440) | def broadcast(self, raw_transaction):
    method subscribe_headers (line 443) | def subscribe_headers(self):
    method subscribe_address (line 446) | async def subscribe_address(self, address, *addresses):
    method unsubscribe_address (line 461) | def unsubscribe_address(self, address):
    method get_server_features (line 464) | def get_server_features(self):
    method get_claim_by_id (line 470) | def get_claim_by_id(self, claim_id):
    method resolve (line 473) | def resolve(self, urls, session_override=None):
    method claim_search (line 476) | def claim_search(self, session_override=None, **kwargs):
    method sum_supports (line 479) | async def sum_supports(self, server, **kwargs):

FILE: lbry/wallet/orchstr8/cli.py
  function get_argument_parser (line 15) | def get_argument_parser():
  function run_remote_command (line 36) | async def run_remote_command(command, **kwargs):
  function main (line 43) | def main():

FILE: lbry/wallet/orchstr8/node.py
  function get_lbcd_node_from_ledger (line 36) | def get_lbcd_node_from_ledger(ledger_module):
  function get_lbcwallet_node_from_ledger (line 44) | def get_lbcwallet_node_from_ledger(ledger_module):
  class Conductor (line 52) | class Conductor:
    method __init__ (line 54) | def __init__(self, seed=None):
    method start_lbcd (line 69) | async def start_lbcd(self):
    method stop_lbcd (line 74) | async def stop_lbcd(self, cleanup=True):
    method start_spv (line 79) | async def start_spv(self):
    method stop_spv (line 84) | async def stop_spv(self, cleanup=True):
    method start_wallet (line 89) | async def start_wallet(self):
    method stop_wallet (line 94) | async def stop_wallet(self, cleanup=True):
    method start_lbcwallet (line 99) | async def start_lbcwallet(self, clean=True):
    method stop_lbcwallet (line 110) | async def stop_lbcwallet(self, cleanup=True):
    method start (line 115) | async def start(self):
    method stop (line 121) | async def stop(self):
    method clear_mempool (line 134) | async def clear_mempool(self):
  class WalletNode (line 141) | class WalletNode:
    method __init__ (line 143) | def __init__(self, manager_class: Type[WalletManager], ledger_class: T...
    method start (line 158) | async def start(self, spv_node: 'SPVNode', seed=None, connect=True, co...
    method stop (line 195) | async def stop(self, cleanup=True):
    method cleanup (line 201) | def cleanup(self):
  class SPVNode (line 205) | class SPVNode:
    method __init__ (line 206) | def __init__(self, node_number=1):
    method start (line 222) | async def start(self, lbcwallet_node: 'LBCWalletNode', extraconf=None):
    method stop (line 270) | async def stop(self, cleanup=True):
    method cleanup (line 286) | def cleanup(self):
  class LBCDProcess (line 290) | class LBCDProcess(asyncio.SubprocessProtocol):
    method __init__ (line 299) | def __init__(self):
    method pipe_data_received (line 304) | def pipe_data_received(self, fd, data):
    method process_exited (line 316) | def process_exited(self):
  class WalletProcess (line 321) | class WalletProcess(asyncio.SubprocessProtocol):
    method __init__ (line 326) | def __init__(self):
    method pipe_data_received (line 332) | def pipe_data_received(self, fd, data):
    method process_exited (line 344) | def process_exited(self):
  class LBCDNode (line 349) | class LBCDNode:
    method __init__ (line 350) | def __init__(self, url, daemon, cli):
    method rpc_url (line 369) | def rpc_url(self):
    method exists (line 373) | def exists(self):
    method download (line 379) | def download(self):
    method ensure (line 415) | def ensure(self):
    method start (line 418) | async def start(self):
    method stop (line 450) | async def stop(self, cleanup=True):
    method cleanup (line 468) | def cleanup(self):
  class LBCWalletNode (line 473) | class LBCWalletNode:
    method __init__ (line 477) | def __init__(self, url, lbcwallet, cli):
    method rpc_url (line 498) | def rpc_url(self):
    method is_expected_block (line 503) | def is_expected_block(self, e: BlockHeightEvent):
    method exists (line 507) | def exists(self):
    method download (line 512) | def download(self):
    method ensure (line 547) | def ensure(self):
    method start (line 550) | async def start(self):
    method cleanup (line 580) | def cleanup(self):
    method stop (line 584) | async def stop(self, cleanup=True):
    method _cli_cmnd (line 601) | async def _cli_cmnd(self, *args):
    method generate (line 624) | def generate(self, blocks):
    method generate_to_address (line 628) | def generate_to_address(self, blocks, addr):
    method wallet_passphrase (line 632) | def wallet_passphrase(self, passphrase, timeout):
    method invalidate_block (line 635) | def invalidate_block(self, blockhash):
    method get_block_hash (line 638) | def get_block_hash(self, block):
    method sendrawtransaction (line 641) | def sendrawtransaction(self, tx):
    method get_block (line 644) | async def get_block(self, block_hash):
    method get_raw_change_address (line 647) | def get_raw_change_address(self):
    method get_new_address (line 650) | def get_new_address(self, address_type='legacy'):
    method get_balance (line 653) | async def get_balance(self):
    method send_to_address (line 656) | def send_to_address(self, address, amount):
    method send_raw_transaction (line 659) | def send_raw_transaction(self, tx):
    method create_raw_transaction (line 662) | def create_raw_transaction(self, inputs, outputs):
    method sign_raw_transaction_with_wallet (line 665) | async def sign_raw_transaction_with_wallet(self, tx):
    method decode_raw_transaction (line 671) | def decode_raw_transaction(self, tx):
    method get_raw_transaction (line 674) | def get_raw_transaction(self, txid):

FILE: lbry/wallet/orchstr8/service.py
  class WebSocketLogHandler (line 13) | class WebSocketLogHandler(logging.Handler):
    method __init__ (line 15) | def __init__(self, send_message):
    method emit (line 19) | def emit(self, record):
  class ConductorService (line 30) | class ConductorService:
    method __init__ (line 32) | def __init__(self, stack: Conductor, loop: asyncio.AbstractEventLoop) ...
    method start (line 46) | async def start(self):
    method stop (line 52) | async def stop(self):
    method start_stack (line 60) | async def start_stack(self, _):
    method generate (line 76) | async def generate(self, request):
    method transfer (line 82) | async def transfer(self, request):
    method balance (line 104) | async def balance(self, _):
    method log (line 109) | async def log(self, request):
    method on_shutdown (line 126) | async def on_shutdown(app):
    method on_status (line 130) | async def on_status(self, _):
    method send_message (line 140) | def send_message(self, msg):

FILE: lbry/wallet/rpc/framing.py
  class FramerBase (line 36) | class FramerBase:
    method frame (line 44) | def frame(self, message):
    method received_bytes (line 48) | def received_bytes(self, data):
    method receive_message (line 52) | async def receive_message(self):
  class NewlineFramer (line 57) | class NewlineFramer(FramerBase):
    method __init__ (line 63) | def __init__(self, max_size=250 * 4000):
    method frame (line 75) | def frame(self, message):
    method receive_message (line 78) | async def receive_message(self):
  class ByteQueue (line 107) | class ByteQueue:
    method __init__ (line 112) | def __init__(self):
    method receive (line 118) | async def receive(self, size):
  class BinaryFramer (line 129) | class BinaryFramer:
    method __init__ (line 132) | def __init__(self):
    method frame (line 137) | def frame(self, message):
    method receive_message (line 144) | async def receive_message(self):
    method _checksum (line 152) | def _checksum(self, payload):
    method _build_header (line 155) | def _build_header(self, command, payload):
    method _receive_header (line 158) | async def _receive_header(self):
  function sha256 (line 167) | def sha256(x):
  function double_sha256 (line 172) | def double_sha256(x):
  class BadChecksumError (line 177) | class BadChecksumError(Exception):
  class BadMagicError (line 181) | class BadMagicError(Exception):
  class OversizedPayloadError (line 185) | class OversizedPayloadError(Exception):
  class BitcoinFramer (line 189) | class BitcoinFramer(BinaryFramer):
    method __init__ (line 206) | def __init__(self, magic, max_block_size):
    method _checksum (line 219) | def _checksum(self, payload):
    method _build_header (line 222) | def _build_header(self, command, payload):
    method _receive_header (line 230) | async def _receive_header(self):

FILE: lbry/wallet/rpc/jsonrpc.py
  class SingleRequest (line 45) | class SingleRequest:
    method __init__ (line 48) | def __init__(self, method, args):
    method __repr__ (line 58) | def __repr__(self):
    method __eq__ (line 61) | def __eq__(self, other):
  class Request (line 66) | class Request(SingleRequest):
    method send_result (line 67) | def send_result(self, response):
  class Notification (line 71) | class Notification(SingleRequest):
  class Batch (line 75) | class Batch:
    method __init__ (line 78) | def __init__(self, items):
    method __len__ (line 88) | def __len__(self):
    method __getitem__ (line 91) | def __getitem__(self, item):
    method __iter__ (line 94) | def __iter__(self):
    method __repr__ (line 97) | def __repr__(self):
  class Response (line 101) | class Response:
    method __init__ (line 104) | def __init__(self, result):
  class CodeMessageError (line 109) | class CodeMessageError(Exception):
    method code (line 112) | def code(self):
    method message (line 116) | def message(self):
    method __eq__ (line 119) | def __eq__(self, other):
    method __hash__ (line 123) | def __hash__(self):
    method invalid_args (line 129) | def invalid_args(cls, message):
    method invalid_request (line 133) | def invalid_request(cls, message):
    method empty_batch (line 137) | def empty_batch(cls):
  class RPCError (line 141) | class RPCError(CodeMessageError):
  class ProtocolError (line 145) | class ProtocolError(CodeMessageError):
    method __init__ (line 147) | def __init__(self, code, message):
  class JSONRPC (line 157) | class JSONRPC:
    method _message_id (line 175) | def _message_id(cls, message, require_id):
    method _validate_message (line 185) | def _validate_message(cls, message):
    method _request_args (line 191) | def _request_args(cls, request):
    method _process_request (line 197) | def _process_request(cls, payload):
    method _process_response (line 213) | def _process_response(cls, payload):
    method _message_to_payload (line 224) | def _message_to_payload(cls, message):
    method _error (line 235) | def _error(cls, code, message, send, msg_id):
    method message_to_item (line 248) | def message_to_item(cls, message):
    method request_message (line 285) | def request_message(cls, item, request_id):
    method notification_message (line 291) | def notification_message(cls, item):
    method response_message (line 297) | def response_message(cls, result, request_id):
    method batch_message (line 306) | def batch_message(cls, batch, request_ids):
    method batch_message_from_parts (line 320) | def batch_message_from_parts(cls, messages):
    method encode_payload (line 331) | def encode_payload(cls, payload):
  class JSONRPCv1 (line 340) | class JSONRPCv1(JSONRPC):
    method _message_id (line 346) | def _message_id(cls, message, require_id):
    method _request_args (line 354) | def _request_args(cls, request):
    method _best_effort_error (line 362) | def _best_effort_error(cls, error):
    method response_value (line 379) | def response_value(cls, payload):
    method request_payload (line 395) | def request_payload(cls, request, request_id):
    method response_payload (line 407) | def response_payload(cls, result, request_id):
    method error_payload (line 416) | def error_payload(cls, error, request_id):
  class JSONRPCv2 (line 424) | class JSONRPCv2(JSONRPC):
    method _message_id (line 428) | def _message_id(cls, message, require_id):
    method _validate_message (line 444) | def _validate_message(cls, message):
    method _request_args (line 449) | def _request_args(cls, request):
    method response_value (line 457) | def response_value(cls, payload):
    method request_payload (line 480) | def request_payload(cls, request, request_id):
    method response_payload (line 495) | def response_payload(cls, result, request_id):
    method error_payload (line 504) | def error_payload(cls, error, request_id):
  class JSONRPCLoose (line 512) | class JSONRPCLoose(JSONRPC):
    method response_value (line 526) | def response_value(cls, payload):
  class JSONRPCAutoDetect (line 542) | class JSONRPCAutoDetect(JSONRPCv2):
    method message_to_item (line 545) | def message_to_item(cls, message):
    method detect_protocol (line 549) | def detect_protocol(cls, message):
  class JSONRPCConnection (line 584) | class JSONRPCConnection:
    method __init__ (line 595) | def __init__(self, protocol):
    method _oversized_response_message (line 604) | def _oversized_response_message(self, request_id):
    method _receive_response (line 609) | def _receive_response(self, result, request_id):
    method _receive_request_batch (line 621) | def _receive_request_batch(self, payloads):
    method _receive_response_batch (line 655) | def _receive_response_batch(self, payloads):
    method _send_result (line 673) | def _send_result(self, request_id, result):
    method _event (line 679) | def _event(self, request, request_id):
    method send_request (line 687) | def send_request(self, request: Request) -> typing.Tuple[bytes, Event]:
    method send_notification (line 701) | def send_notification(self, notification):
    method send_batch (line 704) | def send_batch(self, batch):
    method receive_message (line 711) | def receive_message(self, message):
    method raise_pending_requests (line 746) | def raise_pending_requests(self, exception):
    method pending_requests (line 753) | def pending_requests(self):
  function handler_invocation (line 758) | def handler_invocation(handler, request):

FILE: lbry/wallet/rpc/session.py
  class Connector (line 48) | class Connector:
    method __init__ (line 50) | def __init__(self, session_factory, host=None, port=None, proxy=None,
    method create_connection (line 59) | async def create_connection(self):
    method __aenter__ (line 65) | async def __aenter__(self):
    method __aexit__ (line 69) | async def __aexit__(self, exc_type, exc_value, traceback):
  class SessionBase (line 73) | class SessionBase(asyncio.Protocol):
    method __init__ (line 89) | def __init__(self, *, framer=None, loop=None):
    method _limited_wait (line 117) | async def _limited_wait(self, secs):
    method _send_message (line 124) | async def _send_message(self, message):
    method _bump_errors (line 136) | def _bump_errors(self):
    method _close (line 142) | def _close(self):
    method data_received (line 147) | def data_received(self, framed_message):
    method pause_writing (line 155) | def pause_writing(self):
    method resume_writing (line 161) | def resume_writing(self):
    method connection_made (line 167) | def connection_made(self, transport):
    method connection_lost (line 183) | def connection_lost(self, exc):
    method default_framer (line 196) | def default_framer(self):
    method peer_address (line 200) | def peer_address(self):
    method peer_address_str (line 209) | def peer_address_str(self, for_log=True):
    method is_closing (line 220) | def is_closing(self):
    method abort (line 224) | def abort(self):
    method close (line 230) | async def close(self, *, force_after=30):
    method synchronous_close (line 239) | def synchronous_close(self):
  class MessageSession (line 245) | class MessageSession(SessionBase):
    method _r
Condensed preview — 318 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,484K chars).
[
  {
    "path": ".github/workflows/main.yml",
    "chars": 6638,
    "preview": "name: ci\non: [\"push\", \"pull_request\", \"workflow_dispatch\"]\n\njobs:\n\n  lint:\n    name: lint\n    runs-on: ubuntu-20.04\n    "
  },
  {
    "path": ".github/workflows/release.yml",
    "chars": 641,
    "preview": "name: slack\n\non:\n  release:\n    types: [published]\n\njobs:\n  release:\n    name: \"slack notification\"\n    runs-on: ubuntu-"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 122,
    "preview": "# Change Log\n\nThis changelog is no longer up to date. For release notes, see https://github.com/lbryio/lbry-sdk/releases"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 54,
    "preview": "## Contributing to LBRY\n\nhttps://lbry.tech/contribute\n"
  },
  {
    "path": "INSTALL.md",
    "chars": 4804,
    "preview": "# Installing LBRY\n\nIf only the JSON-RPC API server is needed, the recommended way to install LBRY is to use a pre-built "
  },
  {
    "path": "LICENSE",
    "chars": 1080,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2015-2022 LBRY Inc\n\nPermission is hereby granted, free of charge, to any person obt"
  },
  {
    "path": "MANIFEST.in",
    "chars": 89,
    "preview": "include README.md\ninclude CHANGELOG.md\ninclude LICENSE\nrecursive-include lbry *.txt *.py\n"
  },
  {
    "path": "Makefile",
    "chars": 652,
    "preview": ".PHONY: install tools lint test test-unit test-unit-coverage test-integration idea\n\ninstall:\n\tpip install -e .\n\nlint:\n\tp"
  },
  {
    "path": "README.md",
    "chars": 3880,
    "preview": "# <img src=\"https://raw.githubusercontent.com/lbryio/lbry-sdk/master/lbry.png\" alt=\"LBRY\" width=\"48\" height=\"36\" /> LBRY"
  },
  {
    "path": "SECURITY.md",
    "chars": 180,
    "preview": "# Security Policy\n\n## Supported Versions\n\nWhile we are not at v1.0 yet, only the latest release will be supported.\n\n## R"
  },
  {
    "path": "docker/Dockerfile.dht_node",
    "chars": 981,
    "preview": "FROM debian:10-slim\n\nARG user=lbry\nARG projects_dir=/home/$user\nARG db_dir=/database\n\nARG DOCKER_TAG\nARG DOCKER_COMMIT=d"
  },
  {
    "path": "docker/Dockerfile.wallet_server",
    "chars": 1299,
    "preview": "FROM debian:10-slim\n\nARG user=lbry\nARG db_dir=/database\nARG projects_dir=/home/$user\n\nARG DOCKER_TAG\nARG DOCKER_COMMIT=d"
  },
  {
    "path": "docker/Dockerfile.web",
    "chars": 1076,
    "preview": "FROM debian:10-slim\n\nARG user=lbry\nARG downloads_dir=/database\nARG projects_dir=/home/$user\n\nARG DOCKER_TAG\nARG DOCKER_C"
  },
  {
    "path": "docker/README.md",
    "chars": 181,
    "preview": "### How to run with docker-compose\n1. Edit config file and after that fix permissions with\n```\nsudo chown -R 999:999 web"
  },
  {
    "path": "docker/docker-compose-wallet-server.yml",
    "chars": 1476,
    "preview": "version: \"3\"\n\nvolumes:\n  wallet_server:\n  es01:\n\nservices:\n  wallet_server:\n    depends_on: \n      - es01\n    image: lbr"
  },
  {
    "path": "docker/docker-compose.yml",
    "chars": 191,
    "preview": "version: '3'\nservices:\n    websdk:\n        image: vshyba/websdk\n        ports:\n            - '5279:5279'\n            - '"
  },
  {
    "path": "docker/hooks/build",
    "chars": 335,
    "preview": "#!/bin/bash\n\nDIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" >/dev/null 2>&1 && pwd )\"\ncd \"$DIR/../..\" ## make sure we're "
  },
  {
    "path": "docker/install_choco.ps1",
    "chars": 571,
    "preview": "# requires powershell and .NET 4+. see https://chocolatey.org/install for more info.\n\n$chocoVersion = powershell choco -"
  },
  {
    "path": "docker/set_build.py",
    "chars": 1403,
    "preview": "import sys\nimport os\nimport re\nimport logging\nimport lbry.build_info as build_info_mod\n\nlog = logging.getLogger()\nlog.ad"
  },
  {
    "path": "docker/wallet_server_entrypoint.sh",
    "chars": 897,
    "preview": "#!/bin/bash\n\n# entrypoint for wallet server Docker image\n\nset -euo pipefail\n\nSNAPSHOT_URL=\"${SNAPSHOT_URL:-}\" #off by de"
  },
  {
    "path": "docker/webconf.yaml",
    "chars": 183,
    "preview": "allowed_origin: \"*\"\nmax_key_fee: \"0.0 USD\"\nsave_files: false\nsave_blobs: false\nstreaming_server: \"0.0.0.0:5280\"\napi: \"0."
  },
  {
    "path": "docs/api.json",
    "chars": 520146,
    "preview": "{\n    \"main\": {\n        \"doc\": \"Ungrouped commands.\",\n        \"commands\": [\n            {\n                \"name\": \"ffmpe"
  },
  {
    "path": "example_daemon_settings.yml",
    "chars": 518,
    "preview": "# This is an example daemon_settings.yml file.\n# See https://lbry.tech/resources/daemon-settings for all configuration k"
  },
  {
    "path": "lbry/.dockerignore",
    "chars": 52,
    "preview": ".git\n.tox\n__pycache__\ndist\nlbry.egg-info\ndocs\ntests\n"
  },
  {
    "path": "lbry/__init__.py",
    "chars": 106,
    "preview": "__version__ = \"0.113.0\"\nversion = tuple(map(int, __version__.split('.')))  # pylint: disable=invalid-name\n"
  },
  {
    "path": "lbry/blob/__init__.py",
    "chars": 184,
    "preview": "from lbry.utils import get_lbry_hash_obj\n\nMAX_BLOB_SIZE = 2 * 2 ** 20\n\n# digest_size is in bytes, and blob hashes are he"
  },
  {
    "path": "lbry/blob/blob_file.py",
    "chars": 13868,
    "preview": "import os\nimport re\nimport time\nimport asyncio\nimport binascii\nimport logging\nimport typing\nimport contextlib\nfrom io im"
  },
  {
    "path": "lbry/blob/blob_info.py",
    "chars": 795,
    "preview": "import typing\n\n\nclass BlobInfo:\n    __slots__ = [\n        'blob_hash',\n        'blob_num',\n        'length',\n        'iv"
  },
  {
    "path": "lbry/blob/blob_manager.py",
    "chars": 6673,
    "preview": "import os\nimport typing\nimport asyncio\nimport logging\nfrom lbry.utils import LRUCacheWithMetrics\nfrom lbry.blob.blob_fil"
  },
  {
    "path": "lbry/blob/disk_space_manager.py",
    "chars": 3121,
    "preview": "import asyncio\nimport logging\n\nlog = logging.getLogger(__name__)\n\n\nclass DiskSpaceManager:\n\n    def __init__(self, confi"
  },
  {
    "path": "lbry/blob/writer.py",
    "chars": 2508,
    "preview": "import typing\nimport logging\nimport asyncio\nfrom io import BytesIO\nfrom lbry.error import InvalidBlobHashError, InvalidD"
  },
  {
    "path": "lbry/blob_exchange/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "lbry/blob_exchange/client.py",
    "chars": 13676,
    "preview": "import asyncio\nimport time\nimport logging\nimport typing\nimport binascii\nfrom typing import Optional\nfrom lbry.error impo"
  },
  {
    "path": "lbry/blob_exchange/downloader.py",
    "chars": 6753,
    "preview": "import asyncio\nimport typing\nimport logging\nfrom lbry.utils import cache_concurrent\nfrom lbry.blob_exchange.client impor"
  },
  {
    "path": "lbry/blob_exchange/serialization.py",
    "chars": 9236,
    "preview": "import typing\nimport json\nimport logging\n\nlog = logging.getLogger(__name__)\n\n\nclass BlobMessage:\n    key = ''\n\n    def t"
  },
  {
    "path": "lbry/blob_exchange/server.py",
    "chars": 9093,
    "preview": "import asyncio\nimport binascii\nimport logging\nimport socket\nimport typing\nfrom json.decoder import JSONDecodeError\nfrom "
  },
  {
    "path": "lbry/build_info.py",
    "chars": 122,
    "preview": "# don't touch this. CI server changes this during build/deployment\nBUILD = \"dev\"\nCOMMIT_HASH = \"none\"\nDOCKER_TAG = \"none"
  },
  {
    "path": "lbry/conf.py",
    "chars": 29677,
    "preview": "import os\nimport re\nimport sys\nimport logging\nfrom typing import List, Dict, Tuple, Union, TypeVar, Generic, Optional\nfr"
  },
  {
    "path": "lbry/connection_manager.py",
    "chars": 3878,
    "preview": "import time\nimport asyncio\nimport typing\nimport collections\nimport logging\n\nlog = logging.getLogger(__name__)\n\n\nCONNECTE"
  },
  {
    "path": "lbry/constants.py",
    "chars": 31,
    "preview": "CENT = 1000000\nCOIN = 100*CENT\n"
  },
  {
    "path": "lbry/crypto/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "lbry/crypto/base58.py",
    "chars": 2437,
    "preview": "from lbry.crypto.hash import double_sha256\nfrom lbry.crypto.util import bytes_to_int, int_to_bytes\n\n\nclass Base58Error(E"
  },
  {
    "path": "lbry/crypto/crypt.py",
    "chars": 3076,
    "preview": "import os\nimport base64\nimport typing\nfrom cryptography.hazmat.primitives.kdf.scrypt import Scrypt\nfrom cryptography.haz"
  },
  {
    "path": "lbry/crypto/hash.py",
    "chars": 1113,
    "preview": "import hashlib\nimport hmac\nfrom binascii import hexlify, unhexlify\n\n\ndef sha256(x):\n    \"\"\" Simple wrapper of hashlib sh"
  },
  {
    "path": "lbry/crypto/util.py",
    "chars": 400,
    "preview": "from binascii import unhexlify, hexlify\n\n\ndef bytes_to_int(be_bytes):\n    \"\"\" Interprets a big-endian sequence of bytes "
  },
  {
    "path": "lbry/dht/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "lbry/dht/blob_announcer.py",
    "chars": 3335,
    "preview": "import asyncio\nimport typing\nimport logging\n\nfrom prometheus_client import Counter, Gauge\n\nif typing.TYPE_CHECKING:\n    "
  },
  {
    "path": "lbry/dht/constants.py",
    "chars": 1029,
    "preview": "import hashlib\nimport os\n\nHASH_CLASS = hashlib.sha384  # pylint: disable=invalid-name\nHASH_LENGTH = HASH_CLASS().digest_"
  },
  {
    "path": "lbry/dht/error.py",
    "chars": 407,
    "preview": "class BaseKademliaException(Exception):\n    pass\n\n\nclass DecodeError(BaseKademliaException):\n    \"\"\"\n    Should be raise"
  },
  {
    "path": "lbry/dht/node.py",
    "chars": 14407,
    "preview": "import logging\nimport asyncio\nimport typing\nimport socket\n\nfrom prometheus_client import Gauge\n\nfrom lbry.utils import a"
  },
  {
    "path": "lbry/dht/peer.py",
    "chars": 9126,
    "preview": "import typing\nimport asyncio\nimport logging\nfrom dataclasses import dataclass, field\nfrom functools import lru_cache\n\nfr"
  },
  {
    "path": "lbry/dht/protocol/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "lbry/dht/protocol/data_store.py",
    "chars": 2819,
    "preview": "import asyncio\nimport typing\n\nfrom lbry.dht import constants\nif typing.TYPE_CHECKING:\n    from lbry.dht.peer import Kade"
  },
  {
    "path": "lbry/dht/protocol/distance.py",
    "chars": 910,
    "preview": "from lbry.dht import constants\n\n\nclass Distance:\n    \"\"\"Calculate the XOR result between two string variables.\n\n    Freq"
  },
  {
    "path": "lbry/dht/protocol/iterative_find.py",
    "chars": 15349,
    "preview": "import asyncio\nfrom itertools import chain\nfrom collections import defaultdict, OrderedDict\nfrom collections.abc import "
  },
  {
    "path": "lbry/dht/protocol/protocol.py",
    "chars": 30151,
    "preview": "import logging\nimport socket\nimport functools\nimport hashlib\nimport asyncio\nimport time\nimport typing\nimport random\nfrom"
  },
  {
    "path": "lbry/dht/protocol/routing_table.py",
    "chars": 18789,
    "preview": "import asyncio\nimport random\nimport logging\nimport typing\nimport itertools\n\nfrom prometheus_client import Gauge\n\nfrom lb"
  },
  {
    "path": "lbry/dht/serialization/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "lbry/dht/serialization/bencoding.py",
    "chars": 2839,
    "preview": "import typing\nfrom lbry.dht.error import DecodeError\n\n\ndef _bencode(data: typing.Union[int, bytes, bytearray, str, list,"
  },
  {
    "path": "lbry/dht/serialization/datagram.py",
    "chars": 7662,
    "preview": "import typing\nfrom functools import reduce\nfrom lbry.dht import constants\nfrom lbry.dht.serialization.bencoding import b"
  },
  {
    "path": "lbry/error/Makefile",
    "chars": 91,
    "preview": "generate:\n\tpython generate.py generate > __init__.py\n\nanalyze:\n\tpython generate.py analyze\n"
  },
  {
    "path": "lbry/error/README.md",
    "chars": 6723,
    "preview": "# Exceptions\n\nExceptions in LBRY are defined and generated from the Markdown table at the end of this README.\n\n## Guidel"
  },
  {
    "path": "lbry/error/__init__.py",
    "chars": 12095,
    "preview": "from .base import BaseError, claim_id\n\n\nclass UserInputError(BaseError):\n    \"\"\"\n    User input errors.\n    \"\"\"\n\n\nclass "
  },
  {
    "path": "lbry/error/base.py",
    "chars": 142,
    "preview": "from binascii import hexlify\n\n\ndef claim_id(claim_hash):\n    return hexlify(claim_hash[::-1]).decode()\n\n\nclass BaseError"
  },
  {
    "path": "lbry/error/generate.py",
    "chars": 4780,
    "preview": "import re\nimport sys\nimport argparse\nfrom pathlib import Path\nfrom textwrap import fill, indent\n\n\nINDENT = ' ' * 4\n\nCLAS"
  },
  {
    "path": "lbry/extras/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "lbry/extras/cli.py",
    "chars": 11799,
    "preview": "import os\nimport sys\nimport shutil\nimport signal\nimport pathlib\nimport json\nimport asyncio\nimport argparse\nimport loggin"
  },
  {
    "path": "lbry/extras/daemon/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "lbry/extras/daemon/analytics.py",
    "chars": 9669,
    "preview": "import asyncio\nimport collections\nimport logging\nimport typing\nimport aiohttp\nfrom lbry import utils\nfrom lbry.conf impo"
  },
  {
    "path": "lbry/extras/daemon/client.py",
    "chars": 205,
    "preview": "from lbry.extras.cli import execute_command\nfrom lbry.conf import Config\n\n\ndef daemon_rpc(conf: Config, method: str, **k"
  },
  {
    "path": "lbry/extras/daemon/component.py",
    "chars": 2190,
    "preview": "import asyncio\nimport logging\nfrom lbry.conf import Config\nfrom lbry.extras.daemon.componentmanager import ComponentMana"
  },
  {
    "path": "lbry/extras/daemon/componentmanager.py",
    "chars": 6086,
    "preview": "import logging\nimport asyncio\nfrom lbry.conf import Config\nfrom lbry.error import ComponentStartConditionNotMetError\nfro"
  },
  {
    "path": "lbry/extras/daemon/components.py",
    "chars": 30794,
    "preview": "import math\nimport os\nimport asyncio\nimport logging\nimport binascii\nimport typing\n\nimport base58\n\nfrom aioupnp import __"
  },
  {
    "path": "lbry/extras/daemon/daemon.py",
    "chars": 270318,
    "preview": "import linecache\nimport os\nimport re\nimport asyncio\nimport logging\nimport json\nimport time\nimport inspect\nimport typing\n"
  },
  {
    "path": "lbry/extras/daemon/exchange_rate_manager.py",
    "chars": 7877,
    "preview": "import json\nimport time\nimport asyncio\nimport logging\nfrom statistics import median\nfrom decimal import Decimal\nfrom typ"
  },
  {
    "path": "lbry/extras/daemon/json_response_encoder.py",
    "chars": 16324,
    "preview": "import logging\nfrom decimal import Decimal\nfrom binascii import hexlify, unhexlify\nfrom datetime import datetime\nfrom js"
  },
  {
    "path": "lbry/extras/daemon/migrator/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "lbry/extras/daemon/migrator/dbmigrator.py",
    "chars": 2935,
    "preview": "# pylint: skip-file\nimport os\nimport sys\nimport logging\n\nlog = logging.getLogger(__name__)\n\n\ndef migrate_db(conf, start,"
  },
  {
    "path": "lbry/extras/daemon/migrator/migrate10to11.py",
    "chars": 1911,
    "preview": "import sqlite3\nimport os\nimport binascii\n\n\ndef do_migration(conf):\n    db_path = os.path.join(conf.data_dir, \"lbrynet.sq"
  },
  {
    "path": "lbry/extras/daemon/migrator/migrate11to12.py",
    "chars": 2198,
    "preview": "import sqlite3\nimport os\nimport time\n\n\ndef do_migration(conf):\n    db_path = os.path.join(conf.data_dir, 'lbrynet.sqlite"
  },
  {
    "path": "lbry/extras/daemon/migrator/migrate12to13.py",
    "chars": 2673,
    "preview": "import os\nimport sqlite3\n\n\ndef do_migration(conf):\n    db_path = os.path.join(conf.data_dir, \"lbrynet.sqlite\")\n    conne"
  },
  {
    "path": "lbry/extras/daemon/migrator/migrate13to14.py",
    "chars": 520,
    "preview": "import os\nimport sqlite3\n\n\ndef do_migration(conf):\n    db_path = os.path.join(conf.data_dir, \"lbrynet.sqlite\")\n    conne"
  },
  {
    "path": "lbry/extras/daemon/migrator/migrate14to15.py",
    "chars": 418,
    "preview": "import os\nimport sqlite3\n\n\ndef do_migration(conf):\n    db_path = os.path.join(conf.data_dir, \"lbrynet.sqlite\")\n    conne"
  },
  {
    "path": "lbry/extras/daemon/migrator/migrate15to16.py",
    "chars": 444,
    "preview": "import os\nimport sqlite3\n\n\ndef do_migration(conf):\n    db_path = os.path.join(conf.data_dir, \"lbrynet.sqlite\")\n    conne"
  },
  {
    "path": "lbry/extras/daemon/migrator/migrate1to2.py",
    "chars": 2830,
    "preview": "import sqlite3\nimport os\nimport logging\n\nlog = logging.getLogger(__name__)\nUNSET_NOUT = -1\n\ndef do_migration(conf):\n    "
  },
  {
    "path": "lbry/extras/daemon/migrator/migrate2to3.py",
    "chars": 1441,
    "preview": "import sqlite3\nimport os\nimport logging\n\nlog = logging.getLogger(__name__)\n\n\ndef do_migration(conf):\n    log.info(\"Doing"
  },
  {
    "path": "lbry/extras/daemon/migrator/migrate3to4.py",
    "chars": 3117,
    "preview": "import sqlite3\nimport os\nimport logging\n\nlog = logging.getLogger(__name__)\n\n\ndef do_migration(conf):\n    log.info(\"Doing"
  },
  {
    "path": "lbry/extras/daemon/migrator/migrate4to5.py",
    "chars": 2346,
    "preview": "import sqlite3\nimport os\nimport logging\n\nlog = logging.getLogger(__name__)\n\n\ndef do_migration(conf):\n    log.info(\"Doing"
  },
  {
    "path": "lbry/extras/daemon/migrator/migrate5to6.py",
    "chars": 14056,
    "preview": "import sqlite3\nimport os\nimport json\nimport logging\nfrom binascii import hexlify\nfrom lbry.schema.claim import Claim\n\nlo"
  },
  {
    "path": "lbry/extras/daemon/migrator/migrate6to7.py",
    "chars": 444,
    "preview": "import sqlite3\nimport os\n\n\ndef do_migration(conf):\n    db_path = os.path.join(conf.data_dir, \"lbrynet.sqlite\")\n    conne"
  },
  {
    "path": "lbry/extras/daemon/migrator/migrate7to8.py",
    "chars": 505,
    "preview": "import sqlite3\nimport os\n\n\ndef do_migration(conf):\n    db_path = os.path.join(conf.data_dir, \"lbrynet.sqlite\")\n    conne"
  },
  {
    "path": "lbry/extras/daemon/migrator/migrate8to9.py",
    "chars": 2308,
    "preview": "import sqlite3\nimport logging\nimport os\nfrom lbry.blob.blob_info import BlobInfo\nfrom lbry.stream.descriptor import Stre"
  },
  {
    "path": "lbry/extras/daemon/migrator/migrate9to10.py",
    "chars": 705,
    "preview": "import sqlite3\nimport os\n\n\ndef do_migration(conf):\n    db_path = os.path.join(conf.data_dir, \"lbrynet.sqlite\")\n    conne"
  },
  {
    "path": "lbry/extras/daemon/security.py",
    "chars": 895,
    "preview": "import logging\nfrom aiohttp import web\n\nlog = logging.getLogger(__name__)\n\n\ndef ensure_request_allowed(request, conf):\n "
  },
  {
    "path": "lbry/extras/daemon/storage.py",
    "chars": 44878,
    "preview": "import os\nimport logging\nimport sqlite3\nimport typing\nimport asyncio\nimport binascii\nimport time\nfrom typing import Opti"
  },
  {
    "path": "lbry/extras/daemon/undecorated.py",
    "chars": 1903,
    "preview": "# Copyright 2016-2017 Ionuț Arțăriși <ionut@artarisi.eu>\n\n# Licensed under the Apache License, Version 2.0 (the \"License"
  },
  {
    "path": "lbry/extras/system_info.py",
    "chars": 900,
    "preview": "import platform\nimport os\nimport logging.handlers\n\nfrom lbry import build_info, __version__ as lbrynet_version\n\nlog = lo"
  },
  {
    "path": "lbry/file/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "lbry/file/file_manager.py",
    "chars": 15808,
    "preview": "import asyncio\nimport logging\nimport typing\nfrom typing import Optional\nfrom aiohttp.web import Request\nfrom lbry.error "
  },
  {
    "path": "lbry/file/source.py",
    "chars": 5956,
    "preview": "import os\nimport asyncio\nimport typing\nimport logging\nimport binascii\nfrom typing import Optional\nfrom lbry.utils import"
  },
  {
    "path": "lbry/file/source_manager.py",
    "chars": 4922,
    "preview": "import os\nimport asyncio\nimport logging\nimport typing\nfrom typing import Optional\nfrom lbry.file.source import ManagedDo"
  },
  {
    "path": "lbry/file_analysis.py",
    "chars": 19972,
    "preview": "import asyncio\nimport json\nimport logging\nimport os\nimport pathlib\nimport platform\nimport re\nimport shlex\nimport shutil\n"
  },
  {
    "path": "lbry/prometheus.py",
    "chars": 2515,
    "preview": "import time\nimport logging\nimport asyncio\nimport asyncio.tasks\nfrom aiohttp import web\nfrom prometheus_client import gen"
  },
  {
    "path": "lbry/schema/Makefile",
    "chars": 299,
    "preview": "build:\n\trm types/v2/* -rf\n\ttouch types/v2/__init__.py\n\tcd types/v2/ && protoc --python_out=. -I ../../../../../types/v2/"
  },
  {
    "path": "lbry/schema/README.md",
    "chars": 941,
    "preview": "Schema\n=====\n\nThose files are generated from the [types repo](https://github.com/lbryio/types). If you are modifying/add"
  },
  {
    "path": "lbry/schema/__init__.py",
    "chars": 24,
    "preview": "from .claim import Claim"
  },
  {
    "path": "lbry/schema/attrs.py",
    "chars": 15906,
    "preview": "import json\nimport logging\nimport os.path\nimport hashlib\nfrom typing import Tuple, List\nfrom string import ascii_letters"
  },
  {
    "path": "lbry/schema/base.py",
    "chars": 3167,
    "preview": "from binascii import hexlify, unhexlify\nfrom typing import List, Iterator, TypeVar, Generic\n\nfrom google.protobuf.messag"
  },
  {
    "path": "lbry/schema/claim.py",
    "chars": 12241,
    "preview": "import logging\nfrom typing import List\nfrom binascii import hexlify, unhexlify\n\nfrom asn1crypto.keys import PublicKeyInf"
  },
  {
    "path": "lbry/schema/compat.py",
    "chars": 3738,
    "preview": "import json\nfrom decimal import Decimal\n\nfrom google.protobuf.message import DecodeError\n\nfrom lbry.schema.types.v1.lega"
  },
  {
    "path": "lbry/schema/mime_types.py",
    "chars": 8694,
    "preview": "import os\nimport filetype\nimport logging\n\ntypes_map = {\n    # http://www.iana.org/assignments/media-types\n    # Type map"
  },
  {
    "path": "lbry/schema/purchase.py",
    "chars": 1298,
    "preview": "from google.protobuf.message import DecodeError\nfrom google.protobuf.json_format import MessageToDict\nfrom lbry.schema.t"
  },
  {
    "path": "lbry/schema/result.py",
    "chars": 9845,
    "preview": "import base64\nfrom typing import List, Union, Optional, NamedTuple\nfrom binascii import hexlify\nfrom itertools import ch"
  },
  {
    "path": "lbry/schema/support.py",
    "chars": 532,
    "preview": "from lbry.schema.base import Signable\nfrom lbry.schema.types.v2.support_pb2 import Support as SupportMessage\n\n\nclass Sup"
  },
  {
    "path": "lbry/schema/tags.py",
    "chars": 348,
    "preview": "from typing import List\nimport re\n\nMULTI_SPACE_RE = re.compile(r\"\\s{2,}\")\nWEIRD_CHARS_RE = re.compile(r\"[#!~]\")\n\n\ndef no"
  },
  {
    "path": "lbry/schema/types/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "lbry/schema/types/v1/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "lbry/schema/types/v1/certificate_pb2.py",
    "chars": 4843,
    "preview": "# Generated by the protocol buffer compiler.  DO NOT EDIT!\n# source: certificate.proto\n\nimport sys\n_b=sys.version_info[0"
  },
  {
    "path": "lbry/schema/types/v1/fee_pb2.py",
    "chars": 4844,
    "preview": "# Generated by the protocol buffer compiler.  DO NOT EDIT!\n# source: fee.proto\n\nimport sys\n_b=sys.version_info[0]<3 and "
  },
  {
    "path": "lbry/schema/types/v1/legacy_claim_pb2.py",
    "chars": 5892,
    "preview": "# Generated by the protocol buffer compiler.  DO NOT EDIT!\n# source: legacy_claim.proto\n\nimport sys\n_b=sys.version_info["
  },
  {
    "path": "lbry/schema/types/v1/metadata_pb2.py",
    "chars": 35682,
    "preview": "# Generated by the protocol buffer compiler.  DO NOT EDIT!\n# source: metadata.proto\n\nimport sys\n_b=sys.version_info[0]<3"
  },
  {
    "path": "lbry/schema/types/v1/signature_pb2.py",
    "chars": 4174,
    "preview": "# Generated by the protocol buffer compiler.  DO NOT EDIT!\n# source: signature.proto\n\nimport sys\n_b=sys.version_info[0]<"
  },
  {
    "path": "lbry/schema/types/v1/source_pb2.py",
    "chars": 4717,
    "preview": "# Generated by the protocol buffer compiler.  DO NOT EDIT!\n# source: source.proto\n\nimport sys\n_b=sys.version_info[0]<3 a"
  },
  {
    "path": "lbry/schema/types/v1/stream_pb2.py",
    "chars": 3808,
    "preview": "# Generated by the protocol buffer compiler.  DO NOT EDIT!\n# source: stream.proto\n\nimport sys\n_b=sys.version_info[0]<3 a"
  },
  {
    "path": "lbry/schema/types/v2/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "lbry/schema/types/v2/claim_pb2.py",
    "chars": 167132,
    "preview": "# Generated by the protocol buffer compiler.  DO NOT EDIT!\n# source: claim.proto\n\nimport sys\n_b=sys.version_info[0]<3 an"
  },
  {
    "path": "lbry/schema/types/v2/purchase_pb2.py",
    "chars": 1825,
    "preview": "# Generated by the protocol buffer compiler.  DO NOT EDIT!\n# source: purchase.proto\n\nimport sys\n_b=sys.version_info[0]<3"
  },
  {
    "path": "lbry/schema/types/v2/result_pb2.py",
    "chars": 20420,
    "preview": "# -*- coding: utf-8 -*-\n# Generated by the protocol buffer compiler.  DO NOT EDIT!\n# source: result.proto\n\"\"\"Generated p"
  },
  {
    "path": "lbry/schema/types/v2/support_pb2.py",
    "chars": 2184,
    "preview": "# Generated by the protocol buffer compiler.  DO NOT EDIT!\n# source: support.proto\n\nimport sys\n_b=sys.version_info[0]<3 "
  },
  {
    "path": "lbry/schema/types/v2/wallet.json",
    "chars": 5693,
    "preview": "{\n  \"title\": \"Wallet\",\n  \"description\": \"An LBC wallet\",\n  \"type\": \"object\",\n  \"required\": [\"name\", \"version\", \"accounts"
  },
  {
    "path": "lbry/schema/url.py",
    "chars": 3554,
    "preview": "import re\nimport unicodedata\nfrom typing import NamedTuple, Tuple\n\n\ndef _create_url_regex():\n    # see https://spec.lbry"
  },
  {
    "path": "lbry/stream/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "lbry/stream/background_downloader.py",
    "chars": 1009,
    "preview": "import asyncio\nimport logging\n\nfrom lbry.stream.downloader import StreamDownloader\n\n\nlog = logging.getLogger(__name__)\n\n"
  },
  {
    "path": "lbry/stream/descriptor.py",
    "chars": 12334,
    "preview": "import os\nimport json\nimport binascii\nimport logging\nimport typing\nimport asyncio\nimport time\nimport re\nfrom collections"
  },
  {
    "path": "lbry/stream/downloader.py",
    "chars": 6366,
    "preview": "import asyncio\nimport typing\nimport logging\nimport binascii\n\nfrom lbry.dht.node import get_kademlia_peers_from_hosts\nfro"
  },
  {
    "path": "lbry/stream/managed_stream.py",
    "chars": 21220,
    "preview": "import os\nimport asyncio\nimport time\nimport typing\nimport logging\nfrom typing import Optional\nfrom aiohttp.web import Re"
  },
  {
    "path": "lbry/stream/reflector/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "lbry/stream/reflector/client.py",
    "chars": 6260,
    "preview": "import asyncio\nimport json\nimport logging\nimport typing\n\nif typing.TYPE_CHECKING:\n    from lbry.blob.blob_manager import"
  },
  {
    "path": "lbry/stream/reflector/server.py",
    "chars": 8732,
    "preview": "import asyncio\nimport logging\nimport typing\nimport json\nfrom json.decoder import JSONDecodeError\nfrom lbry.stream.descri"
  },
  {
    "path": "lbry/stream/stream_manager.py",
    "chars": 13277,
    "preview": "import os\nimport asyncio\nimport binascii\nimport logging\nimport random\nimport typing\nfrom typing import Optional\nfrom aio"
  },
  {
    "path": "lbry/testcase.py",
    "chars": 28250,
    "preview": "import os\nimport sys\nimport json\nimport shutil\nimport logging\nimport tempfile\nimport functools\nimport asyncio\nfrom async"
  },
  {
    "path": "lbry/torrent/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "lbry/torrent/session.py",
    "chars": 9104,
    "preview": "import asyncio\nimport binascii\nimport os\nimport logging\nimport random\nfrom hashlib import sha1\nfrom tempfile import mkdt"
  },
  {
    "path": "lbry/torrent/torrent.py",
    "chars": 2263,
    "preview": "import asyncio\nimport logging\nimport typing\n\n\nlog = logging.getLogger(__name__)\n\n\nclass TorrentInfo:\n    __slots__ = ('d"
  },
  {
    "path": "lbry/torrent/torrent_manager.py",
    "chars": 5719,
    "preview": "import asyncio\nimport binascii\nimport logging\nimport os\nimport typing\nfrom typing import Optional\nfrom aiohttp.web impor"
  },
  {
    "path": "lbry/torrent/tracker.py",
    "chars": 14145,
    "preview": "import random\nimport socket\nimport string\nimport struct\nimport asyncio\nimport logging\nimport time\nimport ipaddress\nfrom "
  },
  {
    "path": "lbry/utils.py",
    "chars": 14891,
    "preview": "import base64\nimport codecs\nimport datetime\nimport random\nimport socket\nimport time\nimport string\nimport sys\nimport json"
  },
  {
    "path": "lbry/wallet/__init__.py",
    "chars": 1035,
    "preview": "__lbcd__ = 'lbcd'\n__lbcctl__ = 'lbcctl'\n__lbcwallet__ = 'lbcwallet'\n__lbcd_url__ = (\n    'https://github.com/lbryio/lbcd"
  },
  {
    "path": "lbry/wallet/account.py",
    "chars": 26607,
    "preview": "import os\nimport time\nimport json\nimport logging\nimport typing\nimport asyncio\nimport random\nfrom hashlib import sha256\nf"
  },
  {
    "path": "lbry/wallet/bcd_data_stream.py",
    "chars": 2998,
    "preview": "import struct\nfrom io import BytesIO\n\n\nclass BCDataStream:\n\n    def __init__(self, data=None):\n        self.data = Bytes"
  },
  {
    "path": "lbry/wallet/bip32.py",
    "chars": 12310,
    "preview": "from asn1crypto.keys import PrivateKeyInfo, ECPrivateKey\nfrom coincurve import PublicKey as cPublicKey, PrivateKey as cP"
  },
  {
    "path": "lbry/wallet/checkpoints.py",
    "chars": 99583,
    "preview": "HASHES = {\n    0: 'bf3ff54138625c56737509f080e7e7f3c55972f0f80e684f8e25d2ad83bedbe2',\n    1000: '4ec1f9aebc8f7f75d5d0543"
  },
  {
    "path": "lbry/wallet/claim_proofs.py",
    "chars": 3643,
    "preview": "import struct\nimport binascii\nfrom lbry.crypto.hash import double_sha256\n\n\nclass InvalidProofError(Exception):\n    pass\n"
  },
  {
    "path": "lbry/wallet/coinselection.py",
    "chars": 5816,
    "preview": "from random import Random\nfrom typing import List\n\nfrom lbry.wallet.transaction import OutputEffectiveAmountEstimator\n\nM"
  },
  {
    "path": "lbry/wallet/constants.py",
    "chars": 381,
    "preview": "NULL_HASH32 = b'\\x00'*32\n\nCENT = 1000000\nCOIN = 100*CENT\nDUST = 1000\n\nTIMEOUT = 30.0\n\nTXO_TYPES = {\n    \"other\": 0,\n    "
  },
  {
    "path": "lbry/wallet/database.py",
    "chars": 56554,
    "preview": "import os\nimport logging\nimport asyncio\nimport sqlite3\nimport platform\nfrom binascii import hexlify\nfrom collections imp"
  },
  {
    "path": "lbry/wallet/dewies.py",
    "chars": 1109,
    "preview": "import textwrap\nfrom .util import coins_to_satoshis, satoshis_to_coins\n\n\ndef lbc_to_dewies(lbc: str) -> int:\n    try:\n  "
  },
  {
    "path": "lbry/wallet/hash.py",
    "chars": 1109,
    "preview": "from binascii import hexlify, unhexlify\nfrom .constants import NULL_HASH32\n\n\nclass TXRef:\n\n    __slots__ = '_id', '_hash"
  },
  {
    "path": "lbry/wallet/header.py",
    "chars": 15572,
    "preview": "import base64\nimport os\nimport struct\nimport asyncio\nimport logging\nimport zlib\nfrom datetime import date\n\nfrom io impor"
  },
  {
    "path": "lbry/wallet/ledger.py",
    "chars": 54183,
    "preview": "import os\nimport copy\nimport time\nimport asyncio\nimport logging\nfrom datetime import datetime\nfrom functools import part"
  },
  {
    "path": "lbry/wallet/manager.py",
    "chars": 13453,
    "preview": "import os\nimport json\nimport typing\nimport logging\nimport asyncio\n\nfrom binascii import unhexlify\nfrom decimal import De"
  },
  {
    "path": "lbry/wallet/mnemonic.py",
    "chars": 5020,
    "preview": "# Copyright (C) 2014 Thomas Voegtlin\n# Copyright (C) 2018 LBRY Inc.\n\nimport hmac\nimport math\nimport hashlib\nimport impor"
  },
  {
    "path": "lbry/wallet/network.py",
    "chars": 21470,
    "preview": "import logging\nimport asyncio\nimport json\nimport socket\nimport random\nfrom time import perf_counter\nfrom collections imp"
  },
  {
    "path": "lbry/wallet/orchstr8/__init__.py",
    "chars": 106,
    "preview": "from lbry.wallet.orchstr8.node import Conductor\nfrom lbry.wallet.orchstr8.service import ConductorService\n"
  },
  {
    "path": "lbry/wallet/orchstr8/cli.py",
    "chars": 3204,
    "preview": "import logging\nimport argparse\nimport asyncio\nimport aiohttp\n\nfrom lbry import wallet\nfrom lbry.wallet.orchstr8.node imp"
  },
  {
    "path": "lbry/wallet/orchstr8/node.py",
    "chars": 24005,
    "preview": "# pylint: disable=import-error\nimport os\nimport json\nimport shutil\nimport asyncio\nimport zipfile\nimport tarfile\nimport l"
  },
  {
    "path": "lbry/wallet/orchstr8/service.py",
    "chars": 5483,
    "preview": "import asyncio\nimport logging\nfrom aiohttp.web import Application, WebSocketResponse, json_response\nfrom aiohttp.http_we"
  },
  {
    "path": "lbry/wallet/rpc/__init__.py",
    "chars": 250,
    "preview": "from .framing import *\nfrom .jsonrpc import *\nfrom .socks import *\nfrom .session import *\nfrom .util import *\n\n__all__ ="
  },
  {
    "path": "lbry/wallet/rpc/framing.py",
    "chars": 7790,
    "preview": "# Copyright (c) 2018, Neil Booth\n#\n# All rights reserved.\n#\n# The MIT License (MIT)\n#\n# Permission is hereby granted, fr"
  },
  {
    "path": "lbry/wallet/rpc/jsonrpc.py",
    "chars": 28341,
    "preview": "# Copyright (c) 2018, Neil Booth\n#\n# All rights reserved.\n#\n# The MIT License (MIT)\n#\n# Permission is hereby granted, fr"
  },
  {
    "path": "lbry/wallet/rpc/session.py",
    "chars": 20075,
    "preview": "# Copyright (c) 2018, Neil Booth\n#\n# All rights reserved.\n#\n# The MIT License (MIT)\n#\n# Permission is hereby granted, fr"
  },
  {
    "path": "lbry/wallet/rpc/socks.py",
    "chars": 15343,
    "preview": "# Copyright (c) 2018, Neil Booth\n#\n# All rights reserved.\n#\n# The MIT License (MIT)\n#\n# Permission is hereby granted, fr"
  },
  {
    "path": "lbry/wallet/rpc/util.py",
    "chars": 3272,
    "preview": "# Copyright (c) 2018, Neil Booth\n#\n# All rights reserved.\n#\n# The MIT License (MIT)\n#\n# Permission is hereby granted, fr"
  },
  {
    "path": "lbry/wallet/script.py",
    "chars": 18961,
    "preview": "from typing import List\nfrom itertools import chain\nfrom binascii import hexlify\nfrom collections import namedtuple\n\nfro"
  },
  {
    "path": "lbry/wallet/stream.py",
    "chars": 5067,
    "preview": "import asyncio\n\n\nclass BroadcastSubscription:\n\n    def __init__(self, controller, on_data, on_error, on_done):\n        s"
  },
  {
    "path": "lbry/wallet/tasks.py",
    "chars": 796,
    "preview": "from asyncio import Event, get_event_loop\n\n\nclass TaskGroup:\n\n    def __init__(self, loop=None):\n        self._loop = lo"
  },
  {
    "path": "lbry/wallet/transaction.py",
    "chars": 37508,
    "preview": "import struct\nimport logging\nimport typing\nfrom binascii import hexlify, unhexlify\nfrom typing import List, Iterable, Op"
  },
  {
    "path": "lbry/wallet/udp.py",
    "chars": 7992,
    "preview": "import asyncio\nimport struct\nfrom time import perf_counter\nimport logging\nfrom typing import Optional, Tuple, NamedTuple"
  },
  {
    "path": "lbry/wallet/usage_payment.py",
    "chars": 4434,
    "preview": "import asyncio\nimport logging\n\nfrom lbry.error import (\n    InsufficientFundsError,\n    ServerPaymentFeeAboveMaxAllowedE"
  },
  {
    "path": "lbry/wallet/util.py",
    "chars": 3485,
    "preview": "import re\nfrom typing import TypeVar, Sequence, Optional\nfrom .constants import COIN\n\n\ndef date_to_julian_day(d):\n    re"
  },
  {
    "path": "lbry/wallet/wallet.py",
    "chars": 11377,
    "preview": "import os\nimport time\nimport stat\nimport json\nimport zlib\nimport typing\nimport logging\nfrom typing import List, Sequence"
  },
  {
    "path": "lbry/wallet/words/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "lbry/wallet/words/chinese_simplified.py",
    "chars": 10251,
    "preview": "words = [\n'的',\n'一',\n'是',\n'在',\n'不',\n'了',\n'有',\n'和',\n'人',\n'这',\n'中',\n'大',\n'为',\n'上',\n'个',\n'国',\n'我',\n'以',\n'要',\n'他',\n'时',\n'来',\n"
  },
  {
    "path": "lbry/wallet/words/english.py",
    "chars": 19271,
    "preview": "words = [\n'abandon',\n'ability',\n'able',\n'about',\n'above',\n'absent',\n'absorb',\n'abstract',\n'absurd',\n'abuse',\n'access',\n'"
  },
  {
    "path": "lbry/wallet/words/japanese.py",
    "chars": 15616,
    "preview": "words = [\n'あいこくしん',\n'あいさつ',\n'あいだ',\n'あおぞら',\n'あかちゃん',\n'あきる',\n'あけがた',\n'あける',\n'あこがれる',\n'あさい',\n'あさひ',\n'あしあと',\n'あじわう',\n'あずかる',"
  },
  {
    "path": "lbry/wallet/words/portuguese.py",
    "chars": 19653,
    "preview": "words = [\r\n'abaular',\r\n'abdominal',\r\n'abeto',\r\n'abissinio',\r\n'abjeto',\r\n'ablucao',\r\n'abnegar',\r\n'abotoar',\r\n'abrutalhar'"
  },
  {
    "path": "lbry/wallet/words/spanish.py",
    "chars": 19477,
    "preview": "words = [\n'ábaco',\n'abdomen',\n'abeja',\n'abierto',\n'abogado',\n'abono',\n'aborto',\n'abrazo',\n'abrir',\n'abuelo',\n'abuso',\n'a"
  },
  {
    "path": "lbry/winpaths.py",
    "chars": 9657,
    "preview": "# Copyright (c) 2014 Michael Kropat\n\nimport sys\nimport ctypes\nfrom ctypes import windll, wintypes\nfrom uuid import UUID\n"
  },
  {
    "path": "scripts/Dockerfile.lbry_orchstr8",
    "chars": 711,
    "preview": "FROM debian:buster-slim\n\nARG TORBA_VERSION=master\n\nRUN apt-get update && \\\n    apt-get upgrade -y && \\\n    apt-get insta"
  },
  {
    "path": "scripts/check_signature.py",
    "chars": 1189,
    "preview": "import argparse\nimport sqlite3\nfrom binascii import hexlify\nfrom lbry.wallet.transaction import Output\n\n\ndef check(db_pa"
  },
  {
    "path": "scripts/check_video.py",
    "chars": 1671,
    "preview": "#!/usr/bin/env python3\n\nimport asyncio\nimport logging\nimport platform\nimport sys\n\n# noinspection PyUnresolvedReferences\n"
  },
  {
    "path": "scripts/checkpoints.py",
    "chars": 1346,
    "preview": "import asyncio\nimport os\n\nfrom lbry.extras.cli import ensure_directory_exists\nfrom lbry.conf import Config\nfrom lbry.wal"
  },
  {
    "path": "scripts/checktrie.py",
    "chars": 2861,
    "preview": "import sys\nimport asyncio\nfrom binascii import hexlify\n\nfrom lbry.wallet.server.db.writer import SQLDB\nfrom lbry.wallet."
  },
  {
    "path": "scripts/deploy_dev_wallet_server.sh",
    "chars": 711,
    "preview": "#!/usr/bin/env bash\n\n# usage: update_dev_wallet_server.sh <host to update>\nTARGET_HOST=$1\n\nSCRIPTS_DIR=`dirname $0`\nLBRY"
  },
  {
    "path": "scripts/dht_crawler.py",
    "chars": 22512,
    "preview": "import sys\nimport datetime\nimport logging\nimport asyncio\nimport os.path\nimport random\nimport time\nimport typing\nfrom dat"
  },
  {
    "path": "scripts/dht_monitor.py",
    "chars": 1442,
    "preview": "import curses\nimport time\nimport asyncio\nimport lbry.wallet\nfrom lbry.conf import Config\nfrom lbry.extras.daemon.client "
  },
  {
    "path": "scripts/dht_node.py",
    "chars": 4995,
    "preview": "import asyncio\nimport argparse\nimport logging\nimport csv\nimport os.path\nfrom io import StringIO\nfrom typing import Optio"
  },
  {
    "path": "scripts/download_blob_from_peer.py",
    "chars": 2463,
    "preview": "\"\"\"A simple script that attempts to directly download a single blob.\n\nTo Do:\n------\nCurrently `lbrynet blob get <hash>` "
  },
  {
    "path": "scripts/find_max_server_load.py",
    "chars": 3762,
    "preview": "import time\nimport asyncio\nimport random\nfrom argparse import ArgumentParser\nfrom lbry.wallet.network import ClientSessi"
  },
  {
    "path": "scripts/generate_json_api.py",
    "chars": 16087,
    "preview": "import os\nimport re\nimport json\nimport inspect\nimport tempfile\nimport asyncio\nimport time\nfrom docopt import docopt\nfrom"
  }
]

// ... and 118 more files (download for full content)

About this extraction

This page contains the full source code of the lbryio/lbry-sdk GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 318 files (3.2 MB), approximately 844.2k tokens, and a symbol index with 4019 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!