Initial import of CVS-v2_8_branch

This commit is contained in:
Fred Gleason
2014-08-12 15:13:02 -04:00
commit afd67c7af8
1508 changed files with 405304 additions and 0 deletions

83
rdcastmanager/Makefile.am Normal file
View File

@@ -0,0 +1,83 @@
## automake.am
##
## Automake.am for rivendell/rdcastmanager
##
## (C) Copyright 2002-2006 Fred Gleason <fredg@paravelsystems.com>
##
## $Id: Makefile.am,v 1.8.8.2 2013/01/01 21:36:30 cvs Exp $
##
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License version 2 as
## published by the Free Software Foundation.
##
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public
## License along with this program; if not, write to the Free Software
## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
##
##
## Use automake to process this into a Makefile.in
AM_CPPFLAGS = -Wall -DPREFIX=\"$(prefix)\" -DQTDIR=\"@QT_DIR@\" @QT_CXXFLAGS@
INCLUDES = -I$(top_srcdir)/lib
LIBS = @QT_LIBS@ -L$(top_srcdir)/lib
MOC = @QT_MOC@
# The dependency for qt's Meta Object Compiler (moc)
moc_%.cpp: %.h
$(MOC) $< -o $@
# I18N Stuff
install-exec-local:
mkdir -p $(DESTDIR)$(prefix)/share/rivendell
cp rdcastmanager_*.qm $(DESTDIR)$(prefix)/share/rivendell
uninstall:
rm -f $(DESTDIR)$(prefix)/share/srlabs/rdcastmanager_*.qm
all:
@QT_BIN@/lupdate rdcastmanager.pro
@QT_BIN@/lrelease rdcastmanager.pro
bin_PROGRAMS = rdcastmanager
dist_rdcastmanager_SOURCES = edit_cast.cpp edit_cast.h\
globals.h\
list_casts.cpp list_casts.h\
pick_report_dates.cpp pick_report_dates.h\
rdcastmanager.cpp rdcastmanager.h
nodist_rdcastmanager_SOURCES = moc_edit_cast.cpp\
moc_list_casts.cpp\
moc_pick_report_dates.cpp\
moc_rdcastmanager.cpp
rdcastmanager_LDADD = @LIB_RDLIBS@ @LIBVORBIS@
EXTRA_DIST = rdcastmanager.pro\
rdcastmanager_cs.ts\
rdcastmanager_de.ts\
rdcastmanager_es.ts\
rdcastmanager_fr.ts\
rdcastmanager_nb.ts\
rdcastmanager_nn.ts\
rdcastmanager_pt_BR.ts
CLEANFILES = *~\
*.idb\
*ilk\
*.obj\
*.pdb\
*.qm\
moc_*
MAINTAINERCLEANFILES = *~\
*.tar.gz\
aclocal.m4\
configure\
Makefile.in\
moc_*

542
rdcastmanager/edit_cast.cpp Normal file
View File

@@ -0,0 +1,542 @@
// edit_cast.cpp
//
// Edit a Rivendell Cast
//
// (C) Copyright 2002-2004 Fred Gleason <fredg@paravelsystems.com>
//
// $Id: edit_cast.cpp,v 1.11 2011/09/09 20:23:28 cvs Exp $
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2 as
// published by the Free Software Foundation.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public
// License along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
//
#include <math.h>
#include <qpainter.h>
#include <qevent.h>
#include <qmessagebox.h>
#include <qpainter.h>
#include <qdatetime.h>
#include <qradiobutton.h>
#include <rddb.h>
#include <rddatedialog.h>
#include <rdfeed.h>
#include <rdescape_string.h>
#include <pick_report_dates.h>
#include <rdconf.h>
#include <globals.h>
#include <edit_cast.h>
EditCast::EditCast(unsigned cast_id,QWidget *parent,const char *name)
: QDialog(parent,name,true)
{
QString sql;
RDSqlQuery *q;
RDSqlQuery *q1;
int ypos=0;
cast_cast=new RDPodcast(cast_id);
cast_feed=new RDFeed(cast_cast->feedId());
cast_status=cast_cast->status();
setCaption(tr("Editing PodCast"));
//
// Create Fonts
//
QFont font=QFont("Helvetica",12,QFont::Bold);
font.setPixelSize(12);
QFont select_font=QFont("Helvetica",12,QFont::Normal);
select_font.setPixelSize(12);
//
// Item Media Link
//
cast_item_medialink_edit=new QLineEdit(this,"cast_item_medialink_edit");
cast_item_medialink_edit->setGeometry(115,10,sizeHint().width()-125,20);
cast_item_medialink_edit->setReadOnly(true);
QLabel *cast_item_medialink_label=
new QLabel(cast_item_medialink_edit,tr("Media Link:"),this,
"cast_item_medialink_label");
cast_item_medialink_label->setGeometry(20,10,90,20);
cast_item_medialink_label->setFont(font);
cast_item_medialink_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix);
if(cast_feed->mediaLinkMode()==RDFeed::LinkNone) {
cast_item_medialink_edit->hide();
cast_item_medialink_label->hide();
ypos=10;
}
else {
ypos=42;
}
//
// Item Title
//
cast_item_title_edit=new QLineEdit(this,"cast_item_title_edit");
cast_item_title_edit->setGeometry(115,ypos,sizeHint().width()-125,20);
cast_item_title_edit->setMaxLength(255);
QLabel *cast_item_title_label=
new QLabel(cast_item_title_edit,tr("Title:"),this,
"cast_item_title_label");
cast_item_title_label->setGeometry(20,ypos,90,20);
cast_item_title_label->setFont(font);
cast_item_title_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix);
//
// Item Author
//
cast_item_author_edit=new QLineEdit(this,"cast_item_author_edit");
cast_item_author_edit->setGeometry(115,ypos+22,sizeHint().width()-125,20);
cast_item_author_edit->setMaxLength(255);
QLabel *cast_item_author_label=
new QLabel(cast_item_author_edit,tr("Author E-Mail:"),this,
"cast_item_author_label");
cast_item_author_label->setGeometry(20,ypos+22,90,20);
cast_item_author_label->setFont(font);
cast_item_author_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix);
//
// Item Category
//
cast_item_category_edit=new QLineEdit(this,"cast_item_category_edit");
cast_item_category_edit->setGeometry(115,ypos+44,sizeHint().width()-125,20);
cast_item_category_edit->setMaxLength(64);
QLabel *cast_item_category_label=
new QLabel(cast_item_category_edit,tr("Category:"),this,
"cast_item_category_label");
cast_item_category_label->setGeometry(20,ypos+44,90,20);
cast_item_category_label->setFont(font);
cast_item_category_label->
setAlignment(AlignRight|AlignVCenter|ShowPrefix);
//
// Item Link
//
cast_item_link_edit=new QLineEdit(this,"cast_item_link_edit");
cast_item_link_edit->setGeometry(115,ypos+66,sizeHint().width()-125,20);
cast_item_link_edit->setMaxLength(255);
QLabel *cast_item_link_label=
new QLabel(cast_item_link_edit,tr("Link URL:"),this,
"cast_item_link_label");
cast_item_link_label->setGeometry(20,ypos+66,90,20);
cast_item_link_label->setFont(font);
cast_item_link_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix);
//
// Item Description
//
cast_item_description_edit=
new QTextEdit(this,"cast_item_description_edit");
cast_item_description_edit->
setGeometry(115,ypos+88,sizeHint().width()-125,76);
QLabel *cast_item_description_label=
new QLabel(cast_item_description_edit,tr("Description:"),this,
"cast_item_description_label");
cast_item_description_label->setGeometry(20,ypos+88,90,20);
cast_item_description_label->setFont(font);
cast_item_description_label->
setAlignment(AlignRight|AlignVCenter|ShowPrefix);
//
// Item Source Text
//
cast_item_sourcetext_edit=new QLineEdit(this,"cast_item_sourcetext_edit");
cast_item_sourcetext_edit->setGeometry(115,ypos+169,sizeHint().width()-125,20);
cast_item_sourcetext_edit->setMaxLength(64);
QLabel *cast_item_sourcetext_label=
new QLabel(cast_item_sourcetext_edit,tr("Source Text:"),this,
"cast_item_sourcetext_label");
cast_item_sourcetext_label->setGeometry(20,ypos+169,90,20);
cast_item_sourcetext_label->setFont(font);
cast_item_sourcetext_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix);
//
// Item Source URL
//
cast_item_sourceurl_edit=new QLineEdit(this,"cast_item_sourceurl_edit");
cast_item_sourceurl_edit->setGeometry(115,ypos+191,sizeHint().width()-125,20);
cast_item_sourceurl_edit->setMaxLength(64);
QLabel *cast_item_sourceurl_label=
new QLabel(cast_item_sourceurl_edit,tr("Source URL:"),this,
"cast_item_sourceurl_label");
cast_item_sourceurl_label->setGeometry(20,ypos+191,90,20);
cast_item_sourceurl_label->setFont(font);
cast_item_sourceurl_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix);
//
// Item Comments
//
cast_item_comments_edit=new QLineEdit(this,"cast_item_comments_edit");
cast_item_comments_edit->setGeometry(115,ypos+213,sizeHint().width()-125,20);
cast_item_comments_edit->setMaxLength(64);
QLabel *cast_item_comments_label=
new QLabel(cast_item_comments_edit,tr("Comments URL:"),this,
"cast_item_comments_label");
cast_item_comments_label->setGeometry(10,ypos+213,100,20);
cast_item_comments_label->setFont(font);
cast_item_comments_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix);
//
// Auxiliary Fields
//
cast_ypos=233+ypos;
QString keyname=cast_cast->keyName();
keyname.replace(" ","_");
QLabel *label;
sql=QString().sprintf("select VAR_NAME,CAPTION from AUX_METADATA \
where FEED_ID=%u order by VAR_NAME",
cast_cast->feedId());
q=new RDSqlQuery(sql);
while(q->next()) {
cast_aux_varnames.push_back(q->value(0).toString().
mid(1,q->value(0).toString().length()-2));
cast_aux_edits.push_back(new QLineEdit(this));
cast_aux_edits.back()->
setGeometry(115,cast_ypos,sizeHint().width()-125,20);
cast_aux_edits.back()->setMaxLength(255);
sql=QString().sprintf("select %s from %s_FIELDS where CAST_ID=%u",
(const char *)cast_aux_varnames.back(),
(const char *)keyname,cast_cast->id());
q1=new RDSqlQuery(sql);
if(q1->first()) {
cast_aux_edits.back()->setText(q1->value(0).toString());
}
delete q1;
label=new QLabel(cast_aux_edits.back(),q->value(1).toString()+":",this);
label->setGeometry(20,cast_ypos,90,20);
label->setFont(font);
label->setAlignment(AlignRight|AlignVCenter|ShowPrefix);
cast_ypos+=22;
}
delete q;
cast_ypos+=3;
//
// Effective DateTime
//
cast_item_effective_edit=new QDateTimeEdit(this);
cast_item_effective_edit->
setGeometry(115,cast_ypos,165,20);
label=new QLabel(cast_item_effective_edit,tr("Air Date/Time:"),this,
"cast_item_effective_label");
label->setGeometry(20,cast_ypos,90,20);
label->setFont(font);
label->setAlignment(AlignRight|AlignVCenter|ShowPrefix);
QPushButton *button=new QPushButton(this,"cast_item_effective_button");
button->setGeometry(290,cast_ypos-3,50,25);
button->setFont(select_font);
button->setText(tr("&Select"));
connect(button,SIGNAL(clicked()),this,SLOT(effectiveSelectData()));
cast_ypos+=22;
//
// Item Origin
//
cast_item_origin_edit=new QLineEdit(this,"cast_item_origin_edit");
cast_item_origin_edit->setReadOnly(true);
cast_item_origin_edit->setGeometry(115,cast_ypos,165,20);
cast_item_origin_edit->setMaxLength(64);
QLabel *cast_item_origin_label=
new QLabel(cast_item_origin_edit,tr("Posted At:"),this,
"cast_item_origin_label");
cast_item_origin_label->setGeometry(20,cast_ypos,90,20);
cast_item_origin_label->setFont(font);
cast_item_origin_label->
setAlignment(AlignRight|AlignVCenter|ShowPrefix);
cast_ypos+=22;
//
// Item Expiration
//
cast_item_expiration_box=new QComboBox(this,"cast_item_expiration_box");
cast_item_expiration_box->setGeometry(115,cast_ypos,50,20);
cast_item_expiration_box->insertItem(tr("No"));
cast_item_expiration_box->insertItem(tr("Yes"));
connect(cast_item_expiration_box,SIGNAL(activated(int)),
this,SLOT(expirationSelectedData(int)));
label=new QLabel(cast_item_expiration_box,tr("Cast Expires:"),this,"label");
label->setGeometry(20,cast_ypos,90,20);
label->setFont(font);
label->
setAlignment(AlignRight|AlignVCenter|ShowPrefix);
cast_ypos+=22;
cast_item_expiration_box->setEnabled(cast_status!=RDPodcast::StatusExpired);
label->setEnabled(cast_status!=RDPodcast::StatusExpired);
cast_item_expiration_edit=new QDateEdit(this);
cast_item_expiration_edit->setGeometry(115,cast_ypos,95,20);
cast_item_expiration_label=
new QLabel(cast_item_expiration_edit,tr("Expires On:"),this,
"cast_item_expiration_label");
cast_item_expiration_label->setGeometry(20,cast_ypos,90,20);
cast_item_expiration_label->setFont(font);
cast_item_expiration_label->
setAlignment(AlignRight|AlignVCenter|ShowPrefix);
cast_item_expiration_button=
new QPushButton(this,"cast_item_expiration_button");
cast_item_expiration_button->setGeometry(220,cast_ypos-3,50,25);
cast_item_expiration_button->setFont(select_font);
cast_item_expiration_button->setText(tr("&Select"));
connect(cast_item_expiration_button,SIGNAL(clicked()),
this,SLOT(expirationSelectData()));
cast_ypos+=27;
cast_item_expiration_edit->setEnabled(cast_status!=RDPodcast::StatusExpired);
cast_item_expiration_label->
setEnabled(cast_status!=RDPodcast::StatusExpired);
cast_item_expiration_button->
setEnabled(cast_status!=RDPodcast::StatusExpired);
//
// Cast Status
//
cast_item_status_group=new QButtonGroup(this,"cast_item_status_group");
cast_item_status_group->setExclusive(true);
cast_item_status_group->hide();
QRadioButton *rbutton=new QRadioButton(this,"hold_button");
rbutton->setGeometry(120,cast_ypos,15,15);
cast_item_status_group->insert(rbutton);
label=new QLabel(rbutton,tr("Hold"),this,"hold_label");
label->setFont(select_font);
label->setGeometry(140,cast_ypos,30,15);
label->setAlignment(AlignVCenter|AlignLeft);
rbutton->setChecked(true);
label->setEnabled(cast_status!=RDPodcast::StatusExpired);
rbutton->setEnabled(cast_status!=RDPodcast::StatusExpired);
rbutton=new QRadioButton(this,"active_button");
rbutton->setGeometry(190,cast_ypos,15,15);
cast_item_status_group->insert(rbutton);
label=new QLabel(rbutton,tr("Active"),this,"hold_label");
label->setFont(select_font);
label->setGeometry(210,cast_ypos,80,15);
label->setAlignment(AlignVCenter|AlignLeft);
label->setEnabled(cast_status!=RDPodcast::StatusExpired);
label=new QLabel(cast_item_status_group,tr("Posting Status:"),this,
"cast_item_status_label");
label->setGeometry(20,cast_ypos-1,90,20);
label->setFont(font);
label->setAlignment(AlignRight|AlignVCenter|ShowPrefix);
label->setEnabled(cast_status!=RDPodcast::StatusExpired);
rbutton->setEnabled(cast_status!=RDPodcast::StatusExpired);
//
// Report Button
//
button=new QPushButton(this,"button");
button->setGeometry(10,sizeHint().height()-60,80,50);
button->setFont(font);
button->setText(tr("Episode\n&Report"));
connect(button,SIGNAL(clicked()),this,SLOT(reportData()));
//
// Ok Button
//
button=new QPushButton(this,"button");
button->setGeometry(sizeHint().width()-180,sizeHint().height()-60,80,50);
button->setDefault(true);
button->setFont(font);
button->setText(tr("&OK"));
connect(button,SIGNAL(clicked()),this,SLOT(okData()));
//
// Cancel Button
//
button=new QPushButton(this,"button");
button->setGeometry(sizeHint().width()-90,sizeHint().height()-60,
80,50);
button->setFont(font);
button->setText(tr("&Cancel"));
connect(button,SIGNAL(clicked()),this,SLOT(cancelData()));
//
// Populate Values
//
cast_item_medialink_edit->
setText(cast_feed->audioUrl(cast_feed->mediaLinkMode(),
"[web-hostname]",cast_cast->id()));
cast_item_title_edit->setText(cast_cast->itemTitle());
cast_item_author_edit->setText(cast_cast->itemAuthor());
cast_item_origin_edit->setText(RDUtcToLocal(cast_cast->originDateTime()).
toString("MM/dd/yyyy - hh:mm:ss"));
cast_item_category_edit->setText(cast_cast->itemCategory());
cast_item_link_edit->setText(cast_cast->itemLink());
cast_item_sourcetext_edit->setText(cast_cast->itemSourceText());
cast_item_sourceurl_edit->setText(cast_cast->itemSourceUrl());
cast_item_description_edit->setText(cast_cast->itemDescription());
cast_item_comments_edit->setText(cast_cast->itemComments());
cast_item_effective_edit->
setDateTime(RDUtcToLocal(cast_cast->effectiveDateTime()));
if(cast_cast->shelfLife()>0) {
cast_item_expiration_box->setCurrentItem(1);
}
cast_item_expiration_edit->
setDate(RDUtcToLocal(cast_cast->originDateTime()).date().
addDays(cast_cast->shelfLife()));
expirationSelectedData(cast_item_expiration_box->currentItem());
switch(cast_status) {
case RDPodcast::StatusActive:
cast_item_status_group->setButton(1);
break;
case RDPodcast::StatusPending:
cast_item_status_group->setButton(0);
break;
case RDPodcast::StatusExpired:
cast_item_status_group->setDisabled(true);
break;
}
//
// Fix the Window Size
//
setMinimumWidth(sizeHint().width());
setMaximumWidth(sizeHint().width());
setMinimumHeight(sizeHint().height());
setMaximumHeight(sizeHint().height());
}
EditCast::~EditCast()
{
delete cast_feed;
delete cast_cast;
}
QSize EditCast::sizeHint() const
{
return QSize(640,cast_ypos+92);
}
QSizePolicy EditCast::sizePolicy() const
{
return QSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed);
}
void EditCast::expirationSelectedData(int state)
{
state=state&&(cast_status!=RDPodcast::StatusExpired);
cast_item_expiration_edit->setEnabled(state);
cast_item_expiration_button->setEnabled(state);
cast_item_expiration_label->setEnabled(state);
}
void EditCast::effectiveSelectData()
{
QDate current_date=QDate::currentDate();
QDateTime datetime=cast_item_effective_edit->dateTime();
QDate date=datetime.date();
RDDateDialog *dd=
new RDDateDialog(current_date.year()-5,current_date.year()+5,this);
if(dd->exec(&date)==0) {
datetime.setDate(date);
cast_item_effective_edit->setDateTime(datetime);
}
delete dd;
}
void EditCast::expirationSelectData()
{
QDate current_date=QDate::currentDate();
QDate date=cast_item_expiration_edit->date();
RDDateDialog *dd=
new RDDateDialog(current_date.year(),current_date.year()+10,this);
if(dd->exec(&date)==0) {
cast_item_expiration_edit->setDate(date);
}
delete dd;
}
void EditCast::reportData()
{
PickReportDates *rd=new PickReportDates(cast_cast->feedId(),cast_cast->id());
rd->exec();
delete rd;
}
void EditCast::okData()
{
QString sql;
RDSqlQuery *q;
cast_cast->setItemTitle(cast_item_title_edit->text());
cast_cast->setItemAuthor(cast_item_author_edit->text());
cast_cast->setItemCategory(cast_item_category_edit->text());
cast_cast->setItemLink(cast_item_link_edit->text());
cast_cast->setItemSourceText(cast_item_sourcetext_edit->text());
cast_cast->setItemSourceUrl(cast_item_sourceurl_edit->text());
cast_cast->setItemDescription(cast_item_description_edit->text());
cast_cast->setItemComments(cast_item_comments_edit->text());
cast_cast->
setEffectiveDateTime(RDLocalToUtc(cast_item_effective_edit->dateTime()));
if(cast_item_status_group->isEnabled()) {
if(cast_item_expiration_box->currentItem()) {
int shelf_life=RDUtcToLocal(cast_cast->originDateTime()).date().
daysTo(cast_item_expiration_edit->date());
if(shelf_life<1) {
shelf_life=1;
}
cast_cast->setShelfLife(shelf_life);
}
else {
cast_cast->setShelfLife(0);
}
switch(cast_item_status_group->selectedId()) {
case 0:
cast_cast->setStatus(RDPodcast::StatusPending);
break;
case 1:
cast_cast->setStatus(RDPodcast::StatusActive);
break;
}
}
QString keyname=cast_cast->keyName();
keyname.replace(" ","_");
for(unsigned i=0;i<cast_aux_varnames.size();i++) {
sql=QString().sprintf("update %s_FIELDS set %s=\"%s\" \
where CAST_ID=%u",
(const char *)keyname,
(const char *)cast_aux_varnames[i],
(const char *)RDEscapeString(cast_aux_edits[i]->
text()),
cast_cast->id());
q=new RDSqlQuery(sql);
delete q;
}
cast_feed->
setLastBuildDateTime(RDLocalToUtc(QDateTime(QDate::currentDate(),
QTime::currentTime())));
done(0);
}
void EditCast::cancelData()
{
done(-1);
}

