Merge branch 'develop' into issue-49

This commit is contained in:
daniel oeh
2012-12-22 23:11:02 +01:00
30 changed files with 915 additions and 488 deletions

View File

@ -1,14 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest package="de.danoeh.antennapod"
android:versionCode="22"
android:versionName="0.9.6.1" xmlns:android="http://schemas.android.com/apk/res/android">
android:versionCode="23"
android:versionName="0.9.6.2" xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-sdk
android:minSdkVersion="10"
android:targetSdkVersion="16" />
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

View File

@ -1,6 +1,13 @@
Change Log
==========
Version 0.9.6.2
---------------
* Fixed import problems with some OPML files
* Fixed download problems
* AntennaPod now recognizes changes of episode information
* Other improvements and bugfixes
Version 0.9.6.1
---------------
* Added dark theme

View File

@ -40,7 +40,7 @@
<body>
<div id="header" align="center">
<img src="logo.png" alt="Logo" width="100px" height="100px"/>
<p>AntennaPod, Version 0.9.6.1</p>
<p>AntennaPod, Version 0.9.6.2</p>
<p>Copyright © 2012 Daniel Oeh</p>
<p>Licensed under the MIT License <a href="LICENSE.html">(View)</a></p>
</div>

View File

@ -4,7 +4,7 @@
<groupId>de.danoeh</groupId>
<artifactId>antennapod</artifactId>
<packaging>apk</packaging>
<version>0.9.6.1</version>
<version>0.9.6.2</version>
<name>AntennaPod</name>

View File

@ -9,6 +9,6 @@
# Project target.
proguard.config=proguard.cfg
target=android-16
target=android-17
android.library.reference.1=../ActionBarSherlock/library/
android.library.reference.2=../Android-ViewPagerIndicator/library

View File

@ -160,7 +160,7 @@ public class MainActivity extends SherlockFragmentActivity {
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = new MenuInflater(this);
inflater.inflate(R.menu.podfetcher, menu);
inflater.inflate(R.menu.main, menu);
return true;
}

View File

@ -83,6 +83,18 @@ public class DownloadStatus {
new Date(), reasonDetailed);
}
@Override
public String toString() {
return "DownloadStatus [id=" + id + ", title=" + title + ", reason="
+ reason + ", reasonDetailed=" + reasonDetailed
+ ", successful=" + successful + ", completionDate="
+ completionDate + ", feedfile=" + feedfile + ", feedfileType="
+ feedfileType + ", progressPercent=" + progressPercent
+ ", soFar=" + soFar + ", size=" + size + ", statusMsg="
+ statusMsg + ", done=" + done + ", cancelled=" + cancelled
+ "]";
}
public FeedFile getFeedFile() {
return feedfile;
}

View File

@ -30,7 +30,6 @@ public class Feed extends FeedFile {
/** Name of the author */
private String author;
private FeedImage image;
private FeedCategory category;
private List<FeedItem> items;
/** Date of last refresh. */
private Date lastUpdate;
@ -171,6 +170,72 @@ public class Feed extends FeedFile {
}
}
public void updateFromOther(Feed other) {
super.updateFromOther(other);
if (other.title != null) {
title = other.title;
}
if (other.feedIdentifier != null) {
feedIdentifier = other.feedIdentifier;
}
if (other.link != null) {
link = other.link;
}
if (other.description != null) {
description = other.description;
}
if (other.language != null) {
language = other.language;
}
if (other.author != null) {
author = other.author;
}
if (other.paymentLink != null) {
paymentLink = other.paymentLink;
}
}
public boolean compareWithOther(Feed other) {
if (super.compareWithOther(other)) {
return true;
}
if (!title.equals(other.title)) {
return true;
}
if (other.feedIdentifier != null) {
if (feedIdentifier == null
|| !feedIdentifier.equals(other.feedIdentifier)) {
return true;
}
}
if (other.link != null) {
if (link == null || !link.equals(other.link)) {
return true;
}
}
if (other.description != null) {
if (description == null || !description.equals(other.description)) {
return true;
}
}
if (other.language != null) {
if (language == null || !language.equals(other.language)) {
return true;
}
}
if (other.author != null) {
if (author == null || !author.equals(other.author)) {
return true;
}
}
if (other.paymentLink != null) {
if (paymentLink == null || !paymentLink.equals(other.paymentLink)) {
return true;
}
}
return false;
}
@Override
public int getTypeAsInt() {
return FEEDFILETYPE_FEED;
@ -208,14 +273,6 @@ public class Feed extends FeedFile {
this.image = image;
}
public FeedCategory getCategory() {
return category;
}
public void setCategory(FeedCategory category) {
this.category = category;
}
public List<FeedItem> getItems() {
return items;
}

View File

@ -1,20 +0,0 @@
package de.danoeh.antennapod.feed;
public class FeedCategory extends FeedComponent{
protected String name;
public FeedCategory(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
}

View File

@ -21,6 +21,25 @@ public class FeedComponent {
this.id = id;
}
/**
* Update this FeedComponent's attributes with the attributes from another
* FeedComponent. This method should only update attributes which where read from
* the feed.
*/
public void updateFromOther(FeedComponent other) {
}
/**
* Compare's this FeedComponent's attribute values with another FeedComponent's
* attribute values. This method will only compare attributes which were
* read from the feed.
*
* @return true if attribute values are different, false otherwise
*/
public boolean compareWithOther(FeedComponent other) {
return false;
}
}

View File

@ -26,6 +26,33 @@ public abstract class FeedFile extends FeedComponent {
public abstract int getTypeAsInt();
/**
* Update this FeedFile's attributes with the attributes from another
* FeedFile. This method should only update attributes which where read from
* the feed.
*/
public void updateFromOther(FeedFile other) {
super.updateFromOther(other);
this.download_url = other.download_url;
}
/**
* Compare's this FeedFile's attribute values with another FeedFile's
* attribute values. This method will only compare attributes which were
* read from the feed.
*
* @return true if attribute values are different, false otherwise
*/
public boolean compareWithOther(FeedFile other) {
if (super.compareWithOther(other)) {
return true;
}
if (!download_url.equals(other.download_url)) {
return true;
}
return false;
}
public String getFile_url() {
return file_url;
}

View File

@ -43,6 +43,40 @@ public class FeedItem extends FeedComponent {
this.read = true;
}
public void updateFromOther(FeedItem other) {
super.updateFromOther(other);
if (other.title != null) {
title = other.title;
}
if (other.getDescription() != null) {
description = other.getDescription();
}
if (other.getContentEncoded() != null) {
contentEncoded = other.contentEncoded;
}
if (other.link != null) {
link = other.link;
}
if (other.pubDate != null && other.pubDate != pubDate) {
pubDate = other.pubDate;
}
if (other.media != null) {
if (media == null) {
media = other.media;
} else if (media.compareWithOther(other)) {
media.updateFromOther(other);
}
}
if (other.paymentLink != null) {
paymentLink = other.paymentLink;
}
if (other.chapters != null) {
if (chapters == null) {
chapters = other.chapters;
}
}
}
/**
* Moves the 'description' and 'contentEncoded' field of feeditem to their
* SoftReference fields.
@ -214,9 +248,11 @@ public class FeedItem extends FeedComponent {
public void setCachedContentEncoded(String c) {
cachedContentEncoded = new SoftReference<String>(c);
}
public enum State {NEW, IN_PROGRESS, READ, PLAYING}
public enum State {
NEW, IN_PROGRESS, READ, PLAYING
}
public State getState() {
if (hasMedia()) {
if (isPlaying()) {

View File

@ -53,7 +53,6 @@ public class FeedManager {
private static FeedManager singleton;
private List<Feed> feeds;
private ArrayList<FeedCategory> categories;
/** Contains all items where 'read' is false */
private List<FeedItem> unreadItems;
@ -82,7 +81,6 @@ public class FeedManager {
private FeedManager() {
feeds = Collections.synchronizedList(new ArrayList<Feed>());
categories = new ArrayList<FeedCategory>();
unreadItems = Collections.synchronizedList(new ArrayList<FeedItem>());
requester = DownloadRequester.getInstance();
downloadLog = new ArrayList<DownloadStatus>();
@ -776,18 +774,7 @@ public class FeedManager {
sendFeedUpdateBroadcast(context);
}
});
dbExec.execute(new Runnable() {
@Override
public void run() {
PodDBAdapter adapter = new PodDBAdapter(context);
adapter.open();
adapter.setCompleteFeed(feed);
feed.cacheDescriptionsOfItems();
adapter.close();
}
});
setCompleteFeed(context, feed);
}
/**
@ -811,6 +798,12 @@ public class FeedManager {
if (AppConfig.DEBUG)
Log.d(TAG, "Feed with title " + newFeed.getTitle()
+ " already exists. Syncing new with existing one.");
if (savedFeed.compareWithOther(newFeed)) {
if (AppConfig.DEBUG)
Log.d(TAG,
"Feed has updated attribute values. Updating old feed's attributes");
savedFeed.updateFromOther(newFeed);
}
// Look for new or updated Items
for (int idx = 0; idx < newFeed.getItems().size(); idx++) {
final FeedItem item = newFeed.getItems().get(idx);
@ -828,12 +821,14 @@ public class FeedManager {
}
});
markItemRead(context, item, false, false);
} else {
oldItem.updateFromOther(item);
}
}
// update attributes
savedFeed.setLastUpdate(newFeed.getLastUpdate());
savedFeed.setType(newFeed.getType());
setFeed(context, savedFeed);
setCompleteFeed(context, savedFeed);
return savedFeed;
}
@ -931,6 +926,25 @@ public class FeedManager {
});
}
/**
* Updates Information of an existing Feed and its FeedItems. Creates and opens its own
* adapter.
*/
public void setCompleteFeed(final Context context, final Feed feed) {
dbExec.execute(new Runnable() {
@Override
public void run() {
PodDBAdapter adapter = new PodDBAdapter(context);
adapter.open();
adapter.setCompleteFeed(feed);
feed.cacheDescriptionsOfItems();
adapter.close();
}
});
}
/**
* Updates information of an existing FeedItem. Creates and opens its own
@ -1078,7 +1092,6 @@ public class FeedManager {
public void updateArrays(Context context) {
feeds.clear();
categories.clear();
PodDBAdapter adapter = new PodDBAdapter(context);
adapter.open();
extractFeedlistFromCursor(context, adapter);
@ -1348,9 +1361,9 @@ public class FeedManager {
}
/**
* Loads description and contentEncoded values from the database and caches it in the feeditem. The task
* callback will contain a String-array with the description at index 0 and
* the value of contentEncoded at index 1.
* Loads description and contentEncoded values from the database and caches
* it in the feeditem. The task callback will contain a String-array with
* the description at index 0 and the value of contentEncoded at index 1.
*/
public void loadExtraInformationOfItem(final Context context,
final FeedItem item, FeedManager.TaskCallback<String[]> callback) {
@ -1375,7 +1388,7 @@ public class FeedManager {
.getString(PodDBAdapter.IDX_FI_EXTRA_CONTENT_ENCODED);
item.setCachedDescription(description);
item.setCachedContentEncoded(contentEncoded);
setResult(new String[] {description, contentEncoded});
setResult(new String[] { description, contentEncoded });
}
adapter.close();
}

View File

@ -65,6 +65,31 @@ public class FeedMedia extends FeedFile {
return MediaType.UNKNOWN;
}
public void updateFromOther(FeedMedia other) {
super.updateFromOther(other);
if (other.size > 0) {
size = other.size;
}
if (other.mime_type != null) {
mime_type = other.mime_type;
}
}
public boolean compareWithOther(FeedMedia other) {
if (super.compareWithOther(other)) {
return true;
}
if (other.mime_type != null) {
if (mime_type == null || !mime_type.equals(other.mime_type)) {
return true;
}
}
if (other.size > 0 && other.size != size) {
return true;
}
return false;
}
@Override
public int getTypeAsInt() {
return FEEDFILETYPE_FEEDMEDIA;

View File

@ -12,4 +12,14 @@ public class SimpleChapter extends Chapter {
return CHAPTERTYPE_SIMPLECHAPTER;
}
public void updateFromOther(SimpleChapter other) {
super.updateFromOther(other);
start = other.start;
if (other.title != null) {
title = other.title;
}
if (other.link != null) {
link = other.link;
}
}
}

View File

@ -14,6 +14,7 @@ import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebSettings.LayoutAlgorithm;
import android.webkit.WebView;
import com.actionbarsherlock.app.SherlockFragment;
@ -65,6 +66,7 @@ public class ItemDescriptionFragment extends SherlockFragment {
webvDescription.setBackgroundColor(0);
}
webvDescription.getSettings().setUseWideViewPort(false);
webvDescription.getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);
return webvDescription;
}

