[-]
[+]
|
Changed |
_service:tar_git:glacier-music.changes
|
|
[-]
[+]
|
Changed |
_service:tar_git:glacier-music.spec
^
|
|
[-]
[+]
|
Changed |
_service:tar_git:glacier-music-0.2.tar.bz2/glacier-music.pro
^
|
@@ -41,6 +41,7 @@
qml/components/CoverArea.qml \
qml/components/PlaylistItem.qml \
qml/pages/LibraryPage.qml \
+ qml/pages/PlayListPage.qml \
qml/pages/ArtistsPage.qml \
qml/pages/TracksPage.qml \
qml/components/ControlsArea.qml \
|
[-]
[+]
|
Changed |
_service:tar_git:glacier-music-0.2.tar.bz2/qml/components/ControlsArea.qml
^
|
@@ -1,4 +1,4 @@
-import QtQuick 2.0
+import QtQuick 2.6
import QtMultimedia 5.5
import QtQuick.Controls 1.0 //needed for the Stack attached property
@@ -25,11 +25,11 @@
MouseArea{
anchors.fill: parent
onClicked: {
- pageStack.push(Qt.resolvedUrl("/usr/share/glacier-music/qml/pages/LibraryPage.qml"));
+ pageStack.push(Qt.resolvedUrl("/usr/share/glacier-music/qml/pages/PlayListPage.qml"));
}
}
- source: "/usr/share/themes/glacier/fontawesome/icons/align-justify.png"
+ source: "image://theme/align-justify"
}
Image{
@@ -45,10 +45,10 @@
MouseArea{
anchors.fill: parent
- onClicked: nextTrack.currentIndex--
+ onClicked: playPrev()
}
- source: "/usr/share/themes/glacier/fontawesome/icons/backward.png"
+ source: "image://theme/backward"
}
Image{
@@ -59,8 +59,8 @@
anchors.centerIn: parent;
source: (rootAudio.playbackState == MediaPlayer.PlayingState) ?
- "/usr/share/themes/glacier/fontawesome/icons/pause.png" :
- "/usr/share/themes/glacier/fontawesome/icons/play.png"
+ "image://theme/pause" :
+ "image://theme/play"
MouseArea{
anchors.fill: parent
@@ -79,7 +79,7 @@
verticalCenter: playPauseBtn.verticalCenter
}
- source: "/usr/share/themes/glacier/fontawesome/icons/forward.png"
+ source: "image://theme/forward"
MouseArea{
anchors.fill: parent
@@ -98,7 +98,7 @@
verticalCenter: playPauseBtn.verticalCenter
}
- source: "/usr/share/themes/glacier/fontawesome/icons/volume-up.png"
+ source: "image://theme/volume-up"
MouseArea{
anchors.fill: parent
@@ -148,20 +148,4 @@
volumeArea.visible = false
}
}
-
- Connections{
- target: mprisPlayer
- onPlayPauseRequested: playPause();
- }
-
- function playPause(){
- if(rootAudio.playbackState == MediaPlayer.PlayingState)
- {
- rootAudio.pause();
- }
- else
- {
- rootAudio.play()
- }
- }
}
|
[-]
[+]
|
Changed |
_service:tar_git:glacier-music-0.2.tar.bz2/qml/components/CoverArea.qml
^
|
@@ -5,8 +5,6 @@
import QtQuick.Controls 1.0
import QtQuick.Controls.Nemo 1.0
import QtQuick.Controls.Styles.Nemo 1.0
-import QtQuick.Window 2.1
-import QtQuick.Layouts 1.0
Rectangle{
id: coverArea
@@ -15,18 +13,20 @@
property alias cover: coverImage.source
color: "transparent"
+ clip: true
Image{
id: coverImage
width: parent.width
height: parent.height
+ source: "/usr/share/glacier-music/images/cover.png"
}
Rectangle{
id: progressBar
width: 0
height: Theme.itemHeightExtraSmall/4
- color: "#0091e5"
+ color: Theme.accentColor
anchors{
left: parent.left
bottom: parent.bottom
@@ -48,7 +48,7 @@
end: Qt.point(parent.width, parent.height)
gradient: Gradient {
GradientStop { position: 0.0; color: "transparent" }
- GradientStop { position: 1.0; color: "#0091e5" }
+ GradientStop { position: 1.0; color: Theme.accentColor }
}
}
}
@@ -74,7 +74,31 @@
Connections {
target: rootAudio
onPositionChanged: {
- progressBar.width = parent.width*(rootAudio.position/rootAudio.duration)
+ progressBar.width = coverArea.width*(rootAudio.position/rootAudio.duration)
+ }
+ }
+
+ Connections {
+ target: nextTrackModel
+ onCurrentIndexChanged: {
+ if(nextTrackModel.get(currentIndex).cover != "")
+ {
+ coverArea.cover = nextTrackModel.get(currentIndex).cover;
+ }
+ else
+ {
+ coverArea.cover = "/usr/share/glacier-music/images/cover.png";
+ coverLoader.getCoverByTrackId(nextTrackModel.get(currentIndex).trackId)
+ }
+ }
+ }
+
+ Connections{
+ target: coverLoader
+ onCoverReady: coverArea.cover = coverFile
+ onCoverLoading: {
+ /*FIXME add loader*/
+ coverArea.cover = "/usr/share/glacier-music/images/cover.png";
}
}
}
|
[-]
[+]
|
Changed |
_service:tar_git:glacier-music-0.2.tar.bz2/qml/components/PlaylistItem.qml
^
|
@@ -9,8 +9,10 @@
width: parent.width
height: Theme.itemHeightHuge
- icon: ""
- label: artist+" - "+title
+ icon: cover != "" ? cover : "image://theme/music"
+ label: title
+ description: artist
+ showNext: false
actions: Rectangle {
id: playListItemActions
@@ -31,7 +33,7 @@
topMargin: parent.height*0.2
}
- source: "/usr/share/themes/glacier/fontawesome/icons/edit.png"
+ source: "image://theme/edit"
}
Image{
@@ -46,7 +48,7 @@
topMargin: parent.height*0.2
}
- source: "/usr/share/themes/glacier/fontawesome/icons/times.png"
+ source: "image://theme/times"
}
}
|
[-]
[+]
|
Changed |
_service:tar_git:glacier-music-0.2.tar.bz2/qml/glacier-music.qml
^
|
@@ -13,6 +13,9 @@
import org.glacier.music.collection 1.0
import org.glacier.music.playlistmodel 1.0
+import org.glacier.music.cover 1.0
+
+import Nemo.Dialogs 1.0
import "pages"
@@ -34,6 +37,14 @@
PlaylistModel{
id: nextTrackModel
+ Component.onCompleted: {
+ loadPlaylistFromDB();
+ nextTrackModel.currentIndex = 0
+ }
+ }
+
+ Cover{
+ id: coverLoader
}
MediaPlayer{
@@ -44,20 +55,17 @@
}
onPositionChanged: {
- settings.setValue("seek",position);
+ if(rootAudio.playbackState == MediaPlayer.PlayingState){
+ settings.setValue("seek",position);
+ }
}
- Component.onCompleted: {
- volume = settings.value("volume",1)
+ onPlaybackStateChanged: {
+ settings.setValue("playbackState",rootAudio.playbackState);
}
- }
- Keys.onReleased: {
- if (event.key === Qt.Key_Back) {
- if (pageStack.depth > 1) {
- pageStack.pop();
- event.accepted = true;
- } else { Qt.quit(); }
+ Component.onCompleted: {
+ volume = settings.value("volume",1)
}
}
@@ -94,6 +102,9 @@
rescanProgress.visible = false;
}
}
+ onNoMusicFiles: {
+ noMusicDialog.visible = true
+ }
}
MprisPlayer {
@@ -129,4 +140,21 @@
mprisPlayer.metadata = metadata
}
}
+
+ QueryDialog {
+ id: noMusicDialog
+ visible: false
+ inline: false
+
+ icon: "image://theme/exclamation-triangle"
+
+ cancelText: qsTr("Cancel")
+ acceptText: qsTr("Ok")
+ headingText: qsTr("No music files fonud")
+ subLabelText: qsTr("Please add music files into Music or Download directory. Or connect card with music")
+
+ onSelected: {
+ Qt.quit()
+ }
+ }
}
|
[-]
[+]
|
Changed |
_service:tar_git:glacier-music-0.2.tar.bz2/qml/pages/ArtistsPage.qml
^
|
@@ -3,25 +3,32 @@
import QtQuick.Controls 1.0
import QtQuick.Controls.Nemo 1.0
import QtQuick.Controls.Styles.Nemo 1.0
-import QtQuick.Window 2.1
-import QtQuick.Layouts 1.0
import org.glacier.music.artistmodel 1.0
-Page {
+Item{
id: artistPage
ArtistModel{
id: artistModel
}
+ signal viewTracks(int artist_id, string artist_name)
+
ListView{
id: artistListView
model: artistModel
width: parent.width
height: parent.height
+
delegate: ListViewItemWithActions{
label: name
+ iconVisible: false
+
+ onClicked: {
+ viewTracks(artist_id, name)
+ }
}
+ clip: true
}
}
|
[-]
[+]
|
Changed |
_service:tar_git:glacier-music-0.2.tar.bz2/qml/pages/LibraryPage.qml
^
|
@@ -1,12 +1,12 @@
import QtQuick 2.6
-import QtQuick.Controls 1.0
+import QtQuick.Controls 1.0 //needed for the Stack attached property
import QtQuick.Controls.Nemo 1.0
import QtQuick.Controls.Styles.Nemo 1.0
-import QtQuick.Window 2.1
-import QtQuick.Layouts 1.0
+import org.glacier.music.trackmodel 1.0
+
Page {
id: libraryPage
@@ -19,57 +19,17 @@
TabView {
anchors.fill: parent
- style: touchStyle
-
Tab {
title: "Artists"
- ArtistsPage{}
+ ArtistsPage{
+ onViewTracks: {
+ pageStack.push(Qt.resolvedUrl("/usr/share/glacier-music/qml/pages/TracksPage.qml"), {artistId: artist_id, artistName: artist_name});
+ }
+ }
}
Tab {
title: "Tracks"
TracksPage{}
}
-
- Component {
- id: touchStyle
- TabViewStyle {
- tabsAlignment: Qt.AlignVCenter
- tabOverlap: 0
- frame: Item { }
- tab: Item {
- implicitWidth: control.width/control.count
- implicitHeight: Theme.itemHeightMedium
- BorderImage {
- anchors.fill: parent
- border.bottom: size.dp(8)
- border.top: size.dp(8)
-
- Text {
- anchors.centerIn: parent
- color: (styleData.selected) ? Theme.accentColor : Theme.textColor
- text: styleData.title.toUpperCase()
- font.pixelSize: Theme.fontSizeSmall
- }
- Rectangle {
- visible: index > 0
- anchors.top: parent.top
- anchors.bottom: parent.bottom
- anchors.margins: size.dp(10)
- width:1
- color: "#3a3a3a"
- }
- Rectangle{
- visible: styleData.selected
- width: parent.width
- height: 1
- color: Theme.accentColor
- anchors{
- bottom: parent.bottom
- }
- }
- }
- }
- }
- }
}
}
|
[-]
[+]
|
Added |
_service:tar_git:glacier-music-0.2.tar.bz2/qml/pages/PlayListPage.qml
^
|
@@ -0,0 +1,39 @@
+import QtQuick 2.6
+
+import QtQuick.Controls 1.0
+import QtQuick.Controls.Nemo 1.0
+import QtQuick.Controls.Styles.Nemo 1.0
+
+import "../components"
+
+Page {
+ id: playListPage
+
+ headerTools: HeaderToolsLayout {
+ id: tools
+ title: qsTr("Playlist")
+ showBackButton: true;
+
+ tools: [
+ ToolButton {
+ iconSource: "image://theme/book"
+ onClicked: {
+ pageStack.push(Qt.resolvedUrl("/usr/share/glacier-music/qml/pages/LibraryPage.qml"));
+ }
+ }
+ ]
+ }
+
+ ListView{
+ id: nextTrack
+ anchors.fill: parent
+
+ model: nextTrackModel
+ delegate: PlaylistItem{}
+
+ onCurrentIndexChanged: {
+ nextTrackModel.currentIndex = currentIndex
+ }
+ }
+
+}
|
[-]
[+]
|
Changed |
_service:tar_git:glacier-music-0.2.tar.bz2/qml/pages/PlayerPage.qml
^
|
@@ -5,9 +5,6 @@
import QtQuick.Controls 1.0
import QtQuick.Controls.Nemo 1.0
import QtQuick.Controls.Styles.Nemo 1.0
-import QtQuick.Window 2.1
-
-import org.glacier.music.cover 1.0
import "../components"
@@ -19,7 +16,7 @@
title: qsTr("Music")
tools: [
ToolButton {
- iconSource: "/usr/share/themes/glacier/fontawesome/icons/gear.png"
+ iconSource: "image://theme/gear"
onClicked: {
pageStack.push(Qt.resolvedUrl("/usr/share/glacier-music/qml/pages/SettingsPage.qml"));
}
@@ -27,77 +24,52 @@
]
}
- Column{
- width: parent.width
+ CoverArea{
+ id: coverArea
+ width: height
+ height: Math.min(parent.height-trackLabelArea.height-controsArea.height-Theme.itemSpacingHuge*4, parent.width-Theme.itemSpacingHuge)
anchors{
top: parent.top
+ topMargin: Theme.itemSpacingHuge
+ horizontalCenter: parent.horizontalCenter
}
+ }
- CoverArea{
- id: coverArea
- }
-
- Rectangle{
- id: trackLabelArea
- width: parent.width
- height: Theme.fontSizeLarge*2+Theme.itemSpacingLarge*2
-
- color: "transparent"
-
- Label{
- id: trackLabel
- text: ""
- anchors.fill: parent
- font{
- bold: true
- pixelSize: Theme.fontSizeExtraLarge
- }
- scale: paintedWidth > width ? (width / paintedWidth) : 1
- verticalAlignment: Text.AlignVCenter
- horizontalAlignment: Text.AlignHCenter
- }
- }
+ Rectangle{
+ id: trackLabelArea
+ width: parent.width-Theme.itemSpacingHuge*2
+ height: Theme.fontSizeLarge*2+Theme.itemSpacingLarge*2
- ControlsArea{
- id: controsArea
- width: parent.width
+ anchors{
+ bottom: controsArea.top
+ bottomMargin: Theme.itemSpacingHuge
+ left: parent.left
+ leftMargin: Theme.itemSpacingHuge
}
- Rectangle{
- id: nextArea
- width: parent.width
- height: root.height-tools.height-coverArea.height-trackLabelArea.height-controsArea.height
-
- color: "transparent"
-
- ListView{
- id: nextTrack
- width: parent.width
- height: parent.height
- model: nextTrackModel
- delegate: PlaylistItem{}
-
- clip: true
-
- onCurrentIndexChanged: {
- coverArea.cover = (nextTrackModel.get(currentIndex).cover) ? nextTrackModel.get(currentIndex).cover : "/usr/share/glacier-music/images/cover.png"
- coverLoader.getCoverByTrackId(nextTrackModel.get(currentIndex).trackId)
- rootAudio.stop();
- trackLabel.text = nextTrackModel.get(currentIndex).artist+"\n"+nextTrackModel.get(currentIndex).title
- rootAudio.source = nextTrackModel.get(currentIndex).fileName
-
- rootAudio.play();
- nextTrackModel.setPlayed(currentIndex)
-
- mprisPlayer.artist = nextTrackModel.get(currentIndex).artist
- mprisPlayer.song = nextTrackModel.get(currentIndex).title
- }
+ color: "transparent"
+
+ Label{
+ id: trackLabel
+ text: ""
+ anchors.fill: parent
+ font{
+ bold: true
+ pixelSize: Theme.fontSizeExtraLarge
}
+ scale: paintedWidth > width ? (width / paintedWidth) : 1
+ verticalAlignment: Text.AlignVCenter
+ horizontalAlignment: Text.AlignHCenter
}
}
- Cover{
- id: coverLoader
+ ControlsArea{
+ id: controsArea
+ width: parent.width
+ anchors{
+ bottom: parent.bottom
+ bottomMargin: Theme.itemSpacingHuge
+ }
}
Connections{
@@ -106,25 +78,51 @@
}
Connections{
- target: coverLoader
- onCoverReady: {
- coverArea.cover = coverFile;
+ target: nextTrackModel
+ onCurrentIndexChanged: {
+ rootAudio.stop();
+ trackLabel.text = nextTrackModel.get(currentIndex).artist+"\n"+nextTrackModel.get(currentIndex).title
+ rootAudio.source = nextTrackModel.get(currentIndex).fileName
+
+/*Set seek of firs playing dong and play only if old state is playing*/
+ if(currentIndex == 0 && settings.value("currentTrack") == nextTrackModel.get(currentIndex).trackId)
+ {
+ rootAudio.seek(settings.value("seek"))
+ if(settings.value("playbackState") == 1)
+ {
+ rootAudio.play();
+ }
+ }
+ else
+ {
+ rootAudio.play();
+ }
+ nextTrackModel.setPlayed(currentIndex)
+
+ mprisPlayer.artist = nextTrackModel.get(currentIndex).artist
+ mprisPlayer.song = nextTrackModel.get(currentIndex).title
+/*Update current song in config file */
+ if(settings.value("currentTrack") != nextTrackModel.get(currentIndex).trackId)
+ {
+ settings.setValue("currentTrack",nextTrackModel.get(currentIndex).trackId);
+ }
}
}
Connections{
target: mprisPlayer
onNextRequested: playNext()
- onPreviousRequested: --nextTrack.currentIndex
+ onPreviousRequested: playPrev()
onPlayRequested: rootAudio.play();
onPauseRequested: rootAudio.pause();
+ onPlayPauseRequested: playPause();
}
Connections{
target: collection
onUpdateRescanProgress: {
- if(nextTrack.count < 10)
+ if(nextTrackModel.rowCount() < 5)
{
nextTrackModel.formatRandomPlaylist(1);
}
@@ -133,11 +131,29 @@
function playNext()
{
- console.log((nextTrack.currentIndex+1) + " | " + nextTrack.count)
- if((nextTrack.currentIndex+1) >= nextTrack.count)
+ console.log((nextTrackModel.currentIndex+1) + " | " + nextTrackModel.rowCount())
+ if(nextTrackModel.currentIndex >= nextTrackModel.rowCount()-1)
{
nextTrackModel.formatRandomPlaylist(1);
}
|
[-]
[+]
|
Changed |
_service:tar_git:glacier-music-0.2.tar.bz2/qml/pages/SettingsPage.qml
^
|
@@ -3,8 +3,6 @@
import QtQuick.Controls 1.0
import QtQuick.Controls.Nemo 1.0
import QtQuick.Controls.Styles.Nemo 1.0
-import QtQuick.Window 2.1
-import QtQuick.Layouts 1.0
Page {
|
[-]
[+]
|
Changed |
_service:tar_git:glacier-music-0.2.tar.bz2/qml/pages/TracksPage.qml
^
|
@@ -3,14 +3,19 @@
import QtQuick.Controls 1.0
import QtQuick.Controls.Nemo 1.0
import QtQuick.Controls.Styles.Nemo 1.0
-import QtQuick.Window 2.1
-import QtQuick.Layouts 1.0
import org.glacier.music.trackmodel 1.0
Page {
id: artistPage
property int artistId: 0
+ property string artistName: ""
+
+ headerTools: HeaderToolsLayout {
+ id: tools
+ title: artistId == 0 ? qsTr("Tracks") : qsTr(artistName)
+ showBackButton: true;
+ }
TrackModel{
id: trackModel
@@ -22,7 +27,36 @@
width: parent.width
height: parent.height
delegate: ListViewItemWithActions{
- label: artist_name+" "+title;
+ id: trackItem
+ label: artistId == 0 ? artist_name+" "+title : title
+ description: track+" - "+album
+ icon: "image://theme/music"
+ showNext: false
+
+ onClicked: nextTrackModel.addItem(track_id, 0)
+
+ actions: Rectangle {
+ id: trackItemActions
+ width: trackItem.height
+ height: trackItem.height
+
+ color: "transparent"
+
+ Image{
+ id: editButton
+ width: parent.height*0.6
+ height: width
+
+ anchors{
+ left: parent.left
+ leftMargin: parent.height*0.2
+ top: parent.top
+ topMargin: parent.height*0.2
+ }
+
+ source: "image://theme/edit"
+ }
+ }
}
clip: true
}
@@ -30,7 +64,7 @@
Component.onCompleted: {
if(artistId != 0)
{
- artistModel.setArtist(artistId);
+ trackModel.setArtist(artistId);
}
}
}
|
[-]
[+]
|
Changed |
_service:tar_git:glacier-music-0.2.tar.bz2/src/artist.cpp
^
|
@@ -74,7 +74,7 @@
QSqlDatabase db = dbAdapter::instance().db;
QSqlQuery query(db);
- //QString str = QString("INSERT INTO artist (name) VALUES ('%1')").arg(m_name);
+
query.prepare("INSERT INTO artist (name) VALUES (:name)");
query.bindValue(":name",m_name);
bool ok = query.exec();
@@ -89,11 +89,17 @@
bool Artist::setName(const QString name)
{
+ if(name.length() == 0)
+ {
+ return false;
+ }
+
QSqlDatabase db = dbAdapter::instance().db;
QSqlQuery query(db);
- QString str = QString("SELECT id FROM artist WHERE `name`='%1'").arg(name);
+ query.prepare("SELECT id FROM artist WHERE name=:name");
+ query.bindValue(":name",name);
- bool ok = query.exec(str);
+ bool ok = query.exec();
if(!ok)
{
qDebug() << query.lastQuery() << query.lastError().text();
|
[-]
[+]
|
Changed |
_service:tar_git:glacier-music-0.2.tar.bz2/src/audiofile.cpp
^
|
@@ -7,34 +7,32 @@
#include <QIODevice>
#include <QDebug>
-AudioFile::AudioFile(QString audiofile, QObject *parent) : QObject(parent)
+AudioFile::AudioFile(QString audiofile, QObject *parent) : QObject(parent),
+fileuri(audiofile)
{
- mediaFile = new QFile(audiofile);
+ mediaFile = new QFile(fileuri);
isValid = false;
if(!mediaFile->exists())
{
isValid = false;
- qDebug() << "FNF:" << audiofile;
+ qDebug() << "FNF:" << fileuri;
emit fileNotFound();
}
else
{
- if(mediaFile->open(QIODevice::ReadWrite))
+ if(mediaFile->open(QIODevice::ReadOnly))
{
isValid = true;
- tagFile = new TagLib::FileRef(audiofile.toUtf8());
- if(tagFile->isNull())
- {
- return;
- }
loadTags();
}
else
{
- qDebug() << "FNRW:" << audiofile;
+ qDebug() << "Cant open file:" << fileuri;
isValid = false;
}
}
+
+ mediaFile->close();
}
void AudioFile::loadTags()
@@ -43,6 +41,14 @@
{
return;
}
+
+ QScopedPointer<TagLib::FileRef> tagFile(new TagLib::FileRef(fileuri.toUtf8()));
+
+ if(tagFile->isNull())
+ {
+ return;
+ }
+
TagLib::String t_artist = tagFile->tag()->artist();
TagLib::String t_title = tagFile->tag()->title();
TagLib::String t_album = tagFile->tag()->album();
@@ -64,12 +70,12 @@
if(artist.length() < 1)
{
- artist = "Unknow Artist";
+ artist = "Unknown Artist";
}
if(title.length() < 1)
{
- title = "Unknow Track";
+ title = "Unknown Track";
}
}
@@ -79,6 +85,14 @@
{
return false;
}
+
+ QScopedPointer<TagLib::FileRef> tagFile(new TagLib::FileRef(fileuri.toUtf8()));
+
+ if(tagFile->isNull())
+ {
+ return false;
+ }
+
tagFile->tag()->setAlbum(album.toStdWString());
tagFile->tag()->setArtist(artist.toStdWString());
tagFile->tag()->setComment(comment.toStdWString());
|
[-]
[+]
|
Changed |
_service:tar_git:glacier-music-0.2.tar.bz2/src/audiofile.h
^
|
@@ -12,6 +12,8 @@
explicit AudioFile(QString audiofile, QObject *parent = 0);
~AudioFile();
+ QString fileuri;
+
QString artist;
QString title;
QString album;
@@ -26,7 +28,6 @@
private:
QFile *mediaFile;
- TagLib::FileRef *tagFile;
void loadTags();
signals:
|
[-]
[+]
|
Changed |
_service:tar_git:glacier-music-0.2.tar.bz2/src/collection.cpp
^
|
@@ -36,6 +36,7 @@
QThread *rescanThread = new QThread;
connect(rescanThread,SIGNAL(started()),rCollection, SLOT(scan()));
connect(rCollection,SIGNAL(scanProcess(QVariant)),this,SLOT(m_rescanCollectionProgress(QVariant)));
+ connect(rCollection,SIGNAL(noMusicFiles()),this,SIGNAL(noMusicFiles()));
rCollection->moveToThread(rescanThread);
rescanThread->start();
}
|
[-]
[+]
|
Changed |
_service:tar_git:glacier-music-0.2.tar.bz2/src/collection.h
^
|
@@ -17,6 +17,7 @@
signals:
void newFile(QString path);
void updateRescanProgress(QVariant prc);
+ void noMusicFiles();
public slots:
void rescanCollection();
|
[-]
[+]
|
Changed |
_service:tar_git:glacier-music-0.2.tar.bz2/src/cover.cpp
^
|
@@ -1,5 +1,4 @@
#include "cover.h"
-#include "track.h"
#include "musicbrainzconnect.h"
@@ -10,21 +9,22 @@
void Cover::getCoverByTrackId(int trackId)
{
- Track *track = Track::toId(trackId);
- if(!track)
+ m_track = Track::toId(trackId);
+ if(!m_track)
{
return;
}
- QString artist = track->getArtistName();
- QString title = track->getTitle();
- QString cover = track->getCover();
+ QString artist = m_track->getArtistName();
+ QString title = m_track->getTitle();
+ QString cover = m_track->getCover();
if(cover.isEmpty())
{
MusicBrainzConnect *mbConnect = new MusicBrainzConnect();
mbConnect->getData(artist,title);
connect(mbConnect,SIGNAL(coverReady(QString)),this,SLOT(m_coverReady(QString)));
+ connect(mbConnect,SIGNAL(downloadCover()),this,SIGNAL(coverLoaing()));
}
else
{
@@ -34,5 +34,6 @@
void Cover::m_coverReady(QString coverFile)
{
+ m_track->setCover(m_coverDir+"/"+coverFile);
emit coverReady(m_coverDir+"/"+coverFile);
}
|
[-]
[+]
|
Changed |
_service:tar_git:glacier-music-0.2.tar.bz2/src/cover.h
^
|
@@ -2,6 +2,7 @@
#define COVER_H
#include <QObject>
+#include "track.h"
class Cover : public QObject
{
@@ -11,6 +12,7 @@
signals:
void coverReady(QString coverFile);
+ void coverLoaing();
public slots:
void getCoverByTrackId(int trackId);
@@ -20,6 +22,7 @@
private:
QString m_coverDir;
+ Track *m_track;
};
#endif // COVER_H
|
[-]
[+]
|
Changed |
_service:tar_git:glacier-music-0.2.tar.bz2/src/dbadapter.cpp
^
|
@@ -18,6 +18,7 @@
qDebug() << db.lastError().text();
}
+ qDebug() << "Load DB from " << QStandardPaths::writableLocation(QStandardPaths::CacheLocation)+"/db.sql";
if(QFile(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)+"/db.sql").size() == 0)
@@ -41,6 +42,7 @@
void dbAdapter::initDB()
{
db.exec("CREATE TABLE `artist` (`id` INTEGER PRIMARY KEY AUTOINCREMENT,`name` TEXT )");
+ db.exec("INSERT INTO `artist` (`id`, `name`) VALUES ('0','Unknow Artist')");
db.exec("CREATE TABLE `tracks` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, \
`artist_id` INTEGER NOT NULL, \
`filename` TEXT NOT NULL,\
@@ -57,5 +59,6 @@
`time` INTEGER NOT NULL)");
db.exec("CREATE UNIQUE INDEX artist_idx ON artist(name)");
db.exec("CREATE UNIQUE INDEX song_idx ON songs(artist_id,title,album,track,year)");
+ db.exec("CREATE UNIQUE INDEX plst_idx ON playlist(song_id,time)");
emit baseCreate();
}
|
[-]
[+]
|
Changed |
_service:tar_git:glacier-music-0.2.tar.bz2/src/models/playlistmodel.cpp
^
|
@@ -14,6 +14,9 @@
hash.insert(Qt::UserRole+2 ,QByteArray("title"));
hash.insert(Qt::UserRole+3 ,QByteArray("fileName"));
hash.insert(Qt::UserRole+4 ,QByteArray("played"));
+ hash.insert(Qt::UserRole+5 ,QByteArray("cover"));
+
+ m_currentIndex = -1;
}
void PlayListModel::addItem(int trackId, int count)
@@ -29,6 +32,7 @@
item.artist = track->getArtistName();
item.title = track->getTitle();
item.fileName = track->getFileName();
+ item.cover = track->getCover();
if(count == 0)
{
@@ -84,6 +88,10 @@
{
return item.played;
}
+ else if(role == Qt::UserRole+5)
+ {
+ return item.cover;
+ }
return QVariant();
}
@@ -131,6 +139,7 @@
itemData.insert("title",item.title);
itemData.insert("fileName",item.fileName);
itemData.insert("played",item.played);
+ itemData.insert("cover",item.cover);
return QVariant(itemData);
}
@@ -160,8 +169,26 @@
{
QSqlDatabase db = dbAdapter::instance().db;
QSqlQuery query(db);
- query.prepare("SELECT song_id FROM playlist WHERE time = 0 LIMIT 5");
- bool ok = query.exec();
+ bool ok = false;
+
+/*Load preview unfinifed playing song*/
+ query.prepare("SELECT song_id FROM playlist WHERE time > 0 ORDER BY id DESC LIMIT 1");
+ ok = query.exec();
+ if(!ok)
+ {
+ qDebug() << query.lastQuery() << query.lastError().text();
+ }
+ else
+ {
+ while(query.next())
+ {
+ addItem(query.value(0).toInt());
+ }
+ }
+
+/*Load next songs */
+ query.prepare("SELECT song_id FROM playlist WHERE time = 0");
+ ok = query.exec();
if(!ok)
{
@@ -301,9 +328,9 @@
QSqlDatabase db = dbAdapter::instance().db;
QSqlQuery query(db);
- query.prepare("INSERT INTO playlist (`song_id`, `time`) VALUES ( :trackid , :time)");
+ query.prepare("UPDATE playlist SET `time` = :time WHERE song_id=:trackid AND time = 0");
query.bindValue(":trackid",track_id);
- query.bindValue(":time", QDateTime().toTime_t());
+ query.bindValue(":time", QDateTime::currentMSecsSinceEpoch());
bool ok = query.exec();
if(!ok)
@@ -311,3 +338,14 @@
qDebug() << query.lastQuery() << query.lastError().text();
}
}
+
+
+void PlayListModel::setCurrentIndex(int currentIndex)
+{
+ if(currentIndex >= 0 && currentIndex < playList.count() && currentIndex != m_currentIndex)
+ {
+ m_currentIndex = currentIndex;
+ emit currentIndexChanged(m_currentIndex);
+ }
+}
+
|
[-]
[+]
|
Changed |
_service:tar_git:glacier-music-0.2.tar.bz2/src/models/playlistmodel.h
^
|
@@ -7,15 +7,19 @@
class PlayListModel: public QAbstractListModel
{
Q_OBJECT
+ Q_PROPERTY(int currentIndex READ currentIndex WRITE setCurrentIndex NOTIFY currentIndexChanged)
+
struct playListItem{
int trackId;
QString artist;
QString title;
QString fileName;
bool played;
+ QString cover;
};
public:
+
explicit PlayListModel(QObject *parent = 0);
int rowCount(const QModelIndex &parent = QModelIndex()) const;
QVariant data(const QModelIndex &index, int role) const;
@@ -33,14 +37,18 @@
void setPlayed(const int idx, const QModelIndex &index = QModelIndex());
QVariant get(const int idx);
void remove(const int idx);
+ void setCurrentIndex(int currentIndex);
+ int currentIndex() {return m_currentIndex;}
signals:
void playListUpdate();
+ void currentIndexChanged(int currentIndex);
private:
QHash<int,QByteArray> hash;
QList<playListItem> playList;
+ int m_currentIndex;
};
#endif // PLAYLISTMODEL_H
|
[-]
[+]
|
Changed |
_service:tar_git:glacier-music-0.2.tar.bz2/src/models/tracksqlmodel.cpp
^
|
@@ -1,5 +1,7 @@
#include "tracksqlmodel.h"
+#include <QDebug>
+
TrackSqlModel::TrackSqlModel(QObject *parent) : QSqlQueryModel(parent)
{
hash.insert(Qt::UserRole ,QByteArray("track_id"));
@@ -8,28 +10,30 @@
hash.insert(Qt::UserRole+3,QByteArray("album"));
hash.insert(Qt::UserRole+4,QByteArray("comment"));
hash.insert(Qt::UserRole+5,QByteArray("genre"));
- hash.insert(Qt::UserRole+6,QByteArray("tarck"));
+ hash.insert(Qt::UserRole+6,QByteArray("track"));
hash.insert(Qt::UserRole+7,QByteArray("year"));
- hash.insert(Qt::UserRole+8,QByteArray("artist_name"));
- hash.insert(Qt::UserRole+9,QByteArray("fileName"));
+ hash.insert(Qt::UserRole+8,QByteArray("filename"));
+ hash.insert(Qt::UserRole+9,QByteArray("artist_name"));
+ hash.insert(Qt::UserRole+10,QByteArray("fileName"));
refresh();
}
const char* TrackSqlModel::SQL_SELECT = "SELECT tracks.id as track_id, \
- tracks.artist_id, \
- tracks.title, \
- tracks.album, \
- tracks.comment, \
- tracks.genre, \
- tracks.track, \
- tracks.year, \
- tarcks.fileName \
- artist.name as artist_name \
+ tracks.artist_id, \
+ tracks.title, \
+ tracks.album, \
+ tracks.comment, \
+ tracks.genre, \
+ tracks.track, \
+ tracks.year, \
+ tracks.filename, \
+ artist.name as artist_name \
FROM tracks \
INNER JOIN artist ON artist.id = tracks.artist_id \
ORDER BY artist_name ASC";
-QVariant TrackSqlModel::data(const QModelIndex &index, int role) const{
+QVariant TrackSqlModel::data(const QModelIndex &index, int role) const
+{
QVariant value = QSqlQueryModel::data(index, role);
if(role < Qt::UserRole)
{
@@ -52,35 +56,39 @@
void TrackSqlModel::setArtist(const int artist_id)
{
- setQuery(QString("SELECT tracks.id as track_id, \
- tracks.artist_id, \
- tracks.title, \
- tracks.album, \
- tracks.comment, \
- tracks.genre, \
- tracks.track, \
- tracks.year, \
- tarcks.fileName \
- artist.name as artist_name \
- FROM tracks \
- INNER JOIN artist ON artist.id = tracks.artist_id \
- WHERE artist_id = %1 ORDER BY artist_name ASC").arg(artist_id).toUtf8());
+ if(artist_id == 0)
+ {
+ cleanQuery();
+ return;
+ }
+ setQuery(QString("SELECT tracks.id as track_id, \
+ tracks.artist_id, \
+ tracks.title, \
+ tracks.album, \
+ tracks.comment, \
+ tracks.genre, \
+ tracks.track, \
+ tracks.year, \
+ tracks.filename, \
+ artist.name as artist_name \
+ FROM tracks \
+ INNER JOIN artist ON artist.id = tracks.artist_id \
+ WHERE artist_id = %1 ORDER BY artist_name ASC").arg(artist_id).toUtf8());
}
-
void TrackSqlModel::cleanQuery()
{
this->setQuery("SELECT tracks.id as track_id, \
- tracks.artist_id, \
- tracks.title, \
- tracks.album, \
- tracks.comment, \
- tracks.genre, \
- tracks.track, \
- tracks.year, \
- tarcks.fileName \
- artist.name as artist_name \
- FROM tracks \
- INNER JOIN artist ON artist.id = tracks.artist_id \
- ORDER BY artist_name ASC");
+ tracks.artist_id, \
+ tracks.title, \
+ tracks.album, \
+ tracks.comment, \
+ tracks.genre, \
+ tracks.track, \
+ tracks.year, \
+ tracks.filename, \
+ artist.name as artist_name \
+ FROM tracks \
+ INNER JOIN artist ON artist.id = tracks.artist_id \
+ ORDER BY artist_name ASC");
}
|
[-]
[+]
|
Changed |
_service:tar_git:glacier-music-0.2.tar.bz2/src/rescancollection.cpp
^
|
@@ -21,26 +21,35 @@
for(int i=0; i<scanDir.count(); i++)
{
+ qDebug() << "Scanning " << scanDir[i];
+
QDirIterator it(scanDir[i],allowedExtensions, QDir::Files, QDirIterator::Subdirectories);
- for (;it.hasNext(); it.next())
+ while (it.hasNext())
{
- aviableFiles << it.next();
+ QString file = it.next();
+ qDebug() << "Found " << file;
+ aviableFiles << file;
}
}
+
double m_aviableFiles = aviableFiles.count();
double m_scannedFiles = 0;
- for(int i=0; i<aviableFiles.count();i++)
+ if(m_aviableFiles == 0)
{
+ emit noMusicFiles();
+ }
+ else{
+ foreach (const QString &fileUrl, aviableFiles) {
+ Track *track = new Track(fileUrl);
+ Q_UNUSED(track);
+ qDebug() << fileUrl;
+ m_scannedFiles++;
- QString file = aviableFiles[i];
- Track *track = new Track(file);
- Q_UNUSED(track);
- m_scannedFiles++;
-
- double prc = m_scannedFiles/m_aviableFiles*100;
- emit scanProcess(QVariant(prc));
+ double prc = m_scannedFiles/m_aviableFiles*100;
+ emit scanProcess(QVariant(prc));
+ }
}
}
|
[-]
[+]
|
Changed |
_service:tar_git:glacier-music-0.2.tar.bz2/src/rescancollection.h
^
|
@@ -13,6 +13,7 @@
signals:
void newFile(QString path);
void scanProcess(QVariant prc);
+ void noMusicFiles();
public slots:
void scan();
|
[-]
[+]
|
Changed |
_service:tar_git:glacier-music-0.2.tar.bz2/src/track.cpp
^
|
@@ -19,6 +19,7 @@
}
else
{
+ qDebug() << "Add file: " << file;
m_fileName = file;
AudioFile *trackFile = new AudioFile(m_fileName);
@@ -158,12 +159,13 @@
{
QSqlDatabase db = dbAdapter::instance().db;
QSqlQuery query(db);
- query.prepare("UPDATE tracks SET artist_id=:AID,title=:Title,track=:Track,album=:Album,comment=:Comment,genre=:Genre,year=:Year WHERE id=:rid");
+ query.prepare("UPDATE tracks SET artist_id=:AID,title=:Title,track=:Track,album=:Album,comment=:Comment,genre=:Genre,cover=:Cover,year=:Year WHERE id=:rid");
query.bindValue(":AID",m_artist_id);
query.bindValue(":Title",m_title);
query.bindValue(":Track",m_number);
query.bindValue(":Album",m_album);
query.bindValue(":Comment",m_comment);
+ query.bindValue(":Cover",m_cover);
query.bindValue(":Genre",m_genre);
query.bindValue(":Year",m_year);
query.bindValue(":rid",m_id);
@@ -205,6 +207,15 @@
setArtistId(a_id);
}
+void Track::setCover(const QString coverFile)
+{
+ if(coverFile != m_cover)
+ {
+ m_cover = coverFile;
+ update();
+ }
+}
+
void Track::setArtistId(const int id)
{
Artist* artist = new Artist();
@@ -241,3 +252,27 @@
}
}
}
+/*
+Return trackId if file in DB or 0 if file is new
+*/
+int Track::getTrackIdFromFileName(QString fileName)
+{
+ QSqlDatabase db = dbAdapter::instance().db;
+ QSqlQuery query(db);
+ query.prepare("SELECT id FROM tracks WHERE filename=:filename");
+ query.bindValue(":filename",fileName);
+
+ bool ok = query.exec();
+ if(!ok)
+ {
+ qDebug() << query.lastQuery() << query.lastError().text();
+ return 0;
+ }
+
+ if(query.next())
+ {
+ int trackId = query.value(0).toInt();
+ return trackId;
+ }
+ return 0;
+}
|
[-]
[+]
|
Changed |
_service:tar_git:glacier-music-0.2.tar.bz2/src/track.h
^
|
@@ -39,6 +39,7 @@
void setComment(const QString comment) {m_comment = comment;}
void setArtistId(const int id);
void setArtistName(const QString name);
+ void setCover(const QString coverFile);
int insert();
void update();
@@ -49,8 +50,9 @@
void trackFileNotFound();
private:
- int m_id;
+ int getTrackIdFromFileName(const QString fileName);
+ int m_id;
int m_artist_id;
QString m_title;
QString m_album;
|