pianod2
multisource multiuser scriptable networked music player
filesystem.h
Go to the documentation of this file.
1 
10 #pragma once
11 
12 #include <config.h>
13 
14 #include <cstdio>
15 #include <ctime>
16 
17 #include <string>
18 #include <list>
19 
20 #include "datastore.h"
21 #include "mediaunit.h"
22 #include "mediaplayer.h"
23 #include "audio/audiooutput.h"
24 #include "fundamentals.h"
25 #include "musiclibrary.h"
26 #include "musiclibraryparameters.h"
27 
30 namespace Filesystem {
31 
32  class Source;
33  class Player;
34  class Library;
35  class Album;
36  class Song;
37 
39  class Artist : public MusicLibrary::Artist {
40  friend Album; // Partial path from library base to artist directory.
41  friend Song;
42 
43  private:
44  std::string _path;
45  public:
47  void path (std::string p);
48  std::string path() const;
49  virtual Parsnip::Data persist() const override;
50  virtual void restore (const Parsnip::Data &data) override;
51  };
52 
54  class Album : public MusicLibrary::Album {
55  friend Song;
56 
57  private:
58  std::string _path;
59  public:
61  void path (std::string p);
62  std::string path() const;
63  virtual void makeCompilation (MusicLibrary::Artist *compilation_artist) override;
64  virtual Parsnip::Data persist() const override;
65  virtual void restore (const Parsnip::Data &data) override;
66  };
67 
69  class Song : public MusicLibrary::Song {
70  friend Source;
71  friend Player;
72  friend Library;
73 
74  private:
75  std::string _path;
76  bool present = false;
77  public:
79  void path (std::string p);
80  std::string path() const;
81  virtual Parsnip::Data persist() const override final;
82  virtual void restore (const Parsnip::Data &data) override final;
83  virtual PianodConnection &transmitPrivate (PianodConnection &recipient) const override final;
84  virtual void serializePrivate (Parsnip::Data &, const User *user) const override final;
85  };
86 
88  struct Parameters : public MusicLibrary::LibraryParameters {
89  std::string path;
90 
91  Parameters (Ownership::Type perm, User *user = nullptr);
92  Parameters (const UserData::JSONData &src);
93  virtual bool persist (UserData::JSONData &dest) const override final;
94  void sanitize (void);
95  };
96 
98  class Library : public MusicLibrary::Library {
99  friend Source;
100  friend Song;
101 
102  private:
105  std::string _path;
106  time_t last_scan = 0;
107  bool links_warned = false;
108  bool permissions_warned = false;
109  time_t next_validity_check = 0;
110  bool valid = false;
112 
114  enum class ScanItemType { DIRECTORY, FILE };
115 
117  struct ScanWorkItem {
118  ScanItemType type = ScanItemType::FILE;
119  std::string path;
120  ScanWorkItem (const std::string &newpath) {
121  path = newpath;
122  }
123  };
125  typedef std::list<ScanWorkItem> SearchList;
127 
128  protected:
129  void purge();
130  virtual void persist (Parsnip::Data &into) const override;
131  virtual bool restore (const Parsnip::Data &data) override;
132 
133  public:
134  Library (Media::Source *const owner,
135  const bool persistence,
136  const std::string directory,
137  const MusicLibrary::ScanFrequency behavior);
138  inline const std::string &path() {
139  return _path;
140  };
141  float periodic();
142  bool checkValidity();
143  void startScan();
144  void clear();
145  bool scanDirectory (const std::string &path);
146  void indexFile (const std::string &path);
147  };
148 
150  class Source : public Media::Source {
151  friend class Playlist;
152 
153  private:
155  PianodPlaylist *mix_playlist = nullptr;
156  PianodPlaylist *everything_playlist = nullptr;
157 
158  public:
159  Source (const Parameters &params);
160  ~Source (void);
161 
162  // Identity
163  virtual const char *kind (void) const override;
164 
165  // Capability check methods
166  virtual bool canExpandToAllSongs (void) const override;
167 
168  // General source stuff
169  virtual bool flush (void) override;
170  virtual float periodic (void) override;
171 
172  // Playlist methods
173  virtual PlaylistList getPlaylists (const Filter &filter = Filter::All) override;
174  virtual MusicThingie *getAnythingById (const Media::SplitId &id) override;
175  virtual PianodPlaylist *getMixPlaylist (void) override;
176  virtual PianodPlaylist *getEverythingPlaylist (void) override;
177 
178  // Creating playlists
179  virtual PianodPlaylist *createPlaylist (const char *name, MusicThingie::Type type, MusicThingie *from) override;
180  virtual PianodPlaylist *createPlaylist (const char *name, const Filter &filter) override;
181  virtual PianodPlaylist *getTransientPlaylist (const Filter &criteria) override;
182 
183  // Miscellaneous
184  virtual Media::Player *getPlayer (const AudioSettings &audio, PianodSong *song) override;
185  virtual SongList getRandomSongs (PianodPlaylist *playlist,
186  const UserList &users,
187  Media::SelectionMethod selectionMethod) override;
188  virtual ThingieList getSuggestions (const Filter &filter, SearchRange where) override;
189  virtual void playbackProblem (void) override;
190 
191  // Typecasts
192  virtual MusicThingie *getSuggestion (MusicThingie *thing, MusicThingie::Type type, SearchRange where) override;
193 
194  // Utilities
195  void rescan (bool reset);
196  };
197 } // namespace Filesystem
Class to abstract away details of audio output system is in use.
Album customization for filesystem library & source.
Definition: filesystem.h:54
virtual void makeCompilation(MusicLibrary::Artist *compilation_artist) override
Mark an album as a compilation.
Definition: filesystemtypes.cpp:124
friend Song
Definition: filesystem.h:55
virtual void restore(const Parsnip::Data &data) override
Definition: filesystemtypes.cpp:138
virtual Parsnip::Data persist() const override
Definition: filesystemtypes.cpp:133
std::string path() const
Retrieve the path to the album.
Definition: filesystemtypes.cpp:117
std::string _path
If starting with /, path from library root; otherwise appends to artist path.
Definition: filesystem.h:58
Artist customization for filesystem library & source.
Definition: filesystem.h:39
std::string path() const
Retrieve the path to the artist by combining the library and artist-specific path.
Definition: filesystemtypes.cpp:63
friend Song
Definition: filesystem.h:41
virtual void restore(const Parsnip::Data &data) override
Definition: filesystemtypes.cpp:73
virtual Parsnip::Data persist() const override
Definition: filesystemtypes.cpp:67
friend Album
Definition: filesystem.h:40
std::string _path
Path from library root to this artist. Always starts with '/'.
Definition: filesystem.h:44
Filesystem-specific media library.
Definition: filesystem.h:98
ScanFrequency scan_behavior
Definition: filesystem.h:111
const std::string & path()
Definition: filesystem.h:138
ScanItemType
Types of items to scan when indexing media on a filesystem.
Definition: filesystem.h:114
friend Source
Definition: filesystem.h:99
std::list< ScanWorkItem > SearchList
Pending files to be scanned. Items are processed in LIFO (stack) order.
Definition: filesystem.h:125
SearchList searches
Definition: filesystem.h:126
std::string _path
Definition: filesystem.h:105
friend Song
Definition: filesystem.h:100
Song customization for filesystem library & source.
Definition: filesystem.h:69
virtual PianodConnection & transmitPrivate(PianodConnection &recipient) const override final
Transmit the thingie's user-specific data on a connection.
Definition: filesystemtypes.cpp:196
virtual void serializePrivate(Parsnip::Data &, const User *user) const override final
Add the thingie's user-specific data for JSON transmission.
Definition: filesystemtypes.cpp:204
friend Player
Definition: filesystem.h:71
bool present
Set to false at start of a scan, true when found.
Definition: filesystem.h:76
std::string _path
If starting with /, path from library root; otherwise appends to album path.
Definition: filesystem.h:75
std::string path() const
Retrieve the path to the song.
Definition: filesystemtypes.cpp:178
friend Source
Definition: filesystem.h:70
virtual Parsnip::Data persist() const override final
Definition: filesystemtypes.cpp:186
friend Library
Definition: filesystem.h:72
virtual void restore(const Parsnip::Data &data) override final
Definition: filesystemtypes.cpp:191
Source for filesystem media.
Definition: filesystem.h:150
Library library
Definition: filesystem.h:154
Track data filter.
Definition: filter.h:38
static const Filter All
Selects all tracks.
Definition: filter.h:220
Base class for playing audio from some source.
Definition: mediaplayer.h:46
Base class that wraps any audio source, such as Pandora, Spotify, or local music.
Definition: mediaunit.h:68
Mechanism to split MusicThingie IDs into source identifier, type and inner ID.
Definition: mediaunit.h:195
A PianodAlbum that contains a vector of songs.
Definition: musiclibrary.h:172
Album(Artist *const parent, const std::string &id, const std::string &name)
Create a new album, and register itself with its parent.
Definition: musiclibrarytypes.cpp:355
A PianodArtist that contains a vector of albums.
Definition: musiclibrary.h:144
Artist(Foundation *const library, const std::string &id, const std::string &name)
Create a new artist.
Definition: musiclibrarytypes.cpp:303
Definition: musiclibrary.h:339
A PianodSong made of inbred data structures.
Definition: musiclibrary.h:217
virtual PianodPlaylist * playlist(void) const override final
Get a playlist instance.
Definition: musiclibrarytypes.cpp:191
friend class Playlist
Definition: musiclibrary.h:218
Song(Album *const parent, const std::string &id, const std::string &name)
Add a song, and register itself with its parent album.
Definition: musiclibrarytypes.cpp:482
Base class for songs, albums, artists, playlists, genres, etc.
Definition: musictypes.h:77
Type
Definition: musictypes.h:86
Type
Access levels for an object.
Definition: fundamentals.h:355
Generic data type.
Definition: parsnip.h:81
Connection to a pianod client, along with context and state of that connection.
Definition: connection.h:54
Base class for playlists, but still a MusicThingie.
Definition: musictypes.h:416
Base class for songs, these are also MusicThingies, artists and albums.
Definition: musictypes.h:339
virtual Type type(void) const override
Return the type letter for a thingie.
Definition: musictypes.h:349
virtual const std::string & name(void) const override final
Return the most specific name of this, whatever type it is.
Definition: musictypes.h:348
A container for lists of playlists.
Definition: retainedlist.h:324
A container for holding songs.
Definition: retainedlist.h:328
Base class for storing lists of thingies, which need to be reference counted accurately.
Definition: retainedlist.h:20
Store key-value pairs of string keys & mixed types using Parsnip::Data.
Definition: datastore.h:76
Data about each user.
Definition: user.h:53
User data storage mechanism.
Essential data structures and support.
std::vector< const class User * > UserList
Definition: fundamentals.h:348
SearchRange
Definition: fundamentals.h:35
Public interface for media players.
Public interface for sources, which provide an interface interfaces to select available music,...
PlayList / Artist / Album / Song types that are interbred to form a library.
Source parameters for sources based on music library.
Classes for playing local media files stored within a directory hierarchy.
Definition: filesystem.cpp:31
static const char * Data
Definition: responsejson.cpp:42
const char * Source
Definition: pandoratypes.h:113
SelectionMethod
The manner in which shuffling is performed.
Definition: mediaunit.h:55
const char * Song
Definition: musickeys.cpp:69
const char * Album
Definition: musickeys.cpp:68
Memory-based index/database of music library contents.
Definition: musiclibrary.cpp:37
ScanFrequency
Definition: musiclibraryparameters.h:21
Serialization and parsing library.
Definition: mediaunit.h:26
Audio output device & driver parameters.
Definition: fundamentals.h:52
Structure for storing lists of pending file scanning.
Definition: filesystem.h:117
std::string path
Definition: filesystem.h:119
ScanWorkItem(const std::string &newpath)
Definition: filesystem.h:120
Source parameters for filesystem source.
Definition: filesystem.h:88
std::string path
Definition: filesystem.h:89