lms plugin: add trackable container support (based on lms update id signal)
[profile/ivi/rygel.git] / src / plugins / lms / rygel-lms-all-music.vala
1 /*
2  * Copyright (C) 2013 Intel Corporation.
3  *
4  * Author: Jussi Kukkonen <jussi.kukkonen@intel.com>
5  *
6  * This file is part of Rygel.
7  *
8  * Rygel is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU Lesser General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * Rygel is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public License
19  * along with this program; if not, write to the Free Software Foundation,
20  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21  */
22
23 using Rygel;
24 using Sqlite;
25
26 public class Rygel.LMS.AllMusic : Rygel.LMS.CategoryContainer {
27     private static const string SQL_ALL_TEMPLATE =
28         "SELECT files.id, files.path, files.size, " +
29                "audios.title as title, audios.trackno, audios.length, audios.channels, audios.sampling_rate, audios.bitrate, audios.dlna_profile, audios.dlna_mime, " +
30                "audio_artists.name as artist, " +
31                "audio_albums.name, " +
32                "files.mtime, " +
33                "audio_genres.name " +
34         "FROM audios, files " +
35         "LEFT JOIN audio_artists " +
36         "ON audios.artist_id = audio_artists.id " +
37         "LEFT JOIN audio_albums " +
38         "ON audios.album_id = audio_albums.id " +
39         "LEFT JOIN audio_genres " +
40         "ON audios.genre_id = audio_genres.id " +
41         "WHERE dtime = 0 AND audios.id = files.id %s " +
42         "LIMIT ? OFFSET ?;";
43
44     private static const string SQL_COUNT =
45         "SELECT COUNT(audios.id) " +
46         "FROM audios, files " +
47         "WHERE dtime = 0 AND audios.id = files.id;";
48
49     private static const string SQL_COUNT_WITH_FILTER_TEMPLATE =
50         "SELECT COUNT(audios.id), audios.title as title, " +
51                "audio_artists.name as artist " +
52         "FROM audios, files " +
53         "LEFT JOIN audio_artists " +
54         "ON audios.artist_id = audio_artists.id " +
55         "WHERE dtime = 0 AND audios.id = files.id %s;";
56
57     private static const string SQL_FIND_OBJECT =
58         "SELECT files.id, files.path, files.size, " +
59                "audios.title, audios.trackno, audios.length, audios.channels, audios.sampling_rate, audios.bitrate, audios.dlna_profile, audios.dlna_mime, " + 
60                "audio_artists.name, " +
61                "audio_albums.name, " +
62                "files.mtime, " +
63                "audio_genres.name " +
64         "FROM audios, files " +
65         "LEFT JOIN audio_artists " +
66         "ON audios.artist_id = audio_artists.id " +
67         "LEFT JOIN audio_albums " +
68         "ON audios.album_id = audio_albums.id " +
69         "LEFT JOIN audio_genres " +
70         "ON audios.genre_id = audio_genres.id " +
71         "WHERE dtime = 0 AND files.id = ? AND audios.id = files.id;";
72
73     private static const string SQL_ADDED =
74         "SELECT files.id, files.path, files.size, " +
75                "audios.title as title, audios.trackno, audios.length, audios.channels, audios.sampling_rate, audios.bitrate, audios.dlna_profile, audios.dlna_mime, " +
76                "audio_artists.name as artist, " +
77                "audio_albums.name, " +
78                "files.mtime, " +
79                "audio_genres.name " +
80         "FROM audios, files " +
81         "LEFT JOIN audio_artists " +
82         "ON audios.artist_id = audio_artists.id " +
83         "LEFT JOIN audio_albums " +
84         "ON audios.album_id = audio_albums.id " +
85         "LEFT JOIN audio_genres " +
86         "ON audios.genre_id = audio_genres.id " +
87         "WHERE dtime = 0 AND audios.id = files.id " +
88         "AND update_id > ? AND update_id <= ?;";
89
90     private static const string SQL_REMOVED =
91         "SELECT files.id, files.path, files.size, " +
92                "audios.title as title, audios.trackno, audios.length, audios.channels, audios.sampling_rate, audios.bitrate, audios.dlna_profile, audios.dlna_mime, " +
93                "audio_artists.name as artist, " +
94                "audio_albums.name, " +
95                "files.mtime, " +
96                "audio_genres.name " +
97         "FROM audios, files " +
98         "LEFT JOIN audio_artists " +
99         "ON audios.artist_id = audio_artists.id " +
100         "LEFT JOIN audio_albums " +
101         "ON audios.album_id = audio_albums.id " +
102         "LEFT JOIN audio_genres " +
103         "ON audios.genre_id = audio_genres.id " +
104         "WHERE dtime <> 0 AND audios.id = files.id " +
105         "AND update_id > ? AND update_id <= ?;";
106
107     protected override string get_sql_all_with_filter (string filter) {
108         if (filter.length == 0) {
109             return this.sql_all;
110         }
111         var filter_str = "AND %s".printf (filter);
112         return (AllMusic.SQL_ALL_TEMPLATE.printf (filter_str));
113     }
114
115     protected override string get_sql_count_with_filter (string filter) {
116         if (filter.length == 0) {
117             return this.sql_count;
118         }
119         var filter_str = "AND %s".printf (filter);
120         return (AllMusic.SQL_COUNT_WITH_FILTER_TEMPLATE.printf (filter_str));
121     }
122
123     protected override MediaObject? object_from_statement (Statement statement) {
124         var id = statement.column_int (0);
125         var path = statement.column_text (1);
126         var mime_type = statement.column_text(10);
127
128         if (mime_type == null || mime_type.length == 0) {
129             /* TODO is this correct? */
130             debug ("Music item %d (%s) has no MIME type",
131                    id,
132                    path);
133         }
134
135         var title = statement.column_text(3);
136         var song_id = this.build_child_id (id);
137         var song = new MusicItem (song_id, this, title);
138         song.size = statement.column_int(2);
139         song.track_number = statement.column_int(4);
140         song.duration = statement.column_int(5);
141         song.channels = statement.column_int(6);
142         song.sample_freq = statement.column_int(7); 
143         song.bitrate = statement.column_int(8);
144         song.dlna_profile = statement.column_text(9);
145         song.mime_type = mime_type;
146         song.artist = statement.column_text(11);
147         song.album = statement.column_text(12);
148         TimeVal tv = { (long) statement.column_int(13), (long) 0 };
149         song.date = tv.to_iso8601 ();
150         song.genre = statement.column_text(14);
151         File file = File.new_for_path (path);
152         song.add_uri (file.get_uri ());
153
154         return song;
155     }
156
157     public AllMusic (MediaContainer parent, LMS.Database lms_db) {
158         base("all",
159              parent,
160              _("All"),
161              lms_db,
162              AllMusic.SQL_ALL_TEMPLATE.printf (""),
163              AllMusic.SQL_FIND_OBJECT,
164              AllMusic.SQL_COUNT,
165              AllMusic.SQL_ADDED,
166              AllMusic.SQL_REMOVED
167             );
168     }
169 }