87
rdcastmanager/edit_cast.h Normal file
View File

@@ -0,0 +1,87 @@
// edit_cast.h
//
// Edit a Rivendell Cast
//
// (C) Copyright 2002-2004 Fred Gleason <fredg@paravelsystems.com>
//
// $Id: edit_cast.h,v 1.8 2011/09/09 20:23:28 cvs Exp $
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2 as
// published by the Free Software Foundation.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public
// License along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
//
#ifndef EDIT_CAST_H
#define EDIT_CAST_H
#include <vector>
#include <qdialog.h>
#include <qtextedit.h>
#include <qspinbox.h>
#include <qlineedit.h>
#include <qsqldatabase.h>
#include <qcombobox.h>
#include <qdatetimeedit.h>
#include <qlabel.h>
#include <qpushbutton.h>
#include <qbuttongroup.h>
#include <rdfeed.h>
#include <rdpodcast.h>
class EditCast : public QDialog
{
Q_OBJECT
public:
EditCast(unsigned cast_id,QWidget *parent=0,const char *name=0);
~EditCast();
QSize sizeHint() const;
QSizePolicy sizePolicy() const;
private slots:
void expirationSelectedData(int state);
void effectiveSelectData();
void expirationSelectData();
void reportData();
void okData();
void cancelData();
private:
RDFeed *cast_feed;
RDPodcast *cast_cast;
QLineEdit *cast_item_medialink_edit;
QLineEdit *cast_item_title_edit;
QLineEdit *cast_item_author_edit;
QLineEdit *cast_item_origin_edit;
QTextEdit *cast_item_description_edit;
QLineEdit *cast_item_category_edit;
QLineEdit *cast_item_comments_edit;
QLineEdit *cast_item_sourcetext_edit;
QLineEdit *cast_item_sourceurl_edit;
QLineEdit *cast_item_link_edit;
QComboBox *cast_item_expiration_box;
QLabel *cast_item_expiration_label;
QPushButton *cast_item_expiration_button;
QDateEdit *cast_item_expiration_edit;
QDateTimeEdit *cast_item_effective_edit;
QButtonGroup *cast_item_status_group;
std::vector<QString> cast_aux_varnames;
std::vector<QLineEdit *> cast_aux_edits;
int cast_ypos;
RDPodcast::Status cast_status;
};
#endif // EDIT_CAST_H

46
rdcastmanager/globals.h Normal file
View File

@@ -0,0 +1,46 @@
// globals.h
//
// Global Variable Declarations for RDCastManager
//
// (C) Copyright 2007 Fred Gleason <fredg@paravelsystems.com>
//
// $Id: globals.h,v 1.5 2011/08/30 23:35:44 cvs Exp $
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2 as
// published by the Free Software Foundation.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public
// License along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
//
#ifndef GLOBALS_H
#define GLOBALS_H
#include <qstring.h>
#include <rduser.h>
#include <rdripc.h>
#include <rdstation.h>
#include <rdconfig.h>
#include <rdsystem.h>
//
// Global Resources
//
extern QString cast_filter;
extern QString cast_group;
extern QString cast_schedcode;
extern RDUser *cast_user;
extern RDRipc *cast_ripc;
extern RDConfig *config;
extern RDStation *rdstation_conf;
extern RDSystem *cast_system;
#endif // GLOBALS_H

View File

