Changes in / [279640c:f70792f]


Ignore:
Location:
server/lib
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • server/lib/TODO

    rf0807b8 r374c558  
    6969   [ ] http://gutenbach.mit.edu/ticket/41
    7070   [ ] http://gutenbach.mit.edu/ticket/18
    71 
    72  === CONSIDERATIONS FOR MPD ===
    73 
    74 We are considering using MPD (the Music Player Daemon) for playback, instead
    75 of mplayer.  This gives us a pony (gapless playback), and makes some other
    76 things, like keeping track of the queue, much easier.  There is a lot of work
    77 needed to make this work, though.
    78 
    79 THIS ADDS A DEPENDENCY:  python-mpd
    80 
    81 We will have to re-implement all the functions in jobs.py, and completely
    82 re-structure player.py
    83 
    84 If we want video playback eventually (and we do), there will be some hackery
    85 involved.  We will pause mpd playback, do the video playback completely
    86 separately, and then resume mpd playback.
    87 
    88 Some almost-pseudocode:
    89 
    90 startup:
    91   client = MPDClient()
    92   client.connect(**{'host':'/var/run/mpd/socket', 'port':'6600'})
    93 
    94 adding a song to the queue:
    95   Receive job
    96   Put it into a file                    [gutenbach/FILENAME]
    97   Tell MPD to add it to the queue       [client.addid('gutenbach/FILENAME')]
    98   Find out what the id is
    99   Store all the data [including the temporary filename]
    100   IF WE ARE SUPPOSED TO BE PLAYING, MAKE SURE WE *ARE* PLAYING
    101     In particular, if the queue was empty, start playback   [gutenbach.play()]
    102 
    103 when a job completes playing:
    104   Remove the file                       [rm gutenbach/FILENAME]
    105 
    106 getting the queue:
    107   get playlist, parse return            [client.playlistid()]
    108 
    109 removing a job:
    110   dequeue it                  [client.deleteid('NUMBER')]
    111   remove the file
    112   tell them what you did
    113 
    114 restart song:
    115   client.seek(0,1)   [0% through song 1...]
    116 
  • server/lib/gutenbach/server/job.py

    r57bc2dc r9225351  
    5353        """
    5454        return cmp(self.priority, other.priority)
    55 
    56     def __del__(self):
    57         if self.player:
    58             self.player.mplayer_stop()
    59             self.player = None
    60         if self.document and not self.document.closed:
    61             self.document.close()
    62             self.document = None
    63 
    64         self.id = None
    65         self.creator = None
    66         self.name = None
    67         self.priority = None
    68         self._why_done = None
    6955
    7056    ######################################################################
     
    273259        if not hasattr(document, "close"):
    274260            raise errors.InvalidDocument, "no close attribute"
    275         if not hasattr(document, "closed"):
    276             raise errors.InvalidDocument, "no closed attribute"
    277261
    278262    def spool(self, document=None):
  • server/lib/gutenbach/server/printer.py

    r57bc2dc r9225351  
    99import traceback
    1010import sys
    11 import tempfile
    1211from . import sync
    1312
     
    362361    ######################################################################
    363362
    364     def print_job(self, document, document_name=None, document_format=None,
    365                   document_natural_language=None, requesting_user_name=None,
    366                   compression=None, job_name=None, job_k_octets=None):
    367 
    368         # create the job
    369         job_id = self.create_job(
    370             requesting_user_name=requesting_user_name,
    371             job_name=job_name,
    372             job_k_octets=job_k_octets)
    373        
    374         # send the document
    375         self.send_document(
    376             job_id,
    377             document,
    378             document_name=document_name,
    379             document_format=document_format,
    380             document_natural_language=document_natural_language,
    381             requesting_user_name=requesting_user_name,
    382             compression=compression,
    383             last_document=False)
    384 
    385         return job_id
    386 
    387     def verify_job(self, document_name=None, document_format=None,
    388                   document_natural_language=None, requesting_user_name=None,
    389                   compression=None, job_name=None, job_k_octets=None):
    390 
    391         job_id = self._next_job_id
    392         job = GutenbachJob(
    393             job_id,
    394             creator=requesting_user_name,
    395             name=job_name)
    396         job.spool(tempfile.TemporaryFile())
    397         job.abort()
    398         del job
     363    def print_job(self):
     364        pass
     365
     366    def validate_job(self):
     367        pass
    399368
    400369    def get_jobs(self, requesting_user_name=None, which_jobs=None,
     
    428397        pass
    429398
    430     def create_job(self, requesting_user_name=None, job_name=None,
    431                    job_k_octets=None):
    432 
     399    def create_job(self, requesting_user_name=None, job_name=None, job_k_octets=None):
    433400        job_id = self._next_job_id
    434401        self._next_job_id += 1
     
    438405            creator=requesting_user_name,
    439406            name=job_name)
    440 
     407       
    441408        self.jobs[job_id] = job
    442409        self.pending_jobs.append(job_id)
     
    458425        self.paused = True
    459426
     427
     428
    460429    @sync
    461430    def resume_printer(self):
     
    472441        self.paused = False
    473442
    474     @sync
    475443    def get_printer_attributes(self, requested_attributes=None):
    476444        if requested_attributes is None:
     
    484452        return attributes
    485453
    486     @sync
    487454    def set_printer_attributes(self, job_id, attributes):
    488455        for attr in attributes:
     
    492459                raise ipp.errors.ClientErrorAttributes
    493460
    494     @sync
    495461    def cancel_job(self, job_id, requesting_user_name=None):
    496462        job = self.get_job(job_id)
     
    501467            raise
    502468
    503     @sync
    504469    def send_document(self, job_id, document, document_name=None,
    505470                      document_format=None, document_natural_language=None,
     
    510475        job.spool(document)
    511476
    512     @sync
    513477    def send_uri(self, job_id, document_uri, document_name=None,
    514478                 document_format=None, document_natural_language=None,
     
    520484        #job.spool_uri(document_uri)
    521485
    522     @sync
    523486    def get_job_attributes(self, job_id, requested_attributes=None):
    524487        if requested_attributes is None:
     
    532495        return attributes
    533496
    534     @sync
    535497    def set_job_attributes(self, job_id, attributes):
    536498        job = self.get_job(job_id)
     
    542504            elif attr == "job-originating-user-name":
    543505                job.creator = attributes[attr] # XXX: do we want this?
    544 
    545     @sync
     506               
    546507    def restart_job(self, job_id, requesting_user_name=None):
    547508        job = self.get_job(job_id)
     
    552513            raise ipp.errors.ClientErrorNotPossible
    553514
    554         self.finished_jobs.remove(job_id)
    555         self.pending_jobs.append(job_id)
    556 
    557     @sync
     515        with self.lock:
     516            self.finished_jobs.remove(job_id)
     517            self.pending_jobs.append(job_id)
     518
    558519    def promote_job(self, job_id, requesting_user_name=None):
    559520        # According to RFC 3998, we need to put the job at the front
Note: See TracChangeset for help on using the changeset viewer.