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 datetime
import datetime
20 from django
.http
import HttpResponse
21 from django
.utils
.datastructures
import MultiValueDictKeyError
22 from django
.views
.decorators
.csrf
import csrf_exempt
23 from django
.views
.decorators
.cache
import never_cache
25 from mygpo
.log
import log
26 from mygpo
.api
.sanitizing
import sanitize_urls
27 from mygpo
.users
.models
import User
28 from mygpo
.api
.opml
import Importer
, Exporter
29 from mygpo
.core
.models
import Podcast
, SubscriptionException
30 from mygpo
.api
.backend
import get_device
31 from mygpo
.db
.couchdb
.podcast
import podcast_for_url
34 LEGACY_DEVICE_NAME
= 'Legacy Device'
35 LEGACY_DEVICE_UID
= 'legacy'
41 emailaddr
= request
.POST
['username']
42 password
= request
.POST
['password']
43 action
= request
.POST
['action']
44 protocol
= request
.POST
['protocol']
45 opml
= request
.FILES
['opml'].read()
46 except MultiValueDictKeyError
:
47 return HttpResponse("@PROTOERROR", mimetype
='text/plain')
49 user
= auth(emailaddr
, password
)
51 return HttpResponse('@AUTHFAIL', mimetype
='text/plain')
53 dev
= get_device(user
, LEGACY_DEVICE_UID
,
54 request
.META
.get('HTTP_USER_AGENT', ''))
56 existing_urls
= [x
.url
for x
in dev
.get_subscribed_podcasts()]
60 podcast_urls
= [p
['url'] for p
in i
.items
]
61 podcast_urls
= sanitize_urls(podcast_urls
)
62 podcast_urls
= filter(lambda x
: x
, podcast_urls
)
64 new
= [u
for u
in podcast_urls
if u
not in existing_urls
]
65 rem
= [u
for e
in existing_urls
if u
not in podcast_urls
]
73 p
= podcast_for_url(n
, create
=True)
74 except IntegrityError
, e
:
75 log('/upload: Error trying to get podcast object: %s (error: %s)' % (n
, e
))
79 p
.subscribe(user
, dev
)
80 except SubscriptionException
as e
:
81 log('Legacy API: %(username)s: could not subscribe to podcast %(podcast_url)s on device %(device_id)s: %(exception)s' %
82 {'username': user
.username
, 'podcast_url': p
.url
, 'device_id': dev
.id, 'exception': e
})
85 p
= podcast_for_url(r
, create
=True)
87 p
.unsubscribe(user
, dev
)
88 except SubscriptionException
as e
:
89 log('Legacy API: %(username): could not unsubscribe from podcast %(podcast_url) on device %(device_id): %(exception)s' %
90 {'username': user
.username
, 'podcast_url': p
.url
, 'device_id': dev
.id, 'exception': e
})
92 return HttpResponse('@SUCCESS', mimetype
='text/plain')
97 emailaddr
= request
.GET
.get('username', None)
98 password
= request
.GET
.get('password', None)
100 user
= auth(emailaddr
, password
)
102 return HttpResponse('@AUTHFAIL', mimetype
='text/plain')
104 dev
= get_device(user
, LEGACY_DEVICE_UID
,
105 request
.META
.get('HTTP_USER_AGENT', ''),
107 podcasts
= dev
.get_subscribed_podcasts()
109 title
= "{username}'s subscriptions".format(username
=user
.username
)
110 exporter
= Exporter(title
)
112 opml
= exporter
.generate(podcasts
)
114 return HttpResponse(opml
, mimetype
='text/xml')
117 def auth(emailaddr
, password
):
118 if emailaddr
is None or password
is None:
121 user
= User
.get_user_by_email(emailaddr
)
125 if not user
.check_password(password
):
128 if not user
.is_active
: