/* This file is part of the Opie Project Copyright (c) 2002 Max Reiss Copyright (c) 2002 L. Potter Copyright (c) 2002 Holger Freyther =. .=l. .>+-= _;:, .> :=|. This program is free software; you can .> <`_, > . <= redistribute it and/or modify it under :`=1 )Y*s>-.-- : the terms of the GNU General Public .="- .-=="i, .._ License as published by the Free Software - . .-<_> .<> Foundation; either version 2 of the License, ._= =} : or (at your option) any later version. .%`+i> _;_. .i_,=:_. -`: PARTICULAR PURPOSE. See the GNU ..}^=.= = ; Library General Public License for more ++= -. .` .: details. : = ...= . :.=- -. .:....=;==+<; You should have received a copy of the GNU -_. . . )=. = Library General Public License along with -- :-=` this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "playlist.h" #include "../opieplayer2/lib.h" #include "../opieplayer2/om3u.h" #include #include #include #include #include #include //#define DEFAULT_FILE_TYPES "*.mp3;*.ogg;*.ogm;*.wma;*.wav;*.asf;*.au;*.avi;*.mpeg;*.mpg;*.mv1;*.mov;*.wmv;*.pls;*.m3u;*.mp4;*.m4a" #define DEFAULT_FILE_TYPES "*.mp3;*.ogg;*.ogm;*.wma;*.wav;*.asf;*.au;*.avi;*.mpeg;*.mpg;*.mv1;*.mov;*.wmv;*.mp4;*.m4a" PlaylistItem::PlaylistItem(const DocLnk& aLink,PlaylistView*parent) :QListViewItem(parent),m_Content(aLink),m_video(false) { } PlaylistItem::PlaylistItem(const DocLnk&aLink,PlaylistView*parent,PlaylistItem*after) :QListViewItem(parent,after),m_Content(aLink),m_video(false) { } void PlaylistItem::Video(bool y) { m_video=y; if (m_video) { setPixmap(0,Opie::Core::OResource::loadPixmap("opieplayer2/videofile")); } else { setPixmap(0,Opie::Core::OResource::loadPixmap("opieplayer2/musicfile")); } } PlaylistItem::~PlaylistItem() { } /* PlaylistView Methods */ PlaylistView::PlaylistView(QWidget *parent, const char *name) : QListView(parent,name) { // columnLabels << tr("FullName"); columnLabels << tr(""); // icon columnLabels << tr("File"); columnLabels << tr("Playtime"); columnLabels << tr("Artist"); columnLabels << tr("Album"); columnLabels << tr("Title"); columnLabels << tr("Type"); columnLabels << tr("Size"); for (QStringList::Iterator it = columnLabels.begin(); it != columnLabels.end(); ++it) { addColumn(*it); } m_Infolib=0; setAllColumnsShowFocus(true); setSelectionMode(Single); setSorting(-1); m_lastItem = 0; m_lastDir = QDir::homeDirPath(); } PlaylistView::~PlaylistView() { if (m_Infolib) delete m_Infolib; } void PlaylistView::checkLib() { if (!m_Infolib) { m_Infolib = new XINE::Lib(XINE::Lib::InitializeImmediately); connect(m_Infolib,SIGNAL(stopped()),this,SLOT(slotDummyStop())); m_Infolib->ensureInitialized(); } } void PlaylistView::slotDummyStop() { odebug << "void PlaylistView::slotDummyStop()" << oendl; } void PlaylistView::slotAddFile(const DocLnk&aLink) { QFileInfo f(aLink.file()); if (f.extension(FALSE).lower()=="m3u"||f.extension(FALSE).lower()=="pls") { readPlayList(aLink.file()); } else { addFile(aLink.file(),aLink.name()); } emit contentChanged(childCount()); } void PlaylistView::addFile(const QString&aFile,const QString&aName) { QFileInfo fileInfo(aFile); if (!fileInfo.exists()) return; checkLib(); QString name = aName; if (name.isEmpty()) { name = fileInfo.fileName(); } int i = m_Infolib->setfile(aFile.utf8().data()); /* realy! otherwise we get an "stopped" signal when playing! - I don't know why */ m_Infolib->stop(); odebug << "File set: " << i << " ("<error(); odebug << "Errorcode: " << i << oendl; QString msg; msg = QString(tr("Error open file %1: ")).arg(name); switch (i) { case 1: msg += tr("No input plugin"); break; case 2: msg += tr("No demuxer plugin"); break; case 3: msg += tr("Demuxer failed"); break; case 4: msg+=tr("Malformed mrl"); break; default: msg += tr("Unknown error"); break; } QMessageBox::warning(0,tr("Error reading fileheader"),msg); return; } if (m_items.count()>0) { m_lastItem = m_items.last(); } else { m_lastItem = 0; } PlaylistItem*_it = currentItem(); if (m_lastItem) { m_lastItem = new PlaylistItem(aFile,this,m_lastItem); } else { m_lastItem = new PlaylistItem(aFile,this); } m_lastItem->setExpandable(false); m_lastItem->setText(1,name); QString codec = m_Infolib->metaInfo(6); if (codec.isEmpty()) { codec = m_Infolib->metaInfo(7); } // codec m_lastItem->setText(COL_TYPE,codec); // title m_lastItem->setText(COL_TITLE,m_Infolib->metaInfo(0)); // artist m_lastItem->setText(COL_ARTIST,m_Infolib->metaInfo(2)); // album m_lastItem->setText(COL_ALBUM,m_Infolib->metaInfo(4)); int l = m_Infolib->length(); int h = l/3600; l-=h*3600; int m = l/60; l-=m*60; codec = ""; if (h>0) { codec.sprintf("%2i:%2i:%2i h",h,m,l); } else { codec.sprintf("%02i:%02i m",m,l); } // time m_lastItem->setText(COL_TIME,codec); m_lastItem->Video(m_Infolib->hasVideo()); m_items.append(m_lastItem); if (_it==NULL) { setSelected(m_lastItem,true); } } void PlaylistView::slotAppendDir() { QString _dir = Opie::Ui::OFileDialog::getDirectory(Opie::Ui::OFileSelector::Extended,m_lastDir,0,m_lastDir); if (_dir.isEmpty()) return; m_lastDir = _dir; QDir sDir(_dir); QStringList list = sDir.entryList(DEFAULT_FILE_TYPES,QDir::Files,QDir::Name | QDir::IgnoreCase); for (unsigned i = 0; i < list.count();++i) { addFile(_dir+QString("/")+list[i]); } emit contentChanged(childCount()); } void PlaylistView::slotOpenM3u() { QStringList types; QMap mimeTypes; types << "audio/x-mpegurl"; mimeTypes.insert("Playlists",types); // mimeTypes.insert("All",types); QString fileName= Opie::Ui::OFileDialog::getOpenFileName(Opie::Ui::OFileSelector::EXTENDED, m_lastDir,"playlist.m3u", mimeTypes); if (fileName.isEmpty()) { return; } readPlayList(fileName); emit contentChanged(childCount()); } void PlaylistView::readPlayList(const QString&fileName) { QFileInfo f(fileName); Om3u _om3u(fileName, IO_ReadOnly); if (f.extension(FALSE).lower()=="m3u") { _om3u.readM3u(); } else if (f.extension(FALSE).lower()=="pls") { _om3u.readPls(); } for (unsigned int j=0; j<_om3u.count();++j) { addFile(_om3u[j]); } } void PlaylistView::slotSaveAsM3u() { QStringList types; QMap mimeTypes; types << "audio/x-mpegurl"; mimeTypes.insert("Playlists",types); QString fileName= Opie::Ui::OFileDialog::getSaveFileName(Opie::Ui::OFileSelector::EXTENDED, m_lastDir,"playlist.m3u", mimeTypes); odebug << "Save as " << fileName << oendl; if (fileName.isEmpty()) { return; } Om3u _om3u(fileName, IO_ReadWrite | IO_Truncate); for (unsigned j=0; jLnk().file()); } _om3u.write(); } void PlaylistView::removeFromList(PlaylistItem*Item) { if (!Item)return; t_itemlist::Iterator iter,it2; iter = m_items.find(Item); it2 = m_items.end(); if (iter!=m_items.end()) { it2 = iter; ++it2; m_items.remove(iter); } delete Item; if (it2!=m_items.end()) { setSelected((*it2),true); } else if (m_items.count()) { QListViewItem * it = m_items.last(); setSelected(it,true); } emit contentChanged(childCount()); } XINE::Lib*PlaylistView::getXine() { checkLib(); return m_Infolib; } void PlaylistView::setCurrentItem(PlaylistItem*aItem) { setSelected(aItem,true); } PlaylistItem* PlaylistView::currentItem()const { QListViewItem*it = selectedItem(); if (!it) return 0; return (PlaylistItem*)it; } PlaylistItem* PlaylistView::nextItem(PlaylistItem*parent)const { if (m_items.count()==0) return 0; if (!parent) return m_items[0]; for (unsigned j=0; j0;--j) { if (m_items[j]==parent) { return m_items[j-1]; } } return 0; }