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
20 @cache_page(60 * 60 * 24)
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
)
30 @cache_page(60 * 60 * 24)
32 def tag_podcasts(request
, tag
, count
):
33 count
= parse_range(count
, 1, 100, 100)
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
)
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
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
)
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
:
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
:
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):
91 raise ValueError('podcast should not be None')
93 if isinstance(obj
, SubscribedPodcast
):
100 subscribers
= podcast
.subscribers
101 last_subscribers
= podcast
.subscribers
103 scaled_logo_url
= get_logo_url(podcast
, scaled_logo_size
)
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
122 "title": episode
.title
,
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 ''
133 data
['released'] = episode
.released
.strftime('%Y-%m-%dT%H:%M:%S')
138 def category_data(category
):
140 title
= category
.clean_title
,
142 usage
= category
.num_entries
,