@@ -0,0 +1,542 @@
// list_casts.cpp
//
// List Rivendell Casts
//
// (C) Copyright 2002-2007 Fred Gleason <fredg@paravelsystems.com>
//
// $Id: list_casts.cpp,v 1.18.4.1 2013/11/13 23:36:35 cvs Exp $
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2 as
// published by the Free Software Foundation.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public
// License along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
//
#include <math.h>
#include <stdlib.h>
#include <unistd.h>
#include <qdialog.h>
#include <qstring.h>
#include <qpushbutton.h>
#include <qlistbox.h>
#include <qtextedit.h>
#include <qlabel.h>
#include <qpainter.h>
#include <qevent.h>
#include <qmessagebox.h>
#include <qbuttongroup.h>
#include <qdatetime.h>
#include <qfile.h>
#include <qapplication.h>
#include <qfiledialog.h>
#include <rddb.h>
#include <rdpodcast.h>
#include <rdtextfile.h>
#include <rdcut_dialog.h>
#include <rdconf.h>
#include <rdcut.h>
#include <rdwavefile.h>
#include <rdescape_string.h>
#include <rdurl.h>
#include <rdfeedlog.h>
#include <rdsettings.h>
#include <rdcastsearch.h>
#include <list_casts.h>
#include <edit_cast.h>
#include <globals.h>
#include <pick_report_dates.h>
//
// Icons
//
#include "../icons/redball.xpm"
#include "../icons/greenball.xpm"
#include "../icons/whiteball.xpm"
ListCasts::ListCasts(unsigned feed_id,QWidget *parent,const char *name)
: QDialog(parent,name,true)
{
list_feed_id=feed_id;
//
// Fix the Window Size
//
setMinimumWidth(sizeHint().width());
setMinimumHeight(sizeHint().height());
setCaption(tr("Podcast List"));
//
// Create Fonts
//
QFont font=QFont("Helvetica",12,QFont::Bold);
font.setPixelSize(12);
QFont list_font=QFont("Helvetica",12,QFont::Normal);
list_font.setPixelSize(12);
QFont small_font=QFont("Helvetica",10,QFont::Normal);
small_font.setPixelSize(10);
//
// Create Icons
//
list_greenball_map=new QPixmap(greenball_xpm);
list_redball_map=new QPixmap(redball_xpm);
list_whiteball_map=new QPixmap(whiteball_xpm);
//
// The Feed
//
list_feed=new RDFeed(feed_id,this);
//
// Progress Dialog
//
list_progress_dialog=
new QProgressDialog(tr("Uploading Audio..."),"Cancel",4,this);
list_progress_dialog->setCaption(tr("Progress"));
list_progress_dialog->setMinimumDuration(0);
list_progress_dialog->setTotalSteps(list_feed->totalPostSteps());
connect(list_feed,SIGNAL(postProgressChanged(int)),
this,SLOT(postProgressChangedData(int)));
//
// Filter
//
list_filter_edit=new QLineEdit(this,"list_filter_edit");
list_filter_label=
new QLabel(list_filter_edit,tr("Filter:"),this,"list_filter_label");
list_filter_label->setFont(font);
list_filter_label->setAlignment(AlignRight|AlignVCenter);
connect(list_filter_edit,SIGNAL(textChanged(const QString &)),
this,SLOT(filterChangedData(const QString &)));
//
// Unexpired Check Box
//
list_unexpired_check=new QCheckBox(this,"list_unexpired_check");
list_unexpired_label=
new QLabel(list_unexpired_check,tr("Only Show Unexpired Casts"),this,
"list_unexpired_label");
list_unexpired_label->setFont(font);
list_unexpired_label->setAlignment(AlignLeft|AlignVCenter);
connect(list_unexpired_check,SIGNAL(toggled(bool)),
this,SLOT(notexpiredToggledData(bool)));
//
// Active Check Box
//
list_active_check=new QCheckBox(this,"list_active_check");
list_active_label=
new QLabel(list_active_check,tr("Only Show Active Casts"),this,
"list_active_label");
list_active_label->setFont(font);
list_active_label->setAlignment(AlignLeft|AlignVCenter);
connect(list_active_check,SIGNAL(toggled(bool)),
this,SLOT(activeToggledData(bool)));
//
// Group List
//
list_casts_view=new RDListView(this,"list_casts_view");
list_casts_view->setAllColumnsShowFocus(true);
list_casts_view->setItemMargin(5);
list_casts_view->addColumn(tr(" "));
list_casts_view->setColumnAlignment(0,AlignCenter);
list_casts_view->addColumn(tr("Title"));
list_casts_view->setColumnAlignment(1,AlignLeft);
list_casts_view->addColumn(tr("Origin"));
list_casts_view->setColumnAlignment(2,AlignLeft);
list_casts_view->addColumn(tr("Expires"));
list_casts_view->setColumnAlignment(3,AlignCenter);
list_casts_view->addColumn(tr("Length"));
list_casts_view->setColumnAlignment(4,AlignRight);
list_casts_view->addColumn(tr("Description"));
list_casts_view->setColumnAlignment(5,AlignLeft);
list_casts_view->addColumn(tr("Category"));
list_casts_view->setColumnAlignment(6,AlignCenter);
list_casts_view->addColumn(tr("Link"));
list_casts_view->setColumnAlignment(7,AlignCenter);
connect(list_casts_view,
SIGNAL(doubleClicked(QListViewItem *,const QPoint &,int)),
this,
SLOT(doubleClickedData(QListViewItem *,const QPoint &,int)));
//
// Post Cart Button
//
list_cart_button=new QPushButton(this,"list_cart_button");
list_cart_button->setFont(font);
list_cart_button->setText(tr("Post From\nCar&t/Cut"));
connect(list_cart_button,SIGNAL(clicked()),this,SLOT(addCartData()));
//
// Post File Button
//
list_file_button=new QPushButton(this,"list_file_button");
list_file_button->setFont(font);
list_file_button->setText(tr("Post From\n&File"));
connect(list_file_button,SIGNAL(clicked()),this,SLOT(addFileData()));
//
// Edit Button
//
list_edit_button=new QPushButton(this,"list_edit_button");
list_edit_button->setFont(font);
list_edit_button->setText(tr("&Edit"));
connect(list_edit_button,SIGNAL(clicked()),this,SLOT(editData()));
//
// Delete Button
//
list_delete_button=new QPushButton(this,"list_delete_button");
list_delete_button->setFont(font);
list_delete_button->setText(tr("&Delete"));
connect(list_delete_button,SIGNAL(clicked()),this,SLOT(deleteData()));
//
// Report Button
//
list_report_button=new QPushButton(this,"list_report_button");
list_report_button->setFont(font);
list_report_button->setText(tr("Subscription\n&Report"));
connect(list_report_button,SIGNAL(clicked()),this,SLOT(reportData()));
//
// Close Button
//
list_close_button=new QPushButton(this,"list_close_button");
list_close_button->setDefault(true);
list_close_button->setFont(font);
list_close_button->setText(tr("&Close"));
connect(list_close_button,SIGNAL(clicked()),this,SLOT(closeData()));
RefreshList();
GetEncoderId();
connect(cast_ripc,SIGNAL(userChanged()),this,SLOT(userChangedData()));
userChangedData();
}
ListCasts::~ListCasts()
{
delete list_progress_dialog;
delete list_feed;
}
QSize ListCasts::sizeHint() const
{
return QSize(640,480);
}
QSizePolicy ListCasts::sizePolicy() const
{
return QSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed);
}
void ListCasts::addCartData()
{
QString cutname;
RDCutDialog *cd=new RDCutDialog(&cutname,rdstation_conf,cast_system,
&cast_filter,&cast_group,&cast_schedcode,
cast_ripc->user());
if(cd->exec()!=0) {
delete cd;
return;
}
delete cd;
RDFeed::Error err;
unsigned cast_id=list_feed->postCut(cast_user,rdstation_conf,cutname,&err,
config->logXloadDebugData(),config);
if(err!=RDFeed::ErrorOk) {
QMessageBox::warning(this,tr("Posting Error"),RDFeed::errorString(err));
return;
}
EditCast *edit_cast=new EditCast(cast_id,this);
edit_cast->exec();
RDListViewItem *item=new RDListViewItem(list_casts_view);
item->setId(cast_id);
RefreshItem(item);
list_casts_view->setSelected(item,true);
list_casts_view->ensureItemVisible(item);
delete edit_cast;
}
void ListCasts::addFileData()
{
QString srcfile=QFileDialog::getOpenFileName("",RD_AUDIO_FILE_FILTER,this);
if(srcfile.isNull()) {
return;
}
RDFeed::Error err;
unsigned cast_id=list_feed->postFile(rdstation_conf,srcfile,&err,
config->logXloadDebugData(),config);
if(err!=RDFeed::ErrorOk) {
QMessageBox::warning(this,tr("Posting Error"),RDFeed::errorString(err));
return;
}
EditCast *edit_cast=new EditCast(cast_id,this);
edit_cast->exec();
RDListViewItem *item=new RDListViewItem(list_casts_view);
item->setId(cast_id);
RefreshItem(item);
list_casts_view->setSelected(item,true);
list_casts_view->ensureItemVisible(item);
delete edit_cast;
}
void ListCasts::editData()
{
RDListViewItem *item=(RDListViewItem *)list_casts_view->selectedItem();
if(item==NULL) {
return;
}
EditCast *edit_cast=new EditCast(item->id(),this);
if(edit_cast->exec()==0) {
RefreshItem(item);
}
delete edit_cast;
}
void ListCasts::deleteData()
{
QString sql;
RDSqlQuery *q;
QString err_text;
RDListViewItem *item=(RDListViewItem *)list_casts_view->selectedItem();
if(item==NULL) {
return;
}
if(QMessageBox::question(this,tr("Delete Podcast"),
tr("Are you sure you want to delete this podcast?"),
QMessageBox::Yes,QMessageBox::No)==
QMessageBox::No) {
return;
}
QProgressDialog *pd=
new QProgressDialog(tr("Deleting Podcast..."),"Cancel",2,this);
pd->setCaption(tr("Progress"));
pd->setMinimumDuration(0);
pd->setProgress(0);
qApp->processEvents();
sleep(1);
qApp->processEvents();
RDPodcast *cast=new RDPodcast(item->id());
if(!cast->removeAudio(list_feed,&err_text,config->logXloadDebugData())) {
if(QMessageBox::warning(this,tr("Remote Error"),
tr("Unable to delete remote audio!\n")+
tr("The server said: \"")+err_text+"\".\n\n"+
tr("Continue deleting cast?"),
QMessageBox::Yes,QMessageBox::No)==QMessageBox::No) {
delete pd;
delete cast;
return;
}
}
pd->setProgress(1);
qApp->processEvents();
sql=QString().sprintf("delete from PODCASTS where ID=%u",item->id());
q=new RDSqlQuery(sql);
delete q;
sql=QString().sprintf("update FEEDS set LAST_BUILD_DATETIME=now() \
where ID=%u",list_feed_id);
q=new RDSqlQuery(sql);
delete q;
RDDeleteCastCount(list_feed_id,item->id());
pd->reset();
delete pd;
delete cast;
delete item;
}
void ListCasts::reportData()
{
PickReportDates *rd=new PickReportDates(list_feed_id,0);
rd->exec();
delete rd;
}
void ListCasts::doubleClickedData(QListViewItem *item,const QPoint &pt,
int col)
{
editData();
}
void ListCasts::userChangedData()
{
list_cart_button->setEnabled(cast_user->addPodcast()&&(list_encoder_id>=0));
list_file_button->setEnabled(cast_user->addPodcast()&&(list_encoder_id>=0));
list_edit_button->setEnabled(cast_user->editPodcast());
list_delete_button->setEnabled(cast_user->deletePodcast());
}
void ListCasts::filterChangedData(const QString &str)
{
RefreshList();
}
void ListCasts::notexpiredToggledData(bool state)
{
RefreshList();
}
void ListCasts::activeToggledData(bool state)
{
RefreshList();
}
void ListCasts::postProgressChangedData(int step)
{
list_progress_dialog->setProgress(step);
if(step==list_progress_dialog->totalSteps()) {
list_progress_dialog->reset();
}
qApp->processEvents();
}
void ListCasts::closeData()
{
done(0);
}
void ListCasts::resizeEvent(QResizeEvent *e)
{
list_filter_label->setGeometry(10,10,40,20);
list_filter_edit->setGeometry(55,10,size().width()-65,20);
list_unexpired_check->setGeometry(55,35,15,15);
list_unexpired_label->setGeometry(75,33,200,20);
list_active_check->setGeometry(300,35,15,15);
list_active_label->setGeometry(320,33,200,20);
list_casts_view->setGeometry(10,54,size().width()-20,size().height()-124);
list_cart_button->setGeometry(10,size().height()-60,80,50);
list_file_button->setGeometry(100,size().height()-60,80,50);
list_edit_button->setGeometry(190,size().height()-60,80,50);
list_delete_button->setGeometry(280,size().height()-60,80,50);
list_report_button->setGeometry(415,size().height()-60,80,50);
list_close_button->setGeometry(size().width()-90,size().height()-60,80,50);
}
void ListCasts::RefreshList()
{
QString sql;
RDSqlQuery *q;
RDListViewItem *item;
list_casts_view->clear();
sql=QString().sprintf("select ID from PODCASTS %s \
order by ORIGIN_DATETIME",
(const char *)RDCastSearch(list_feed_id,list_filter_edit->text(),
list_unexpired_check->isChecked(),
list_active_check->isChecked()));
q=new RDSqlQuery(sql);
while (q->next()) {
item=new RDListViewItem(list_casts_view);
item->setId(q->value(0).toInt());
RefreshItem(item);
}
delete q;
}
void ListCasts::RefreshItem(RDListViewItem *item)
{
QString sql;
RDSqlQuery *q;
sql=QString().sprintf("select STATUS,ITEM_TITLE,ORIGIN_DATETIME,SHELF_LIFE,\
AUDIO_TIME,ITEM_DESCRIPTION,ITEM_CATEGORY,ITEM_LINK \
from PODCASTS where ID=%d",item->id());
q=new RDSqlQuery(sql);
if(q->first()) {
switch((RDPodcast::Status)q->value(0).toUInt()) {
case RDPodcast::StatusActive:
item->setPixmap(0,*list_greenball_map);
break;
case RDPodcast::StatusPending:
item->setPixmap(0,*list_redball_map);
break;
case RDPodcast::StatusExpired:
item->setPixmap(0,*list_whiteball_map);
break;
}
item->setText(1,q->value(1).toString());
item->setText(2,RDUtcToLocal(q->value(2).toDateTime()).
toString("MM/dd/yyyy hh:mm:ss"));
if(q->value(3).toInt()==0) {
item->setText(3,tr("Never"));
}
else {
item->setText(3,RDUtcToLocal(q->value(2).toDateTime()).
addDays(q->value(3).toInt()).toString("MM/dd/yyyy"));
}
item->setText(4,RDGetTimeLength(q->value(4).toInt(),false,false));
item->setText(5,q->value(5).toString());
item->setText(6,q->value(6).toString());
item->setText(7,q->value(7).toString());
}
delete q;
}
void ListCasts::GetEncoderId()
{
QString sql;
RDSqlQuery *q;
list_encoder_id=-1;
RDFeed *feed=new RDFeed(list_feed_id);
int format=feed->uploadFormat();
delete feed;
if((format>0)&&(format<100)) { // Built-in format
list_encoder_id=format;
return;
}
sql=QString().sprintf("select NAME from ENCODERS where ID=%d",format);
q=new RDSqlQuery(sql);
if(q->first()) {
sql=QString().sprintf("select ID from ENCODERS \
where (NAME=\"%s\")&&(STATION_NAME=\"%s\")",
(const char *)RDEscapeString(q->value(0).toString()),
(const char *)RDEscapeString(rdstation_conf->name()));
delete q;
q=new RDSqlQuery(sql);
if(q->first()) {
list_encoder_id=q->value(0).toInt();
}
}
delete q;
}

View File

@@ -0,0 +1,93 @@
// list_casts.h
//
// List Rivendell Casts
//
// (C) Copyright 2002-2007 Fred Gleason <fredg@paravelsystems.com>
//
// $Id: list_casts.h,v 1.9 2010/07/29 19:32:36 cvs Exp $
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2 as
// published by the Free Software Foundation.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public
// License along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
//
#ifndef LIST_CASTS_H
#define LIST_CASTS_H
#include <qdialog.h>
#include <qpixmap.h>
#include <qradiobutton.h>
#include <qsqldatabase.h>
#include <qpushbutton.h>
#include <qlineedit.h>
#include <qcheckbox.h>
#include <qlabel.h>
#include <qprogressdialog.h>
#include <rdfeed.h>
#include <rdlistviewitem.h>
class ListCasts : public QDialog
{
Q_OBJECT
public:
ListCasts(unsigned feed_id,QWidget *parent=0,const char *name=0);
~ListCasts();
QSize sizeHint() const;
QSizePolicy sizePolicy() const;
private slots:
void addCartData();
void addFileData();
void editData();
void deleteData();
void reportData();
void doubleClickedData(QListViewItem *item,const QPoint &pt,int col);
void userChangedData();
void filterChangedData(const QString &str);
void notexpiredToggledData(bool state);
void activeToggledData(bool state);
void postProgressChangedData(int step);
void closeData();
protected:
void resizeEvent(QResizeEvent *e);
private:
void RefreshList();
void RefreshItem(RDListViewItem *item);
void GetEncoderId();
RDListView *list_casts_view;
QPushButton *list_cart_button;
QPushButton *list_file_button;
QPushButton *list_edit_button;
QPushButton *list_delete_button;
QPushButton *list_report_button;
QPushButton *list_close_button;
QPixmap *list_redball_map;
QPixmap *list_greenball_map;
QPixmap *list_whiteball_map;
unsigned list_feed_id;
int list_encoder_id;
QLabel *list_filter_label;
QLineEdit *list_filter_edit;
QLabel *list_unexpired_label;
QCheckBox *list_unexpired_check;
QLabel *list_active_label;
QCheckBox *list_active_check;
QProgressDialog *list_progress_dialog;
RDFeed *list_feed;
};
#endif // LIST_CASTS_H

