public static void SetComplete(int epid, string fileName, Provider.DownloadInfo info) { lock (DbUpdateLock) { using (SQLiteMonTransaction transMon = new SQLiteMonTransaction(FetchDbConn().BeginTransaction())) { using (SQLiteCommand command = new SQLiteCommand("update downloads set status=@status, filepath=@filepath where epid=@epid", FetchDbConn(), transMon.Trans)) { command.Parameters.Add(new SQLiteParameter("@status", DownloadStatus.Downloaded)); command.Parameters.Add(new SQLiteParameter("@filepath", fileName)); command.Parameters.Add(new SQLiteParameter("@epid", epid)); command.ExecuteNonQuery(); } Chapter.AddRange(epid, info.Chapters); transMon.Trans.Commit(); } } lock (sortCacheLock) { sortCache = null; } if (Updated != null) { Updated(epid); } }
protected static void SetAutoDownloadAsync(int[] epids, bool autoDownload) { lock (DbUpdateLock) { using (SQLiteMonTransaction transMon = new SQLiteMonTransaction(FetchDbConn().BeginTransaction())) { using (SQLiteCommand command = new SQLiteCommand("update episodes set autodownload=@autodownload where epid=@epid", FetchDbConn())) { SQLiteParameter epidParam = new SQLiteParameter("@epid"); SQLiteParameter autodownloadParam = new SQLiteParameter("@autodownload"); command.Parameters.Add(epidParam); command.Parameters.Add(autodownloadParam); foreach (int epid in epids) { epidParam.Value = epid; autodownloadParam.Value = autoDownload ? 1 : 0; command.ExecuteNonQuery(); } } transMon.Trans.Commit(); } } if (Updated != null) { foreach (int epid in epids) { Updated(epid); } } }
private static void RemoveAsync(int epid, bool auto) { if (!auto) { if (!DownloadManager.CancelDownload(epid)) { return; } } lock (Database.DbUpdateLock) { using (SQLiteMonTransaction transMon = new SQLiteMonTransaction(FetchDbConn().BeginTransaction())) { SQLiteParameter epidParam = new SQLiteParameter("@epid", epid); using (SQLiteCommand command = new SQLiteCommand("delete from downloads where epid=@epid", FetchDbConn(), transMon.Trans)) { command.Parameters.Add(epidParam); if (command.ExecuteNonQuery() == 0) { // Download has already been removed transMon.Trans.Rollback(); return; } } // Mark the download's episode as unavailable so it gets updated when next available using (SQLiteCommand command = new SQLiteCommand("update episodes set available=0 where epid=@epid", FetchDbConn(), transMon.Trans)) { command.Parameters.Add(epidParam); command.ExecuteNonQuery(); } if (!auto) { // Unset the auto download flag, so if the user is subscribed it doesn't just download again Episode.SetAutoDownloadAsync(new int[] { epid }, false); } transMon.Trans.Commit(); } } lock (sortCacheLock) { // No need to clear the sort cache, just remove this episodes entry if (sortCache != null) { sortCache.Remove(epid); } } if (Removed != null) { Removed(epid); } }
private static void AddAsync(int[] epids) { List <int> added = new List <int>(); lock (DbUpdateLock) { using (SQLiteMonTransaction transMon = new SQLiteMonTransaction(FetchDbConn().BeginTransaction())) { using (SQLiteCommand command = new SQLiteCommand("insert into downloads (epid) values (@epid)", FetchDbConn())) { SQLiteParameter epidParam = new SQLiteParameter("@epid"); command.Parameters.Add(epidParam); foreach (int epid in epids) { epidParam.Value = epid; try { command.ExecuteNonQuery(); } catch (SQLiteException sqliteExp) { if (sqliteExp.ErrorCode == SQLiteErrorCode.Constraint) { // Already added while this was waiting in the threadpool continue; } throw; } added.Add(epid); } } transMon.Trans.Commit(); } } if (Added != null) { foreach (int epid in added) { Added(epid); } } DownloadManager.AddDownloads(added.ToArray()); }
public static void RemoveAll(int epid) { lock (DbUpdateLock) { using (SQLiteMonTransaction transMon = new SQLiteMonTransaction(FetchDbConn().BeginTransaction())) { using (SQLiteCommand command = new SQLiteCommand("delete from chapters where epid=@epid", FetchDbConn(), transMon.Trans)) { command.Parameters.Add(new SQLiteParameter("@epid", epid)); command.ExecuteNonQuery(); } transMon.Trans.Commit(); } } }
public static void AddRange(int epid, ICollection <Provider.ChapterInfo> chapters) { lock (DbUpdateLock) { using (SQLiteMonTransaction transMon = new SQLiteMonTransaction(FetchDbConn().BeginTransaction())) { using (SQLiteCommand command = new SQLiteCommand("insert into chapters (epid, start, name, link, image) values (@epid, @start, @name, @link, @image)", FetchDbConn(), transMon.Trans)) { foreach (var chapter in chapters) { command.Parameters.Add(new SQLiteParameter("@epid", epid)); command.Parameters.Add(new SQLiteParameter("@start", chapter.Start.TotalMilliseconds)); command.Parameters.Add(new SQLiteParameter("@name", chapter.Name)); command.Parameters.Add(new SQLiteParameter("@link", chapter.Link)); command.Parameters.Add(new SQLiteParameter("@image", StoreImage(chapter.Image))); command.ExecuteNonQuery(); } } transMon.Trans.Commit(); } } }
private static int? UpdateInfo(int progid, string episodeExtId) { Guid pluginId; string progExtId; ProgrammeInfo progInfo; using (SQLiteCommand command = new SQLiteCommand("select pluginid, extid, name, description, singleepisode from programmes where progid=@progid", FetchDbConn())) { command.Parameters.Add(new SQLiteParameter("@progid", progid)); using (SQLiteMonDataReader reader = new SQLiteMonDataReader(command.ExecuteReader())) { if (!reader.Read()) { throw new DataNotFoundException(progid, "Programme does not exist"); } pluginId = new Guid(reader.GetString(reader.GetOrdinal("pluginid"))); progExtId = reader.GetString(reader.GetOrdinal("extid")); progInfo = new ProgrammeInfo(); progInfo.Name = reader.GetString(reader.GetOrdinal("name")); int descriptionOrdinal = reader.GetOrdinal("description"); if (!reader.IsDBNull(descriptionOrdinal)) { progInfo.Description = reader.GetString(descriptionOrdinal); } progInfo.SingleEpisode = reader.GetBoolean(reader.GetOrdinal("singleepisode")); } } IRadioProvider providerInst = Provider.GetFromId(pluginId).CreateInstance(); EpisodeInfo episodeInfo; try { episodeInfo = providerInst.GetEpisodeInfo(progExtId, progInfo, episodeExtId); if (episodeInfo == null) { return null; } if (string.IsNullOrEmpty(episodeInfo.Name)) { throw new InvalidDataException("Episode name cannot be null or an empty string"); } } catch (Exception provExp) { provExp.Data.Add("Programme", progInfo.ToString() + "\r\nExtID: " + progExtId); provExp.Data.Add("Episode ExtID", episodeExtId); throw new ProviderException("Call to GetEpisodeInfo failed", provExp, pluginId); } if (episodeInfo.Date == null) { // The date of the episode isn't known, so use the current date episodeInfo.Date = DateTime.Now; } lock (DbUpdateLock) { using (SQLiteMonTransaction transMon = new SQLiteMonTransaction(FetchDbConn().BeginTransaction())) { int? epid = null; using (SQLiteCommand command = new SQLiteCommand("select epid from episodes where progid=@progid and extid=@extid", FetchDbConn(), transMon.Trans)) { command.Parameters.Add(new SQLiteParameter("@progid", progid)); command.Parameters.Add(new SQLiteParameter("@extid", episodeExtId)); using (SQLiteMonDataReader reader = new SQLiteMonDataReader(command.ExecuteReader())) { if (reader.Read()) { epid = reader.GetInt32(reader.GetOrdinal("epid")); } } } if (epid == null) { using (SQLiteCommand command = new SQLiteCommand("insert into episodes (progid, extid, name, date) values (@progid, @extid, @name, @date)", FetchDbConn(), transMon.Trans)) { command.Parameters.Add(new SQLiteParameter("@progid", progid)); command.Parameters.Add(new SQLiteParameter("@extid", episodeExtId)); command.Parameters.Add(new SQLiteParameter("@name", episodeInfo.Name)); command.Parameters.Add(new SQLiteParameter("@date", episodeInfo.Date)); command.ExecuteNonQuery(); } using (SQLiteCommand command = new SQLiteCommand("select last_insert_rowid()", FetchDbConn(), transMon.Trans)) { epid = (int)(long)command.ExecuteScalar(); } } using (SQLiteCommand command = new SQLiteCommand("update episodes set name=@name, description=@description, duration=@duration, date=@date, image=@image, available=1 where epid=@epid", FetchDbConn(), transMon.Trans)) { command.Parameters.Add(new SQLiteParameter("@name", episodeInfo.Name)); command.Parameters.Add(new SQLiteParameter("@description", episodeInfo.Description)); command.Parameters.Add(new SQLiteParameter("@duration", episodeInfo.Duration)); command.Parameters.Add(new SQLiteParameter("@date", episodeInfo.Date)); command.Parameters.Add(new SQLiteParameter("@image", StoreImage(episodeInfo.Image))); command.Parameters.Add(new SQLiteParameter("@epid", epid)); command.ExecuteNonQuery(); } using (SQLiteCommand command = new SQLiteCommand("insert or replace into episodeext (epid, name, value) values (@epid, @name, @value)", FetchDbConn(), transMon.Trans)) { foreach (KeyValuePair<string, string> extItem in episodeInfo.ExtInfo) { command.Parameters.Add(new SQLiteParameter("@epid", epid)); command.Parameters.Add(new SQLiteParameter("@name", extItem.Key)); command.Parameters.Add(new SQLiteParameter("@value", extItem.Value)); command.ExecuteNonQuery(); } } transMon.Trans.Commit(); return epid; } } }
protected static void SetAutoDownloadAsync(int[] epids, bool autoDownload) { lock (DbUpdateLock) { using (SQLiteMonTransaction transMon = new SQLiteMonTransaction(FetchDbConn().BeginTransaction())) { using (SQLiteCommand command = new SQLiteCommand("update episodes set autodownload=@autodownload where epid=@epid", FetchDbConn())) { SQLiteParameter epidParam = new SQLiteParameter("@epid"); SQLiteParameter autodownloadParam = new SQLiteParameter("@autodownload"); command.Parameters.Add(epidParam); command.Parameters.Add(autodownloadParam); foreach (int epid in epids) { epidParam.Value = epid; autodownloadParam.Value = autoDownload ? 1 : 0; command.ExecuteNonQuery(); } } transMon.Trans.Commit(); } } if (Updated != null) { foreach (int epid in epids) { Updated(epid); } } }
public static void UpdatePaths(Status status, string newPath, string newFormat) { status.StatusText = "Fetching downloads..."; List <Download> downloads = new List <Download>(); using (SQLiteCommand command = new SQLiteCommand("select episodes.epid, progid, name, description, date, duration, autodownload, status, errortype, errordetails, filepath, playcount from episodes, downloads where episodes.epid=downloads.epid", FetchDbConn())) { using (SQLiteMonDataReader reader = new SQLiteMonDataReader(command.ExecuteReader())) { while (reader.Read()) { downloads.Add(new Download(reader)); } } } if (downloads.Count > 0) { Dictionary <int, Programme> programmes = new Dictionary <int, Programme>(); int progress = 0; status.StatusText = "Updating download paths..."; status.ProgressBarMax = downloads.Count; status.ProgressBarMarquee = false; using (SQLiteCommand command = new SQLiteCommand("update downloads set filepath=@filepath where epid=@epid", FetchDbConn())) { SQLiteParameter epidParam = new SQLiteParameter("epid"); SQLiteParameter filepathParam = new SQLiteParameter("filepath"); command.Parameters.Add(epidParam); command.Parameters.Add(filepathParam); foreach (Download download in downloads) { if (File.Exists(download.DownloadPath)) { if (!programmes.ContainsKey(download.Progid)) { programmes.Add(download.Progid, new Programme(download.Progid)); } string newDownloadPath = FindFreeSaveFileName(newFormat, programmes[download.Progid], download, newPath) + Path.GetExtension(download.DownloadPath); if (newDownloadPath != download.DownloadPath) { lock (DbUpdateLock) { using (SQLiteMonTransaction transMon = new SQLiteMonTransaction(FetchDbConn().BeginTransaction())) { epidParam.Value = download.Epid; filepathParam.Value = newDownloadPath; command.ExecuteNonQuery(); File.Move(download.DownloadPath, newDownloadPath); transMon.Trans.Commit(); } } } } status.ProgressBarValue = ++progress; } } status.ProgressBarValue = status.ProgressBarMax; } }
private static int? UpdateInfo(Guid pluginId, string progExtId) { if (!Provider.Exists(pluginId)) { return null; } IRadioProvider pluginInstance = Provider.GetFromId(pluginId).CreateInstance(); ProgrammeInfo progInfo; try { progInfo = pluginInstance.GetProgrammeInfo(progExtId); } catch (Exception provExp) { provExp.Data.Add("Programme ExtID", progExtId); throw new ProviderException("Call to GetProgrammeInfo failed", provExp, pluginId); } if (progInfo == null) { return null; } int? progid = null; lock (DbUpdateLock) { using (SQLiteCommand command = new SQLiteCommand("select progid from programmes where pluginid=@pluginid and extid=@extid", FetchDbConn())) { command.Parameters.Add(new SQLiteParameter("@pluginid", pluginId.ToString())); command.Parameters.Add(new SQLiteParameter("@extid", progExtId)); using (SQLiteMonDataReader reader = new SQLiteMonDataReader(command.ExecuteReader())) { if (reader.Read()) { progid = reader.GetInt32(reader.GetOrdinal("progid")); } } } using (SQLiteMonTransaction transMon = new SQLiteMonTransaction(FetchDbConn().BeginTransaction())) { if (progid == null) { using (SQLiteCommand command = new SQLiteCommand("insert into programmes (pluginid, extid, name) values (@pluginid, @extid, @name)", FetchDbConn())) { command.Parameters.Add(new SQLiteParameter("@pluginid", pluginId.ToString())); command.Parameters.Add(new SQLiteParameter("@extid", progExtId)); command.Parameters.Add(new SQLiteParameter("@name", progExtId)); command.ExecuteNonQuery(); } using (SQLiteCommand command = new SQLiteCommand("select last_insert_rowid()", FetchDbConn())) { progid = (int)(long)command.ExecuteScalar(); } } using (SQLiteCommand command = new SQLiteCommand("update programmes set name=@name, description=@description, image=@image, singleepisode=@singleepisode, lastupdate=@lastupdate where progid=@progid", FetchDbConn())) { command.Parameters.Add(new SQLiteParameter("@name", progInfo.Name)); command.Parameters.Add(new SQLiteParameter("@description", progInfo.Description)); command.Parameters.Add(new SQLiteParameter("@image", StoreImage(progInfo.Image))); command.Parameters.Add(new SQLiteParameter("@singleepisode", progInfo.SingleEpisode)); command.Parameters.Add(new SQLiteParameter("@lastupdate", DateTime.Now)); command.Parameters.Add(new SQLiteParameter("@progid", progid)); command.ExecuteNonQuery(); } transMon.Trans.Commit(); } } if (Updated != null) { Updated(progid.Value); } return progid; }
public static List<string> GetAvailableEpisodes(int progid, bool fetchAll) { Guid providerId; string progExtId; ProgrammeInfo progInfo; using (SQLiteCommand command = new SQLiteCommand("select pluginid, extid, name, description, singleepisode from programmes where progid=@progid", FetchDbConn())) { command.Parameters.Add(new SQLiteParameter("@progid", progid)); using (SQLiteMonDataReader reader = new SQLiteMonDataReader(command.ExecuteReader())) { if (!reader.Read()) { throw new DataNotFoundException(progid, "Programme does not exist"); } providerId = new Guid(reader.GetString(reader.GetOrdinal("pluginid"))); progExtId = reader.GetString(reader.GetOrdinal("extid")); progInfo = new ProgrammeInfo(); progInfo.Name = reader.GetString(reader.GetOrdinal("name")); int descriptionOrdinal = reader.GetOrdinal("description"); if (!reader.IsDBNull(descriptionOrdinal)) { progInfo.Description = reader.GetString(descriptionOrdinal); } progInfo.SingleEpisode = reader.GetBoolean(reader.GetOrdinal("singleepisode")); } } if (!Provider.Exists(providerId)) { return null; } // Fetch a list of previously available episodes for the programme List<string> previousAvailable = new List<string>(); using (SQLiteCommand command = new SQLiteCommand("select extid from episodes where progid=@progid and available=1 order by date desc", FetchDbConn())) { command.Parameters.Add(new SQLiteParameter("@progid", progid)); using (SQLiteMonDataReader reader = new SQLiteMonDataReader(command.ExecuteReader())) { int epidOrdinal = reader.GetOrdinal("extid"); while (reader.Read()) { previousAvailable.Add(reader.GetString(epidOrdinal)); } } } List<string> allEpExtIds = new List<string>(); int page = 1; IRadioProvider providerInst = Provider.GetFromId(providerId).CreateInstance(); AvailableEpisodes available; do { try { available = providerInst.GetAvailableEpisodes(progExtId, progInfo, page); } catch (Exception provExp) { provExp.Data.Add("Programme ExtID", progExtId); throw new ProviderException("Call to GetAvailableEpisodeIds failed", provExp, providerId); } if (available.EpisodeIds.Count == 0) { break; } int trackOverlap = -1; foreach (string epExtId in available.EpisodeIds) { // Append the returned IDs to the list of all episodes (minus duplicates) if (!allEpExtIds.Contains(epExtId)) { allEpExtIds.Add(epExtId); } if (previousAvailable.Contains(epExtId)) { // Store where the available & previously available ID lists overlap trackOverlap = previousAvailable.IndexOf(epExtId); } else if (trackOverlap >= 0) { // Bump up the overlap index to show there are more after the overlap trackOverlap++; } } if (available.MoreAvailable && !fetchAll) { if (trackOverlap >= 0) { // Remove previously available programmes before this page from the list so that they // are not incorrectly un-flagged as available in the database if (trackOverlap < previousAvailable.Count - 1) { previousAvailable.RemoveRange(trackOverlap + 1, previousAvailable.Count - (trackOverlap + 1)); } // Stop fetching available episode pages break; } } page++; } while (available.MoreAvailable); // Remove the still available episodes from the previously available list foreach (string epExtId in allEpExtIds) { previousAvailable.Remove(epExtId); } // Unflag any no-longer available episodes in the database if (previousAvailable.Count > 0) { lock (DbUpdateLock) { using (SQLiteMonTransaction transMon = new SQLiteMonTransaction(FetchDbConn().BeginTransaction())) { using (SQLiteCommand command = new SQLiteCommand("update episodes set available=0 where progid=@progid and extid=@extid", FetchDbConn(), transMon.Trans)) { SQLiteParameter extidParam = new SQLiteParameter("@extid"); command.Parameters.Add(new SQLiteParameter("@progid", progid)); command.Parameters.Add(extidParam); foreach (string epExtId in previousAvailable) { extidParam.Value = epExtId; command.ExecuteNonQuery(); } } transMon.Trans.Commit(); } } } return allEpExtIds; }
private static int?UpdateInfo(int progid, string episodeExtId) { Guid pluginId; string progExtId; Provider.ProgrammeInfo progInfo; using (SQLiteCommand command = new SQLiteCommand("select pluginid, extid, name, description, singleepisode from programmes where progid=@progid", FetchDbConn())) { command.Parameters.Add(new SQLiteParameter("@progid", progid)); using (SQLiteMonDataReader reader = new SQLiteMonDataReader(command.ExecuteReader())) { if (!reader.Read()) { throw new DataNotFoundException(progid, "Programme does not exist"); } pluginId = new Guid(reader.GetString(reader.GetOrdinal("pluginid"))); progExtId = reader.GetString(reader.GetOrdinal("extid")); progInfo = new Provider.ProgrammeInfo(); progInfo.Name = reader.GetString(reader.GetOrdinal("name")); int descriptionOrdinal = reader.GetOrdinal("description"); if (!reader.IsDBNull(descriptionOrdinal)) { progInfo.Description = reader.GetString(descriptionOrdinal); } progInfo.SingleEpisode = reader.GetBoolean(reader.GetOrdinal("singleepisode")); } } Provider.RadioProvider providerInst = Provider.Handler.GetFromId(pluginId).CreateInstance(); Provider.EpisodeInfo episodeInfo; try { episodeInfo = providerInst.GetEpisodeInfo(progExtId, progInfo, episodeExtId); if (episodeInfo == null) { return(null); } if (string.IsNullOrEmpty(episodeInfo.Name)) { throw new InvalidDataException("Episode name cannot be null or an empty string"); } } catch (Exception provExp) { provExp.Data.Add("Programme", progInfo.ToString() + "\r\nExtID: " + progExtId); provExp.Data.Add("Episode ExtID", episodeExtId); throw new ProviderException("Call to GetEpisodeInfo failed", provExp, pluginId); } if (episodeInfo.Date == null) { // The date of the episode isn't known, so use the current date episodeInfo.Date = DateTime.Now; } lock (DbUpdateLock) { using (SQLiteMonTransaction transMon = new SQLiteMonTransaction(FetchDbConn().BeginTransaction())) { int?epid = null; using (SQLiteCommand command = new SQLiteCommand("select epid from episodes where progid=@progid and extid=@extid", FetchDbConn(), transMon.Trans)) { command.Parameters.Add(new SQLiteParameter("@progid", progid)); command.Parameters.Add(new SQLiteParameter("@extid", episodeExtId)); using (SQLiteMonDataReader reader = new SQLiteMonDataReader(command.ExecuteReader())) { if (reader.Read()) { epid = reader.GetInt32(reader.GetOrdinal("epid")); } } } if (epid == null) { using (SQLiteCommand command = new SQLiteCommand("insert into episodes (progid, extid, name, date) values (@progid, @extid, @name, @date)", FetchDbConn(), transMon.Trans)) { command.Parameters.Add(new SQLiteParameter("@progid", progid)); command.Parameters.Add(new SQLiteParameter("@extid", episodeExtId)); command.Parameters.Add(new SQLiteParameter("@name", episodeInfo.Name)); command.Parameters.Add(new SQLiteParameter("@date", episodeInfo.Date)); command.ExecuteNonQuery(); } using (SQLiteCommand command = new SQLiteCommand("select last_insert_rowid()", FetchDbConn(), transMon.Trans)) { epid = (int)(long)command.ExecuteScalar(); } } using (SQLiteCommand command = new SQLiteCommand("update episodes set name=@name, description=@description, duration=@duration, date=@date, image=@image, available=1 where epid=@epid", FetchDbConn(), transMon.Trans)) { command.Parameters.Add(new SQLiteParameter("@name", episodeInfo.Name)); command.Parameters.Add(new SQLiteParameter("@description", episodeInfo.Description)); command.Parameters.Add(new SQLiteParameter("@duration", episodeInfo.Duration)); command.Parameters.Add(new SQLiteParameter("@date", episodeInfo.Date)); command.Parameters.Add(new SQLiteParameter("@image", StoreImage(episodeInfo.Image))); command.Parameters.Add(new SQLiteParameter("@epid", epid)); command.ExecuteNonQuery(); } using (SQLiteCommand command = new SQLiteCommand("insert or replace into episodeext (epid, name, value) values (@epid, @name, @value)", FetchDbConn(), transMon.Trans)) { foreach (KeyValuePair <string, string> extItem in episodeInfo.ExtInfo) { command.Parameters.Add(new SQLiteParameter("@epid", epid)); command.Parameters.Add(new SQLiteParameter("@name", extItem.Key)); command.Parameters.Add(new SQLiteParameter("@value", extItem.Value)); command.ExecuteNonQuery(); } } transMon.Trans.Commit(); return(epid); } } }
private static void RemoveAsync(int epid, bool auto) { if (!auto) { if (!DownloadManager.CancelDownload(epid)) { return; } } lock (Database.DbUpdateLock) { using (SQLiteMonTransaction transMon = new SQLiteMonTransaction(FetchDbConn().BeginTransaction())) { SQLiteParameter epidParam = new SQLiteParameter("@epid", epid); using (SQLiteCommand command = new SQLiteCommand("delete from downloads where epid=@epid", FetchDbConn(), transMon.Trans)) { command.Parameters.Add(epidParam); if (command.ExecuteNonQuery() == 0) { // Download has already been removed transMon.Trans.Rollback(); return; } } // Mark the download's episode as unavailable so it gets updated when next available using (SQLiteCommand command = new SQLiteCommand("update episodes set available=0 where epid=@epid", FetchDbConn(), transMon.Trans)) { command.Parameters.Add(epidParam); command.ExecuteNonQuery(); } if (!auto) { // Unset the auto download flag, so if the user is subscribed it doesn't just download again Episode.SetAutoDownloadAsync(new int[] { epid }, false); } transMon.Trans.Commit(); } } lock (sortCacheLock) { // No need to clear the sort cache, just remove this episodes entry if (sortCache != null) { sortCache.Remove(epid); } } if (Removed != null) { Removed(epid); } }
private static void AddAsync(int[] epids) { List<int> added = new List<int>(); lock (Database.DbUpdateLock) { using (SQLiteMonTransaction transMon = new SQLiteMonTransaction(FetchDbConn().BeginTransaction())) { using (SQLiteCommand command = new SQLiteCommand("insert into downloads (epid) values (@epid)", FetchDbConn())) { SQLiteParameter epidParam = new SQLiteParameter("@epid"); command.Parameters.Add(epidParam); foreach (int epid in epids) { epidParam.Value = epid; try { command.ExecuteNonQuery(); } catch (SQLiteException sqliteExp) { if (sqliteExp.ErrorCode == SQLiteErrorCode.Constraint) { // Already added while this was waiting in the threadpool continue; } throw; } added.Add(epid); } } transMon.Trans.Commit(); } } if (Added != null) { foreach (int epid in added) { Added(epid); } } DownloadManager.AddDownloads(added.ToArray()); }
public static void UpdatePaths(Status status, string newPath, string newFormat) { status.StatusText = "Fetching downloads..."; List<Download> downloads = new List<Download>(); using (SQLiteCommand command = new SQLiteCommand("select episodes.epid, progid, name, description, date, duration, autodownload, status, errortype, errordetails, filepath, playcount from episodes, downloads where episodes.epid=downloads.epid", FetchDbConn())) { using (SQLiteMonDataReader reader = new SQLiteMonDataReader(command.ExecuteReader())) { while (reader.Read()) { downloads.Add(new Download(reader)); } } } if (downloads.Count > 0) { Dictionary<int, Programme> programmes = new Dictionary<int, Programme>(); int progress = 0; status.StatusText = "Updating download paths..."; status.ProgressBarMax = downloads.Count; status.ProgressBarMarquee = false; using (SQLiteCommand command = new SQLiteCommand("update downloads set filepath=@filepath where epid=@epid", FetchDbConn())) { SQLiteParameter epidParam = new SQLiteParameter("epid"); SQLiteParameter filepathParam = new SQLiteParameter("filepath"); command.Parameters.Add(epidParam); command.Parameters.Add(filepathParam); foreach (Download download in downloads) { if (File.Exists(download.DownloadPath)) { if (!programmes.ContainsKey(download.Progid)) { programmes.Add(download.Progid, new Programme(download.Progid)); } string newDownloadPath = FindFreeSaveFileName(newFormat, programmes[download.Progid], download, newPath) + Path.GetExtension(download.DownloadPath); if (newDownloadPath != download.DownloadPath) { lock (Database.DbUpdateLock) { using (SQLiteMonTransaction transMon = new SQLiteMonTransaction(FetchDbConn().BeginTransaction())) { epidParam.Value = download.Epid; filepathParam.Value = newDownloadPath; command.ExecuteNonQuery(); File.Move(download.DownloadPath, newDownloadPath); transMon.Trans.Commit(); } } } } status.ProgressBarValue = ++progress; } } status.ProgressBarValue = status.ProgressBarMax; } }
private static int?UpdateInfo(Guid pluginId, string progExtId) { if (!Provider.Exists(pluginId)) { return(null); } IRadioProvider pluginInstance = Provider.GetFromId(pluginId).CreateInstance(); ProgrammeInfo progInfo; try { progInfo = pluginInstance.GetProgrammeInfo(progExtId); } catch (Exception provExp) { provExp.Data.Add("Programme ExtID", progExtId); throw new ProviderException("Call to GetProgrammeInfo failed", provExp, pluginId); } if (progInfo == null) { return(null); } int?progid = null; lock (Database.DbUpdateLock) { using (SQLiteCommand command = new SQLiteCommand("select progid from programmes where pluginid=@pluginid and extid=@extid", FetchDbConn())) { command.Parameters.Add(new SQLiteParameter("@pluginid", pluginId.ToString())); command.Parameters.Add(new SQLiteParameter("@extid", progExtId)); using (SQLiteMonDataReader reader = new SQLiteMonDataReader(command.ExecuteReader())) { if (reader.Read()) { progid = reader.GetInt32(reader.GetOrdinal("progid")); } } } using (SQLiteMonTransaction transMon = new SQLiteMonTransaction(FetchDbConn().BeginTransaction())) { if (progid == null) { using (SQLiteCommand command = new SQLiteCommand("insert into programmes (pluginid, extid, name) values (@pluginid, @extid, @name)", FetchDbConn())) { command.Parameters.Add(new SQLiteParameter("@pluginid", pluginId.ToString())); command.Parameters.Add(new SQLiteParameter("@extid", progExtId)); command.Parameters.Add(new SQLiteParameter("@name", progExtId)); command.ExecuteNonQuery(); } using (SQLiteCommand command = new SQLiteCommand("select last_insert_rowid()", FetchDbConn())) { progid = (int)(long)command.ExecuteScalar(); } } using (SQLiteCommand command = new SQLiteCommand("update programmes set name=@name, description=@description, image=@image, singleepisode=@singleepisode, lastupdate=@lastupdate where progid=@progid", FetchDbConn())) { command.Parameters.Add(new SQLiteParameter("@name", progInfo.Name)); command.Parameters.Add(new SQLiteParameter("@description", progInfo.Description)); command.Parameters.Add(new SQLiteParameter("@image", StoreImage(progInfo.Image))); command.Parameters.Add(new SQLiteParameter("@singleepisode", progInfo.SingleEpisode)); command.Parameters.Add(new SQLiteParameter("@lastupdate", DateTime.Now)); command.Parameters.Add(new SQLiteParameter("@progid", progid)); command.ExecuteNonQuery(); } transMon.Trans.Commit(); } } if (Updated != null) { Updated(progid.Value); } return(progid); }
public static List <string> GetAvailableEpisodes(int progid, bool fetchAll) { Guid providerId; string progExtId; ProgrammeInfo progInfo; using (SQLiteCommand command = new SQLiteCommand("select pluginid, extid, name, description, singleepisode from programmes where progid=@progid", FetchDbConn())) { command.Parameters.Add(new SQLiteParameter("@progid", progid)); using (SQLiteMonDataReader reader = new SQLiteMonDataReader(command.ExecuteReader())) { if (!reader.Read()) { throw new DataNotFoundException(progid, "Programme does not exist"); } providerId = new Guid(reader.GetString(reader.GetOrdinal("pluginid"))); progExtId = reader.GetString(reader.GetOrdinal("extid")); progInfo = new ProgrammeInfo(); progInfo.Name = reader.GetString(reader.GetOrdinal("name")); int descriptionOrdinal = reader.GetOrdinal("description"); if (!reader.IsDBNull(descriptionOrdinal)) { progInfo.Description = reader.GetString(descriptionOrdinal); } progInfo.SingleEpisode = reader.GetBoolean(reader.GetOrdinal("singleepisode")); } } if (!Provider.Exists(providerId)) { return(null); } // Fetch a list of previously available episodes for the programme List <string> previousAvailable = new List <string>(); using (SQLiteCommand command = new SQLiteCommand("select extid from episodes where progid=@progid and available=1 order by date desc", FetchDbConn())) { command.Parameters.Add(new SQLiteParameter("@progid", progid)); using (SQLiteMonDataReader reader = new SQLiteMonDataReader(command.ExecuteReader())) { int epidOrdinal = reader.GetOrdinal("extid"); while (reader.Read()) { previousAvailable.Add(reader.GetString(epidOrdinal)); } } } List <string> allEpExtIds = new List <string>(); int page = 1; IRadioProvider providerInst = Provider.GetFromId(providerId).CreateInstance(); AvailableEpisodes available; do { try { available = providerInst.GetAvailableEpisodes(progExtId, progInfo, page); } catch (Exception provExp) { provExp.Data.Add("Programme ExtID", progExtId); throw new ProviderException("Call to GetAvailableEpisodeIds failed", provExp, providerId); } if (available.EpisodeIds == null || available.EpisodeIds.Length == 0) { break; } int trackOverlap = -1; foreach (string epExtId in available.EpisodeIds) { // Append the returned IDs to the list of all episodes (minus duplicates) if (!allEpExtIds.Contains(epExtId)) { allEpExtIds.Add(epExtId); } if (previousAvailable.Contains(epExtId)) { // Store where the available & previously available ID lists overlap trackOverlap = previousAvailable.IndexOf(epExtId); } else if (trackOverlap >= 0) { // Bump up the overlap index to show there are more after the overlap trackOverlap++; } } if (available.MoreAvailable && !fetchAll) { if (trackOverlap >= 0) { // Remove previously available programmes before this page from the list so that they // are not incorrectly un-flagged as available in the database if (trackOverlap < previousAvailable.Count - 1) { previousAvailable.RemoveRange(trackOverlap + 1, previousAvailable.Count - (trackOverlap + 1)); } // Stop fetching available episode pages break; } } page++; }while (available.MoreAvailable); // Remove the still available episodes from the previously available list foreach (string epExtId in allEpExtIds) { previousAvailable.Remove(epExtId); } // Unflag any no-longer available episodes in the database if (previousAvailable.Count > 0) { lock (Database.DbUpdateLock) { using (SQLiteMonTransaction transMon = new SQLiteMonTransaction(FetchDbConn().BeginTransaction())) { using (SQLiteCommand command = new SQLiteCommand("update episodes set available=0 where progid=@progid and extid=@extid", FetchDbConn(), transMon.Trans)) { SQLiteParameter extidParam = new SQLiteParameter("@extid"); command.Parameters.Add(new SQLiteParameter("@progid", progid)); command.Parameters.Add(extidParam); foreach (string epExtId in previousAvailable) { extidParam.Value = epExtId; command.ExecuteNonQuery(); } } transMon.Trans.Commit(); } } } return(allEpExtIds); }