Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Re-add przemienniki.net query source #703

Merged
merged 1 commit into from
Jul 4, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
345 changes: 187 additions & 158 deletions chirp/locale/de.po

Large diffs are not rendered by default.

348 changes: 190 additions & 158 deletions chirp/locale/el.po

Large diffs are not rendered by default.

344 changes: 186 additions & 158 deletions chirp/locale/en_US.po

Large diffs are not rendered by default.

359 changes: 198 additions & 161 deletions chirp/locale/es.po

Large diffs are not rendered by default.

344 changes: 186 additions & 158 deletions chirp/locale/fr.po

Large diffs are not rendered by default.

352 changes: 191 additions & 161 deletions chirp/locale/hu.po

Large diffs are not rendered by default.

344 changes: 186 additions & 158 deletions chirp/locale/it.po

Large diffs are not rendered by default.

344 changes: 186 additions & 158 deletions chirp/locale/nl.po

Large diffs are not rendered by default.

344 changes: 186 additions & 158 deletions chirp/locale/pl.po

Large diffs are not rendered by default.

344 changes: 186 additions & 158 deletions chirp/locale/pt_BR.po

Large diffs are not rendered by default.

344 changes: 186 additions & 158 deletions chirp/locale/ru.po

Large diffs are not rendered by default.

348 changes: 190 additions & 158 deletions chirp/locale/tr_TR.po

Large diffs are not rendered by default.

344 changes: 186 additions & 158 deletions chirp/locale/uk_UA.po

Large diffs are not rendered by default.

352 changes: 191 additions & 161 deletions chirp/locale/zh_CN.po

Large diffs are not rendered by default.

71 changes: 71 additions & 0 deletions chirp/sources/przemienniki.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
# Copyright 2023 Dan Smith <chirp@f.danplanet.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.

import logging

import requests

from chirp.drivers import generic_csv
from chirp import errors
from chirp.sources import base

LOG = logging.getLogger(__name__)


class Przemienniki(base.NetworkResultRadio):
VENDOR = 'przemienniki.net'

def get_label(self):
return 'przemienniki.net'

def do_fetch(self, status, params):
status.send_status('Querying', 10)
if not params['range'] or int(params['range']) == 0:
params.pop('range')
LOG.debug('query params: %s' % str(params))
try:
r = requests.get('http://przemienniki.net/export/chirp.csv',
headers=base.HEADERS,
params=params,
stream=True)
r.raise_for_status()
except requests.exceptions.RequestException as e:
LOG.error('Failed to query przemienniki: %s' % e)
status.send_fail(_('Unable to query'))
return
status.send_status(_('Parsing'), 20)
try:
csv = generic_csv.CSVRadio(None)
csv._load(x.decode() for x in r.iter_lines())
except errors.InvalidDataError:
status.send_fail(_('No results'))
return
except Exception as e:
LOG.error('Error parsing result: %s' % e)
status.send_fail(_('Failed to parse result'))
return

status.send_status(_('Sorting'), 80)

self._memories = [csv.get_memory(x) for x in range(1, 999)
if not csv.get_memory(x).empty]
if not any([params['latitude'], params['longitude']]):
LOG.debug('Sorting memories by name')
self._memories.sort(key=lambda m: m.name)
# Now renumber them
for i, mem in enumerate(self._memories):
mem.number = i + 1

return status.send_end()
8 changes: 8 additions & 0 deletions chirp/wxui/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -837,6 +837,11 @@ def make_menubar(self):
self.Bind(wx.EVT_MENU, self._menu_query_dm, query_dm_item)
source_menu.Append(query_dm_item)

query_prz_item = wx.MenuItem(source_menu, wx.NewId(),
'przemienniki.net')
self.Bind(wx.EVT_MENU, self._menu_query_prz, query_prz_item)
source_menu.Append(query_prz_item)

radio_menu.Append(wx.MenuItem(radio_menu, wx.ID_SEPARATOR))

auto_edits = wx.MenuItem(radio_menu, wx.NewId(),
Expand Down Expand Up @@ -1736,6 +1741,9 @@ def _menu_query_rb(self, event):
def _menu_query_dm(self, event):
self._do_network_query(query_sources.DMRMARCQueryDialog)

def _menu_query_prz(self, event):
self._do_network_query(query_sources.PrzemiennikiQueryDialog)


def display_update_notice(version):
LOG.info('Server reports %s is latest' % version)
Expand Down
107 changes: 107 additions & 0 deletions chirp/wxui/query_sources.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
from chirp.sources import dmrmarc
from chirp.sources import radioreference
from chirp.sources import repeaterbook
from chirp.sources import przemienniki
from chirp.wxui import common
from chirp.wxui import config

Expand Down Expand Up @@ -477,6 +478,112 @@ def get_params(self):
'country': CONF.get('country', 'dmrmarc')}