View File

@@ -0,0 +1,320 @@
// pick_report_date.cpp
//
// Select a Set of Dates for a Rivendell Report
//
// (C) Copyright 2002-2006 Fred Gleason <fredg@paravelsystems.com>
//
// $Id: pick_report_dates.cpp,v 1.5 2011/09/07 13:44:59 cvs Exp $
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2 as
// published by the Free Software Foundation.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public
// License along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
//
#include <qpushbutton.h>
#include <qlabel.h>
#include <qmessagebox.h>
#include <qfile.h>
#include <rddatedialog.h>
#include <rdreport.h>
#include <rddatedecode.h>
#include <rddb.h>
#include <rdtextfile.h>
#include <rdfeed.h>
#include <rdpodcast.h>
#include <globals.h>
#include <pick_report_dates.h>
PickReportDates::PickReportDates(unsigned feed_id,unsigned cast_id,
QWidget *parent,const char *name)
: QDialog(parent,name,true)
{
QString sql;
RDSqlQuery *q;
QDate yesterday_date=QDate::currentDate().addDays(-1);
edit_cast_id=feed_id;
edit_cast_id=cast_id;
setCaption(tr("Select Report Dates"));
sql=QString().sprintf("select KEY_NAME from FEEDS where ID=%d",feed_id);
q=new RDSqlQuery(sql);
if(q->first()) {
edit_keyname=q->value(0).toString();
}
delete q;
//
// Fix the Window Size
//
setMaximumWidth(sizeHint().width());
setMaximumHeight(sizeHint().height());
setMinimumWidth(sizeHint().width());
setMinimumHeight(sizeHint().height());
//
// Create Fonts
//
QFont bold_font=QFont("Helvetica",12,QFont::Bold);
bold_font.setPixelSize(12);
QFont font=QFont("Helvetica",12,QFont::Normal);
font.setPixelSize(12);
//
// Start Date
//
edit_startdate_edit=new QDateEdit(this,"edit_startdate_edit");
edit_startdate_edit->setGeometry(150,10,100,20);
edit_startdate_edit->setDate(yesterday_date.addMonths(-1));
QLabel *label=new QLabel(edit_startdate_edit,tr("&Start Date:"),
this,"edit_startdate_label");
label->setGeometry(75,10,70,20);
label->setFont(bold_font);
label->setAlignment(AlignRight|AlignVCenter|ShowPrefix);
QPushButton *button=new QPushButton(this,"startdate_button");
button->setGeometry(260,7,50,27);
button->setFont(font);
button->setText(tr("&Select"));
connect(button,SIGNAL(clicked()),this,SLOT(selectStartDateData()));
//
// End Date
//
edit_enddate_edit=new QDateEdit(this,"edit_enddate_edit");
edit_enddate_edit->setGeometry(150,40,100,20);
edit_enddate_edit->setDate(yesterday_date);
label=new QLabel(edit_enddate_edit,tr("&End Date:"),
this,"edit_enddate_label");
label->setGeometry(75,40,70,20);
label->setFont(bold_font);
label->setAlignment(AlignRight|AlignVCenter|ShowPrefix);
button=new QPushButton(this,"enddate_button");
button->setGeometry(260,37,50,27);
button->setFont(font);
button->setText(tr("&Select"));
connect(button,SIGNAL(clicked()),this,SLOT(selectEndDateData()));
//
// Generate Button
//
button=new QPushButton(this,"list_purge_button");
button->setGeometry(10,sizeHint().height()-60,80,50);
button->setFont(bold_font);
button->setText(tr("&Generate\nReport"));
connect(button,SIGNAL(clicked()),this,SLOT(generateData()));
//
// Close Button
//
button=new QPushButton(this,"close_button");
button->setGeometry(sizeHint().width()-90,sizeHint().height()-60,80,50);
button->setDefault(true);
button->setFont(bold_font);
button->setText(tr("C&lose"));
connect(button,SIGNAL(clicked()),this,SLOT(closeData()));
}
PickReportDates::~PickReportDates()
{
}
QSize PickReportDates::sizeHint() const
{
return QSize(400,134);
}
QSizePolicy PickReportDates::sizePolicy() const
{
return QSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed);
}
void PickReportDates::selectStartDateData()
{
RDDateDialog *dialog=new RDDateDialog(2002,QDate::currentDate().year(),this);
QDate date=edit_startdate_edit->date();
if(dialog->exec(&date)<0) {
delete dialog;
return;
}
edit_startdate_edit->setDate(date);
edit_enddate_edit->setDate(date);
delete dialog;
}
void PickReportDates::selectEndDateData()
{
RDDateDialog *dialog=new RDDateDialog(2002,QDate::currentDate().year(),this);
QDate date=edit_enddate_edit->date();
if(dialog->exec(&date)<0) {
delete dialog;
return;
}
edit_enddate_edit->setDate(date);
delete dialog;
}
void PickReportDates::generateData()
{
QString report;
if(edit_cast_id>0) {
GenerateEpisodeReport(edit_keyname,edit_cast_id,&report);
}
else {
GenerateSubscriptionReport(edit_keyname,&report);
}
RDTextFile(report);
}
void PickReportDates::closeData()
{
done(0);
}
void PickReportDates::GenerateSubscriptionReport(const QString &keyname,
QString *rpt)
{
QString sql;
RDSqlQuery *q;
RDFeed *feed=new RDFeed(keyname,this);
unsigned total=0;
unsigned rss_total=0;
unsigned audio_total=0;
//
// Header
//
*rpt+=" Rivendell Podcast Subscription Report\n";
QString title=feed->channelTitle();
for(unsigned i=0;i<((80-title.length())/2);i++) {
*rpt+=" ";
}
*rpt+=title;
*rpt+="\n\n";
*rpt+=" ----- Downloads -----\n";
*rpt+=" Date RSS Audio\n";
*rpt+=" ---------------------------------------------\n";
//
// Data Rows
//
QString keyname_esc=keyname;
keyname_esc.replace(" ","_");
sql=QString().sprintf("select ACCESS_DATE,ACCESS_COUNT,CAST_ID from %s_FLG \
where (ACCESS_DATE>=\"%s\")&&(ACCESS_DATE<=\"%s\") \
order by ACCESS_DATE,CAST_ID desc",
(const char *)keyname_esc,
(const char *)edit_startdate_edit->date().
toString("yyyy-MM-dd"),
(const char *)edit_enddate_edit->date().
toString("yyyy-MM-dd"));
q=new RDSqlQuery(sql);
while(q->next()) {
if(q->value(2).toUInt()==0) {
*rpt+=QString().sprintf(" %s %9u %9u\n",
(const char *)q->value(0).toDate().
toString("MM/dd/yyyy"),
q->value(1).toUInt(),total);
total=0;
rss_total+=q->value(1).toUInt();
}
else {
total+=q->value(1).toUInt();
audio_total+=q->value(1).toUInt();
}
}
delete q;
*rpt+=QString().sprintf(" ------------ ------------\n");
*rpt+=QString().sprintf(" %9u %9u\n",
rss_total,audio_total);
delete feed;
}
void PickReportDates::GenerateEpisodeReport(const QString &keyname,
unsigned cast_id,QString *rpt)
{
QString sql;
RDSqlQuery *q;
RDFeed *feed=new RDFeed(keyname,this);
RDPodcast *cast=new RDPodcast(cast_id);
//
// Header
//
*rpt+=" Rivendell Podcast Episode Report\n";
QString channel_title=feed->channelTitle();
for(unsigned i=0;i<((80-channel_title.length())/2);i++) {
*rpt+=" ";
}
*rpt+=channel_title;
*rpt+="\n";
QString item_title=cast->itemTitle();
for(unsigned i=0;i<((80-item_title.length())/2);i++) {
*rpt+=" ";
}
*rpt+=item_title;
*rpt+="\n";
*rpt+=QString().sprintf(" Posted on %s at %s\n\n",
(const char *)cast->originDateTime().
toString("MM/dd/yyyy"),
(const char *)cast->originDateTime().
toString("hh:mm:ss"));
*rpt+=" Date Downloads\n";
*rpt+=" --------------------------------\n";
//
// Data Rows
//
unsigned total=0;
QString keyname_esc=keyname;
keyname_esc.replace(" ","_");
sql=QString().sprintf("select ACCESS_DATE,ACCESS_COUNT from %s_FLG \
where (ACCESS_DATE>=\"%s\")&&(ACCESS_DATE<=\"%s\")&& \
(CAST_ID=%u) order by ACCESS_DATE",
(const char *)keyname_esc,
(const char *)edit_startdate_edit->date().
toString("yyyy-MM-dd"),
(const char *)edit_enddate_edit->date().
toString("yyyy-MM-dd"),
cast_id);
q=new RDSqlQuery(sql);
while(q->next()) {
*rpt+=QString().sprintf(" %s %9u\n",
(const char *)q->value(0).toDate().
toString("MM/dd/yyyy"),
q->value(1).toUInt());
total+=q->value(1).toUInt();
}
delete q;
*rpt+=QString().
sprintf(" ------------\n");
*rpt+=QString().
sprintf(" %9u\n",total);
delete cast;
delete feed;
}

View File

@@ -0,0 +1,60 @@
// pick_report_date.h
//
// Select a Set of Dates for a Rivendell Podcast Report
//
// (C) Copyright 2002-2007 Fred Gleason <fredg@paravelsystems.com>
//
// $Id: pick_report_dates.h,v 1.3 2010/07/29 19:32:36 cvs Exp $
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2 as
// published by the Free Software Foundation.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public
// License along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
//
#ifndef PICK_REPORT_DATE_H
#define PICK_REPORT_DATE_H
#include <qdialog.h>
#include <qsqldatabase.h>
#include <qcombobox.h>
#include <qdatetimeedit.h>
class PickReportDates : public QDialog
{
Q_OBJECT
public:
PickReportDates(unsigned feed_id,unsigned cast_id,
QWidget *parent=0,const char *name=0);
~PickReportDates();
QSize sizeHint() const;
QSizePolicy sizePolicy() const;
private slots:
void selectStartDateData();
void selectEndDateData();
void generateData();
void closeData();
private:
void GenerateSubscriptionReport(const QString &keyname,QString *rpt);
void GenerateEpisodeReport(const QString &keyname,unsigned cast_id,
QString *rpt);
QDateEdit *edit_startdate_edit;
QDateEdit *edit_enddate_edit;
QString edit_keyname;
unsigned edit_feed_id;
unsigned edit_cast_id;
};
#endif // PICK_REPORT_DATES_H

View File

