File: options.py

package info (click to toggle)
zeya 0.6-1
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 368 kB
  • sloc: python: 1,144; xml: 239; makefile: 4
file content (139 lines) | stat: -rw-r--r-- 5,071 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# -*- coding: utf-8 -*-
#
# Copyright (C) 2009 Phil Sung, Samson Yeung, Romain Francoise
#
# This file is part of Zeya.
#
# Zeya is free software: you can redistribute it and/or modify it under the
# terms of the GNU Affero General Public License as published by the Free
# Software Foundation, either version 3 of the License, or (at your option) any
# later version.
#
# Zeya is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
# A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
# details.
#
# You should have received a copy of the GNU Affero General Public License
# along with Zeya. If not, see <http://www.gnu.org/licenses/>.


# Code for parsing command-line options.

import getopt
import os
import sys

DEFAULT_PORT = 8080
DEFAULT_BITRATE = 64 #kbits/s
DEFAULT_BACKEND = 'dir'

valid_backends = ['rhythmbox', 'dir', 'playlist']

class BadArgsError(Exception):
    """
    Error due to incorrect command-line invocation of this program.
    """
    def __init__(self, message):
        self.error_message = message
    def __str__(self):
        return "Error: %s" % (self.error_message,)

def get_options(remaining_args):
    """
    Parse the arguments and return a tuple (show_help, backend, bitrate, port,
    path, basic_auth_file), or raise BadArgsError if the invocation was not
    valid.

    show_help: whether user requested help information
    backend: string indicating backend to use
    bitrate: bitrate for encoded streams (kbits/sec)
    bind_address: IPv4/IPv6 address to bind to
    port: port number to listen on
    path: path from which to read music files (for "dir" and "playlist" backends only)
    basic_auth_file: file handle from which to read basic auth config, or None.
    """
    # TODO: make this return a more useful data structure, e.g. a dict or an
    # object. Returning a huge tuple is kind of unwieldy.
    help_msg = False
    bind_address = ''
    port = DEFAULT_PORT
    backend_type = DEFAULT_BACKEND
    bitrate = DEFAULT_BITRATE
    path = None
    basic_auth_file = None
    try:
        opts, file_list = getopt.getopt(
            remaining_args, "b:hp:",
            ["help", "backend=", "bitrate=", "bind_address=", "port=", "path=",
             "basic_auth_file="])
    except getopt.GetoptError, e:
        raise BadArgsError(e.msg)
    for flag, value in opts:
        if flag in ("-h", "--help"):
            help_msg = True
        if flag in ("--backend",):
            backend_type = value
            if backend_type not in valid_backends:
                raise BadArgsError("Unsupported backend type %r"
                                   % (backend_type,))
        if flag in ("--basic_auth_file",):
            try:
                basic_auth_file = open(value, 'r')
            except:
                raise BadArgsError("Could not read auth file %s" % (value,))
        if flag in ("-b", "--bitrate"):
            try:
                bitrate = int(value)
                if bitrate <= 0:
                    raise ValueError()
            except ValueError:
                raise BadArgsError("Invalid bitrate setting %r" % (value,))
        if flag in ("--path",):
            path = value
        if flag in ("-p", "--port"):
            try:
                port = int(value)
            except ValueError:
                raise BadArgsError("Invalid port setting %r" % (value,))
        if flag in ("--bind_address",):
            bind_address = value
    if backend_type not in ('dir', 'playlist') and path is not None:
        print "Warning: --path was set but is ignored for --backend=%s" \
            % (backend_type,)
    if backend_type == 'dir' and path is None:
        path = os.getcwd()
    if backend_type == 'playlist' and path is None:
        raise BadArgsError("Specify --path for playlist backend")
    return (help_msg, backend_type, bitrate, bind_address, port, path, basic_auth_file)

def print_usage():
    print "Usage: %s [OPTIONS]" % (os.path.basename(sys.argv[0]),)
    print """
Options:

  -h, --help
      Display this help message.

  --backend=BACKEND
      Specify the backend to use. Acceptable values:
        dir: (default) read a directory's contents recursively; see --path
        rhythmbox: read from current user's Rhythmbox library
        playlist: read from the playlist (m3u) file specified by --path

  --path=PATH
      For --backend=dir, the directory in which to look for music. (Default: ./)
      For --backend=playlist, the absolute path to a .m3u file, or a .pls file

  -b, --bitrate=N
      Specify the bitrate for output streams, in kbits/sec. (default: 64)

  --bindaddress=bindaddress
      Specify the IPv4/IPv6 address to bind to (default: bind to everything)

  -p, --port=PORT
      Listen for requests on the specified port. (default: 8080)

  --basic_auth_file=FILENAME
      Require basic HTTP authentication and only allow users named in the
      specified file. The file should be in 'htpasswd' format."""