about.rst 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. About
  2. ========
  3. What does it do
  4. ---------------
  5. larigira integrates with MPD (Music Player Daemon) and prevents your playlist
  6. from running empty. It also has powerful support for "events": audio that must be played at some time.
  7. Features
  8. ---------
  9. * Simple to install
  10. * WebUI
  11. * modular event system
  12. Architecture
  13. -------------
  14. larigira delegates all the music playing business to MPD.
  15. It relies on ``tinydb`` as a db: it's actually just a json file, to achieve
  16. simplicity and flexibility.
  17. Code structure and core concepts
  18. -----------------------------------
  19. The code is heavily based on gevent: almost everything is a greenlet.
  20. alarm
  21. An alarm is a specification of timings. It is "something that can generate
  22. times". For example ``{ 'kind': 'single', 'timestamp': 1234567890 }``
  23. generates a single time (February 14, 2009 00:31:00), while
  24. ``{ 'kind': 'frequency', 'interval': 10, 'start': 1234567890 }`` generates
  25. infinite times, one every 10 seconds, starting from February 14, 2009
  26. 00:31:00.
  27. action
  28. An action is a specification of audio. It is "something that can generate a
  29. list of audio files".
  30. For example, ``{ 'kind': 'randomdir', 'paths': ['/my/dir', '/other/path'] }``
  31. will pick a random file from one of the two paths.
  32. event
  33. An event is an alarm plus a list of actions. At given times, do those things
  34. The main object is :class:`larigira.mpc.Player`; as the name says, it is the only object that sends messages
  35. to MPD. How does it know what to do? there are two main flows: the continous playlist filling and the alarm
  36. system.
  37. Continous playlist
  38. ~~~~~~~~~~~~~~~~~~
  39. :class:`larigira.mpc.Player` has a "child" called :class:`larigira.mpc.MpcWatcher`. It watches for events on
  40. the playlist; when the playlist is changed it notifies Player, which in turn will check if the playlist has
  41. enough songs. If that's the case, it will spawn an audiogenerator in a new greenlet; when the audio will be
  42. ready, it will be added at the bottom of the playlist.
  43. Alarm system
  44. ~~~~~~~~~~~~
  45. There is a DB. The lowest level is handled by TinyDB. :class:`larigira.event.EventModel` is a thin layer on
  46. it, providing more abstract functions. The real deal is :class:`larigira.event.EventSource`, which is a
  47. greenlet that sends notifications about alarms in the DB. Those notifications are received by
  48. :class:`larigira.event.Monitor`, which "runs" them; it executes the time specification, make an appropriate
  49. "sleep" and after that runs the audiogenerator.