@@ -0,0 +1,403 @@
// rdcastmanager.cpp
//
// A PodCast Management Utility for Rivendell.
//
// (C) Copyright 2002-2005 Fred Gleason <fredg@paravelsystems.com>
//
// $Id: rdcastmanager.cpp,v 1.15.4.3 2014/01/21 21:59:31 cvs Exp $
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2 as
// published by the Free Software Foundation.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public
// License along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
//
#ifndef WIN32
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#endif
#include <qapplication.h>
#include <qwindowsstyle.h>
#include <qwidget.h>
#include <qpushbutton.h>
#include <qlabel.h>
#include <qtextcodec.h>
#include <qtranslator.h>
#include <qsettings.h>
#include <qpainter.h>
#include <qmessagebox.h>
#include <rd.h>
#include <rdconf.h>
#include <rduser.h>
#include <rdripc.h>
#include <rdcastmanager.h>
#include <rdcmd_switch.h>
#include <rddb.h>
#include <rdpodcast.h>
#include <dbversion.h>
#include <list_casts.h>
#include <globals.h>
//
// Icons
//
#include "../icons/rivendell-22x22.xpm"
#include "../icons/greencheckmark.xpm"
#include "../icons/redx.xpm"
//
// Global Resources
//
QString cast_filter;
QString cast_group;
QString cast_schedcode;
RDUser *cast_user;
RDRipc *cast_ripc;
RDStation *rdstation_conf;
RDConfig *config;
RDSystem *cast_system=NULL;
MainWidget::MainWidget(QWidget *parent,const char *name,WFlags f)
:QMainWindow(parent,name,f)
{
QString str1;
QString str2;
bool skip_db_check=false;
unsigned schema=0;
//
// Read Command Options
//
RDCmdSwitch *cmd=
new RDCmdSwitch(qApp->argc(),qApp->argv(),"rdcastmanager","\n");
for(unsigned i=0;i<cmd->keys();i++) {
if(cmd->key(i)=="--skip-db-check") {
skip_db_check=true;
}
}
delete cmd;
//
// Fix the Window Size
//
setMinimumWidth(sizeHint().width());
setMinimumHeight(sizeHint().height());
//
// Load Local Configs
//
config=new RDConfig();
config->load();
str1=QString("RDCastManager")+" v"+VERSION+" - "+tr("Host");
str2=QString(tr("User: [Unknown]"));
setCaption(QString().sprintf("%s: %s, %s",(const char *)str1,
(const char *)config->stationName(),
(const char *)str2));
//
// Open Database
//
QString err;
QSqlDatabase *db=RDInitDb(&schema,&err);
if(!db) {
QMessageBox::warning(this,tr("Can't Connect"),err);
exit(0);
}
if((schema!=RD_VERSION_DATABASE)&&(!skip_db_check)) {
fprintf(stderr,
"rdcastmanager: database version mismatch, should be %u, is %u\n",
RD_VERSION_DATABASE,schema);
exit(256);
}
//
// RIPC Connection
//
#ifndef WIN32
cast_ripc=new RDRipc(config->stationName());
connect(cast_ripc,SIGNAL(userChanged()),this,SLOT(userChangedData()));
cast_ripc->connectHost("localhost",RIPCD_TCP_PORT,config->password());
#else
cast_ripc=NULL;
#endif // WIN32
//
// Station Configuration
//
rdstation_conf=new RDStation(config->stationName(),this);
cast_system=new RDSystem();
//
// User
//
#ifndef WIN32
cast_user=NULL;
#else
cast_user=new RDUser(RD_USER_LOGIN_NAME);
#endif // WIN32
//
// Create Fonts
//
QFont default_font("Helvetica",12,QFont::Normal);
default_font.setPixelSize(12);
qApp->setFont(default_font);
QFont button_font=QFont("Helvetica",12,QFont::Bold);
button_font.setPixelSize(12);
//
// Create Icons
//
cast_rivendell_map=new QPixmap(rivendell_xpm);
setIcon(*cast_rivendell_map);
cast_greencheckmark_map=new QPixmap(greencheckmark_xpm);
cast_redx_map=new QPixmap(redx_xpm);
//
// Feed List
//
cast_feed_list=new RDListView(this,"cast_feed_list");
cast_feed_list->setFont(default_font);
cast_feed_list->setAllColumnsShowFocus(true);
cast_feed_list->setItemMargin(5);
connect(cast_feed_list,
SIGNAL(doubleClicked(QListViewItem *,const QPoint &,int)),
this,
SLOT(feedDoubleclickedData(QListViewItem *,const QPoint &,int)));
cast_feed_list->addColumn("");
cast_feed_list->setColumnAlignment(0,Qt::AlignCenter);
cast_feed_list->addColumn(tr("Key Name"));
cast_feed_list->setColumnAlignment(1,Qt::AlignHCenter);
cast_feed_list->addColumn(tr("Feed Name"));
cast_feed_list->setColumnAlignment(2,Qt::AlignLeft);
cast_feed_list->addColumn(tr("Description"));
cast_feed_list->setColumnAlignment(3,Qt::AlignLeft);
cast_feed_list->addColumn(tr("Casts"));
cast_feed_list->setColumnAlignment(3,Qt::AlignCenter);
//
// Open Button
//
cast_open_button=new QPushButton(this,"cast_open_button");
cast_open_button->setFont(button_font);
cast_open_button->setText(tr("&View\nFeed"));
connect(cast_open_button,SIGNAL(clicked()),this,SLOT(openData()));
//
// Close Button
//
cast_close_button=new QPushButton(this,"cast_close_button");
cast_close_button->setFont(button_font);
cast_close_button->setText(tr("&Close"));
connect(cast_close_button,SIGNAL(clicked()),this,SLOT(quitMainWidget()));
}
QSize MainWidget::sizeHint() const
{
return QSize(640,480);
}
QSizePolicy MainWidget::sizePolicy() const
{
return QSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed);
}
void MainWidget::userChangedData()
{
QString str1;
QString str2;
if(cast_user!=NULL) {
delete cast_user;
}
str1=QString("RDCastManager")+" v"+VERSION+" - "+tr("Host");
str2=QString(tr("User"));
setCaption(QString().sprintf("%s: %s, %s: %s",(const char *)str1,
(const char *)config->stationName(),
(const char *)str2,
(const char *)cast_ripc->user()));
cast_user=new RDUser(cast_ripc->user());
RefreshList();
}
void MainWidget::openData()
{
RDListViewItem *item=(RDListViewItem *)cast_feed_list->selectedItem();
if(item==NULL) {
return;
}
ListCasts *casts=new ListCasts(item->id(),this);
casts->exec();
RefreshItem(item);
delete casts;
}
void MainWidget::feedDoubleclickedData(QListViewItem *,const QPoint &,int)
{
openData();
}
void MainWidget::quitMainWidget()
{
exit(0);
}
void MainWidget::resizeEvent(QResizeEvent *e)
{
cast_feed_list->setGeometry(10,10,size().width()-20,size().height()-70);
cast_open_button->setGeometry(10,size().height()-55,80,50);
cast_close_button->setGeometry(size().width()-90,size().height()-55,80,50);
}
void MainWidget::RefreshItem(RDListViewItem *item)
{
RDSqlQuery *q;
RDSqlQuery *q1;
QString sql;
int active=0;
int total=0;
sql=QString().sprintf("select CHANNEL_TITLE,CHANNEL_DESCRIPTION,ID \
from FEEDS where KEY_NAME=\"%s\"",
(const char *)item->text(1));
q=new RDSqlQuery(sql);
while(q->next()) {
sql=QString().sprintf("select STATUS from PODCASTS where FEED_ID=%u",
q->value(2).toUInt());
q1=new RDSqlQuery(sql);
while(q1->next()) {
total++;
switch((RDPodcast::Status)q1->value(0).toUInt()) {
case RDPodcast::StatusActive:
case RDPodcast::StatusExpired:
active++;
break;
case RDPodcast::StatusPending:
break;
}
}
delete q1;
if(active==total) {
item->setPixmap(0,*cast_greencheckmark_map);
}
else {
item->setPixmap(0,*cast_redx_map);
}
item->setText(2,q->value(0).toString());
item->setText(3,q->value(1).toString());
item->setText(4,QString().sprintf("%d / %d",active,total));
}
delete q;
}
void MainWidget::RefreshList()
{
RDSqlQuery *q;
QString sql;
int id=-1;
RDListViewItem *selected_item=NULL;
RDListViewItem *item=(RDListViewItem *)cast_feed_list->selectedItem();
if(item!=NULL) {
id=item->id();
}
cast_feed_list->clear();
sql=QString().sprintf("select KEY_NAME from FEED_PERMS \
where USER_NAME=\"%s\"",
(const char *)cast_user->name());
q=new RDSqlQuery(sql);
if(q->size()<=0) { // No valid feeds!
delete q;
return;
}
sql="select ID,KEY_NAME from FEEDS where ";
while(q->next()) {
sql+=QString().sprintf("(KEY_NAME=\"%s\")||",
(const char *)q->value(0).toString());
}
delete q;
sql=sql.left(sql.length()-2);
q=new RDSqlQuery(sql);
while(q->next()) {
item=new RDListViewItem(cast_feed_list);
item->setId(q->value(0).toInt());
item->setText(1,q->value(1).toString());
RefreshItem(item);
if(item->id()==id) {
selected_item=item;
}
}
delete q;
if(selected_item!=NULL) {
cast_feed_list->setSelected(selected_item,true);
cast_feed_list->ensureItemVisible(item);
}
}
int main(int argc,char *argv[])
{
QApplication a(argc,argv);
//
// Load Translations
//
QString tr_path;
QString qt_path;
#ifdef WIN32
QSettings settings;
settings.insertSearchPath(QSettings::Windows,"/SalemRadioLabs");
tr_path=QString().sprintf("%s\\",
(const char *)settings.
readEntry("/Rivendell/InstallDir"));
qt_path=tr_path;
#else
tr_path=QString(PREFIX)+QString("/share/rivendell/");
qt_path=QString(QTDIR)+QString("/translation/");
#endif // WIN32
QTranslator qt(0);
qt.load(qt_path+QString("qt_")+QTextCodec::locale(),".");
a.installTranslator(&qt);
QTranslator rd(0);
rd.load(tr_path+QString("librd_")+QTextCodec::locale(),".");
a.installTranslator(&rd);
QTranslator rdhpi(0);
rdhpi.load(tr_path+QString("librdhpi_")+QTextCodec::locale(),".");
a.installTranslator(&rdhpi);
QTranslator tr(0);
tr.load(tr_path+QString("rdcastmanager_")+QTextCodec::locale(),".");
a.installTranslator(&tr);
//
// Start Event Loop
//
MainWidget *w=new MainWidget(NULL,"main",0);
a.setMainWidget(w);
w->setGeometry(w->geometry().x(),w->geometry().y(),w->sizeHint().width(),w->sizeHint().height());
w->show();
return a.exec();
}

View File

@@ -0,0 +1,73 @@
// rdcastmanager.h
//
// A RSS Feed Management Utility for Rivendell.
//
// (C) Copyright 2002-2007 Fred Gleason <fredg@paravelsystems.com>
//
// $Id: rdcastmanager.h,v 1.6 2010/07/29 19:32:36 cvs Exp $
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2 as
// published by the Free Software Foundation.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public
// License along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
//
#ifndef RDCASTMANAGER_H
#define RDCASTMANAGER_H
#include <vector>
#include <qmainwindow.h>
#include <qsize.h>
#include <qsizepolicy.h>
#include <qsqldatabase.h>
#include <qpushbutton.h>
#include <qpixmap.h>
#include <rdlistview.h>
#include <rduser.h>
#include <rdripc.h>
#include <rdlibrary_conf.h>
#include <rdlog_line.h>
#include <rdconfig.h>
class MainWidget : public QMainWindow
{
Q_OBJECT
public:
MainWidget(QWidget *parent=0,const char *name=0,WFlags f=0);
QSize sizeHint() const;
QSizePolicy sizePolicy() const;
private slots:
void openData();
void userChangedData();
void feedDoubleclickedData(QListViewItem *item,const QPoint &pt,int col);
void quitMainWidget();
protected:
void resizeEvent(QResizeEvent *e);
private:
void RefreshItem(RDListViewItem *item);
void RefreshList();
RDListView *cast_feed_list;
QPixmap *cast_rivendell_map;
QPixmap *cast_greencheckmark_map;
QPixmap *cast_redx_map;
QPushButton *cast_open_button;
QPushButton *cast_close_button;
};
#endif // RDCASTMANAGER_H

View File

@@ -0,0 +1,59 @@
# rdcastmanager.pro
#
# The rdcastmanager/ QMake project file for Rivendell
#
# (C) Copyright 2003-2004 Fred Gleason <fredg@paravelsystems.com>
#
# $Id: rdcastmanager.pro,v 1.5.2.1 2013/01/01 21:36:30 cvs Exp $
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public
# License along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
TEMPLATE = app
TARGET = rdlogmanager
win32 {
DEFINES += WIN32
DEFINES += VERSION=\"$$[VERSION]\"
DEFINES += PACKAGE=\"rivendell\"
DEFINES += PACKAGE_VERSION=\"$$[VERSION]\"
DEFINES += PACKAGE_NAME=\"rivendell\"
DEFINES += PACKAGE_BUGREPORT=\"fredg@paravelsystems.com\"
}
SOURCES += rdcastmanager.cpp
SOURCES += edit_cast.cpp
SOURCES += list_casts.cpp
SOURCES += pick_report_dates.cpp
HEADERS += rdcastmanager.h
HEADERS += edit_cast.h
HEADERS += list_casts.h
HEADERS += pick_report_dates.h
RES_FILE += ..\icons\rivendell.res
INCLUDEPATH += ..\lib
LIBS = -lqui -L..\lib -llib
CONFIG += qt
TRANSLATIONS += rdcastmanager_cs.ts
TRANSLATIONS += rdcastmanager_de.ts
TRANSLATIONS += rdcastmanager_es.ts
TRANSLATIONS += rdcastmanager_fr.ts
TRANSLATIONS += rdcastmanager_nb.ts
TRANSLATIONS += rdcastmanager_nn.ts
TRANSLATIONS += rdcastmanager_pt_BR.ts

View File

