Merge pull request #735 from gpodder/remove-yt-apikey
Remove youtube api key usage
This commit is contained in:
commit
a7f5394e0a
7 changed files with 0 additions and 164 deletions
43
bin/gpo
43
bin/gpo
|
@ -65,7 +65,6 @@
|
|||
- Other commands -
|
||||
|
||||
youtube URL Resolve the YouTube URL to a download URL
|
||||
youtubefix Migrate old YouTube subscriptions to new feeds
|
||||
rewrite OLDURL NEWURL Change the feed URL of [OLDURL] to [NEWURL]
|
||||
|
||||
"""
|
||||
|
@ -707,48 +706,6 @@ class gPodderCli(object):
|
|||
|
||||
return True
|
||||
|
||||
def youtubefix(self):
|
||||
if not self._config.youtube.api_key_v3:
|
||||
self._error(_('Please register a YouTube API key and set it using %(command)s.') % {
|
||||
'command': 'set youtube.api_key_v3 KEY',
|
||||
})
|
||||
return False
|
||||
|
||||
reported_anything = False
|
||||
for podcast in self._model.get_podcasts():
|
||||
url, user = youtube.for_each_feed_pattern(lambda url, channel: (url, channel), podcast.url, (None, None))
|
||||
if url is not None and user is not None:
|
||||
try:
|
||||
logger.info('Getting channels for YouTube user %s (%s)', user, url)
|
||||
new_urls = youtube.get_channels_for_user(user, self._config.youtube.api_key_v3)
|
||||
logger.debug('YouTube channels retrieved: %r', new_urls)
|
||||
|
||||
if len(new_urls) != 1:
|
||||
self._info('%s: %s' % (url, _('No unique URL found')))
|
||||
reported_anything = True
|
||||
continue
|
||||
|
||||
new_url = new_urls[0]
|
||||
if new_url in set(x.url for x in self._model.get_podcasts()):
|
||||
self._info('%s: %s' % (url, _('Already subscribed')))
|
||||
reported_anything = True
|
||||
continue
|
||||
|
||||
logger.info('New feed location: %s => %s', url, new_url)
|
||||
|
||||
self._info(_('Changing: %(old_url)s => %(new_url)s') % {'old_url': url, 'new_url': new_url})
|
||||
reported_anything = True
|
||||
podcast.url = new_url
|
||||
podcast.save()
|
||||
except Exception as e:
|
||||
logger.error('Exception happened while updating download list.', exc_info=True)
|
||||
self._error(_('Make sure the API key is correct. Error: %(message)s') % {'message': str(e)})
|
||||
return False
|
||||
|
||||
if not reported_anything:
|
||||
self._info(_('Nothing to fix'))
|
||||
return True
|
||||
|
||||
def search(self, *terms):
|
||||
query = ' '.join(terms)
|
||||
if not query:
|
||||
|
|
|
@ -199,45 +199,6 @@
|
|||
<property name="top_attach">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel" id="label_youtube_api_key">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="xalign">0</property>
|
||||
<property name="label" translatable="yes">YouTube API key (v3):</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="left_attach">0</property>
|
||||
<property name="top_attach">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkEntry" id="entry_youtube_api_key">
|
||||
<property name="visible">True</property>
|
||||
<property name="hexpand">True</property>
|
||||
<signal handler="on_youtube_api_key_changed" name="changed"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="left_attach">1</property>
|
||||
<property name="top_attach">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="button_youtube_api_key">
|
||||
<property name="visible">True</property>
|
||||
<signal name="clicked" handler="on_button_youtube_api_key_clicked"/>
|
||||
<child>
|
||||
<object class="GtkImage" id="image_youtube_api_key">
|
||||
<property name="stock">gtk-jump-to</property>
|
||||
<property name="visible">True</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="top_attach">1</property>
|
||||
<property name="left_attach">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel" id="label_preferred_vimeo_format">
|
||||
<property name="visible">True</property>
|
||||
|
|
|
@ -144,10 +144,6 @@
|
|||
<attribute name="label" translatable="yes">Sync to device</attribute>
|
||||
<attribute name="accel"><Primary>s</attribute>
|
||||
</item>
|
||||
<item>
|
||||
<attribute name="action">win.updateYoutubeSubscriptions</attribute>
|
||||
<attribute name="label" translatable="yes">Update YouTube subscriptions</attribute>
|
||||
</item>
|
||||
</submenu>
|
||||
<submenu id="menuView">
|
||||
<attribute name="label" translatable="yes">_View</attribute>
|
||||
|
|
|
@ -202,7 +202,6 @@ defaults = {
|
|||
'youtube': {
|
||||
'preferred_fmt_id': 18, # default fmt_id (see fallbacks in youtube.py)
|
||||
'preferred_fmt_ids': [], # for advanced uses (custom fallback sequence)
|
||||
'api_key_v3': '', # API key, register for one at https://developers.google.com/youtube/v3/
|
||||
},
|
||||
|
||||
'vimeo': {
|
||||
|
|
|
@ -280,7 +280,6 @@ class gPodderPreferences(BuilderWidget):
|
|||
self.entry_username.set_text(self._config.mygpo.username)
|
||||
self.entry_password.set_text(self._config.mygpo.password)
|
||||
self.entry_caption.set_text(self._config.mygpo.device.caption)
|
||||
self.entry_youtube_api_key.set_text(self._config.youtube.api_key_v3)
|
||||
|
||||
# Disable mygpo sync while the dialog is open
|
||||
self._config.mygpo.enabled = False
|
||||
|
@ -550,12 +549,6 @@ class gPodderPreferences(BuilderWidget):
|
|||
# Only update indirectly (see on_dialog_destroy)
|
||||
self._enable_mygpo = widget.get_active()
|
||||
|
||||
def on_youtube_api_key_changed(self, widget):
|
||||
self._config.youtube.api_key_v3 = widget.get_text()
|
||||
|
||||
def on_button_youtube_api_key_clicked(self, widget):
|
||||
util.open_website('http://wiki.gpodder.org/wiki/Youtube')
|
||||
|
||||
def on_server_changed(self, widget):
|
||||
self._config.mygpo.server = widget.get_text()
|
||||
|
||||
|
|
|
@ -272,7 +272,6 @@ class gPodder(BuilderWidget, dbus.service.Object):
|
|||
('toggleEpisodeLock', self.on_item_toggle_lock_activate),
|
||||
('toggleShownotes', self.on_shownotes_selected_episodes),
|
||||
('sync', self.on_sync_to_device_activate),
|
||||
('updateYoutubeSubscriptions', self.on_update_youtube_subscriptions_activate),
|
||||
]
|
||||
|
||||
for name, callback in action_defs:
|
||||
|
@ -3602,56 +3601,6 @@ class gPodder(BuilderWidget, dbus.service.Object):
|
|||
self.sync_ui.on_synchronize_episodes(self.channels, episodes, force_played,
|
||||
self.enable_download_list_update)
|
||||
|
||||
def on_update_youtube_subscriptions_activate(self, action, param):
|
||||
if not self.config.youtube.api_key_v3:
|
||||
if self.show_confirmation('\n'.join((_('Please register a YouTube API key and set it in the preferences.'),
|
||||
_('Would you like to set up an API key now?'))), _('API key required')):
|
||||
self.application.on_itemPreferences_activate(self, None)
|
||||
return
|
||||
|
||||
failed_urls = []
|
||||
migrated_users = []
|
||||
for podcast in self.channels:
|
||||
url, user = youtube.for_each_feed_pattern(lambda url, channel: (url, channel), podcast.url, (None, None))
|
||||
if url is not None and user is not None:
|
||||
try:
|
||||
logger.info('Getting channels for YouTube user %s (%s)', user, url)
|
||||
new_urls = youtube.get_channels_for_user(user, self.config.youtube.api_key_v3)
|
||||
logger.debug('YouTube channels retrieved: %r', new_urls)
|
||||
|
||||
if len(new_urls) == 0 and youtube.get_youtube_id(url) is not None:
|
||||
logger.info('No need to update %s', url)
|
||||
continue
|
||||
|
||||
if len(new_urls) != 1:
|
||||
failed_urls.append((url, _('No unique URL found')))
|
||||
continue
|
||||
|
||||
new_url = new_urls[0]
|
||||
if new_url in set(x.url for x in self.model.get_podcasts()):
|
||||
failed_urls.append((url, _('Already subscribed')))
|
||||
continue
|
||||
|
||||
logger.info('New feed location: %s => %s', url, new_url)
|
||||
podcast.url = new_url
|
||||
podcast.save()
|
||||
migrated_users.append(html.escape(user))
|
||||
except Exception as e:
|
||||
logger.error('Exception happened while updating download list.', exc_info=True)
|
||||
self.show_message(
|
||||
_('Make sure the API key is correct. Error: %(message)s') % {'message': html.escape(str(e))},
|
||||
_('Error getting YouTube channels'), important=True)
|
||||
|
||||
if migrated_users:
|
||||
self.show_message('\n'.join(migrated_users), _('Successfully migrated subscriptions'))
|
||||
elif not failed_urls:
|
||||
self.show_message(_('Subscriptions are up to date'))
|
||||
|
||||
if failed_urls:
|
||||
self.show_message('\n'.join([_('These URLs failed:'), ''] + [html.escape('{0}: {1}'.format(url, message))
|
||||
for url, message in failed_urls]),
|
||||
_('Could not migrate some subscriptions'), important=True)
|
||||
|
||||
def on_extension_enabled(self, extension):
|
||||
if getattr(extension, 'on_ui_object_available', None) is not None:
|
||||
extension.on_ui_object_available('gpodder-gtk', self)
|
||||
|
|
|
@ -365,25 +365,6 @@ def get_channel_desc(url):
|
|||
logger.warning('Could not retrieve YouTube channel description.', exc_info=True)
|
||||
|
||||
|
||||
def get_channels_for_user(username, api_key_v3):
|
||||
# already a channel ID: return videos.xml.
|
||||
# Can't rely on automatic discovery, see #371
|
||||
if username.startswith('UC'):
|
||||
try:
|
||||
url = '{0}?channel_id={1}'.format(CHANNEL_VIDEOS_XML, username)
|
||||
stream = util.urlopen(url)
|
||||
return [url]
|
||||
except urllib.error.HTTPError as e:
|
||||
logger.debug("get_channels_for_user(%s) not a channel id (got %i response code)", username, e.code)
|
||||
except:
|
||||
logger.error("get_channels_for_user(%s) not a channel id (got unexpected exception)", username)
|
||||
|
||||
# try username to channel ID conversion
|
||||
stream = util.urlopen('{0}/channels?forUsername={1}&part=id&key={2}'.format(V3_API_ENDPOINT, username, api_key_v3))
|
||||
data = json.load(stream)
|
||||
return ['{0}?channel_id={1}'.format(CHANNEL_VIDEOS_XML, item['id']) for item in data['items']]
|
||||
|
||||
|
||||
def parse_youtube_url(url):
|
||||
"""
|
||||
Youtube Channel Links are parsed into youtube feed links
|
||||
|
|
Loading…
Reference in a new issue