RadioCL* PlaylistCL::Parse(QUrl pURL){ RadioCL* newRadio=NULL; if (pURL.isLocalFile()){ QString tFileName=pURL.path().mid(1,pURL.path().length()-1); QStringList tFileNameParts=tFileName.split("."); QFile drFile(tFileName); if (!drFile.open(QIODevice::ReadOnly)){ qDebug()<<"Unable to open"<<drFile.fileName(); } else{ drFile.close(); if ( tFileNameParts.last()=="pls" || tFileNameParts.last()=="m3u"){ qDebug()<<"Dropped content is acceptable"; if (tFileNameParts.last()=="pls"){ newRadio=ParsePls(tFileName); newRadio->SetPlaylist(pURL.url()); } if (tFileNameParts.last()=="m3u"){ newRadio=ParseM3U(tFileName); newRadio->SetPlaylist(pURL.url()); } } else{ qDebug()<<"Parse works with pls and m3u only"; } } } else{ // remote url qDebug()<<"Getting playlist from "<<pURL.url(); QNetworkAccessManager *manager = new QNetworkAccessManager(this); if (Proxy!=""){ manager->setProxy(QNetworkProxy(QNetworkProxy::HttpProxy,Proxy,ProxyPort.toInt(),ProxyUser,ProxyPass)); } QNetworkRequest req; req.setUrl(pURL); QNetworkReply *tRemotePlaylist=manager->get(req); QEventLoop loop; connect(manager, SIGNAL(finished(QNetworkReply*)), &loop, SLOT(quit())); QApplication::setOverrideCursor(Qt::WaitCursor); loop.exec(); QApplication::restoreOverrideCursor(); qDebug()<<"Got replay:"<<tRemotePlaylist->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); if (tRemotePlaylist->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt()==0) return(NULL); QString tPlaylist=QString(tRemotePlaylist->readAll()); qDebug()<<"Got playlist as:"<<tPlaylist; if (tPlaylist=="") return(NULL); //qDebug()<<"Headers are:"<<tRemotePlaylist->rawHeaderList(); //qDebug()<<"Content-Disposition:"<<tRemotePlaylist->rawHeader("Content-Disposition"); QFile tTempFile(GetTempFilePath()); if (!tTempFile.open(QIODevice::WriteOnly | QIODevice::Truncate)){ qDebug()<<"Unable to open"<<tTempFile.fileName(); } int tFileNamePos=tPlaylist.indexOf("filename=",0,Qt::CaseInsensitive); int tFileNameEndPos=tPlaylist.indexOf("\n",tFileNamePos,Qt::CaseInsensitive); int tFileBeginningPos=tPlaylist.indexOf("\n\n",tFileNameEndPos); QString tFileBody; if (tFileNamePos!=-1){ if (tFileNameEndPos!=-1 && tFileBeginningPos!=-1){ QString tPlaylistName=tPlaylist.mid(tFileNamePos+9,tFileNameEndPos-9-tFileNamePos); qDebug()<<"Playlist filename="<<tPlaylistName; tFileBody=tPlaylist.right(tPlaylist.length()-tFileBeginningPos-2); } else{ qDebug()<<"Error in playlist"; } } else{ tFileBody=tPlaylist; } qDebug()<<"FileBody:"<<tFileBody; tTempFile.write(tFileBody.toLocal8Bit(),tFileBody.length()); tTempFile.close(); if (tFileBody.indexOf("[playlist]",Qt::CaseInsensitive)!=-1){ newRadio=ParsePls(tTempFile.fileName()); } else{ newRadio=ParseM3U(tTempFile.fileName()); } newRadio->SetPlaylist(pURL.url()); } return(newRadio); }
// Import local files from m3u/pls playlists onto a new track void PlaylistImport(COMMAND_T* ct) { char cPath[256]; vector<SPlaylistEntry> filelist; GetProjectPath(cPath, 256); string listpath = BrowseForFiles(__LOCALIZE("Import playlist","sws_mbox"), cPath, NULL, false, "Playlist files (*.m3u,*.pls)\0*.m3u;*.pls\0All Files (*.*)\0*.*\0"); string ext = ParseFileExtension(listpath); // Decide what kind of playlist we have if(ext == "m3u") { ParseM3U(listpath, filelist); } else if(ext == "pls") { ParsePLS(listpath, filelist); } if(filelist.empty()) { ShowMessageBox(__LOCALIZE("Failed to import playlist. No files found.","sws_mbox"), __LOCALIZE("Import playlist","sws_mbox"), 0); return; } // Validate files vector<string> badfiles; for(int i = 0, c = (int)filelist.size(); i < c; i++) { SPlaylistEntry e = filelist[i]; if(!file_exists(e.path.c_str())) { badfiles.push_back(e.path); } } // If files can't be found, ask user what to do. bool includeMissing = false; if(!badfiles.empty()) { stringstream ss; ss << __LOCALIZE("Cannot find some files. Create items anyway?\n","sws_mbox"); unsigned int limit = min((int)badfiles.size(), 9); // avoid enormous messagebox for(unsigned int i = 0; i < limit; i++) { ss << "\n " << badfiles[i]; } if(badfiles.size() > limit) { ss << "\n +" << badfiles.size() - limit << __LOCALIZE(" more files","sws_mbox"); } switch(ShowMessageBox(ss.str().c_str(), __LOCALIZE("Import playlist","sws_mbox"), 3)) { case 6 : // Yes includeMissing = true; break; case 7 : // No break; default : return; } } Undo_BeginBlock2(NULL); // Add new track int idx = GetNumTracks(); int panMode = 5; // Stereo pan double panLaw = 1.0; // 0dB InsertTrackAtIndex(idx, false); MediaTrack *pTrack = GetTrack(NULL, idx); GetSetMediaTrackInfo(pTrack, "P_NAME", (void*) listpath.c_str()); GetSetMediaTrackInfo(pTrack, "I_PANMODE", (void*) &panMode); GetSetMediaTrackInfo(pTrack, "D_PANLAW", (void*) &panLaw); SetOnlyTrackSelected(pTrack); // Add new items to track double pos = 0.0; for(int i = 0, c = (int)filelist.size(); i < c; i++) { SPlaylistEntry e = filelist[i]; //TODO: Would be better if missing files were offline rather than just empty items. PCM_source *pSrc = PCM_Source_CreateFromFile(e.path.c_str()); if(pSrc || includeMissing) { MediaItem *pItem = AddMediaItemToTrack(pTrack); if(pItem) { MediaItem_Take *pTake = AddTakeToMediaItem(pItem); if(pTake) { GetSetMediaItemTakeInfo(pTake, "P_SOURCE", pSrc); GetSetMediaItemTakeInfo(pTake, "P_NAME", (void*) e.title.c_str()); SetMediaItemPosition(pItem, pos, false); SetMediaItemLength(pItem, e.length, false); pos += e.length; } } } } Undo_EndBlock2(NULL, SWS_CMD_SHORTNAME(ct), UNDO_STATE_ITEMS|UNDO_STATE_TRACKCFG); TrackList_AdjustWindows(false); UpdateTimeline(); Main_OnCommand(40047, 0); // Build missing peaks }