@@ -0,0 +1,367 @@
<!DOCTYPE TS><TS>
<context>
<name>EditCast</name>
<message>
<source>Editing PodCast</source>
<translation>Upravit podcast</translation>
</message>
<message>
<source>Title:</source>
<translation>Název:</translation>
</message>
<message>
<source>Author E-Mail:</source>
<translation>Adresa el. pošty autora:</translation>
</message>
<message>
<source>Category:</source>
<translation>Skupina:</translation>
</message>
<message>
<source>Link URL:</source>
<translation>Adresa (URL) odkazu:</translation>
</message>
<message>
<source>Description:</source>
<translation>Popis:</translation>
</message>
<message>
<source>Source Text:</source>
<translation>Zdrojový text:</translation>
</message>
<message>
<source>Source URL:</source>
<translation>Adresa (URL) zdroje:</translation>
</message>
<message>
<source>Comments URL:</source>
<translation>Adresa (URL) poznámky:</translation>
</message>
<message>
<source>Posted At:</source>
<translation>Vyvěšeno:</translation>
</message>
<message>
<source>No</source>
<translation>Ne</translation>
</message>
<message>
<source>Yes</source>
<translation>Ano</translation>
</message>
<message>
<source>Cast Expires:</source>
<translation>Přestane platit:</translation>
</message>
<message>
<source>Expires At:</source>
<translation type="obsolete">Läuft ab am/um:</translation>
</message>
<message>
<source>&amp;Select</source>
<translation>&amp;Vybrat</translation>
</message>
<message>
<source>Hold</source>
<translation>Držet</translation>
</message>
<message>
<source>Active</source>
<translation>Činný</translation>
</message>
<message>
<source>Posting Status:</source>
<translation>Stav vyvěšení:</translation>
</message>
<message>
<source>Episode
&amp;Report</source>
<translation>&amp;Zpráva o
dílu</translation>
</message>
<message>
<source>&amp;OK</source>
<translation>&amp;OK</translation>
</message>
<message>
<source>&amp;Cancel</source>
<translation>Z&amp;rušit</translation>
</message>
<message>
<source>Air Date/Time:</source>
<translation>Datum/Čas poslání:</translation>
</message>
<message>
<source>Media Link:</source>
<translation>Multimediální odkaz:</translation>
</message>
<message>
<source>Expires On:</source>
<translation>Přestane platit:</translation>
</message>
</context>
<context>
<name>ListCasts</name>
<message>
<source>Podcast List</source>
<translation>Seznam podcastů</translation>
</message>
<message>
<source>Post From
Car&amp;t/Cut</source>
<translation>Vyvěsit z
vozí&amp;ku/záběru</translation>
</message>
<message>
<source>Post From
&amp;File</source>
<translation>Vyvěsit ze
&amp;souboru</translation>
</message>
<message>
<source>&amp;Edit</source>
<translation>&amp;Upravit</translation>
</message>
<message>
<source>&amp;Delete</source>
<translation>S&amp;mazat</translation>
</message>
<message>
<source>Subscription
&amp;Report</source>
<translation>Zpráva o
&amp;odběru</translation>
</message>
<message>
<source>&amp;Close</source>
<translation>&amp;Zavřít</translation>
</message>
<message>
<source></source>
<translation>Project-Id-Version: amarok
Report-Msgid-Bugs-To: http://bugs.kde.org
POT-Creation-Date: 2010-05-20 04:55+0200
PO-Revision-Date: 2010-05-22 09:34+0200
Last-Translator: Pavel Fric
Language-Team: Czech &lt;kde-i18n-doc@kde.org&gt;
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-Generator: Lokalize 1.0
Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n&gt;=2 &amp;&amp; n&lt;=4) ? 1 : 2;
</translation>
</message>
<message>
<source>Title</source>
<translation>Název</translation>
</message>
<message>
<source>Origin</source>
<translation>Původ</translation>
</message>
<message>
<source>Expires</source>
<translation>Přestane platit</translation>
</message>
<message>
<source>Length</source>
<translation>Délka</translation>
</message>
<message>
<source>Description</source>
<translation>Popis</translation>
</message>
<message>
<source>Category</source>
<translation>Skupina</translation>
</message>
<message>
<source>Link</source>
<translation>Odkaz</translation>
</message>
<message>
<source>Uploading Audio...</source>
<translation>Nahrává se zvuk...</translation>
</message>
<message>
<source>Progress</source>
<translation>Postup</translation>
</message>
<message>
<source>Format Error</source>
<translation type="obsolete">Formatfehler</translation>
</message>
<message>
<source>Unable to convert audio file!</source>
<translation type="obsolete">Kann die Audiodatei nicht konvertieren!</translation>
</message>
<message>
<source>Upload Error</source>
<translation type="obsolete">Fehler beim Hochladen</translation>
</message>
<message>
<source>Unable to upload audio file!</source>
<translation type="obsolete">Kann die Audiodatei nicht hochladen!</translation>
</message>
<message>
<source>Delete Podcast</source>
<translation>Smazat podcast</translation>
</message>
<message>
<source>Are you sure you want to delete this podcast?</source>
<translation>Opravdu chcete smazat tento podcast?</translation>
</message>
<message>
<source>Deleting Podcast...</source>
<translation>Maže se podcast...</translation>
</message>
<message>
<source>Internal Error</source>
<translation type="obsolete">Interner Fehler</translation>
</message>
<message>
<source>Unable to generate purge command!</source>
<translation type="obsolete">Kann den Löschbefehl nicht generieren!</translation>
</message>
<message>
<source>Remote Error</source>
<translation>Chyba u protistrany</translation>
</message>
<message>
<source>Unable to delete remote audio!
Continue deleting cast?</source>
<translation type="obsolete">Kann das entfernte Audio nicht Löschen!
Podcast trotzdem löschen?</translation>
</message>
<message>
<source>Never</source>
<translation>Nikdy</translation>
</message>
<message>
<source>File Error</source>
<translation type="obsolete">Dateifehler</translation>
</message>
<message>
<source>File does not exist!</source>
<translation type="obsolete">Datei existiert nicht!</translation>
</message>
<message>
<source>Cannot open file!</source>
<translation type="obsolete">Kann die Datei nicht öffnen!</translation>
</message>
<message>
<source>Unsupported file type!</source>
<translation type="obsolete">Nicht unterstützter Dateityp!</translation>
</message>
<message>
<source> </source>
<translation> </translation>
</message>
<message>
<source>Filter:</source>
<translation>Filtr:</translation>
</message>
<message>
<source>Only Show Unexpired Casts</source>
<translation>Ukázat jen podcasty, co platí</translation>
</message>
<message>
<source>Only Show Active Casts</source>
<translation>Ukázat jen činné podcasty</translation>
</message>
<message>
<source>Posting Error</source>
<translation>Chyba při vyvěšení</translation>
</message>
<message>
<source>Unable to delete remote audio!
</source>
<translation>Nelze smazat soubory se zvukem na jiném serveru!</translation>
</message>
<message>
<source>The server said: &quot;</source>
<translation>Server hlásí: &quot;</translation>
</message>
<message>
<source>Continue deleting cast?</source>
<translation>Pokračovat v mazání podcastu?</translation>
</message>
</context>
<context>
<name>MainWidget</name>
<message>
<source>RDCastManager - Host</source>
<translation type="obsolete">RDCastManager - Server</translation>
</message>
<message>
<source>User: [Unknown]</source>
<translation>Uživatel: [Neznámý]</translation>
</message>
<message>
<source>Can&apos;t Connect</source>
<translation>Nelze spojit</translation>
</message>
<message>
<source>Key Name</source>
<translation>Název klíče</translation>
</message>
<message>
<source>Feed Name</source>
<translation>Název přívodu</translation>
</message>
<message>
<source>Description</source>
<translation>Popis</translation>
</message>
<message>
<source>Casts</source>
<translation>Podcasty</translation>
</message>
<message>
<source>&amp;View
Feed</source>
<translation>&amp;Zobrazit
přívod</translation>
</message>
<message>
<source>&amp;Close</source>
<translation>&amp;Zavřít</translation>
</message>
<message>
<source>User</source>
<translation>Uživatel</translation>
</message>
<message>
<source>Host</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PickReportDates</name>
<message>
<source>Select Report Dates</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&amp;Start Date:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&amp;Select</source>
<translation type="unfinished">&amp;Vybrat</translation>
</message>
<message>
<source>&amp;End Date:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&amp;Generate
Report</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>C&amp;lose</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

View File

@@ -0,0 +1,356 @@
<!DOCTYPE TS><TS>
<context>
<name>EditCast</name>
<message>
<source>Editing PodCast</source>
<translation>Podcast editieren</translation>
</message>
<message>
<source>Title:</source>
<translation>Titel:</translation>
</message>
<message>
<source>Author E-Mail:</source>
<translation>eMail des Autors:</translation>
</message>
<message>
<source>Category:</source>
<translation>Kategorie:</translation>
</message>
<message>
<source>Link URL:</source>
<translation>Link URL:</translation>
</message>
<message>
<source>Description:</source>
<translation>Beschreibung:</translation>
</message>
<message>
<source>Source Text:</source>
<translation>Quelltext:</translation>
</message>
<message>
<source>Source URL:</source>
<translation>Quell-URL:</translation>
</message>
<message>
<source>Comments URL:</source>
<translation>Kommentar-URL:</translation>
</message>
<message>
<source>Posted At:</source>
<translation>Gepostet am:</translation>
</message>
<message>
<source>No</source>
<translation>Nein</translation>
</message>
<message>
<source>Yes</source>
<translation>Ja</translation>
</message>
<message>
<source>Cast Expires:</source>
<translation>Cast läuft ab:</translation>
</message>
<message>
<source>Expires At:</source>
<translation type="obsolete">Läuft ab am/um:</translation>
</message>
<message>
<source>&amp;Select</source>
<translation>&amp;Auswählen</translation>
</message>
<message>
<source>Hold</source>
<translation>Hold</translation>
</message>
<message>
<source>Active</source>
<translation>Aktiv</translation>
</message>
<message>
<source>Posting Status:</source>
<translation>Posting Status:</translation>
</message>
<message>
<source>Episode
&amp;Report</source>
<translation>Episoden-
&amp;Report</translation>
</message>
<message>
<source>&amp;OK</source>
<translation>&amp;OK</translation>
</message>
<message>
<source>&amp;Cancel</source>
<translation>Abbre&amp;chen</translation>
</message>
<message>
<source>Air Date/Time:</source>
<translation>Sendezeit/-Datum:</translation>
</message>
<message>
<source>Media Link:</source>
<translation>Medienlink:</translation>
</message>
<message>
<source>Expires On:</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ListCasts</name>
<message>
<source>Podcast List</source>
<translation>Podcastliste</translation>
</message>
<message>
<source>Post From
Car&amp;t/Cut</source>
<translation>Poste von
Car&amp;t/Cut</translation>
</message>
<message>
<source>Post From
&amp;File</source>
<translation>Poste von
&amp;Datei</translation>
</message>
<message>
<source>&amp;Edit</source>
<translation>&amp;Editieren</translation>
</message>
<message>
<source>&amp;Delete</source>
<translation>&amp;Löschen</translation>
</message>
<message>
<source>Subscription
&amp;Report</source>
<translation>Abonnement
&amp;Report</translation>
</message>
<message>
<source>&amp;Close</source>
<translation>S&amp;chliessen</translation>
</message>
<message>
<source></source>
<translation></translation>
</message>
<message>
<source>Title</source>
<translation>Titel</translation>
</message>
<message>
<source>Origin</source>
<translation>Herkunft</translation>
</message>
<message>
<source>Expires</source>
<translation>Läuf ab</translation>
</message>
<message>
<source>Length</source>
<translation>Länge</translation>
</message>
<message>
<source>Description</source>
<translation>Beschreibung</translation>
</message>
<message>
<source>Category</source>
<translation>Kategorie</translation>
</message>
<message>
<source>Link</source>
<translation>Link</translation>
</message>
<message>
<source>Uploading Audio...</source>
<translation>Lade Audio hoch...</translation>
</message>
<message>
<source>Progress</source>
<translation>Fortschritt</translation>
</message>
<message>
<source>Format Error</source>
<translation type="obsolete">Formatfehler</translation>
</message>
<message>
<source>Unable to convert audio file!</source>
<translation type="obsolete">Kann die Audiodatei nicht konvertieren!</translation>
</message>
<message>
<source>Upload Error</source>
<translation type="obsolete">Fehler beim Hochladen</translation>
</message>
<message>
<source>Unable to upload audio file!</source>
<translation type="obsolete">Kann die Audiodatei nicht hochladen!</translation>
</message>
<message>
<source>Delete Podcast</source>
<translation>Podcast löschen</translation>
</message>
<message>
<source>Are you sure you want to delete this podcast?</source>
<translation>Sind Sie sicher, daß sie diesen Podcast löschen wollen?</translation>
</message>
<message>
<source>Deleting Podcast...</source>
<translation>Lösche Podcast...</translation>
</message>
<message>
<source>Internal Error</source>
<translation type="obsolete">Interner Fehler</translation>
</message>
<message>
<source>Unable to generate purge command!</source>
<translation type="obsolete">Kann den Löschbefehl nicht generieren!</translation>
</message>
<message>
<source>Remote Error</source>
<translation>Fehler an Gegenstelle</translation>
</message>
<message>
<source>Unable to delete remote audio!
Continue deleting cast?</source>
<translation type="obsolete">Kann das entfernte Audio nicht Löschen!
Podcast trotzdem löschen?</translation>
</message>
<message>
<source>Never</source>
<translation>Nie</translation>
</message>
<message>
<source>File Error</source>
<translation type="obsolete">Dateifehler</translation>
</message>
<message>
<source>File does not exist!</source>
<translation type="obsolete">Datei existiert nicht!</translation>
</message>
<message>
<source>Cannot open file!</source>
<translation type="obsolete">Kann die Datei nicht öffnen!</translation>
</message>
<message>
<source>Unsupported file type!</source>
<translation type="obsolete">Nicht unterstützter Dateityp!</translation>
</message>
<message>
<source> </source>
<translation> </translation>
</message>
<message>
<source>Filter:</source>
<translation>Filter:</translation>
</message>
<message>
<source>Only Show Unexpired Casts</source>
<translation>Zeige nur nichtabgelaufene Casts</translation>
</message>
<message>
<source>Only Show Active Casts</source>
<translation>Zeige nur aktive Casts</translation>
</message>
<message>
<source>Posting Error</source>
<translation>Fehler beim posten</translation>
</message>
<message>
<source>Unable to delete remote audio!
</source>
<translation>Kann die Audiodatei(en) auf dem anderen Server nicht löschen!</translation>
</message>
<message>
<source>The server said: &quot;</source>
<translation>Der Server meldet: &quot;</translation>
</message>
<message>
<source>Continue deleting cast?</source>
<translation>Löschen des Podcasts fortsetzen?</translation>
</message>
</context>
<context>
<name>MainWidget</name>
<message>
<source>RDCastManager - Host</source>
<translation type="obsolete">RDCastManager - Host</translation>
</message>
<message>
<source>User: [Unknown]</source>
<translation>Benutzer: [Unbekannt]</translation>
</message>
<message>
<source>Can&apos;t Connect</source>
<translation>Kann mich nicht verbinden</translation>
</message>
<message>
<source>Key Name</source>
<translation>Schlüsselname</translation>
</message>
<message>
<source>Feed Name</source>
<translation>Feedname</translation>
</message>
<message>
<source>Description</source>
<translation>Beschreibung</translation>
</message>
<message>
<source>Casts</source>
<translation>Casts</translation>
</message>
<message>
<source>&amp;View
Feed</source>
<translation>&amp;Zeige
Feed</translation>
</message>
<message>
<source>&amp;Close</source>
<translation>S&amp;chliessen</translation>
</message>
<message>
<source>User</source>
<translation>Benutzer</translation>
</message>
<message>
<source>Host</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PickReportDates</name>
<message>
<source>Select Report Dates</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&amp;Start Date:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&amp;Select</source>
<translation type="unfinished">&amp;Auswählen</translation>
</message>
<message>
<source>&amp;End Date:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&amp;Generate
Report</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>C&amp;lose</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

View File

