Changeset 28

Show
Ignore:
Timestamp:
02/20/06 20:07:53 (3 years ago)
Author:
travis
Message:

Playlist stats and more abstract AudioInfo? class

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/Makefile.in

    r15 r28  
    155155 
    156156sloccount: 
    157         sloccount ./src ./bin 
    158         sloccount --cached --details ./src ./bin 
     157        sloccount ./src 
     158        sloccount --cached --details ./src 
    159159 
    160160test-env-clean: 
  • trunk/src/audio_control.py

    r27 r28  
    271271        elif arg_value('prev'): 
    272272            src = self._playlist.get_prev() 
    273         elif arg_value['absolute'] is not None: 
    274             # TODO: absolute index 
    275             pass 
     273        elif arg_value('absolute') is not None: 
     274            i = arg_value('absolute') 
     275            self._playlist.set_curr_index(i) 
    276276        new = self._playlist.get_curr_index() 
    277277        if new is None: 
     
    286286    def _set_source(self, src): 
    287287        if src.audio_file: 
    288             self._set_track_scale(0, upper = src.audio_file.getPlayTime()
     288            self._set_track_scale(0, upper = src.audio_info.time_secs
    289289 
    290290        uri = src.uri 
  • trunk/src/mesk/audio_source.py

    r20 r28  
    2121from eyeD3 import Tag, Mp3AudioFile, TagException 
    2222 
     23class AudioInfo: 
     24    time_secs = None 
     25    size_bytes = None 
     26 
    2327class AudioSource: 
    2428    def __init__(self, uri): 
    2529        self.uri = uri 
    2630        self.tag = None 
     31        self.audio_info = AudioInfo() 
    2732 
    2833class FileAudioSource(AudioSource): 
     
    3742        try: 
    3843            self.audio_file = Mp3AudioFile(self.uri) 
     44            self.audio_info.time_secs = self.audio_file.getPlayTime() 
     45            self.audio_info.size_bytes = self.audio_file.getSize() 
    3946            self.tag = self.audio_file.tag 
    4047        except TagException, ex: 
     
    4754 
    4855class UrlAudioSource(AudioSource): 
     56    # TODO 
    4957    def __init__(self, url): 
    5058        AudioSource.__init__(self, url) 
  • trunk/src/mesk/playlist.py

    r27 r28  
    1818#  $Id$ 
    1919################################################################################ 
    20 import os.path 
     20import sys, os.path 
    2121import random 
    2222import audio_source 
     
    4141            continue 
    4242        path = os.path.realpath(os.path.abspath(line)) 
    43         src = audio_source.FileAudioSource(path) 
    44         pl.append(src) 
     43        try: 
     44            src = audio_source.FileAudioSource(path) 
     45            pl.append(src) 
     46        except Exception, ex: 
     47            print >> sys.stderr, "Error loading %s" % path 
    4548    fp.close() 
    4649 
     
    122125        return self._curr_idx 
    123126 
     127    def set_curr_index(self, idx): 
     128        # Test the index 
     129        curr = self._list[idx] 
     130        self._curr_idx = idx 
     131 
    124132    def get_next_index(self): 
    125133        next = self._curr_idx + 1 
  • trunk/src/mesk/utils.py

    r24 r28  
    1919################################################################################ 
    2020 
     21import common.i18n 
     22_ = common.i18n._ 
     23 
    2124def format_track_time(secs): 
    22     hours = secs / 3600; 
    23     mins = (secs % 3600) / 60; 
    24     secs = (secs % 3600) % 60; 
    25     tstr = "%02d:%02d" % (mins, secs); 
     25    hours = secs / 3600 
     26    mins = (secs % 3600) / 60 
     27    secs = (secs % 3600) % 60 
     28    tstr = "%02d:%02d" % (mins, secs) 
    2629    if hours: 
    27         tstr = "%02d:%s" % (hours, tstr); 
    28     return tstr; 
     30        tstr = "%02d:%s" % (hours, tstr) 
     31    return tstr 
     32 
     33KB_BYTES = 1024 
     34MB_BYTES = 1048576 
     35GB_BYTES = 1073741824 
     36KB_UNIT = _('KB') 
     37MB_UNIT = _('MB') 
     38GB_UNIT = _('GB') 
     39 
     40def format_size(sz): 
     41    unit = _('Bytes') 
     42    if sz >= GB_BYTES: 
     43        sz = float(sz) / float(GB_BYTES) 
     44        unit = GB_UNIT 
     45    elif sz >= MB_BYTES: 
     46        sz = float(sz) / float(MB_BYTES) 
     47        unit = MB_UNIT 
     48    elif sz >= KB_BYTES: 
     49        sz = float(sz) / float(KB_BYTES) 
     50        unit = KB_UNIT 
     51    return "%.2f %s" % (sz, unit) 
     52 
     53def format_time_delta(td): 
     54    days = td.days 
     55    hours = td.seconds / 3600 
     56    mins = (td.seconds % 3600) / 60 
     57    secs = (td.seconds % 3600) % 60 
     58    tstr = "%02d:%02d:%02d" % (hours, mins, secs) 
     59    if days: 
     60        tstr = "%d days %s" % (days, tstr) 
     61    return tstr 
  • trunk/src/playlist_control.py

    r27 r28  
    1919################################################################################ 
    2020import os 
     21import datetime 
    2122import gobject, gtk, gtk.gdk, gtk.glade 
    2223 
     
    2728 
    2829class PlaylistControl(gobject.GObject): 
    29                                              
     30 
    3031    def __init__(self, name, playlist, audio_control): 
    3132        self.name = name 
     
    3334        self._playlist = None 
    3435        self._audio_control = audio_control 
     36 
     37        # Playlist stats 
     38        self._list_len = 0 
     39        self._list_bytes = long(0) 
     40        self._list_secs = long(0) 
    3541 
    3642        # Setup tab label 
     
    109115                                      self._playlist.get_next_index()) 
    110116 
     117        self._update_playlist_stats() 
     118 
    111119    def get_playlist(self): 
    112120        # NOTE: Treat as read-only (for now) 
     
    115123    def _on_playlist_view_row_activated(self, treeview, path, view_col): 
    116124        row = path[0] 
    117         print "row:", row 
     125        self._audio_control.stop() 
     126        self._audio_control._enqueue_source({'absolute': row}) 
     127        self._audio_control.play() 
    118128 
    119129    def _on_audio_playing(self, audio_control): 
     
    142152            model_iter = self._pl_model.get_iter(row) 
    143153            self._pl_model.set_value(model_iter, self.COL_STATUS_IMG, stock_id) 
     154 
     155    def _update_playlist_stats(self, count_inc = None, size_bytes_inc = None,  
     156                               time_secs_inc = None): 
     157        if count_inc is None and size_bytes_inc is None and \ 
     158           time_secs_inc is None: 
     159            self._list_len = len(self._playlist) 
     160            self._list_bytes = long(0) 
     161            self._list_secs = long(0) 
     162 
     163            for src in self._playlist: 
     164                if src.audio_info.time_secs is not None: 
     165                    self._list_secs += src.audio_info.time_secs 
     166                if src.audio_info.size_bytes is not None: 
     167                    self._list_bytes += src.audio_info.size_bytes 
     168        else: 
     169            if count_inc: 
     170                self._list_len += count_inc 
     171            if size_bytes_inc: 
     172                self._size_bytes += size_bytes_inc 
     173            if time_secs_inc: 
     174                self._times_secs += time_secs_inc 
     175 
     176        delta = datetime.timedelta(seconds = self._list_secs); 
     177        label = self.widget_xml.get_widget('playlist_stats_label') 
     178        label.set_text("%d %s [%s] - %s" % \ 
     179                       (self._list_len, _('tracks'), 
     180                        mesk.utils.format_size(self._list_bytes), 
     181                        mesk.utils.format_time_delta(delta))) 
     182        #self.pl_stats_label.adjustSize();