class PrzemiennikiQueryDialog(QuerySourceDialog):
NAME = 'przemienniki.net'
_section = 'przemienniki'
_countries = sorted(
['at', 'bg', 'by', 'ch', 'cz', 'de', 'dk', 'es', 'fi',
'fr', 'hu', 'it', 'lt', 'lv', 'no', 'pl', 'ro', 'se',
'sk', 'ua', 'uk', 'si', 'nl', 'is', 'ru'])
_bands = ['10m', '4m', '6m', '2m', '70cm',
'23cm', '13cm', '3cm']
_modes = ['FM', 'DV']

def _add_grid(self, grid, label, widget):
grid.Add(wx.StaticText(widget.GetParent(), label=label),
border=20, flag=wx.ALIGN_CENTER | wx.RIGHT | wx.LEFT)
grid.Add(widget, 1, border=20, flag=wx.EXPAND | wx.RIGHT | wx.LEFT)

def build(self):
vbox = wx.BoxSizer(wx.VERTICAL)
self.SetSizer(vbox)
panel = wx.Panel(self)
vbox.Add(panel, 1, flag=wx.EXPAND | wx.ALL, border=20)
grid = wx.FlexGridSizer(2, 5, 0)
grid.AddGrowableCol(1)
panel.SetSizer(grid)

self._country = wx.Choice(panel, choices=self._countries)
prev = CONF.get('country', self._section)
if prev and prev in self._countries:
self._country.SetStringSelection(prev)
else:
self._country.SetStringSelection(self._countries[0])
self._add_grid(grid, _('Country'), self._country)

self._band = wx.Choice(panel, choices=self._bands)
prev = CONF.get('band', self._section)
if prev and prev in self._bands:
self._band.SetStringSelection(prev)
else:
self._band.SetStringSelection(self._bands[0])
self._add_grid(grid, _('Band'), self._band)

# This may not be working or no longer supported?
self._mode = wx.Choice(panel, choices=self._modes)
prev = CONF.get('mode', self._section)
# Force FM for now
prev = 'FM'
if prev and prev in self._modes:
self._mode.SetStringSelection(prev)
else:
self._mode.SetStringSelection(self._bands[0])
# self._add_grid(grid, _('Mode'), self._mode)
self._mode.Hide()

self._lat = wx.TextCtrl(panel,
value=CONF.get('lat', 'repeaterbook') or '',
validator=LatValidator())
self._lat.SetHint(_('Optional: 45.0000'))
self._lat.SetToolTip(_('If set, sort results by distance from '
'these coordinates'))
self._lon = wx.TextCtrl(panel,
value=CONF.get('lon', 'repeaterbook') or '',
validator=LonValidator())
self._lon.SetHint(_('Optional: -122.0000'))
self._lon.SetToolTip(_('If set, sort results by distance from '
'these coordinates'))
self._add_grid(grid, _('Latitude'), self._lat)
self._add_grid(grid, _('Longitude'), self._lon)
self._dist = wx.TextCtrl(panel,
value=CONF.get('dist', 'repeaterbook') or '',
validator=DistValidator())
self._dist.SetHint(_('Optional: 100'))
self._dist.SetToolTip(_('Limit results to this distance (km) from '
'coordinates'))
self._add_grid(grid, _('Distance'), self._dist)

return vbox

def get_info(self):
return _('FREE repeater database, which provide most up-to-date\n'
'information about repeaters in Europe. No account is\n'
'required.')

def get_link(self):
return 'https://przemienniki.net'

def do_query(self):
CONF.set('country', self._country.GetStringSelection(), self._section)
CONF.set('band', self._band.GetStringSelection(), self._section)
CONF.set('mode', self._mode.GetStringSelection(), self._section)
CONF.set('lat', self._lat.GetValue(), 'repeaterbook')
CONF.set('lon', self._lon.GetValue(), 'repeaterbook')
CONF.set('dist', self._dist.GetValue(), 'repeaterbook')
self.result_radio = przemienniki.Przemienniki()
super().do_query()

def get_params(self):
return {
'country': CONF.get('country', self._section),
'band': CONF.get('band', self._section),
'mode': CONF.get('mode', self._section).lower(),
'latitude': CONF.get('lat', 'repeaterbook'),
'longitude': CONF.get('lon', 'repeaterbook'),
'range': CONF.get('dist', 'repeaterbook'),
}


class RRQueryDialog(QuerySourceDialog):
NAME = 'RadioReference'

Expand Down
Loading