@@ -0,0 +1,307 @@
<!DOCTYPE TS><TS>
<context>
<name>EditCast</name>
<message>
<source>Editing PodCast</source>
<translation>Editando PodCast</translation>
</message>
<message>
<source>Title:</source>
<translation>Título:</translation>
</message>
<message>
<source>Category:</source>
<translation>Categoría:</translation>
</message>
<message>
<source>Description:</source>
<translation>Descripción:</translation>
</message>
<message>
<source>Posted At:</source>
<translation>Colocado el:</translation>
</message>
<message>
<source>No</source>
<translation>No</translation>
</message>
<message>
<source>Yes</source>
<translation></translation>
</message>
<message>
<source>Cast Expires:</source>
<translation>Expira:</translation>
</message>
<message>
<source>&amp;Select</source>
<translation>&amp;Elegir</translation>
</message>
<message>
<source>Hold</source>
<translation>Mantener</translation>
</message>
<message>
<source>Active</source>
<translation>Activo</translation>
</message>
<message>
<source>Posting Status:</source>
<translation>Estado del Post:</translation>
</message>
<message>
<source>&amp;OK</source>
<translation>&amp;Aceptar</translation>
</message>
<message>
<source>&amp;Cancel</source>
<translation>&amp;Cancelar</translation>
</message>
<message>
<source>Author E-Mail:</source>
<translation>E-Mail del autor:</translation>
</message>
<message>
<source>Link URL:</source>
<translation>URL del artículo:</translation>
</message>
<message>
<source>Comments URL:</source>
<translation>URL comentarios:</translation>
</message>
<message>
<source>Source Text:</source>
<translation>Texto fuente:</translation>
</message>
<message>
<source>Source URL:</source>
<translation>URL fuente:</translation>
</message>
<message>
<source>Episode
&amp;Report</source>
<translation>&amp;Reporte de
Episodios</translation>
</message>
<message>
<source>Air Date/Time:</source>
<translation>Fecha/Ho al aire:</translation>
</message>
<message>
<source>Media Link:</source>
<translation>Enlace al medio:</translation>
</message>
<message>
<source>Expires On:</source>
<translation>Expira el:</translation>
</message>
</context>
<context>
<name>ListCasts</name>
<message>
<source>&amp;Edit</source>
<translation>&amp;Editar</translation>
</message>
<message>
<source>&amp;Close</source>
<translation>&amp;Cerrar</translation>
</message>
<message>
<source></source>
<translation></translation>
</message>
<message>
<source>Title</source>
<translation>Título</translation>
</message>
<message>
<source>Origin</source>
<translation>Origen</translation>
</message>
<message>
<source>Expires</source>
<translation>Expira</translation>
</message>
<message>
<source>Description</source>
<translation>Descripción</translation>
</message>
<message>
<source>Category</source>
<translation>Categoría</translation>
</message>
<message>
<source>Link</source>
<translation>Enlace</translation>
</message>
<message>
<source>Never</source>
<translation>Nunca</translation>
</message>
<message>
<source>Podcast List</source>
<translation>Lista de Podcasts</translation>
</message>
<message>
<source>Post From
Car&amp;t/Cut</source>
<translation>Publicar de
Car&amp;t./Audio</translation>
</message>
<message>
<source>Post From
&amp;File</source>
<translation>Publicar de
&amp;Archivo</translation>
</message>
<message>
<source>Uploading Audio...</source>
<translation>Subiendo Audio...</translation>
</message>
<message>
<source>Progress</source>
<translation>Progreso</translation>
</message>
<message>
<source>&amp;Delete</source>
<translation>&amp;Borrar</translation>
</message>
<message>
<source>Length</source>
<translation>Longitud</translation>
</message>
<message>
<source>Subscription
&amp;Report</source>
<translation>&amp;Reporte de
Suscripción</translation>
</message>
<message>
<source> </source>
<translation></translation>
</message>
<message>
<source>Filter:</source>
<translation>Filtro:</translation>
</message>
<message>
<source>Only Show Unexpired Casts</source>
<translation>Sólo Mostrar sin Expirar</translation>
</message>
<message>
<source>Only Show Active Casts</source>
<translation>Sólo mostrar activos</translation>
</message>
<message>
<source>Posting Error</source>
<translation>Error de Post</translation>
</message>
<message>
<source>Delete Podcast</source>
<translation>Borrar Podcast</translation>
</message>
<message>
<source>Are you sure you want to delete this podcast?</source>
<translation>¿Está seguro de borrar este Podcast?</translation>
</message>
<message>
<source>Deleting Podcast...</source>
<translation>Eliminando Podcast...</translation>
</message>
<message>
<source>Remote Error</source>
<translation>Error remoto</translation>
</message>
<message>
<source>Unable to delete remote audio!
</source>
<translation>¡No fue posible eliminar audio remoto!
</translation>
</message>
<message>
<source>The server said: &quot;</source>
<translation>El servidor dio el error: &quot;</translation>
</message>
<message>
<source>Continue deleting cast?</source>
<translation> ¿Continuar eliminando podcasts?</translation>
</message>
</context>
<context>
<name>MainWidget</name>
<message>
<source>RDCastManager - Host</source>
<translation type="obsolete">RDCastManager - Equipo </translation>
</message>
<message>
<source>User: [Unknown]</source>
<translation>Usuario: [Desconocido]</translation>
</message>
<message>
<source>Can&apos;t Connect</source>
<translation>No puedo conectarme</translation>
</message>
<message>
<source>Key Name</source>
<translation>Nombre Clave</translation>
</message>
<message>
<source>Feed Name</source>
<translation>Nombre del Feed</translation>
</message>
<message>
<source>Description</source>
<translation>Descripción</translation>
</message>
<message>
<source>Casts</source>
<translation>Podcasts</translation>
</message>
<message>
<source>&amp;Close</source>
<translation>&amp;Cerrar</translation>
</message>
<message>
<source>User</source>
<translation>Usuario</translation>
</message>
<message>
<source>&amp;View
Feed</source>
<translation>&amp;Ver Feed</translation>
</message>
<message>
<source>Host</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PickReportDates</name>
<message>
<source>Select Report Dates</source>
<translation>Elegir Fechas del Reporte</translation>
</message>
<message>
<source>&amp;Start Date:</source>
<translation>Fech. &amp;Inicio:</translation>
</message>
<message>
<source>&amp;Select</source>
<translation>&amp;Elegir</translation>
</message>
<message>
<source>&amp;End Date:</source>
<translation>Fech. &amp;Fin:</translation>
</message>
<message>
<source>&amp;Generate
Report</source>
<translation>&amp;Generar
Reporte</translation>
</message>
<message>
<source>C&amp;lose</source>
<translation>&amp;Cerrar</translation>
</message>
</context>
</TS>

View File

@@ -0,0 +1,297 @@
<!DOCTYPE TS><TS>
<context>
<name>EditCast</name>
<message>
<source>Editing PodCast</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Title:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Author E-Mail:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Category:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Link URL:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Description:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Source Text:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Source URL:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Comments URL:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Posted At:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>No</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Yes</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Cast Expires:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&amp;Select</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Hold</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Active</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Posting Status:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Episode
&amp;Report</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&amp;OK</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&amp;Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Air Date/Time:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Media Link:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Expires On:</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ListCasts</name>
<message>
<source>Podcast List</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Post From
Car&amp;t/Cut</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Post From
&amp;File</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&amp;Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&amp;Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Subscription
&amp;Report</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&amp;Close</source>
<translation type="unfinished"></translation>
</message>
<message>
<source></source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Title</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Origin</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Expires</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Length</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Description</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Category</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Link</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Uploading Audio...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Progress</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Never</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> </source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Filter:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Only Show Unexpired Casts</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Only Show Active Casts</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Posting Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Delete Podcast</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Are you sure you want to delete this podcast?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Deleting Podcast...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Remote Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unable to delete remote audio!
</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The server said: &quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Continue deleting cast?</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MainWidget</name>
<message>
<source>User: [Unknown]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Can&apos;t Connect</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Key Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Feed Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Description</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Casts</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&amp;View
Feed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&amp;Close</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>User</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Host</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PickReportDates</name>
<message>
<source>Select Report Dates</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&amp;Start Date:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&amp;Select</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&amp;End Date:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&amp;Generate
Report</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>C&amp;lose</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

View File

@@ -0,0 +1,355 @@
<!DOCTYPE TS><TS>
<context>
<name>EditCast</name>
<message>
<source>Editing PodCast</source>
<translation>Redigerer podkast</translation>
</message>
<message>
<source>Title:</source>
<translation>Tittel:</translation>
</message>
<message>
<source>Author E-Mail:</source>
<translation>E-post til forfattaren:</translation>
</message>
<message>
<source>Category:</source>
<translation>Kategori:</translation>
</message>
<message>
<source>Link URL:</source>
<translation>Lenkjeadresse:</translation>
</message>
<message>
<source>Description:</source>
<translation>Skildring:</translation>
</message>
<message>
<source>Source Text:</source>
<translation>Kjeldetekst:</translation>
</message>
<message>
<source>Source URL:</source>
<translation>Kjeldeadresse:</translation>
</message>
<message>
<source>Comments URL:</source>
<translation>Kommentaradresse:</translation>
</message>
<message>
<source>Posted At:</source>
<translation>Lagt inn:</translation>
</message>
<message>
<source>No</source>
<translation>Nei</translation>
</message>
<message>
<source>Yes</source>
<translation>Ja</translation>
</message>
<message>
<source>Cast Expires:</source>
<translation>Podkasten går ut:</translation>
</message>
<message>
<source>Expires At:</source>
<translation type="obsolete">Går ut:</translation>
</message>
<message>
<source>&amp;Select</source>
<translation>&amp;Vel</translation>
</message>
<message>
<source>Hold</source>
<translation>Hald</translation>
</message>
<message>
<source>Active</source>
<translation>Aktiv</translation>
</message>
<message>
<source>Posting Status:</source>
<translation>Postestatus:</translation>
</message>
<message>
<source>Episode
&amp;Report</source>
<translation>Episode-
&amp;rapport</translation>
</message>
<message>
<source>&amp;OK</source>
<translation>&amp;OK</translation>
</message>
<message>
<source>&amp;Cancel</source>
<translation>&amp;Avbryt</translation>
</message>
<message>
<source>Media Link:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Air Date/Time:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Expires On:</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ListCasts</name>
<message>
<source>Podcast List</source>
<translation>Podkastliste</translation>
</message>
<message>
<source>Post From
Car&amp;t/Cut</source>
<translation>Post frå
Korg/Ku&amp;tt</translation>
</message>
<message>
<source>Post From
&amp;File</source>
<translation>Post frå
&amp;fil</translation>
</message>
<message>
<source>&amp;Edit</source>
<translation>R&amp;ediger</translation>
</message>
<message>
<source>&amp;Delete</source>
<translation>&amp;Slett</translation>
</message>
<message>
<source>Subscription
&amp;Report</source>
<translation>Abonnements&amp;rapport</translation>
</message>
<message>
<source>&amp;Close</source>
<translation>&amp;Lukk</translation>
</message>
<message>
<source> </source>
<translation> </translation>
</message>
<message>
<source>Title</source>
<translation>Tittel</translation>
</message>
<message>
<source>Origin</source>
<translation>Opphav</translation>
</message>
<message>
<source>Expires</source>
<translation>Går ut</translation>
</message>
<message>
<source>Length</source>
<translation>Lengd</translation>
</message>
<message>
<source>Description</source>
<translation>Skildring</translation>
</message>
<message>
<source>Category</source>
<translation>Kategori</translation>
</message>
<message>
<source>Link</source>
<translation>Lenkje</translation>
</message>
<message>
<source>&amp;Casts:</source>
<translation type="obsolete">&amp;Kastar:</translation>
</message>
<message>
<source>Uploading Audio...</source>
<translation>Lastar opp lyd...</translation>
</message>
<message>
<source>Progress</source>
<translation>Framgang</translation>
</message>
<message>
<source>Format Error</source>
<translation type="obsolete">Formatfeil</translation>
</message>
<message>
<source>Unable to convert audio file!</source>
<translation type="obsolete">Greidde ikkje koda om lydfila!</translation>
</message>
<message>
<source>Upload Error</source>
<translation type="obsolete">Opplastingsfeil</translation>
</message>
<message>
<source>Unable to upload audio file!</source>
<translation type="obsolete">Greidde ikkje lasta opp lydfila!</translation>
</message>
<message>
<source>Delete Podcast</source>
<translation type="unfinished">Slett podkast</translation>
</message>
<message>
<source>Are you sure you want to delete this podcast?</source>
<translation type="unfinished">Er du sikker at du vil sletta denne podkasten?</translation>
</message>
<message>
<source>Deleting Podcast...</source>
<translation type="unfinished">Slettar podkast...</translation>
</message>
<message>
<source>Internal Error</source>
<translation type="obsolete">Intern feil</translation>
</message>
<message>
<source>Unable to generate purge command!</source>
<translation type="obsolete">Greidde ikkje laga tømmekommando!</translation>
</message>
<message>
<source>Remote Error</source>
<translation type="unfinished">Ekstern feil</translation>
</message>
<message>
<source>Unable to delete remote audio!
Continue deleting cast?</source>
<translation type="obsolete">Greidde ikkje sletta ekstern lyd!
Vil du halda fram med å sletta podkasten?</translation>
</message>
<message>
<source>Never</source>
<translation>Aldri</translation>
</message>
<message>
<source>File Error</source>
<translation type="obsolete">Filfeil</translation>
</message>
<message>
<source>File does not exist!</source>
<translation type="obsolete">Fila finst ikkje!</translation>
</message>
<message>
<source>Cannot open file!</source>
<translation type="obsolete">Greier ikkje opna fila!</translation>
</message>
<message>
<source>Unsupported file type!</source>
<translation type="obsolete">Filtypen er ikkje støtta!</translation>
</message>
<message>
<source>Filter:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Only Show Unexpired Casts</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Only Show Active Casts</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Posting Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unable to delete remote audio!
</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The server said: &quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Continue deleting cast?</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MainWidget</name>
<message>
<source>RDCastManager - Host</source>
<translation type="obsolete">RDCastManager - Vert</translation>
</message>
<message>
<source>User: [Unknown]</source>
<translation>Brukar: [Ukjend]</translation>
</message>
<message>
<source>Can&apos;t Connect</source>
<translation>Greier ikkje kopla til</translation>
</message>
<message>
<source>Key Name</source>
<translation>Lykjelnamn</translation>
</message>
<message>
<source>Feed Name</source>
<translation>Straumnamn</translation>
</message>
<message>
<source>Description</source>
<translation>Skildring</translation>
</message>
<message>
<source>Casts</source>
<translation>Kastar</translation>
</message>
<message>
<source>&amp;View
Feed</source>
<translation>&amp;Sjå
straum</translation>
</message>
<message>
<source>&amp;Close</source>
<translation>&amp;Lukk</translation>
</message>
<message>
<source>User</source>
<translation>Brukar</translation>
</message>
<message>
<source>Host</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PickReportDates</name>
<message>
<source>Select Report Dates</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&amp;Start Date:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&amp;Select</source>
<translation type="unfinished">&amp;Vel</translation>
</message>
<message>
<source>&amp;End Date:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&amp;Generate
Report</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>C&amp;lose</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

