Remove unused license preamble
[mygpo.git] / mygpo / api / advanced / directory.py
blobb35b255c6094eb784895b471df630b564e1f6486
1 from django.http import Http404
2 from django.core.urlresolvers import reverse
3 from django.contrib.sites.requests import RequestSite
4 from django.views.decorators.csrf import csrf_exempt
5 from django.views.decorators.cache import cache_page
6 from django.shortcuts import get_object_or_404
8 from mygpo.podcasts.models import Podcast, Episode
9 from mygpo.utils import parse_range, normalize_feed_url
10 from mygpo.directory.tags import Topics
11 from mygpo.web.utils import get_episode_link_target, get_podcast_link_target
12 from mygpo.web.logo import get_logo_url
13 from mygpo.subscriptions.models import SubscribedPodcast
14 from mygpo.decorators import cors_origin
15 from mygpo.categories.models import Category
16 from mygpo.api.httpresponse import JsonResponse
19 @csrf_exempt
20 @cache_page(60 * 60 * 24)
21 @cors_origin()
22 def top_tags(request, count):
23 count = parse_range(count, 1, 100, 100)
24 tag_cloud = Topics(count, num_cat=0)
25 resp = list(map(category_data, tag_cloud.tagcloud))
26 return JsonResponse(resp)
29 @csrf_exempt
30 @cache_page(60 * 60 * 24)
31 @cors_origin()
32 def tag_podcasts(request, tag, count):
33 count = parse_range(count, 1, 100, 100)
34 try:
35 category = Category.objects.get(tags__tag=tag)
37 except Category.DoesNotExist:
38 return JsonResponse([])
40 domain = RequestSite(request).domain
41 entries = category.entries.all()\
42 .prefetch_related('podcast', 'podcast__slugs',
43 'podcast__urls')[:count]
44 resp = [podcast_data(entry.podcast, domain) for entry in entries]
45 return JsonResponse(resp)
48 @cache_page(60 * 60)
49 @cors_origin()
50 def podcast_info(request):
51 url = normalize_feed_url(request.GET.get('url', ''))
53 # 404 before we query for url, because query would complain
54 # about missing param
55 if not url:
56 raise Http404
58 podcast = get_object_or_404(Podcast, urls__url=url)
59 domain = RequestSite(request).domain
60 resp = podcast_data(podcast, domain)
62 return JsonResponse(resp)
65 @cache_page(60 * 60)
66 @cors_origin()
67 def episode_info(request):
68 podcast_url = normalize_feed_url(request.GET.get('podcast', ''))
69 episode_url = normalize_feed_url(request.GET.get('url', ''))
71 # 404 before we query for url, because query would complain
72 # about missing parameters
73 if not podcast_url or not episode_url:
74 raise Http404
76 try:
77 query = Episode.objects.filter(podcast__urls__url=podcast_url,
78 urls__url=episode_url)
79 episode = query.select_related('podcast').get()
80 except Episode.DoesNotExist:
81 raise Http404
83 domain = RequestSite(request).domain
85 resp = episode_data(episode, domain)
86 return JsonResponse(resp)
89 def podcast_data(obj, domain, scaled_logo_size=64):
90 if obj is None:
91 raise ValueError('podcast should not be None')
93 if isinstance(obj, SubscribedPodcast):
94 url = obj.ref_url
95 podcast = obj.podcast
96 else:
97 podcast = obj
98 url = podcast.url
100 subscribers = podcast.subscribers
101 last_subscribers = podcast.subscribers
103 scaled_logo_url = get_logo_url(podcast, scaled_logo_size)
105 return {
106 "url": url,
107 "title": podcast.title,
108 "description": podcast.description,
109 "subscribers": subscribers,
110 "subscribers_last_week": last_subscribers,
111 "logo_url": podcast.logo_url,
112 "scaled_logo_url": 'http://%s%s' % (domain, scaled_logo_url),
113 "website": podcast.link,
114 "mygpo_link": 'http://%s%s' % (domain, get_podcast_link_target(podcast)),
117 def episode_data(episode, domain, podcast=None):
119 podcast = podcast or episode.podcast
121 data = {
122 "title": episode.title,
123 "url": episode.url,
124 "podcast_title": podcast.title if podcast else '',
125 "podcast_url": podcast.url if podcast else '',
126 "description": episode.description,
127 "website": episode.link,
128 "mygpo_link": 'http://%(domain)s%(res)s' % dict(domain=domain,
129 res=get_episode_link_target(episode, podcast)) if podcast else ''
132 if episode.released:
133 data['released'] = episode.released.strftime('%Y-%m-%dT%H:%M:%S')
135 return data
138 def category_data(category):
139 return dict(
140 title = category.clean_title,
141 tag = category.tag,
142 usage = category.num_entries,