def scan(self, paths, exclude=[], cofuncid=None): added = [] exclude = [util.expanduser(path) for path in exclude if path] for fullpath in paths: print_d("Scanning %r." % fullpath, self) desc = _("Scanning %s") % (util.unexpand(util.fsdecode(fullpath))) with Task(_("Library"), desc) as task: if cofuncid: task.copool(cofuncid) fullpath = util.expanduser(fullpath) if filter(fullpath.startswith, exclude): continue for path, dnames, fnames in os.walk(util.fsnative(fullpath)): for filename in fnames: fullfilename = os.path.join(path, filename) if filter(fullfilename.startswith, exclude): continue if fullfilename not in self._contents: fullfilename = os.path.realpath(fullfilename) if filter(fullfilename.startswith, exclude): continue if fullfilename not in self._contents: item = self.add_filename(fullfilename, False) if item is not None: added.append(item) if len(added) > 20: self.add(added) added = [] task.pulse() yield True if added: self.add(added) added = [] task.pulse() yield True
def _post(self, value, song): if value: fn = song.get("~filename", ".") ext = fn[fn.rfind("."):].lower() val_ext = value[-len(ext):].lower() if not ext == val_ext: value += ext.lower() if os.name == "nt": value = util.strip_win32_incompat_from_path(value) value = util.expanduser(value) # Limit each path section to 255 (bytes on linux, chars on win). # http://en.wikipedia.org/wiki/Comparison_of_file_systems#Limits path, ext = os.path.splitext(value) path = map(util.fsnative, path.split(os.sep)) limit = [255] * len(path) limit[-1] -= len(util.fsnative(ext)) elip = lambda (p, l): (len(p) > l and p[:l-2] + "..") or p path = os.sep.join(map(elip, zip(path, limit))) value = util.fsdecode(path) + ext if os.sep in value and not os.path.isabs(value): raise ValueError("Pattern is not rooted") return value
def process_arguments(): controls = ["next", "previous", "play", "pause", "play-pause", "stop", "hide-window", "show-window", "toggle-window", "focus", "quit", "unfilter", "refresh", "force-previous"] controls_opt = ["seek", "order", "repeat", "query", "volume", "filter", "set-rating", "set-browser", "open-browser", "random", "song-list", "queue"] options = util.OptionParser( "Quod Libet", const.VERSION, _("a music library and player"), _("[option]")) options.add("print-playing", help=_("Print the playing song and exit")) options.add("start-playing", help=_("Begin playing immediately")) for opt, help in [ ("next", _("Jump to next song")), ("previous", _("Jump to previous song or restart if near the beginning")), ("force-previous", _("Jump to previous song")), ("play", _("Start playback")), ("pause", _("Pause playback")), ("play-pause", _("Toggle play/pause mode")), ("stop", _("Stop playback")), ("volume-up", _("Turn up volume")), ("volume-down", _("Turn down volume")), ("status", _("Print player status")), ("hide-window", _("Hide main window")), ("show-window", _("Show main window")), ("toggle-window", _("Toggle main window visibility")), ("focus", _("Focus the running player")), ("unfilter", _("Remove active browser filters")), ("refresh", _("Refresh and rescan library")), ("print-playlist", _("Print the current playlist")), ("print-queue", _("Print the contents of the queue")), ("no-plugins", _("Start without plugins")), ("quit", _("Exit Quod Libet")), ]: options.add(opt, help=help) for opt, help, arg in [ ("seek", _("Seek within the playing song"), _("[+|-][HH:]MM:SS")), ("order", _("Set or toggle the playback order"), "[order]|toggle"), ("repeat", _("Turn repeat off, on, or toggle it"), "0|1|t"), ("volume", _("Set the volume"), "(+|-|)0..100"), ("query", _("Search your audio library"), _("query")), ("play-file", _("Play a file"), Q_("command|filename")), ("set-rating", _("Rate the playing song"), "0.0..1.0"), ("set-browser", _("Set the current browser"), "BrowserName"), ("open-browser", _("Open a new browser"), "BrowserName"), ("queue", _("Show or hide the queue"), "on|off|t"), ("song-list", _("Show or hide the main song list"), "on|off|t"), ("random", _("Filter on a random value"), Q_("command|tag")), ("filter", _("Filter on a tag value"), _("tag=value")), ("enqueue", _("Enqueue a file or query"), "%s|%s" % ( Q_("command|filename"), _("query"))), ("enqueue-files", _("Enqueue comma-separated files"), "%s[,%s..]" % ( _("filename"), _("filename"))), ("print-query", _("Print filenames of results of query to stdout"), _("query")), ("unqueue", _("Unqueue a file or query"), "%s|%s" % ( Q_("command|filename"), _("query"))), ]: options.add(opt, help=help, arg=arg) options.add("sm-config-prefix", arg="dummy") options.add("sm-client-id", arg="prefix") options.add("screen", arg="dummy") def is_vol(str): if str[0] in '+-': if len(str) == 1: return True str = str[1:] return str.isdigit() def is_time(str): if str[0] not in "+-0123456789": return False elif str[0] in "+-": str = str[1:] parts = str.split(":") if len(parts) > 3: return False else: return not (False in [p.isdigit() for p in parts]) def is_float(str): try: float(str) except ValueError: return False else: return True validators = { "order": ["0", "1", "t", "toggle", "inorder", "shuffle", "weighted", "onesong"].__contains__, "repeat": ["0", "1", "t", "on", "off", "toggle"].__contains__, "volume": is_vol, "seek": is_time, "set-rating": is_float, } opts, args = options.parse() for command, arg in opts.items(): if command in controls: control(command) elif command in controls_opt: if command in validators and not validators[command](arg): print_e(_("Invalid argument for '%s'.") % command) print_e(_("Try %s --help.") % sys.argv[0]) quodlibet.exit(True) else: control(command + " " + arg) elif command == "status": print_fifo("status") elif command == "print-playlist": print_fifo("dump-playlist") elif command == "print-queue": print_fifo("dump-queue") elif command == "volume-up": control("volume +") elif command == "volume-down": control("volume -") elif command == "enqueue" or command == "unqueue": try: filename = URI(arg).filename except ValueError: filename = arg control(command + " " + filename) elif command == "enqueue-files": control(command + " " + arg) elif command == "play-file": try: filename = URI(arg).filename except ValueError: filename = os.path.abspath(util.expanduser(arg)) if os.path.isdir(filename): control("add-directory " + filename) else: control("add-file " + filename) elif command == "print-playing": try: print_playing(args[0]) except IndexError: print_playing() elif command == "print-query": print_query(arg) elif command == "start-playing": global play play = True elif command == "no-plugins": global no_plugins no_plugins = True