View File

@@ -0,0 +1,355 @@
<!DOCTYPE TS><TS>
<context>
<name>EditCast</name>
<message>
<source>Editing PodCast</source>
<translation>Redigerer podkast</translation>
</message>
<message>
<source>Title:</source>
<translation>Tittel:</translation>
</message>
<message>
<source>Author E-Mail:</source>
<translation>E-post til forfattaren:</translation>
</message>
<message>
<source>Category:</source>
<translation>Kategori:</translation>
</message>
<message>
<source>Link URL:</source>
<translation>Lenkjeadresse:</translation>
</message>
<message>
<source>Description:</source>
<translation>Skildring:</translation>
</message>
<message>
<source>Source Text:</source>
<translation>Kjeldetekst:</translation>
</message>
<message>
<source>Source URL:</source>
<translation>Kjeldeadresse:</translation>
</message>
<message>
<source>Comments URL:</source>
<translation>Kommentaradresse:</translation>
</message>
<message>
<source>Posted At:</source>
<translation>Lagt inn:</translation>
</message>
<message>
<source>No</source>
<translation>Nei</translation>
</message>
<message>
<source>Yes</source>
<translation>Ja</translation>
</message>
<message>
<source>Cast Expires:</source>
<translation>Podkasten går ut:</translation>
</message>
<message>
<source>Expires At:</source>
<translation type="obsolete">Går ut:</translation>
</message>
<message>
<source>&amp;Select</source>
<translation>&amp;Vel</translation>
</message>
<message>
<source>Hold</source>
<translation>Hald</translation>
</message>
<message>
<source>Active</source>
<translation>Aktiv</translation>
</message>
<message>
<source>Posting Status:</source>
<translation>Postestatus:</translation>
</message>
<message>
<source>Episode
&amp;Report</source>
<translation>Episode-
&amp;rapport</translation>
</message>
<message>
<source>&amp;OK</source>
<translation>&amp;OK</translation>
</message>
<message>
<source>&amp;Cancel</source>
<translation>&amp;Avbryt</translation>
</message>
<message>
<source>Media Link:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Air Date/Time:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Expires On:</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ListCasts</name>
<message>
<source>Podcast List</source>
<translation>Podkastliste</translation>
</message>
<message>
<source>Post From
Car&amp;t/Cut</source>
<translation>Post frå
Korg/Ku&amp;tt</translation>
</message>
<message>
<source>Post From
&amp;File</source>
<translation>Post frå
&amp;fil</translation>
</message>
<message>
<source>&amp;Edit</source>
<translation>R&amp;ediger</translation>
</message>
<message>
<source>&amp;Delete</source>
<translation>&amp;Slett</translation>
</message>
<message>
<source>Subscription
&amp;Report</source>
<translation>Abonnements&amp;rapport</translation>
</message>
<message>
<source>&amp;Close</source>
<translation>&amp;Lukk</translation>
</message>
<message>
<source> </source>
<translation> </translation>
</message>
<message>
<source>Title</source>
<translation>Tittel</translation>
</message>
<message>
<source>Origin</source>
<translation>Opphav</translation>
</message>
<message>
<source>Expires</source>
<translation>Går ut</translation>
</message>
<message>
<source>Length</source>
<translation>Lengd</translation>
</message>
<message>
<source>Description</source>
<translation>Skildring</translation>
</message>
<message>
<source>Category</source>
<translation>Kategori</translation>
</message>
<message>
<source>Link</source>
<translation>Lenkje</translation>
</message>
<message>
<source>&amp;Casts:</source>
<translation type="obsolete">&amp;Kastar:</translation>
</message>
<message>
<source>Uploading Audio...</source>
<translation>Lastar opp lyd...</translation>
</message>
<message>
<source>Progress</source>
<translation>Framgang</translation>
</message>
<message>
<source>Format Error</source>
<translation type="obsolete">Formatfeil</translation>
</message>
<message>
<source>Unable to convert audio file!</source>
<translation type="obsolete">Greidde ikkje koda om lydfila!</translation>
</message>
<message>
<source>Upload Error</source>
<translation type="obsolete">Opplastingsfeil</translation>
</message>
<message>
<source>Unable to upload audio file!</source>
<translation type="obsolete">Greidde ikkje lasta opp lydfila!</translation>
</message>
<message>
<source>Delete Podcast</source>
<translation type="unfinished">Slett podkast</translation>
</message>
<message>
<source>Are you sure you want to delete this podcast?</source>
<translation type="unfinished">Er du sikker at du vil sletta denne podkasten?</translation>
</message>
<message>
<source>Deleting Podcast...</source>
<translation type="unfinished">Slettar podkast...</translation>
</message>
<message>
<source>Internal Error</source>
<translation type="obsolete">Intern feil</translation>
</message>
<message>
<source>Unable to generate purge command!</source>
<translation type="obsolete">Greidde ikkje laga tømmekommando!</translation>
</message>
<message>
<source>Remote Error</source>
<translation type="unfinished">Ekstern feil</translation>
</message>
<message>
<source>Unable to delete remote audio!
Continue deleting cast?</source>
<translation type="obsolete">Greidde ikkje sletta ekstern lyd!
Vil du halda fram med å sletta podkasten?</translation>
</message>
<message>
<source>Never</source>
<translation>Aldri</translation>
</message>
<message>
<source>File Error</source>
<translation type="obsolete">Filfeil</translation>
</message>
<message>
<source>File does not exist!</source>
<translation type="obsolete">Fila finst ikkje!</translation>
</message>
<message>
<source>Cannot open file!</source>
<translation type="obsolete">Greier ikkje opna fila!</translation>
</message>
<message>
<source>Unsupported file type!</source>
<translation type="obsolete">Filtypen er ikkje støtta!</translation>
</message>
<message>
<source>Filter:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Only Show Unexpired Casts</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Only Show Active Casts</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Posting Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unable to delete remote audio!
</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The server said: &quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Continue deleting cast?</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MainWidget</name>
<message>
<source>RDCastManager - Host</source>
<translation type="obsolete">RDCastManager - Vert</translation>
</message>
<message>
<source>User: [Unknown]</source>
<translation>Brukar: [Ukjend]</translation>
</message>
<message>
<source>Can&apos;t Connect</source>
<translation>Greier ikkje kopla til</translation>
</message>
<message>
<source>Key Name</source>
<translation>Lykjelnamn</translation>
</message>
<message>
<source>Feed Name</source>
<translation>Straumnamn</translation>
</message>
<message>
<source>Description</source>
<translation>Skildring</translation>
</message>
<message>
<source>Casts</source>
<translation>Kastar</translation>
</message>
<message>
<source>&amp;View
Feed</source>
<translation>&amp;Sjå
straum</translation>
</message>
<message>
<source>&amp;Close</source>
<translation>&amp;Lukk</translation>
</message>
<message>
<source>User</source>
<translation>Brukar</translation>
</message>
<message>
<source>Host</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PickReportDates</name>
<message>
<source>Select Report Dates</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&amp;Start Date:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&amp;Select</source>
<translation type="unfinished">&amp;Vel</translation>
</message>
<message>
<source>&amp;End Date:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&amp;Generate
Report</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>C&amp;lose</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

View File

@@ -0,0 +1,321 @@
<!DOCTYPE TS><TS>
<context>
<name>EditCast</name>
<message>
<source>Editing PodCast</source>
<translation>Editando Podcast</translation>
</message>
<message>
<source>Media Link:</source>
<translation>Link de Mídia:</translation>
</message>
<message>
<source>Title:</source>
<translation>Título:</translation>
</message>
<message>
<source>Author E-Mail:</source>
<translation>E-mail do autor:</translation>
</message>
<message>
<source>Category:</source>
<translation>Categoria:</translation>
</message>
<message>
<source>Link URL:</source>
<translation>Link URL:</translation>
</message>
<message>
<source>Description:</source>
<translation>Descrição:</translation>
</message>
<message>
<source>Source Text:</source>
<translation>Texto Fonte:</translation>
</message>
<message>
<source>Source URL:</source>
<translation>Fonte URL:</translation>
</message>
<message>
<source>Comments URL:</source>
<translation>Comentários da URL:</translation>
</message>
<message>
<source>Air Date/Time:</source>
<translation>Ar Data/Hora:</translation>
</message>
<message>
<source>&amp;Select</source>
<translation>&amp;Selecionar</translation>
</message>
<message>
<source>Posted At:</source>
<translation>Postado em:</translation>
</message>
<message>
<source>No</source>
<translation>Não</translation>
</message>
<message>
<source>Yes</source>
<translation>Sim</translation>
</message>
<message>
<source>Cast Expires:</source>
<translation>Cast Expira:</translation>
</message>
<message>
<source>Expires At:</source>
<translation type="obsolete">Expira em:</translation>
</message>
<message>
<source>Hold</source>
<translation>Espere</translation>
</message>
<message>
<source>Active</source>
<translation>Ativo</translation>
</message>
<message>
<source>Posting Status:</source>
<translation>Publicação:</translation>
</message>
<message>
<source>Episode
&amp;Report</source>
<translation>&amp;Relatório do
Episódio</translation>
</message>
<message>
<source>&amp;OK</source>
<translation>&amp;OK</translation>
</message>
<message>
<source>&amp;Cancel</source>
<translation>&amp;Cancelar</translation>
</message>
<message>
<source>Expires On:</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ListCasts</name>
<message>
<source>Podcast List</source>
<translation>Lista de POdcast</translation>
</message>
<message>
<source>Uploading Audio...</source>
<translation>Áudio Uploading...</translation>
</message>
<message>
<source>Progress</source>
<translation>Progresso</translation>
</message>
<message>
<source>Filter:</source>
<translation>Filtro:</translation>
</message>
<message>
<source>Only Show Unexpired Casts</source>
<translation>Mostrar Casts não expirados</translation>
</message>
<message>
<source>Only Show Active Casts</source>
<translation>Mostrar Casts Ativos</translation>
</message>
<message>
<source> </source>
<translation>
</translation>
</message>
<message>
<source>Title</source>
<translation>Título</translation>
</message>
<message>
<source>Origin</source>
<translation>Origem</translation>
</message>
<message>
<source>Expires</source>
<translation>Expira</translation>
</message>
<message>
<source>Length</source>
<translation>Duração</translation>
</message>
<message>
<source>Description</source>
<translation>Descrição</translation>
</message>
<message>
<source>Category</source>
<translation>Categoria</translation>
</message>
<message>
<source>Link</source>
<translation>Link</translation>
</message>
<message>
<source>Post From
Car&amp;t/Cut</source>
<translation>Postar
&amp;Cartão</translation>
</message>
<message>
<source>Post From
&amp;File</source>
<translation>Postar
&amp;Arquivo</translation>
</message>
<message>
<source>&amp;Edit</source>
<translation>&amp;Editar</translation>
</message>
<message>
<source>&amp;Delete</source>
<translation>&amp;Deletar</translation>
</message>
<message>
<source>Subscription
&amp;Report</source>
<translation>&amp;Relatório de
Assinaturas</translation>
</message>
<message>
<source>&amp;Close</source>
<translation>&amp;Fechar</translation>
</message>
<message>
<source>Posting Error</source>
<translation>Erro na Postagem</translation>
</message>
<message>
<source>Delete Podcast</source>
<translation>Deletar PodCast</translation>
</message>
<message>
<source>Are you sure you want to delete this podcast?</source>
<translation>Tem certeza que você quer deletar este podcast?</translation>
</message>
<message>
<source>Deleting Podcast...</source>
<translation>Deletando Podcast...</translation>
</message>
<message>
<source>Internal Error</source>
<translation type="obsolete">Erro Interno</translation>
</message>
<message>
<source>Unable to generate purge command!</source>
<translation type="obsolete">Não foi Possível gerar comando para eliminar!</translation>
</message>
<message>
<source>Remote Error</source>
<translation>Erro Remoto</translation>
</message>
<message>
<source>Unable to delete remote audio!
Continue deleting cast?</source>
<translation type="obsolete">Não foi possível deletar áudio remoto!
Continuar deletando cast?</translation>
</message>
<message>
<source>Never</source>
<translation>Nunca</translation>
</message>
<message>
<source>Unable to delete remote audio!
</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The server said: &quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Continue deleting cast?</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MainWidget</name>
<message>
<source>RDCastManager - Host</source>
<translation type="obsolete">RDPodcast - Cliente</translation>
</message>
<message>
<source>User: [Unknown]</source>
<translation>Usuário: [Desconhecido] </translation>
</message>
<message>
<source>Can&apos;t Connect</source>
<translation>Não foi possível conectar</translation>
</message>
<message>
<source>Key Name</source>
<translation>Nome chave</translation>
</message>
<message>
<source>Feed Name</source>
<translation>Nome do Feed</translation>
</message>
<message>
<source>Description</source>
<translation>Descrição</translation>
</message>
<message>
<source>Casts</source>
<translation>Casts</translation>
</message>
<message>
<source>&amp;View
Feed</source>
<translation>&amp;Ver
Feed</translation>
</message>
<message>
<source>&amp;Close</source>
<translation>&amp;Fechar</translation>
</message>
<message>
<source>User</source>
<translation>Usuário</translation>
</message>
<message>
<source>Host</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PickReportDates</name>
<message>
<source>Select Report Dates</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&amp;Start Date:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&amp;Select</source>
<translation type="unfinished">&amp;Selecionar</translation>
</message>
<message>
<source>&amp;End Date:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&amp;Generate
Report</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>C&amp;lose</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>