summaryrefslogtreecommitdiff
path: root/src/song.h
blob: 13d66f3bfcefbe90265cb04fa2db5f7ae933f7c9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/***************************************************************************
 *   Copyright (C) 2008-2009 by Andrzej Rybczak                            *
 *   electricityispower@gmail.com                                          *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.              *
 ***************************************************************************/

#ifndef _SONG_H
#define _SONG_H

#include <map>
#include <string>

#include <mpd/client.h>

namespace MPD
{
	class Song
	{
		typedef std::map<std::pair<mpd_tag_type, unsigned>, std::string> TagMap;
		
		public:
			
			typedef void (Song::*SetFunction)(const std::string &);
			typedef std::string (Song::*GetFunction)() const;
			
			Song(mpd_song * = 0, bool = 0);
			Song(const Song &);
			~Song();
			
			std::string GetFile() const;
			std::string GetName() const;
			std::string GetDirectory() const;
			std::string GetArtist() const;
			std::string GetTitle() const;
			std::string GetAlbum() const;
			std::string GetTrack() const;
			std::string GetTrackNumber() const;
			std::string GetDate() const;
			std::string GetGenre() const;
			std::string GetComposer() const;
			std::string GetPerformer() const;
			std::string GetDisc() const;
			std::string GetComment() const;
			std::string GetLength() const;
			
			unsigned GetHash() const { return itsHash; }
			unsigned GetTotalLength() const { return mpd_song_get_duration(itsSong); }
			unsigned GetPosition() const { return mpd_song_get_pos(itsSong); }
			unsigned GetID() const { return mpd_song_get_id(itsSong); }
			
			void SetArtist(const std::string &);
			void SetTitle(const std::string &);
			void SetAlbum(const std::string &);
			void SetTrack(const std::string &);
			void SetTrack(unsigned);
			void SetDate(const std::string &);
			void SetDate(unsigned);
			void SetGenre(const std::string &);
			void SetComposer(const std::string &);
			void SetPerformer(const std::string &);
			void SetDisc(const std::string &);
			void SetComment(const std::string &);
			void SetPosition(unsigned);
			
			void SetNewName(const std::string &name) { itsNewName = name == GetName() ? "" : name; }
			std::string GetNewName() const { return itsNewName; }
			
			std::string toString(const std::string &, const char *escape_chars = 0) const;
			static const char FormatEscapeCharacter = 1;
			
			void NullMe() { itsSong = 0; }
			void CopyPtr(bool copy) { copyPtr = copy; }
			
			void Localize();
			void Clear();
			bool Empty() const;
			bool isFromDB() const;
			bool isStream() const;
			bool Localized() const { return isLocalised; }
			
			Song &operator=(const Song &);
			
			static std::string ShowTime(int);
			static void ValidateFormat(const std::string &type, const std::string &format);
			
		private:
			void SetHashAndSlash();
			std::string ParseFormat(std::string::const_iterator &it, const char *escape_chars) const;
			
			void SetTag(mpd_tag_type, unsigned, const std::string &);
			std::string GetTag(mpd_tag_type, unsigned) const;
			
			/// Used internally for handling filename, since we don't have
			/// write access to file string in mpd_song, manage our own if
			/// localization was done and there is localized filename that
			/// is different than the original one.
			///
			const char *MyFilename() const;
			
			/// internal mpd_song structure
			mpd_song *itsSong;
			
			/// localized version of filename
			const char *itsFile;
			
			/// map that contains localized tags or these set by tag editor
			TagMap *itsTags;
			
			std::string itsNewName;
			
			size_t itsSlash;
			unsigned itsHash;
			bool copyPtr;
			bool isLocalised;
	};
}

#endif