def episode_info(request): podcast_url = sanitize_url(request.GET.get('podcast', '')) episode_url = sanitize_url(request.GET.get('url', ''), 'episode') episode = models.Episode.for_podcast_url(podcast_url, episode_url) if episode is None: raise Http404 domain = RequestSite(request).domain resp = episode_data(episode, domain) return JsonResponse(resp)
def search_podcasts(q, limit=20, skip=0): if is_url(q): url = sanitize_url(q) podcast = Podcast.for_url(url, create=True) if not podcast.title: update_podcasts([podcast]) podcast = Podcast.for_url(url) return [podcast], 1 db = get_main_database() #FIXME current couchdbkit can't parse responses for multi-query searches q = q.replace(',', '') res = db.search('podcasts/search', wrapper=search_wrapper, include_docs=True, limit=limit, skip=skip, q=q, sort='\\subscribers<int>') #FIXME: return empty results in case of search backend error try: return list(res), res.total_rows except: return [], 0
def update_episode(entry, podcast): url, mimetype = get_episode_url(entry) if url is None: print 'Ignoring entry' return url = sanitize_url(url, 'episode') if not url: print 'Ignoring entry' return episode = Episode.for_podcast_id_url(podcast.get_id(), url, create=True) md = get_episode_metadata(entry, url, mimetype, podcast.language) changed = False for key, value in md.items(): if getattr(episode, key) != value: setattr(episode, key, value) changed = True if changed: episode.save() print 'Updating Episode: %s' % episode.title.encode('utf-8', 'ignore') return episode
def podcast_info(request): url = sanitize_url(request.GET.get('url', '')) podcast = Podcast.for_url(url) if not podcast: raise Http404 domain = RequestSite(request).domain resp = podcast_data(podcast, domain) return JsonResponse(resp)
def update_chapters(req, user): podcast_url = sanitize_url(req['podcast']) episode_url = sanitize_url(req['episode'], 'episode') episode = models.Episode.for_podcast_url(podcast_url, episode_url, create=True) e_state = episode.get_user_state(request.user) device = None if 'device' in req: device = get_device(request.user, req['device'], request.META.get('HTTP_USER_AGENT', ''), undelete=True) timestamp = dateutil.parser.parse(req['timestamp']) if 'timestamp' in req else datetime.utcnow() new_chapters = parse_new_chapters(request.user, req.get('chapters_add', [])) rem_chapters = parse_rem_chapters(req.get('chapters_remove', [])) e_state.update_chapters(new_chapters, rem_chapters)
def chapters(request, username): now = datetime.utcnow() now_ = int(time.mktime(now.timetuple())) if request.method == 'POST': req = json.loads(request.raw_post_data) if not 'podcast' in req: return HttpResponseBadRequest('Podcast URL missing') if not 'episode' in req: return HttpResponseBadRequest('Episode URL missing') podcast_url = req.get('podcast', '') episode_url = req.get('episode', '') update_urls = [] # podcast sanitizing s_podcast_url = sanitize_url(podcast_url) if s_podcast_url != podcast_url: req['podcast'] = s_podcast_url update_urls.append((podcast_url, s_podcast_url)) # episode sanitizing s_episode_url = sanitize_url(episode_url, 'episode') if s_episode_url != episode_url: req['episode'] = s_episode_url update_urls.append((episode_url, s_episode_url)) if (s_podcast_url != '') and (s_episode_url != ''): try: update_chapters(req, request.user) except ParameterMissing, e: return HttpResponseBadRequest(e) return JsonResponse({ 'update_url': update_url, 'timestamp': now_ })
def subscribe_url(request): url = request.GET.get('url', None) if not url: raise Http404('http://my.gpodder.org/subscribe?url=http://www.example.com/podcast.xml') url = sanitize_url(url) if url == '': raise Http404('Please specify a valid url') podcast = Podcast.for_url(url, create=True) return HttpResponseRedirect(get_podcast_link_target(podcast, 'subscribe'))
if not 'podcast' in request.GET: return HttpResponseBadRequest('podcast URL missing') if not 'episode' in request.GET: return HttpResponseBadRequest('Episode URL missing') podcast_url = request.GET['podcast'] episode_url = request.GET['episode'] since_ = request.GET.get('since', None) try: since = datetime.fromtimestamp(float(since_)) if since_ else None except ValueError: return HttpResponseBadRequest('since-value is not a valid timestamp') podcast_url = sanitize_url(podcast_url) episode_url = sanitize_url(episode_url, 'episode') episode = models.Episode.for_podcast_url(podcast_url, episode_url) if episode is None: raise Http404 e_state = episode.get_user_state(request.user) chapterlist = sorted(e_state.chapters, key=lambda c: c.start) if since: chapterlist = filter(lambda c: c.created >= since, chapters) chapters = [] for c in chapterlist:
def update_podcasts(fetch_queue): for n, podcast in enumerate(fetch_queue): print '(%d) %s' % (n, podcast.url) try: timeout = socket.getdefaulttimeout() socket.setdefaulttimeout(60) fetcher.fetch(podcast.url) socket.setdefaulttimeout(timeout) except (feedcore.Offline, feedcore.InvalidFeed, feedcore.WifiLogin, feedcore.AuthenticationRequired, socket.error, IOError): print 'marking outdated' mark_outdated(podcast) except feedcore.NewLocation, location: print 'redirecting to', location.data new_url = sanitize_url(location.data) if new_url: p = Podcast.for_url(new_url) if not p: podcast.urls.insert(0, new_url) fetch_queue = chain([podcast], fetch_queue) else: print 'podcast with new URL found, outdating old one' podcast.new_location = new_url podcast.save() mark_outdated(podcast) except feedcore.UpdatedFeed, updated: feed = updated.data existing_episodes = list(podcast.get_episodes()) update_ep = partial(update_episode, podcast=podcast) feed_episodes = filter(None, map(update_ep, feed.entries)) outdated_episodes = set(existing_episodes) - set(feed_episodes) # set episodes to be outdated, where necessary for e in filter(lambda e: not e.outdated, outdated_episodes): e.outdated = True e.save() podcast_md = get_podcast_metadata(podcast, feed) changed = False for key, value in podcast_md.items(): if getattr(podcast, key) != value: setattr(podcast, key, value) changed = True tags = get_feed_tags(feed.feed) if podcast.tags.get('feed', None) != tags: podcast.tags['feed'] = tags changed = True if changed: print 'updating podcast' podcast.last_update = datetime.utcnow() podcast.save() else: print 'podcast not updated'
def sanitize_append(url, obj_type, sanitized_list): urls = sanitize_url(url, obj_type) if url != urls: sanitized_list.append( (url, urls) ) return urls