ab31a07892ad220e726d540277ae737a7c3f87c1
2 # This file is part of my.gpodder.org.
4 # my.gpodder.org is free software: you can redistribute it and/or modify it
5 # under the terms of the GNU Affero General Public License as published by
6 # the Free Software Foundation, either version 3 of the License, or (at your
7 # option) any later version.
9 # my.gpodder.org is distributed in the hope that it will be useful, but
10 # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
11 # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
12 # License for more details.
14 # You should have received a copy of the GNU Affero General Public License
15 # along with my.gpodder.org. If not, see <http://www.gnu.org/licenses/>.
18 from django
.shortcuts
import render_to_response
19 from django
.http
import HttpResponseRedirect
, HttpResponse
, HttpResponseBadRequest
, Http404
, HttpResponseForbidden
20 from django
.template
import RequestContext
21 from mygpo
.api
.models
import Podcast
, Episode
, Subscription
22 from mygpo
.api
import backend
23 from mygpo
.data
.models
import PodcastTag
, DirectoryEntry
24 from mygpo
.data
.mimetype
import CONTENT_TYPES
25 from mygpo
.decorators
import manual_gc
26 from mygpo
.web
import utils
27 from mygpo
import settings
28 from django
.shortcuts
import get_object_or_404
29 from django
.db
.models
import Sum
30 from django
.contrib
.sites
.models
import Site
31 from django
.core
.paginator
import Paginator
, InvalidPage
, EmptyPage
35 def browse(request
, num_categories
=10, num_tags_cloud
=90, podcasts_per_category
=10):
36 total
= int(num_categories
) + int(num_tags_cloud
)
37 top_tags
= DirectoryEntry
.objects
.top_tags(total
)
40 for tag
in top_tags
[:num_categories
]:
41 entries
= DirectoryEntry
.objects
.podcasts_for_tag(tag
.tag
)[:podcasts_per_category
]
47 tag_cloud
= top_tags
[num_categories
:]
49 tag_cloud
.sort(key
= lambda x
: x
.tag
.lower())
50 max_entries
= max([t
.entries
for t
in tag_cloud
])
52 return render_to_response('directory.html', {
53 'categories': categories
,
54 'tag_cloud': tag_cloud
,
55 'max_entries': max_entries
,
56 }, context_instance
=RequestContext(request
))
60 def category(request
, category
, page_size
=20):
61 entries
= DirectoryEntry
.objects
.podcasts_for_tag(category
)
63 paginator
= Paginator(entries
, page_size
)
65 # Make sure page request is an int. If not, deliver first page.
67 page
= int(request
.GET
.get('page', '1'))
71 # If page request (9999) is out of range, deliver last page of results.
73 podcasts
= paginator
.page(page
)
74 except (EmptyPage
, InvalidPage
):
75 podcasts
= paginator
.page(paginator
.num_pages
)
77 page_list
= utils
.get_page_list(1, podcasts
.paginator
.num_pages
, podcasts
.number
, 15)
79 return render_to_response('category.html', {
82 'page_list': page_list
,
83 }, context_instance
=RequestContext(request
))
87 def toplist(request
, num
=100, lang
=None):
90 lang
= utils
.process_lang_params(request
, '/toplist/')
91 except utils
.UpdatedException
, updated
:
92 return HttpResponseRedirect('/toplist/?lang=%s' % ','.join(updated
.data
))
94 type_str
= request
.GET
.get('types', '')
95 set_types
= [t
for t
in type_str
.split(',') if t
]
97 media_types
= dict([(t
, t
in set_types
) for t
in CONTENT_TYPES
])
99 media_types
= dict([(t
, True) for t
in CONTENT_TYPES
])
101 entries
= backend
.get_toplist(num
, lang
, set_types
)
103 max_subscribers
= max([e
.subscriptions
for e
in entries
]) if entries
else 0
104 current_site
= Site
.objects
.get_current()
105 all_langs
= utils
.get_language_names(utils
.get_podcast_languages())
107 return render_to_response('toplist.html', {
109 'max_subscribers': max_subscribers
,
112 'all_languages': all_langs
,
113 'types': media_types
,
114 }, context_instance
=RequestContext(request
))
118 def episode_toplist(request
, num
=100):
121 lang
= utils
.process_lang_params(request
, '/toplist/episodes')
122 except utils
.UpdatedException
, updated
:
123 return HttpResponseRedirect('/toplist/episodes?lang=%s' % ','.join(updated
.data
))
125 type_str
= request
.GET
.get('types', '')
126 set_types
= [t
for t
in type_str
.split(',') if t
]
128 media_types
= dict([(t
, t
in set_types
) for t
in CONTENT_TYPES
])
130 media_types
= dict([(t
, True) for t
in CONTENT_TYPES
])
132 entries
= backend
.get_episode_toplist(num
, lang
, set_types
)
134 current_site
= Site
.objects
.get_current()
136 # Determine maximum listener amount (or 0 if no entries exist)
137 max_listeners
= max([0]+[e
.listeners
for e
in entries
])
138 all_langs
= utils
.get_language_names(utils
.get_podcast_languages())
139 return render_to_response('episode_toplist.html', {
141 'max_listeners': max_listeners
,
144 'all_languages': all_langs
,
145 'types': media_types
,
146 }, context_instance
=RequestContext(request
))
149 def gpodder_example_podcasts(request
):
150 sponsored_podcast
= utils
.get_sponsored_podcast()
151 return render_to_response('gpodder_examples.opml', {
152 'sponsored_podcast': sponsored_podcast
153 }, context_instance
=RequestContext(request
))