Esempio n. 1
0
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)
Esempio n. 2
0
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
Esempio n. 3
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
Esempio n. 4
0
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)
Esempio n. 5
0
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)
Esempio n. 6
0
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_
            })
Esempio n. 7
0
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'))
Esempio n. 8
0
        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:
Esempio n. 9
0
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'
Esempio n. 10
0
def sanitize_append(url, obj_type, sanitized_list):
    urls = sanitize_url(url, obj_type)
    if url != urls:
        sanitized_list.append( (url, urls) )
    return urls