View File

@ -17,7 +17,6 @@ public class OpmlReader {
// ATTRIBUTES
private boolean isInOpml = false;
private boolean isInBody = false;
private ArrayList<OpmlElement> elementList;
/**
@ -47,12 +46,7 @@ public class OpmlReader {
isInOpml = true;
if (AppConfig.DEBUG)
Log.d(TAG, "Reached beginning of OPML tree.");
} else if (isInOpml && xpp.getName().equals(OpmlSymbols.BODY)) {
isInBody = true;
if (AppConfig.DEBUG)
Log.d(TAG, "Reached beginning of body tree.");
} else if (isInBody && xpp.getName().equals(OpmlSymbols.OUTLINE)) {
} else if (isInOpml && xpp.getName().equals(OpmlSymbols.OUTLINE)) {
if (AppConfig.DEBUG)
Log.d(TAG, "Found new Opml element");
OpmlElement element = new OpmlElement();

View File

@ -308,7 +308,20 @@ public class DownloadService extends Service {
private Downloader getDownloader(DownloadStatus status) {
if (URLUtil.isHttpUrl(status.getFeedFile().getDownload_url())) {
return new HttpDownloader(this, status);
return new HttpDownloader(new DownloaderCallback() {
@Override
public void onDownloadCompleted(final Downloader downloader) {
handler.post(new Runnable() {
@Override
public void run() {
DownloadService.this
.onDownloadCompleted(downloader);
}
});
}
}, status);
}
Log.e(TAG, "Could not find appropriate downloader for "
+ status.getFeedFile().getDownload_url());
@ -318,6 +331,21 @@ public class DownloadService extends Service {
@SuppressLint("NewApi")
public void onDownloadCompleted(final Downloader downloader) {
final AsyncTask<Void, Void, Void> handlerTask = new AsyncTask<Void, Void, Void>() {
boolean successful;
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
if (!successful) {
queryDownloads();
}
}
@Override
protected void onPreExecute() {
super.onPreExecute();
removeDownload(downloader);
}
@Override
protected Void doInBackground(Void... params) {
@ -326,7 +354,7 @@ public class DownloadService extends Service {
downloadsBeingHandled += 1;
DownloadStatus status = downloader.getStatus();
status.setCompletionDate(new Date());
boolean successful = status.isSuccessful();
successful = status.isSuccessful();
FeedFile download = status.getFeedFile();
if (download != null) {
@ -349,10 +377,6 @@ public class DownloadService extends Service {
downloadsBeingHandled -= 1;
}
}
removeDownload(downloader);
if (!successful) {
queryDownloads();
}
return null;
}
};
@ -368,7 +392,9 @@ public class DownloadService extends Service {
* DownloadService list.
*/
private void removeDownload(final Downloader d) {
downloads.remove(d);
if (AppConfig.DEBUG) Log.d(TAG, "Removing downloader: " + d.getStatus().getFeedFile().getDownload_url());
boolean rc = downloads.remove(d);
if (AppConfig.DEBUG) Log.d(TAG, "Result of downloads.remove: " + rc);
DownloadRequester.getInstance().removeDownload(
d.getStatus().getFeedFile());
sendBroadcast(new Intent(ACTION_DOWNLOADS_CONTENT_CHANGED));
@ -536,12 +562,12 @@ public class DownloadService extends Service {
reason = 0;
String reasonDetailed = null;
successful = true;
FeedManager manager = FeedManager.getInstance();
FeedHandler handler = new FeedHandler();
final FeedManager manager = FeedManager.getInstance();
FeedHandler feedHandler = new FeedHandler();
feed.setDownloaded(true);
try {
feed = handler.parseFeed(feed);
feed = feedHandler.parseFeed(feed);
if (AppConfig.DEBUG)
Log.d(TAG, feed.getTitle() + " parsed");
if (checkFeedData(feed) == false) {
@ -555,18 +581,29 @@ public class DownloadService extends Service {
if (AppConfig.DEBUG)
Log.d(TAG, "Feed has image; Downloading....");
savedFeed.getImage().setFeed(savedFeed);
try {
requester.downloadImage(DownloadService.this,
savedFeed.getImage());
} catch (DownloadRequestException e) {
e.printStackTrace();
manager.addDownloadStatus(DownloadService.this,
new DownloadStatus(savedFeed.getImage(),
savedFeed.getImage()
.getHumanReadableIdentifier(),
DownloadError.ERROR_REQUEST_ERROR,
false, e.getMessage()));
}
final Feed savedFeedRef = savedFeed;
handler.post(new Runnable() {
@Override
public void run() {
try {
requester.downloadImage(DownloadService.this,
savedFeedRef.getImage());
} catch (DownloadRequestException e) {
e.printStackTrace();
manager.addDownloadStatus(
DownloadService.this,
new DownloadStatus(
savedFeedRef.getImage(),
savedFeedRef
.getImage()
.getHumanReadableIdentifier(),
DownloadError.ERROR_REQUEST_ERROR,
false, e.getMessage()));
}
}
});
}
} catch (SAXException e) {
@ -606,7 +643,14 @@ public class DownloadService extends Service {
reasonDetailed));
sendDownloadHandledIntent(DOWNLOAD_TYPE_FEED);
downloadsBeingHandled -= 1;
queryDownloads();
handler.post(new Runnable() {
@Override
public void run() {
queryDownloads();
}
});
}
/** Checks if the feed was parsed correctly. */
@ -683,7 +727,14 @@ public class DownloadService extends Service {
"Image has no feed, image might not be saved correctly!");
}
downloadsBeingHandled -= 1;
queryDownloads();
handler.post(new Runnable() {
@Override
public void run() {
queryDownloads();
}
});
}
}
@ -739,7 +790,14 @@ public class DownloadService extends Service {
}
downloadsBeingHandled -= 1;
queryDownloads();
handler.post(new Runnable() {
@Override
public void run() {
queryDownloads();
}
});
}
}

View File

