16 #include <libavformat/avformat.h>
17 #include <libavcodec/avcodec.h>
44 static QRegExp
badChars = QRegExp(
"(/|\\\\|:|\'|\"|\\?|\\|)");
48 QString ret = filename;
56 QString file = QString(
"Icons/%1/%2").arg(type).arg(cleanName);
64 return filename +
".jpg";
67 return filename +
".jpeg";
70 return filename +
".png";
73 return filename +
".gif";
82 return file +
".jpeg";
90 LOG(VB_FILE, LOG_INFO, QString(
"findicon: not found for type: %1, name: %2").arg(type).arg(name));
100 AVFormatContext *inputFC = NULL;
101 AVInputFormat *fmt = NULL;
107 LOG(VB_GENERAL, LOG_DEBUG, QString(
"calcTrackLength: Opening '%1'")
110 QByteArray inFileBA = musicFile.toLocal8Bit();
112 int ret = avformat_open_input(&inputFC, inFileBA.constData(), fmt, NULL);
116 LOG(VB_GENERAL, LOG_ERR,
"calcTrackLength: Couldn't open input file" +
122 ret = avformat_find_stream_info(inputFC, NULL);
126 LOG(VB_GENERAL, LOG_ERR,
127 QString(
"calcTrackLength: Couldn't get stream info, error #%1").arg(ret));
128 avformat_close_input(&inputFC);
136 for (
uint i = 0; i < inputFC->nb_streams; i++)
138 AVStream *st = inputFC->streams[i];
141 avcodec_string(buf,
sizeof(buf), st->codec,
false);
143 switch (inputFC->streams[i]->codec->codec_type)
145 case AVMEDIA_TYPE_AUDIO:
148 av_init_packet(&pkt);
150 while (av_read_frame(inputFC, &pkt) >= 0)
152 if (pkt.stream_index == (
int)i)
153 time = time + pkt.duration;
155 av_free_packet(&pkt);
158 duration = time * av_q2d(inputFC->streams[i]->time_base);
163 LOG(VB_GENERAL, LOG_ERR,
164 QString(
"Skipping unsupported codec %1 on stream %2")
165 .arg(inputFC->streams[i]->codec->codec_type).arg(i));
171 avformat_close_input(&inputFC);
181 token.replace(QRegExp(
"(\\\\|:|\'|\"|\\?|\\|)"), QString(
"_"));
192 QRegExp rx_ws(
"\\s{1,}");
193 QRegExp rx(
"(GENRE|ARTIST|ALBUM|TRACK|TITLE|YEAR)");
198 i = rx.indexIn(fntempl, i);
203 i += rx.matchedLength();
206 if ((rx.capturedTexts()[1] ==
"GENRE") && (!track->
Genre().isEmpty()))
209 if ((rx.capturedTexts()[1] ==
"ARTIST")
213 if ((rx.capturedTexts()[1] ==
"ALBUM") && (!track->
Album().isEmpty()))
216 if ((rx.capturedTexts()[1] ==
"TRACK") && (track->
Track() >= 0))
218 QString tempstr = QString::number(track->
Track(), 10);
219 if (track->
Track() < 10)
220 tempstr.prepend(
'0');
224 if ((rx.capturedTexts()[1] ==
"TITLE")
228 if ((rx.capturedTexts()[1] ==
"YEAR") && (track->
Year() >= 0))
234 filename.replace(rx_ws,
"_");
237 if (filename ==
"" || filename.length() > FILENAME_MAX)
239 QString tempstr = QString::number(track->
Track(), 10);
242 LOG(VB_GENERAL, LOG_ERR,
"Invalid file storage definition.");
247 QFileInfo fi(filename);
249 LOG(VB_GENERAL, LOG_ERR,
250 QString(
"filenameFromMetadata: Failed to create directory path: '%1'").arg(
getMusicDirectory() + filename));
256 bool isNewTune(
const QString& artist,
const QString& album,
const QString& title)
259 QString matchartist = artist;
260 QString matchalbum = album;
261 QString matchtitle = title;
263 if (! matchartist.isEmpty())
265 matchartist.replace(QRegExp(
"(/|\\\\|:|\'|\\,|\\!|\\(|\\)|\"|\\?|\\|)"), QString(
"_"));
268 if (! matchalbum.isEmpty())
270 matchalbum.replace(QRegExp(
"(/|\\\\|:|\'|\\,|\\!|\\(|\\)|\"|\\?|\\|)"), QString(
"_"));
273 if (! matchtitle.isEmpty())
275 matchtitle.replace(QRegExp(
"(/|\\\\|:|\'|\\,|\\!|\\(|\\)|\"|\\?|\\|)"), QString(
"_"));
279 QString queryString(
"SELECT filename, artist_name,"
280 " album_name, name, song_id "
282 "LEFT JOIN music_artists"
283 " ON music_songs.artist_id=music_artists.artist_id "
284 "LEFT JOIN music_albums"
285 " ON music_songs.album_id=music_albums.album_id "
286 "WHERE artist_name LIKE :ARTIST "
287 "AND album_name LIKE :ALBUM "
288 "AND name LIKE :TITLE "
289 "ORDER BY artist_name, album_name,"
290 " name, song_id, filename");
304 if (query.
size() > 0)