def download(self, file): library_path = library_dao.get_library_path() ext = os.path.splitext(file) content_type = mimetypes.types_map.get(ext[1], None) # viewable in most browsers if content_type in ('image/jpeg', "image/png", "image/gif", 'application/pdf', 'text/x-nfo', 'text/plain', 'text/x-sfv', 'audio/x-mpegurl'): disposition = None if content_type in ('text/x-nfo', 'text/x-sfv', 'audio/x-mpegurl'): content_type = 'text/plain' # download... else: disposition = 'attachement' content_type = None return cherrypy.lib.static.serve_file(os.path.join(library_path, file), content_type=content_type, disposition=disposition)
def _dir_tracks(self, tracks): dir_tracks = {} artist_covers = set() album_covers = set() for track in tracks: if track.artist is not None: artist_covers.add(track.artist.cover_path) if track.album is not None: album_covers.add(track.album.cover_path) if len(track.paths) == 0: continue for path in track.paths: dir = path.dir if dir not in dir_tracks: dir_tracks[dir] = { 'paths': [], 'tracks': [], 'paths_and_tracks': [], 'pretty_dir': path.pretty_dir, 'files': [], } dir_tracks[dir]['paths'].append(path.path) dir_tracks[dir]['tracks'].append(track) dir_tracks[dir]['paths_and_tracks'].append((path, track)) for dir, dir_track in dir_tracks.items(): dir_tracks[dir]['paths_and_tracks'] = sorted(dir_track['paths_and_tracks'], key=lambda pat: pat[0].path) for dir, item in dir_tracks.items(): if not os.path.exists(dir): continue for file in os.listdir(dir): file = os.path.join(dir, file) if file not in item['paths']: isdir = os.path.isdir(file) if not isdir and LibraryService.is_supported(file): track = library_dao.get_track_by_path(file) else: track = None pretty_file = file[(len(dir) + 1):].decode("utf8", "replace") if isdir: pretty_file = "%s/" % pretty_file if not isdir: try: stat = os.stat(file) modified = datetime.datetime.fromtimestamp(stat.st_mtime) size = stat.st_size except FileNotFoundError: continue else: size = modified = None library_path = library_dao.get_library_path() relative_file = file[len(library_path):] dir_tracks[dir]['files'].append({ "file": file, "relative_file": relative_file.decode('utf8', 'replace'), "modified": modified, "size": size, "track": track, "isdir": isdir, "pretty_file": pretty_file, "is_album_cover": file in album_covers, "is_artist_cover": file in artist_covers }) dir_tracks[dir]['files'] = sorted(dir_tracks[dir]['files'], key=lambda item: "%d%s" % (not item["isdir"], item["file"])) dir_tracks = sorted(dir_tracks.items(), key=lambda d: d[0]) return dir_tracks