@ -7,22 +7,21 @@ import de.danoeh.antennapod.asynctask.DownloadStatus;
/** Downloads files */
public abstract class Downloader extends Thread {
private static final String TAG = "Downloader";
private Handler handler;
private DownloadService downloadService;
private DownloaderCallback downloaderCallback;
protected boolean finished;
protected volatile boolean cancelled;
protected volatile DownloadStatus status;
public Downloader(DownloadService downloadService, DownloadStatus status) {
public Downloader(DownloaderCallback downloaderCallback,
DownloadStatus status) {
super();
this.downloadService = downloadService;
this.downloaderCallback = downloaderCallback;
this.status = status;
this.status.setStatusMsg(R.string.download_pending);
this.cancelled = false;
handler = new Handler();
}
/**
@ -32,14 +31,7 @@ public abstract class Downloader extends Thread {
protected void finish() {
if (!finished) {
finished = true;
handler.post(new Runnable() {
@Override
public void run() {
downloadService.onDownloadCompleted(Downloader.this);
}
});
downloaderCallback.onDownloadCompleted(this);
}
}
@ -54,7 +46,7 @@ public abstract class Downloader extends Thread {
public DownloadStatus getStatus() {
return status;
}
public void cancel() {
cancelled = true;
}

View File

@ -0,0 +1,10 @@
package de.danoeh.antennapod.service.download;
/**
* Callback used by the Downloader-classes to notify the requester that the
* download has completed.
*/
public interface DownloaderCallback {
public void onDownloadCompleted(Downloader downloader);
}

View File

@ -14,6 +14,8 @@ import java.net.URL;
import java.net.UnknownHostException;
import org.apache.commons.io.IOUtils;
import org.apache.http.HttpConnection;
import org.apache.http.HttpStatus;
import android.util.Log;
import de.danoeh.antennapod.AppConfig;
@ -25,11 +27,70 @@ import de.danoeh.antennapod.util.StorageUtils;
public class HttpDownloader extends Downloader {
private static final String TAG = "HttpDownloader";
private static final int MAX_REDIRECTS = 5;
private static final int BUFFER_SIZE = 8 * 1024;
private static final int CONNECTION_TIMEOUT = 5000;
public HttpDownloader(DownloadService downloadService, DownloadStatus status) {
super(downloadService, status);
public HttpDownloader(DownloaderCallback downloaderCallback, DownloadStatus status) {
super(downloaderCallback, status);
}
/**
* This method is called by establishConnection(String). Don't call it
* directly.
* */
private HttpURLConnection establishConnection(String location,
int redirectCount) throws MalformedURLException, IOException {
URL url = new URL(location);
HttpURLConnection connection = null;
int responseCode = -1;
connection = (HttpURLConnection) url.openConnection();
connection.setConnectTimeout(CONNECTION_TIMEOUT);
// try with 'follow redirect'
connection.setInstanceFollowRedirects(true);
try {
responseCode = connection.getResponseCode();
} catch (IOException e) {
e.printStackTrace();
if (AppConfig.DEBUG)
Log.d(TAG,
"Failed to establish connection with 'follow redirects. Disabling 'follow redirects'");
connection.disconnect();
connection.setInstanceFollowRedirects(false);
responseCode = connection.getResponseCode();
}
if (AppConfig.DEBUG)
Log.d(TAG, "Response Code: " + responseCode);
switch (responseCode) {
case HttpStatus.SC_TEMPORARY_REDIRECT:
if (redirectCount < MAX_REDIRECTS) {
final String redirect = connection.getHeaderField("Location");
if (redirect != null) {
return establishConnection(redirect, redirectCount + 1);
}
}
case HttpStatus.SC_OK:
return connection;
default:
onFail(DownloadError.ERROR_HTTP_DATA_ERROR,
String.valueOf(responseCode));
return null;
}
}
/**
* Establish connection to resource. This method will also try to handle
* different response codes / redirect issues.
*
* @return the HttpURLConnection object if the connection could be opened,
* null otherwise.
* @throws MalformedURLException
* , IOException
* */
private HttpURLConnection establishConnection(String location)
throws MalformedURLException, IOException {
return establishConnection(location, 0);
}
@Override
@ -37,12 +98,9 @@ public class HttpDownloader extends Downloader {
HttpURLConnection connection = null;
OutputStream out = null;
try {
URL url = new URL(status.getFeedFile().getDownload_url());
connection = (HttpURLConnection) url.openConnection();
connection.setConnectTimeout(CONNECTION_TIMEOUT);
connection.setInstanceFollowRedirects(true);
int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
connection = establishConnection(status.getFeedFile()
.getDownload_url());
if (connection != null) {
if (AppConfig.DEBUG) {
Log.d(TAG, "Connected to resource");
}
@ -89,14 +147,12 @@ public class HttpDownloader extends Downloader {
onFail(DownloadError.ERROR_NOT_ENOUGH_SPACE, null);
}
} else {
Log.w(TAG, "File already exists");
onFail(DownloadError.ERROR_FILE_EXISTS, null);
}
} else {
onFail(DownloadError.ERROR_DEVICE_NOT_FOUND, null);
}
} else {
onFail(DownloadError.ERROR_HTTP_DATA_ERROR,
String.valueOf(responseCode));
}
} catch (MalformedURLException e) {
e.printStackTrace();

View File

@ -49,10 +49,10 @@ public class DownloadRequester {
private void download(Context context, FeedFile item, File dest,
boolean overwriteIfExists) {
if (!isDownloadingFile(item)) {
if (dest.exists()) {
if (!isFilenameAvailable(dest.toString()) || dest.exists()) {
if (AppConfig.DEBUG)
Log.d(TAG, "File already exists.");
if (overwriteIfExists) {
Log.d(TAG, "Filename already used.");
if (isFilenameAvailable(dest.toString()) && overwriteIfExists) {
boolean result = dest.delete();
if (AppConfig.DEBUG)
Log.d(TAG, "Deleting file. Result: " + result);
@ -69,7 +69,7 @@ public class DownloadRequester {
if (AppConfig.DEBUG)
Log.d(TAG, "Testing filename " + newName);
newDest = new File(dest.getParent(), newName);
if (!newDest.exists()) {
if (!newDest.exists() && isFilenameAvailable(newDest.toString())) {
if (AppConfig.DEBUG)
Log.d(TAG, "File doesn't exist yet. Using "
+ newName);
@ -108,6 +108,24 @@ public class DownloadRequester {
}
}
/**
* Returns true if a filename is available and false if it has already been
* taken by another requested download.
*/
private boolean isFilenameAvailable(String path) {
for (String key : downloads.keySet()) {
FeedFile f = downloads.get(key);
if (f.getFile_url().equals(path)) {
if (AppConfig.DEBUG)
Log.d(TAG, path
+ " is already used by another requested download");
return false;
}
}
if (AppConfig.DEBUG) Log.d(TAG, path + " is available as a download destination");
return true;
}
public void downloadFeed(Context context, Feed feed)
throws DownloadRequestException {
if (feedFileValid(feed)) {

View File

@ -481,6 +481,7 @@ public class PodDBAdapter {
/** Remove a feed with all its FeedItems and Media entries. */
public void removeFeed(Feed feed) {
db.beginTransaction();
if (feed.getImage() != null) {
removeFeedImage(feed.getImage());
}
@ -489,6 +490,8 @@ public class PodDBAdapter {
}
db.delete(TABLE_NAME_FEEDS, KEY_ID + "=?",
new String[] { String.valueOf(feed.getId()) });
db.setTransactionSuccessful();
db.endTransaction();
}
public void removeDownloadStatus(DownloadStatus remove) {

View File

@ -97,7 +97,7 @@ public class SyndHandler extends DefaultHandler {
if (AppConfig.DEBUG)
Log.d(TAG, "Recognized ITunes namespace");
} else if (uri.equals(NSSimpleChapters.NSURI)
&& prefix.equals(NSSimpleChapters.NSTAG)) {
&& prefix.matches(NSSimpleChapters.NSTAG)) {
state.namespaces.put(uri, new NSSimpleChapters());
if (AppConfig.DEBUG)
Log.d(TAG, "Recognized SimpleChapters namespace");

View File

@ -12,7 +12,7 @@ import de.danoeh.antennapod.syndication.namespace.SyndElement;
import de.danoeh.antennapod.syndication.util.SyndDateUtils;
public class NSSimpleChapters extends Namespace {
public static final String NSTAG = "sc";
public static final String NSTAG = "psc|sc";
public static final String NSURI = "http://podlove.org/simple-chapters";
public static final String CHAPTERS = "chapters";

View File

@ -23,376 +23,13 @@ public class FeedHandlerTest extends AndroidTestCase {
private static final String TAG = "FeedHandlerTest";
private static final String FEEDS_DIR = "testfeeds";
private static final String[] urls = {
"http://rss.sciam.com/sciam/60secsciencepodcast",
"http://rss.sciam.com/sciam/60-second-mind",
"http://rss.sciam.com/sciam/60-second-space",
"http://rss.sciam.com/sciam/60-second-health",
"http://rss.sciam.com/sciam/60-second-tech",
"http://risky.biz/feeds/risky-business",
"http://risky.biz/feeds/rb2",
"http://podcast.hr-online.de/lateline/podcast.xml",
"http://bitlove.org/nsemak/mikrodilettanten/feed",
"http://bitlove.org/moepmoeporg/riotburnz/feed",
"http://bitlove.org/moepmoeporg/schachcast/feed",
"http://bitlove.org/moepmoeporg/sundaymoaning/feed",
"http://bitlove.org/motofunk/anekdotkast/feed",
"http://bitlove.org/motofunk/motofunk/feed",
"http://bitlove.org/nerdinand/zch/feed",
"http://podcast.homerj.de/podcasts.xml",
"http://www.dradio.de/rss/podcast/sendungen/wissenschaftundbildung/",
"http://www.dradio.de/rss/podcast/sendungen/wirtschaftundverbraucher/",
"http://www.dradio.de/rss/podcast/sendungen/literatur/",
"http://www.dradio.de/rss/podcast/sendungen/sport/",
"http://www.dradio.de/rss/podcast/sendungen/wirtschaftundgesellschaft/",
"http://www.dradio.de/rss/podcast/sendungen/filmederwoche/",
"http://www.blacksweetstories.com/feed/podcast/",
"http://feeds.5by5.tv/buildanalyze",
"http://bitlove.org/ranzzeit/ranz/feed",
"http://bitlove.org/importthis/mp3/feed",
"http://bitlove.org/astro/youtube/feed",
"http://bitlove.org/channelcast/channelcast/feed",
"http://bitlove.org/cccb/chaosradio/feed",
"http://bitlove.org/astro/bitlove-show/feed",
"http://feeds.thisamericanlife.org/talpodcast",
"http://www.casasola.de/137b/1337motiv/1337motiv.xml",
"http://alternativlos.org/ogg.rss", "http://www.bitsundso.de/feed",
"http://www.gamesundso.de/feed/",
"http://chaosradio.ccc.de/chaosradio-latest.rss",
"http://feeds.feedburner.com/cre-podcast",
"http://feeds.feedburner.com/NotSafeForWorkPodcast",
"http://feeds.feedburner.com/mobile-macs-podcast",
"http://www.gamesundso.de/feed/",
"http://feeds.feedburner.com/DerLautsprecher",
"http://feeds.feedburner.com/raumzeit-podcast",
"http://feeds.feedburner.com/TheLunaticFringe",
"http://feeds.feedburner.com/Kuechenradioorg",
"http://feeds.feedburner.com/Medienradio_Podcast_RSS",
"http://feeds.feedburner.com/wrint/wrint",
"http://retrozirkel.de/episodes.mp3.rss",
"http://trackback.fritz.de/?feed=podcast",
"http://feeds.feedburner.com/linuxoutlaws-ogg",
"http://www.mevio.com/feeds/noagenda.xml",
"http://podcast.hr2.de/derTag/podcast.xml",
"http://feeds.feedburner.com/thechangelog",
"http://leoville.tv/podcasts/floss.xml",
"http://www.radiotux.de/index.php?/feeds/index.rss2",
"http://megamagis.ch/episodes.mp3.rss",
"http://www.eurogamer.net/rss/eurogamer_podcast_itunes.rss",
"http://bobsonbob.de/?feed=rss2",
"http://www.blacksweetstories.com/feed/podcast/",
"http://www.eurogamer.net/rss/eurogamer_podcast_itunes.rss",
"http://diehoppeshow.de/podcast/feed.xml",
"http://feeds.feedburner.com/ThisIsMyNextPodcast?format=xml",
"http://bitlove.org/343max/maerchenstunde/feed",
"http://bitlove.org/343max/wmr-aac/feed",
"http://bitlove.org/343max/wmr-mp3/feed",
"http://bitlove.org/343max/wmr-oga/feed",
"http://bitlove.org/adamc1999/noagenda/feed",
"http://bitlove.org/alexbrueckel/normalzeit_podcast/feed",
"http://bitlove.org/alexbrueckel/normalzeit_podcast_mp3/feed",
"http://bitlove.org/alexbrueckel/tisch3-podcast/feed",
"http://bitlove.org/alexolma/iphoneblog/feed",
"http://bitlove.org/andydrop/nachtnerd/feed",
"http://bitlove.org/apollo40/ps3newsroom/feed",
"http://bitlove.org/beapirate/hauptstadtpiraten/feed",
"http://bitlove.org/benni/besondereumstaende/feed",
"http://bitlove.org/bennihahn/unicast/feed",
"http://bitlove.org/berndbloggt/wirschweifenab/feed",
"http://bitlove.org/bildungsangst/spoiler-alert-mp3/feed",
"http://bitlove.org/bildungsangst/spoiler-alert-ogg/feed",
"http://bitlove.org/bildungsangst/troja-alert-mp3/feed",
"http://bitlove.org/bildungsangst/troja-alert-ogg/feed",
"http://bitlove.org/binaergewitter/talk/feed",
"http://bitlove.org/binaergewitter/talk-ogg/feed",
"http://bitlove.org/bitgamers/bitgamerscast/feed",
"http://bitlove.org/boingsworld/boingsworld/feed",
"http://bitlove.org/boris/appsacker/feed",
"http://bitlove.org/boris/bam/feed",
"http://bitlove.org/bruhndsoweiter/anycast-aac/feed",
"http://bitlove.org/bruhndsoweiter/anycast-mp3/feed",
"http://bitlove.org/bruhndsoweiter/schnackennet-m4a/feed",
"http://bitlove.org/bruhndsoweiter/schnackennet-mp3/feed",
"http://bitlove.org/bruhndsoweiter/schnackennet-ogg/feed",
"http://bitlove.org/byteweise/bytecast/feed",
"http://bitlove.org/byteweise/byteweiseaac/feed",
"http://bitlove.org/c3d2/news/feed",
"http://bitlove.org/c3d2/pentacast/feed",
"http://bitlove.org/c3d2/pentamedia/feed",
"http://bitlove.org/c3d2/pentamusic/feed",
"http://bitlove.org/c3d2/pentaradio/feed",
"http://bitlove.org/campuscast_cc/campuscast_cc/feed",
"http://bitlove.org/carlito/schnittmuster/feed",
"http://bitlove.org/carlito/yaycomics/feed",
"http://bitlove.org/cccb/chaosradio/feed",
"http://bitlove.org/ccculm/chaosseminar-mp4-high/feed",
"http://bitlove.org/ccculm/chaosseminar-theora/feed",
"http://bitlove.org/channelcast/channelcast/feed",
"http://bitlove.org/chgrasse/freequency/feed",
"http://bitlove.org/chgrasse/kiezradio/feed",
"http://bitlove.org/christiansteiner/secondunit/feed",
"http://bitlove.org/cinext/cinext/feed",
"http://bitlove.org/ckater/schoeneecken/feed",
"http://bitlove.org/ckater/schoeneecken-mp3/feed",
"http://bitlove.org/cllassnig/bytegefluester/feed",
"http://bitlove.org/cllassnig/nerdtirol/feed",
"http://bitlove.org/cocoaheads/austria/feed",
"http://bitlove.org/compod/compod/feed",
"http://bitlove.org/consolmedia/consolpodcast/feed",
"http://bitlove.org/couchblog/computerfix/feed",
"http://bitlove.org/culinaricast/podcast/feed",
"http://bitlove.org/d3v/die-drei-vogonen/feed",
"http://bitlove.org/danielbuechele/luftpost/feed",
"http://bitlove.org/deimhart/mp3/feed",
"http://bitlove.org/deimhart/ogg/feed",
"http://bitlove.org/derbastard/podcast/feed",
"http://bitlove.org/derpoppe/poppeandpeople/feed",
"http://bitlove.org/derpoppe/stammtischphilosophen/feed",
"http://bitlove.org/devradio/devradio-music-mp3/feed",
"http://bitlove.org/devradio/devradio-music-ogg/feed",
"http://bitlove.org/devradio/devradio-nomusic-mp3/feed",
"http://bitlove.org/devradio/devradio-nomusic-ogg/feed",
"http://bitlove.org/die-halde/die-halde/feed",
"http://bitlove.org/dirtyminutesleft/m4a/feed",
"http://bitlove.org/dirtyminutesleft/mp3/feed",
"http://bitlove.org/dominik/knutsens/feed",
"http://bitlove.org/dominik/schnittchen/feed",
"http://bitlove.org/driveeo/podcast/feed",
"http://bitlove.org/einfachben/freibeuterhafen/feed",
"http://bitlove.org/eintr8podcast/aac/feed",
"http://bitlove.org/eintr8podcast/eptv/feed",
"http://bitlove.org/eintr8podcast/mp3/feed",
"http://bitlove.org/eteubert/satoripress-m4a/feed",
"http://bitlove.org/fabu/indie-fresse/feed",
"http://bitlove.org/faldrian/bofh-mp3/feed",
"http://bitlove.org/faldrian/bofh-oga/feed",
"http://bitlove.org/faldrian/faldriansfeierabend/feed",
"http://bitlove.org/filmtonpodcast/filmtonpodcast/feed",
"http://bitlove.org/firmadorsch/fahrradio/feed",
"http://bitlove.org/frequenz9/feed/feed",
"http://bitlove.org/gamefusion/feeds/feed",
"http://bitlove.org/gamesandmacs/podcast/feed",
"http://bitlove.org/geekweek/techpodcast/feed",
"http://bitlove.org/germanstudent/apfelnet/feed",
"http://bitlove.org/germanstudent/bruellaffencouch-enhanced/feed",
"http://bitlove.org/germanstudent/bruellaffencouch-mp3/feed",
"http://bitlove.org/germanstudent/kauderwelschavantgarde/feed",
"http://bitlove.org/germanstudent/podccast-enhanced/feed",
"http://bitlove.org/germanstudent/podccast-mp3/feed",
"http://bitlove.org/geschichtendose/love/feed",
"http://bitlove.org/gfm/atzbach/feed",
"http://bitlove.org/gfm/rumsendende/feed",
"http://bitlove.org/grizze/vtlive/feed",
"http://bitlove.org/hackerfunk/hf-mp3/feed",
"http://bitlove.org/hackerfunk/hf-ogg/feed",
"http://bitlove.org/hasencore/podcast/feed",
"http://bitlove.org/hoaxmaster/hoaxilla/feed",
"http://bitlove.org/hoaxmaster/psychotalk/feed",
"http://bitlove.org/hoaxmaster/skeptoskop/feed",
"http://bitlove.org/hoersuppe/vorcast/feed",
"http://bitlove.org/holgi/wrint/feed",
"http://bitlove.org/ich-bin-radio/fir/feed",
"http://bitlove.org/ich-bin-radio/rsff/feed",
"http://bitlove.org/incerio/podcast/feed",
"http://bitlove.org/jagdfunk/jagdfunk/feed",
"http://bitlove.org/janlelis/rubykraut/feed",
"http://bitlove.org/jed/feed1/feed",
"http://bitlove.org/jupiterbroadcasting/coderradio/feed",
"http://bitlove.org/jupiterbroadcasting/fauxshowhd/feed",
"http://bitlove.org/jupiterbroadcasting/fauxshowmobile/feed",
"http://bitlove.org/jupiterbroadcasting/lashd/feed",
"http://bitlove.org/jupiterbroadcasting/lasmobile/feed",
"http://bitlove.org/jupiterbroadcasting/scibytehd/feed",
"http://bitlove.org/jupiterbroadcasting/scibytemobile/feed",
"http://bitlove.org/jupiterbroadcasting/techsnap60/feed",
"http://bitlove.org/jupiterbroadcasting/techsnapmobile/feed",
"http://bitlove.org/jupiterbroadcasting/unfilterhd/feed",
"http://bitlove.org/jupiterbroadcasting/unfiltermobile/feed",
"http://bitlove.org/kassettenkind/trollfunk/feed",
"http://bitlove.org/klangkammermedia/abgekuppelt/feed",
"http://bitlove.org/klangkammermedia/derbalkoncast/feed",
"http://bitlove.org/klangkammermedia/wortundstille/feed",
"http://bitlove.org/kurzpod/kurzpod/feed",
"http://bitlove.org/kurzpod/kurzpodm4a/feed",
"http://bitlove.org/kurzpod/ogg/feed",
"http://bitlove.org/langpod/lp/feed",
"http://bitlove.org/legrex/videli-noch/feed",
"http://bitlove.org/linucast/screencast/feed",
"http://bitlove.org/lisnewsnetcasts/listen/feed",
"http://bitlove.org/logenzuschlag/cinecast/feed",
"http://bitlove.org/maha/1337kultur/feed",
"http://bitlove.org/maha/klabautercast/feed",
"http://bitlove.org/map/fanboys/feed",
"http://bitlove.org/map/fanboys-mp3/feed",
"http://bitlove.org/map/retrozirkel/feed",
"http://bitlove.org/map/retrozirkel-mp3/feed",
"http://bitlove.org/mappleconfusers/nachts-mp3/feed",
"http://bitlove.org/mappleconfusers/nachts-mp4/feed",
"http://bitlove.org/mappleconfusers/nachts-ogg/feed",
"http://bitlove.org/mappleconfusers/nachts-pdf/feed",
"http://bitlove.org/markus/robotiklabor/feed",
"http://bitlove.org/martinschmidt/freiklettern/feed",
"http://bitlove.org/mespotine/mespotine_sessions/feed",
"http://bitlove.org/meszner/aether/feed",
"http://bitlove.org/meszner/kulturwissenschaften/feed",
"http://bitlove.org/metaebene/cre/feed",
"http://bitlove.org/metaebene/der-lautsprecher/feed",
"http://bitlove.org/metaebene/kolophon/feed",
"http://bitlove.org/metaebene/logbuch-netzpolitik/feed",
"http://bitlove.org/metaebene/mobilemacs/feed",
"http://bitlove.org/metaebene/newz-of-the-world/feed",
"http://bitlove.org/metaebene/not-safe-for-work/feed",
"http://bitlove.org/metaebene/raumzeit/feed",
"http://bitlove.org/metaebene/raumzeit-mp3/feed",
"http://bitlove.org/metagamer/metagamer/feed",
"http://bitlove.org/mfromm/collaborativerockers/feed",
"http://bitlove.org/mfromm/explorism/feed",
"http://bitlove.org/mfromm/transientesichten/feed",
"http://bitlove.org/mhpod/pofacs/feed",
"http://bitlove.org/michaela_w/michaelaswelt/feed",
"http://bitlove.org/michaelgreth/sharepointpdcast/feed",
"http://bitlove.org/mintcast/podcast/feed",
"http://bitlove.org/mitgezwitschert/brandung/feed",
"http://bitlove.org/moepmoeporg/anonnewsde/feed",
"http://bitlove.org/moepmoeporg/contentcast/feed",
"http://bitlove.org/moepmoeporg/dieseminarren/feed",
"http://bitlove.org/moepmoeporg/emcast/feed",
"http://bitlove.org/moepmoeporg/fhainalex/feed",
"http://bitlove.org/moepmoeporg/fruehstueck/feed",
"http://bitlove.org/moepmoeporg/galanoir/feed",
"http://bitlove.org/moepmoeporg/julespodcasts/feed",
"http://bitlove.org/moepmoeporg/knorkpod/feed",
"http://bitlove.org/moepmoeporg/lecast/feed",
"http://bitlove.org/moepmoeporg/moepspezial/feed",
"http://bitlove.org/moepmoeporg/podsprech/feed",
"http://bitlove.org/moepmoeporg/pottcast/feed",
"http://bitlove.org/moepmoeporg/riotburnz/feed",
"http://bitlove.org/moepmoeporg/schachcast/feed",
"http://bitlove.org/moepmoeporg/sundaymoaning/feed",
"http://bitlove.org/motofunk/anekdotkast/feed",
"http://bitlove.org/motofunk/motofunk/feed",
"http://bitlove.org/nerdinand/zch/feed",
"http://bitlove.org/netzpolitik/netzpolitik-podcast/feed",
"http://bitlove.org/netzpolitik/netzpolitik-tv/feed",
"http://bitlove.org/nischenkultur/soziopod/feed",
"http://bitlove.org/nitramred/staatsbuergerkunde/feed",
"http://bitlove.org/nitramred/staatsbuergerkunde-mp3/feed",
"http://bitlove.org/nsemak/elementarfragen/feed",
"http://bitlove.org/nsemak/mikrodilettanten/feed",
"http://bitlove.org/oaad/oaad/feed",
"http://bitlove.org/ohrkrampfteam/ohr/feed",
"http://bitlove.org/omegatau/all/feed",
"http://bitlove.org/omegatau/english-only/feed",
"http://bitlove.org/omegatau/german-only/feed",
"http://bitlove.org/onatcer/oal/feed",
"http://bitlove.org/panikcast/panikcast/feed",
"http://bitlove.org/panxatony/aviewinblue/feed",
"http://bitlove.org/panxatony/macnemotv/feed",
"http://bitlove.org/pattex/megamagisch_m4a/feed",
"http://bitlove.org/pattex/megamagisch_mp3/feed",
"http://bitlove.org/pausengespraeche/pausengespraeche/feed",
"http://bitlove.org/pck/ez-und-geschlecht/feed",
"http://bitlove.org/pck/gender-kolleg-marburg/feed",
"http://bitlove.org/pck/genderzentrum_mr/feed",
"http://bitlove.org/pck/hh/feed",
"http://bitlove.org/pck/hh_mp3/feed",
"http://bitlove.org/pck/hh_ogg/feed",
"http://bitlove.org/pck/intercast/feed",
"http://bitlove.org/pck/peachnerdznohero/feed",
"http://bitlove.org/pck/peachnerdznohero_mp3/feed",
"http://bitlove.org/philip/einfach-schwul/feed",
"http://bitlove.org/philip/faselcast2/feed",
"http://bitlove.org/philipbanse/kuechenradio/feed",
"http://bitlove.org/philipbanse/medienradio/feed",
"http://bitlove.org/philipbanse/studienwahl_tv_audio/feed",
"http://bitlove.org/philipbanse/studienwahl_tv_video/feed",
"http://bitlove.org/podsafepilot/pmp/feed",
"http://bitlove.org/podsafepilot/psid/feed",
"http://bitlove.org/ponytimepodcast/ponytimepodcast/feed",
"http://bitlove.org/pratfm/strunt/feed",
"http://bitlove.org/pressrecord/podcast/feed",
"http://bitlove.org/pztv/alle_formate/feed",
"http://bitlove.org/qbi/datenkanal-mp3/feed",
"http://bitlove.org/qbi/datenkanal-ogg/feed",
"http://bitlove.org/quotidianitaet/quotidianitaet/feed",
"http://bitlove.org/radiotux/radiotux-all/feed",
"http://bitlove.org/randgruppenfunk/mediale_subkultur/feed",
"http://bitlove.org/ranzzeit/ranz/feed",
"http://bitlove.org/relet/lifeartificial_partone/feed",
"http://bitlove.org/retinacast/pilotenpruefung/feed",
"http://bitlove.org/retinacast/podcast/feed",
"http://bitlove.org/retinacast/podcast-aac/feed",
"http://bitlove.org/retinacast/retinauten/feed",
"http://bitlove.org/retinacast/rtc/feed",
"http://bitlove.org/revolutionarts/mehrspielerquote/feed",
"http://bitlove.org/ronsens/machtdose/feed",
"http://bitlove.org/rooby/fressefreiheit/feed",
"http://bitlove.org/rundumpodcast/rundum/feed",
"http://bitlove.org/ryuu/riesencast/feed",
"http://bitlove.org/ryuu/ryuus_labercast/feed",
"http://bitlove.org/sangyye/nerdmate/feed",
"http://bitlove.org/sangyye/nerdmate-ogg/feed",
"http://bitlove.org/schmalsprech/schmalsprech_m4a/feed",
"http://bitlove.org/schmalsprech/schmalsprech_mp3/feed",
"http://bitlove.org/schmidtlepp/houroflauer/feed",
"http://bitlove.org/schmidtlepp/lauerinformiert/feed",
"http://bitlove.org/sebastiansimon/wertungsfrei/feed",
"http://bitlove.org/sebseb7/vimeo/feed",
"http://bitlove.org/sirtomate/comichoehle/feed",
"http://bitlove.org/smartphone7/windowsphonepodcast/feed",
"http://bitlove.org/smcpodcast/feed/feed",
"http://bitlove.org/sneakpod/cocktailpodcast/feed",
"http://bitlove.org/sneakpod/sneakpod/feed",
"http://bitlove.org/socialhack/hoerensagen/feed",
"http://bitlove.org/socialhack/netzkinder/feed",
"http://bitlove.org/socialhack/netzkinder_mp3/feed",
"http://bitlove.org/socialhack/netzkinder_ogg/feed",
"http://bitlove.org/socialhack/talking_anthropology/feed",
"http://bitlove.org/sprechwaisen/sw/feed",
"http://bitlove.org/sublab/aboutradio/feed",
"http://bitlove.org/sysops/elektrisch/feed",
"http://bitlove.org/sysops/hd/feed",
"http://bitlove.org/taschencasts/taschencasts/feed",
"http://bitlove.org/tcmanila/ae-podcast/feed",
"http://bitlove.org/teezeit/kulturbuechse/feed",
"http://bitlove.org/teezeit/kulturbuechse-mp3/feed",
"http://bitlove.org/teezeit/teezeittalkradio/feed",
"http://bitlove.org/teezeit/teezeittalkradio-mp3/feed",
"http://bitlove.org/tinkengil/playtogether/feed",
"http://bitlove.org/tobi_s/alleswirdgut/feed",
"http://bitlove.org/toby/einschlafenenhanced/feed",
"http://bitlove.org/toby/einschlafenpodcast/feed",
"http://bitlove.org/toby/pubkameraden/feed",
"http://bitlove.org/toby/pubkameradenaac/feed",
"http://bitlove.org/tom/radioanstalt/feed",
"http://bitlove.org/tvallgaeu/beitraege/feed",
"http://bitlove.org/tvallgaeu/freizeit/feed",
"http://bitlove.org/tvallgaeu/sendung/feed",
"http://bitlove.org/ubahnverleih/teepodcast/feed",
"http://bitlove.org/umunsherum/sammelcast/feed",
"http://bitlove.org/umunsherum/spielonauten/feed",
"http://bitlove.org/umunsherum/unteruns/feed",
"http://bitlove.org/umunsherum/wasmachstdu/feed",
"http://bitlove.org/uwe/nettesfrettchen/feed",
"http://bitlove.org/vorgedacht/slug/feed",
"http://bitlove.org/webdev/wdr/feed",
"http://bitlove.org/weezerle/brandung/feed",
"http://bitlove.org/weezerle/guestcast/feed",
"http://bitlove.org/weezerle/stupalog/feed",
"http://bitlove.org/wikigeeks/wikigeeks-aac/feed",
"http://bitlove.org/wikigeeks/wikigeeks-mp3/feed",
"http://bitlove.org/wikigeeks/wikigeeks-ogg/feed",
"http://bitlove.org/workingdraft/revisionen/feed",
"http://bitlove.org/wunderlich/podcast/feed",
"http://www.cczwei.de/rss_tvissues.php" };
private ArrayList<Feed> feeds;
protected void setUp() throws Exception {
super.setUp();
feeds = new ArrayList<Feed>();
for (int i = 0; i < urls.length; i++) {
Feed f = new Feed(urls[i], new Date());
for (int i = 0; i < TestFeeds.urls.length; i++) {
Feed f = new Feed(TestFeeds.urls[i], new Date());
f.setFile_url(new File(getContext().getExternalFilesDir(FEEDS_DIR)
.getAbsolutePath(), "R" + i).getAbsolutePath());
feeds.add(f);

View File

@ -0,0 +1,70 @@
package de.danoeh.antennapod.test;
import java.io.File;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import de.danoeh.antennapod.asynctask.DownloadStatus;
import de.danoeh.antennapod.feed.Feed;
import de.danoeh.antennapod.service.download.Downloader;
import de.danoeh.antennapod.service.download.DownloaderCallback;
import de.danoeh.antennapod.service.download.HttpDownloader;
import android.test.AndroidTestCase;
import android.util.Log;
public class HttpDownloaderTest extends AndroidTestCase {
private static final String TAG = "HttpDownloaderTest";
private static final String DOWNLOAD_DIR = "testdownloads";
private static boolean successful = true;
private static ExecutorService es;
private static DownloaderCallback downloaderCallback = new DownloaderCallback() {
@Override
public void onDownloadCompleted(Downloader downloader) {
DownloadStatus status = downloader.getStatus();
if (status != null) {
final String downloadUrl = status.getFeedFile().getDownload_url();
final String fileUrl = status.getFeedFile().getFile_url();
new File(fileUrl).delete();
if (status.isSuccessful()) {
Log.i(TAG, "Download successful: " + downloadUrl);
} else {
Log.e(TAG, "Download not successful: " + status.toString());
successful = false;
}
} else {
Log.wtf(TAG, "Status was null");
successful = false;
}
if (successful == false) {
es.shutdownNow();
}
}
};
public void testDownload() throws InterruptedException {
es = Executors.newFixedThreadPool(5);
int i = 0;
for (String url : TestDownloads.urls) {
Feed feed = new Feed(url, new Date());
String fileUrl = new File(getContext().getExternalFilesDir(DOWNLOAD_DIR).getAbsolutePath(), Integer.toString(i)).getAbsolutePath();
File file = new File(fileUrl);
Log.d(TAG, "Deleting file: " + file.delete());
feed.setFile_url(fileUrl);
DownloadStatus status = new DownloadStatus(feed, Integer.toString(i));
Downloader downloader = new HttpDownloader(downloaderCallback, status);
es.submit(downloader);
i++;
}
Log.i(TAG, "Awaiting termination");
es.shutdown();
es.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);
assertTrue(successful);
}
}

View File

@ -0,0 +1,35 @@
package de.danoeh.antennapod.test;
public class TestDownloads {
public static final String[] urls = {
"http://httpbin.org/redirect/4",
"http://httpbin.org/relative-redirect/4",
"http://jigsaw.w3.org/HTTP/300/307.html",
"http://radiobox.omroep.nl/programme/read_programme_podcast/9168/read.rss",
"http://rss.sciam.com/sciam/60secsciencepodcast",
"http://rss.sciam.com/sciam/60-second-mind",
"http://rss.sciam.com/sciam/60-second-space",
"http://rss.sciam.com/sciam/60-second-health",
"http://rss.sciam.com/sciam/60-second-tech",
"http://risky.biz/feeds/risky-business",
"http://risky.biz/feeds/rb2",
"http://podcast.hr-online.de/lateline/podcast.xml",
"http://bitlove.org/nsemak/mikrodilettanten/feed",
"http://bitlove.org/moepmoeporg/riotburnz/feed",
"http://bitlove.org/moepmoeporg/schachcast/feed",
"http://bitlove.org/moepmoeporg/sundaymoaning/feed",
"http://bitlove.org/motofunk/anekdotkast/feed",
"http://bitlove.org/motofunk/motofunk/feed",
"http://bitlove.org/nerdinand/zch/feed",
"http://podcast.homerj.de/podcasts.xml",
"http://www.dradio.de/rss/podcast/sendungen/wissenschaftundbildung/",
"http://www.dradio.de/rss/podcast/sendungen/wirtschaftundverbraucher/",
"http://www.dradio.de/rss/podcast/sendungen/literatur/",
"http://www.dradio.de/rss/podcast/sendungen/sport/",
"http://www.dradio.de/rss/podcast/sendungen/wirtschaftundgesellschaft/",
"http://www.dradio.de/rss/podcast/sendungen/filmederwoche/",
"http://www.blacksweetstories.com/feed/podcast/",
"http://feeds.5by5.tv/buildanalyze",
"http://bitlove.org/ranzzeit/ranz/feed"
};
}

View File

@ -0,0 +1,366 @@
package de.danoeh.antennapod.test;
public class TestFeeds {
public static final String[] urls = {
"http://rss.sciam.com/sciam/60secsciencepodcast",
"http://rss.sciam.com/sciam/60-second-mind",
"http://rss.sciam.com/sciam/60-second-space",
"http://rss.sciam.com/sciam/60-second-health",
"http://rss.sciam.com/sciam/60-second-tech",
"http://risky.biz/feeds/risky-business",
"http://risky.biz/feeds/rb2",
"http://podcast.hr-online.de/lateline/podcast.xml",
"http://bitlove.org/nsemak/mikrodilettanten/feed",
"http://bitlove.org/moepmoeporg/riotburnz/feed",
"http://bitlove.org/moepmoeporg/schachcast/feed",
"http://bitlove.org/moepmoeporg/sundaymoaning/feed",
"http://bitlove.org/motofunk/anekdotkast/feed",
"http://bitlove.org/motofunk/motofunk/feed",
"http://bitlove.org/nerdinand/zch/feed",
"http://podcast.homerj.de/podcasts.xml",
"http://www.dradio.de/rss/podcast/sendungen/wissenschaftundbildung/",
"http://www.dradio.de/rss/podcast/sendungen/wirtschaftundverbraucher/",
"http://www.dradio.de/rss/podcast/sendungen/literatur/",
"http://www.dradio.de/rss/podcast/sendungen/sport/",
"http://www.dradio.de/rss/podcast/sendungen/wirtschaftundgesellschaft/",
"http://www.dradio.de/rss/podcast/sendungen/filmederwoche/",
"http://www.blacksweetstories.com/feed/podcast/",
"http://feeds.5by5.tv/buildanalyze",
"http://bitlove.org/ranzzeit/ranz/feed",
"http://bitlove.org/importthis/mp3/feed",
"http://bitlove.org/astro/youtube/feed",
"http://bitlove.org/channelcast/channelcast/feed",
"http://bitlove.org/cccb/chaosradio/feed",
"http://bitlove.org/astro/bitlove-show/feed",
"http://feeds.thisamericanlife.org/talpodcast",
"http://www.casasola.de/137b/1337motiv/1337motiv.xml",
"http://alternativlos.org/ogg.rss", "http://www.bitsundso.de/feed",
"http://www.gamesundso.de/feed/",
"http://chaosradio.ccc.de/chaosradio-latest.rss",
"http://feeds.feedburner.com/cre-podcast",
"http://feeds.feedburner.com/NotSafeForWorkPodcast",
"http://feeds.feedburner.com/mobile-macs-podcast",
"http://www.gamesundso.de/feed/",
"http://feeds.feedburner.com/DerLautsprecher",
"http://feeds.feedburner.com/raumzeit-podcast",
"http://feeds.feedburner.com/TheLunaticFringe",
"http://feeds.feedburner.com/Kuechenradioorg",
"http://feeds.feedburner.com/Medienradio_Podcast_RSS",
"http://feeds.feedburner.com/wrint/wrint",
"http://retrozirkel.de/episodes.mp3.rss",
"http://trackback.fritz.de/?feed=podcast",
"http://feeds.feedburner.com/linuxoutlaws-ogg",
"http://www.mevio.com/feeds/noagenda.xml",
"http://podcast.hr2.de/derTag/podcast.xml",
"http://feeds.feedburner.com/thechangelog",
"http://leoville.tv/podcasts/floss.xml",
"http://www.radiotux.de/index.php?/feeds/index.rss2",
"http://megamagis.ch/episodes.mp3.rss",
"http://www.eurogamer.net/rss/eurogamer_podcast_itunes.rss",
"http://bobsonbob.de/?feed=rss2",
"http://www.blacksweetstories.com/feed/podcast/",
"http://www.eurogamer.net/rss/eurogamer_podcast_itunes.rss",
"http://diehoppeshow.de/podcast/feed.xml",
"http://feeds.feedburner.com/ThisIsMyNextPodcast?format=xml",
"http://bitlove.org/343max/maerchenstunde/feed",
"http://bitlove.org/343max/wmr-aac/feed",
"http://bitlove.org/343max/wmr-mp3/feed",
"http://bitlove.org/343max/wmr-oga/feed",
"http://bitlove.org/adamc1999/noagenda/feed",
"http://bitlove.org/alexbrueckel/normalzeit_podcast/feed",
"http://bitlove.org/alexbrueckel/normalzeit_podcast_mp3/feed",
"http://bitlove.org/alexbrueckel/tisch3-podcast/feed",
"http://bitlove.org/alexolma/iphoneblog/feed",
"http://bitlove.org/andydrop/nachtnerd/feed",
"http://bitlove.org/apollo40/ps3newsroom/feed",
"http://bitlove.org/beapirate/hauptstadtpiraten/feed",
"http://bitlove.org/benni/besondereumstaende/feed",
"http://bitlove.org/bennihahn/unicast/feed",
"http://bitlove.org/berndbloggt/wirschweifenab/feed",
"http://bitlove.org/bildungsangst/spoiler-alert-mp3/feed",
"http://bitlove.org/bildungsangst/spoiler-alert-ogg/feed",
"http://bitlove.org/bildungsangst/troja-alert-mp3/feed",
"http://bitlove.org/bildungsangst/troja-alert-ogg/feed",
"http://bitlove.org/binaergewitter/talk/feed",
"http://bitlove.org/binaergewitter/talk-ogg/feed",
"http://bitlove.org/bitgamers/bitgamerscast/feed",
"http://bitlove.org/boingsworld/boingsworld/feed",
"http://bitlove.org/boris/appsacker/feed",
"http://bitlove.org/boris/bam/feed",
"http://bitlove.org/bruhndsoweiter/anycast-aac/feed",
"http://bitlove.org/bruhndsoweiter/anycast-mp3/feed",
"http://bitlove.org/bruhndsoweiter/schnackennet-m4a/feed",
"http://bitlove.org/bruhndsoweiter/schnackennet-mp3/feed",
"http://bitlove.org/bruhndsoweiter/schnackennet-ogg/feed",
"http://bitlove.org/byteweise/bytecast/feed",
"http://bitlove.org/byteweise/byteweiseaac/feed",
"http://bitlove.org/c3d2/news/feed",
"http://bitlove.org/c3d2/pentacast/feed",
"http://bitlove.org/c3d2/pentamedia/feed",
"http://bitlove.org/c3d2/pentamusic/feed",
"http://bitlove.org/c3d2/pentaradio/feed",
"http://bitlove.org/campuscast_cc/campuscast_cc/feed",
"http://bitlove.org/carlito/schnittmuster/feed",
"http://bitlove.org/carlito/yaycomics/feed",
"http://bitlove.org/cccb/chaosradio/feed",
"http://bitlove.org/ccculm/chaosseminar-mp4-high/feed",
"http://bitlove.org/ccculm/chaosseminar-theora/feed",
"http://bitlove.org/channelcast/channelcast/feed",
"http://bitlove.org/chgrasse/freequency/feed",
"http://bitlove.org/chgrasse/kiezradio/feed",
"http://bitlove.org/christiansteiner/secondunit/feed",
"http://bitlove.org/cinext/cinext/feed",
"http://bitlove.org/ckater/schoeneecken/feed",
"http://bitlove.org/ckater/schoeneecken-mp3/feed",
"http://bitlove.org/cllassnig/bytegefluester/feed",
"http://bitlove.org/cllassnig/nerdtirol/feed",
"http://bitlove.org/cocoaheads/austria/feed",
"http://bitlove.org/compod/compod/feed",
"http://bitlove.org/consolmedia/consolpodcast/feed",
"http://bitlove.org/couchblog/computerfix/feed",
"http://bitlove.org/culinaricast/podcast/feed",
"http://bitlove.org/d3v/die-drei-vogonen/feed",
"http://bitlove.org/danielbuechele/luftpost/feed",
"http://bitlove.org/deimhart/mp3/feed",
"http://bitlove.org/deimhart/ogg/feed",
"http://bitlove.org/derbastard/podcast/feed",
"http://bitlove.org/derpoppe/poppeandpeople/feed",
"http://bitlove.org/derpoppe/stammtischphilosophen/feed",
"http://bitlove.org/devradio/devradio-music-mp3/feed",
"http://bitlove.org/devradio/devradio-music-ogg/feed",
"http://bitlove.org/devradio/devradio-nomusic-mp3/feed",
"http://bitlove.org/devradio/devradio-nomusic-ogg/feed",
"http://bitlove.org/die-halde/die-halde/feed",
"http://bitlove.org/dirtyminutesleft/m4a/feed",
"http://bitlove.org/dirtyminutesleft/mp3/feed",
"http://bitlove.org/dominik/knutsens/feed",
"http://bitlove.org/dominik/schnittchen/feed",
"http://bitlove.org/driveeo/podcast/feed",
"http://bitlove.org/einfachben/freibeuterhafen/feed",
"http://bitlove.org/eintr8podcast/aac/feed",
"http://bitlove.org/eintr8podcast/eptv/feed",
"http://bitlove.org/eintr8podcast/mp3/feed",
"http://bitlove.org/eteubert/satoripress-m4a/feed",
"http://bitlove.org/fabu/indie-fresse/feed",
"http://bitlove.org/faldrian/bofh-mp3/feed",
"http://bitlove.org/faldrian/bofh-oga/feed",
"http://bitlove.org/faldrian/faldriansfeierabend/feed",
"http://bitlove.org/filmtonpodcast/filmtonpodcast/feed",
"http://bitlove.org/firmadorsch/fahrradio/feed",
"http://bitlove.org/frequenz9/feed/feed",
"http://bitlove.org/gamefusion/feeds/feed",
"http://bitlove.org/gamesandmacs/podcast/feed",
"http://bitlove.org/geekweek/techpodcast/feed",
"http://bitlove.org/germanstudent/apfelnet/feed",
"http://bitlove.org/germanstudent/bruellaffencouch-enhanced/feed",
"http://bitlove.org/germanstudent/bruellaffencouch-mp3/feed",
"http://bitlove.org/germanstudent/kauderwelschavantgarde/feed",
"http://bitlove.org/germanstudent/podccast-enhanced/feed",
"http://bitlove.org/germanstudent/podccast-mp3/feed",
"http://bitlove.org/geschichtendose/love/feed",
"http://bitlove.org/gfm/atzbach/feed",
"http://bitlove.org/gfm/rumsendende/feed",
"http://bitlove.org/grizze/vtlive/feed",
"http://bitlove.org/hackerfunk/hf-mp3/feed",
"http://bitlove.org/hackerfunk/hf-ogg/feed",
"http://bitlove.org/hasencore/podcast/feed",
"http://bitlove.org/hoaxmaster/hoaxilla/feed",
"http://bitlove.org/hoaxmaster/psychotalk/feed",
"http://bitlove.org/hoaxmaster/skeptoskop/feed",
"http://bitlove.org/hoersuppe/vorcast/feed",
"http://bitlove.org/holgi/wrint/feed",
"http://bitlove.org/ich-bin-radio/fir/feed",
"http://bitlove.org/ich-bin-radio/rsff/feed",
"http://bitlove.org/incerio/podcast/feed",
"http://bitlove.org/jagdfunk/jagdfunk/feed",
"http://bitlove.org/janlelis/rubykraut/feed",
"http://bitlove.org/jed/feed1/feed",
"http://bitlove.org/jupiterbroadcasting/coderradio/feed",
"http://bitlove.org/jupiterbroadcasting/fauxshowhd/feed",
"http://bitlove.org/jupiterbroadcasting/fauxshowmobile/feed",
"http://bitlove.org/jupiterbroadcasting/lashd/feed",
"http://bitlove.org/jupiterbroadcasting/lasmobile/feed",
"http://bitlove.org/jupiterbroadcasting/scibytehd/feed",
"http://bitlove.org/jupiterbroadcasting/scibytemobile/feed",
"http://bitlove.org/jupiterbroadcasting/techsnap60/feed",
"http://bitlove.org/jupiterbroadcasting/techsnapmobile/feed",
"http://bitlove.org/jupiterbroadcasting/unfilterhd/feed",
"http://bitlove.org/jupiterbroadcasting/unfiltermobile/feed",
"http://bitlove.org/kassettenkind/trollfunk/feed",
"http://bitlove.org/klangkammermedia/abgekuppelt/feed",
"http://bitlove.org/klangkammermedia/derbalkoncast/feed",
"http://bitlove.org/klangkammermedia/wortundstille/feed",
"http://bitlove.org/kurzpod/kurzpod/feed",
"http://bitlove.org/kurzpod/kurzpodm4a/feed",
"http://bitlove.org/kurzpod/ogg/feed",
"http://bitlove.org/langpod/lp/feed",
"http://bitlove.org/legrex/videli-noch/feed",
"http://bitlove.org/linucast/screencast/feed",
"http://bitlove.org/lisnewsnetcasts/listen/feed",
"http://bitlove.org/logenzuschlag/cinecast/feed",
"http://bitlove.org/maha/1337kultur/feed",
"http://bitlove.org/maha/klabautercast/feed",
"http://bitlove.org/map/fanboys/feed",
"http://bitlove.org/map/fanboys-mp3/feed",
"http://bitlove.org/map/retrozirkel/feed",
"http://bitlove.org/map/retrozirkel-mp3/feed",
"http://bitlove.org/mappleconfusers/nachts-mp3/feed",
"http://bitlove.org/mappleconfusers/nachts-mp4/feed",
"http://bitlove.org/mappleconfusers/nachts-ogg/feed",
"http://bitlove.org/mappleconfusers/nachts-pdf/feed",
"http://bitlove.org/markus/robotiklabor/feed",
"http://bitlove.org/martinschmidt/freiklettern/feed",
"http://bitlove.org/mespotine/mespotine_sessions/feed",
"http://bitlove.org/meszner/aether/feed",
"http://bitlove.org/meszner/kulturwissenschaften/feed",
"http://bitlove.org/metaebene/cre/feed",
"http://bitlove.org/metaebene/der-lautsprecher/feed",
"http://bitlove.org/metaebene/kolophon/feed",
"http://bitlove.org/metaebene/logbuch-netzpolitik/feed",
"http://bitlove.org/metaebene/mobilemacs/feed",
"http://bitlove.org/metaebene/newz-of-the-world/feed",
"http://bitlove.org/metaebene/not-safe-for-work/feed",
"http://bitlove.org/metaebene/raumzeit/feed",
"http://bitlove.org/metaebene/raumzeit-mp3/feed",
"http://bitlove.org/metagamer/metagamer/feed",
"http://bitlove.org/mfromm/collaborativerockers/feed",
"http://bitlove.org/mfromm/explorism/feed",
"http://bitlove.org/mfromm/transientesichten/feed",
"http://bitlove.org/mhpod/pofacs/feed",
"http://bitlove.org/michaela_w/michaelaswelt/feed",
"http://bitlove.org/michaelgreth/sharepointpdcast/feed",
"http://bitlove.org/mintcast/podcast/feed",
"http://bitlove.org/mitgezwitschert/brandung/feed",
"http://bitlove.org/moepmoeporg/anonnewsde/feed",
"http://bitlove.org/moepmoeporg/contentcast/feed",
"http://bitlove.org/moepmoeporg/dieseminarren/feed",
"http://bitlove.org/moepmoeporg/emcast/feed",
"http://bitlove.org/moepmoeporg/fhainalex/feed",
"http://bitlove.org/moepmoeporg/fruehstueck/feed",
"http://bitlove.org/moepmoeporg/galanoir/feed",
"http://bitlove.org/moepmoeporg/julespodcasts/feed",
"http://bitlove.org/moepmoeporg/knorkpod/feed",
"http://bitlove.org/moepmoeporg/lecast/feed",
"http://bitlove.org/moepmoeporg/moepspezial/feed",
"http://bitlove.org/moepmoeporg/podsprech/feed",
"http://bitlove.org/moepmoeporg/pottcast/feed",
"http://bitlove.org/moepmoeporg/riotburnz/feed",
"http://bitlove.org/moepmoeporg/schachcast/feed",
"http://bitlove.org/moepmoeporg/sundaymoaning/feed",
"http://bitlove.org/motofunk/anekdotkast/feed",
"http://bitlove.org/motofunk/motofunk/feed",
"http://bitlove.org/nerdinand/zch/feed",
"http://bitlove.org/netzpolitik/netzpolitik-podcast/feed",
"http://bitlove.org/netzpolitik/netzpolitik-tv/feed",
"http://bitlove.org/nischenkultur/soziopod/feed",
"http://bitlove.org/nitramred/staatsbuergerkunde/feed",
"http://bitlove.org/nitramred/staatsbuergerkunde-mp3/feed",
"http://bitlove.org/nsemak/elementarfragen/feed",
"http://bitlove.org/nsemak/mikrodilettanten/feed",
"http://bitlove.org/oaad/oaad/feed",
"http://bitlove.org/ohrkrampfteam/ohr/feed",
"http://bitlove.org/omegatau/all/feed",
"http://bitlove.org/omegatau/english-only/feed",
"http://bitlove.org/omegatau/german-only/feed",
"http://bitlove.org/onatcer/oal/feed",
"http://bitlove.org/panikcast/panikcast/feed",
"http://bitlove.org/panxatony/aviewinblue/feed",
"http://bitlove.org/panxatony/macnemotv/feed",
"http://bitlove.org/pattex/megamagisch_m4a/feed",
"http://bitlove.org/pattex/megamagisch_mp3/feed",
"http://bitlove.org/pausengespraeche/pausengespraeche/feed",
"http://bitlove.org/pck/ez-und-geschlecht/feed",
"http://bitlove.org/pck/gender-kolleg-marburg/feed",
"http://bitlove.org/pck/genderzentrum_mr/feed",
"http://bitlove.org/pck/hh/feed",
"http://bitlove.org/pck/hh_mp3/feed",
"http://bitlove.org/pck/hh_ogg/feed",
"http://bitlove.org/pck/intercast/feed",
"http://bitlove.org/pck/peachnerdznohero/feed",
"http://bitlove.org/pck/peachnerdznohero_mp3/feed",
"http://bitlove.org/philip/einfach-schwul/feed",
"http://bitlove.org/philip/faselcast2/feed",
"http://bitlove.org/philipbanse/kuechenradio/feed",
"http://bitlove.org/philipbanse/medienradio/feed",
"http://bitlove.org/philipbanse/studienwahl_tv_audio/feed",
"http://bitlove.org/philipbanse/studienwahl_tv_video/feed",
"http://bitlove.org/podsafepilot/pmp/feed",
"http://bitlove.org/podsafepilot/psid/feed",
"http://bitlove.org/pratfm/strunt/feed",
"http://bitlove.org/pressrecord/podcast/feed",
"http://bitlove.org/pztv/alle_formate/feed",
"http://bitlove.org/qbi/datenkanal-mp3/feed",
"http://bitlove.org/qbi/datenkanal-ogg/feed",
"http://bitlove.org/quotidianitaet/quotidianitaet/feed",
"http://bitlove.org/radiotux/radiotux-all/feed",
"http://bitlove.org/randgruppenfunk/mediale_subkultur/feed",
"http://bitlove.org/ranzzeit/ranz/feed",
"http://bitlove.org/relet/lifeartificial_partone/feed",
"http://bitlove.org/retinacast/pilotenpruefung/feed",
"http://bitlove.org/retinacast/podcast/feed",
"http://bitlove.org/retinacast/podcast-aac/feed",
"http://bitlove.org/retinacast/retinauten/feed",
"http://bitlove.org/retinacast/rtc/feed",
"http://bitlove.org/revolutionarts/mehrspielerquote/feed",
"http://bitlove.org/ronsens/machtdose/feed",
"http://bitlove.org/rooby/fressefreiheit/feed",
"http://bitlove.org/rundumpodcast/rundum/feed",
"http://bitlove.org/ryuu/riesencast/feed",
"http://bitlove.org/ryuu/ryuus_labercast/feed",
"http://bitlove.org/sangyye/nerdmate/feed",
"http://bitlove.org/sangyye/nerdmate-ogg/feed",
"http://bitlove.org/schmalsprech/schmalsprech_m4a/feed",
"http://bitlove.org/schmalsprech/schmalsprech_mp3/feed",
"http://bitlove.org/schmidtlepp/houroflauer/feed",
"http://bitlove.org/schmidtlepp/lauerinformiert/feed",
"http://bitlove.org/sebastiansimon/wertungsfrei/feed",
"http://bitlove.org/sebseb7/vimeo/feed",
"http://bitlove.org/sirtomate/comichoehle/feed",
"http://bitlove.org/smartphone7/windowsphonepodcast/feed",
"http://bitlove.org/smcpodcast/feed/feed",
"http://bitlove.org/sneakpod/cocktailpodcast/feed",
"http://bitlove.org/sneakpod/sneakpod/feed",
"http://bitlove.org/socialhack/hoerensagen/feed",
"http://bitlove.org/socialhack/netzkinder/feed",
"http://bitlove.org/socialhack/netzkinder_mp3/feed",
"http://bitlove.org/socialhack/netzkinder_ogg/feed",
"http://bitlove.org/socialhack/talking_anthropology/feed",
"http://bitlove.org/sprechwaisen/sw/feed",
"http://bitlove.org/sublab/aboutradio/feed",
"http://bitlove.org/sysops/elektrisch/feed",
"http://bitlove.org/sysops/hd/feed",
"http://bitlove.org/taschencasts/taschencasts/feed",
"http://bitlove.org/tcmanila/ae-podcast/feed",
"http://bitlove.org/teezeit/kulturbuechse/feed",
"http://bitlove.org/teezeit/kulturbuechse-mp3/feed",
"http://bitlove.org/teezeit/teezeittalkradio/feed",
"http://bitlove.org/teezeit/teezeittalkradio-mp3/feed",
"http://bitlove.org/tinkengil/playtogether/feed",
"http://bitlove.org/tobi_s/alleswirdgut/feed",
"http://bitlove.org/toby/einschlafenenhanced/feed",
"http://bitlove.org/toby/einschlafenpodcast/feed",
"http://bitlove.org/toby/pubkameraden/feed",
"http://bitlove.org/toby/pubkameradenaac/feed",
"http://bitlove.org/tom/radioanstalt/feed",
"http://bitlove.org/tvallgaeu/beitraege/feed",
"http://bitlove.org/tvallgaeu/freizeit/feed",
"http://bitlove.org/tvallgaeu/sendung/feed",
"http://bitlove.org/ubahnverleih/teepodcast/feed",
"http://bitlove.org/umunsherum/sammelcast/feed",
"http://bitlove.org/umunsherum/spielonauten/feed",
"http://bitlove.org/umunsherum/unteruns/feed",
"http://bitlove.org/umunsherum/wasmachstdu/feed",
"http://bitlove.org/uwe/nettesfrettchen/feed",
"http://bitlove.org/vorgedacht/slug/feed",
"http://bitlove.org/webdev/wdr/feed",
"http://bitlove.org/weezerle/brandung/feed",
"http://bitlove.org/weezerle/guestcast/feed",
"http://bitlove.org/weezerle/stupalog/feed",
"http://bitlove.org/wikigeeks/wikigeeks-aac/feed",
"http://bitlove.org/wikigeeks/wikigeeks-mp3/feed",
"http://bitlove.org/wikigeeks/wikigeeks-ogg/feed",
"http://bitlove.org/workingdraft/revisionen/feed",
"http://bitlove.org/wunderlich/podcast/feed",
"http://www.cczwei.de/rss_tvissues.php" };
}