Ver Fonte

refactor my_recentlystation

Thomas Hanika há 3 anos atrás
pai
commit
a80d6f15f9
3 ficheiros alterados com 71 adições e 40 exclusões
  1. 62 31
      ycast/my_recentlystation.py
  2. 8 8
      ycast/my_stations.py
  3. 1 1
      ycast/server.py

+ 62 - 31
ycast/my_recentlystation.py

@@ -1,57 +1,88 @@
 from ycast import generic
 
 MAX_ENTRIES = 15
+# define a max, so after 5 hits, an other station is get better votes
+MAX_VOTES = 5
 DIRECTORY_NAME = "recently used"
 
 recently_file = generic.get_var_path() + '/recently.yml'
-is_yml_file_loadable = True
+recently_station_dictionary = None
+
+
+class StationVote:
+    def __init__(self, name, params_txt):
+        self.name = name
+        params = params_txt.split('|')
+        self.url = params[0]
+        self.icon = ''
+        self.vote = 0
+        if len(params) > 0:
+            self.icon = params[1]
+            if len(params) > 1:
+                self.vote = int(params[2])
+
+    def to_params_txt(self):
+        text_line = self.url + '|' + self.icon + '|' + str(self.vote) + '\n'
+        return text_line
 
 
 def signal_station_selected(name, url, icon):
-    list_heard_stations = get_stations_list()
-    if not list_heard_stations:
-        list_heard_stations = []
-        list_heard_stations.append(DIRECTORY_NAME + ":\n")
     # make name yaml - like
     name = name.replace(":", " -")
 
-    for line in list_heard_stations:
-        elements = line.split(': ')
-        if elements[0] == '  '+name:
-            list_heard_stations.remove(line)
-    piped_icon = ''
-    if icon and len(icon) > 0:
-        piped_icon = '|' + icon
+    recently_station_list = get_stations_list()
+    station_hit = StationVote(name, url + '|' + icon)
+    for recently_station in recently_station_list:
+        if name == recently_station.name:
+            station_hit.vote = recently_station.vote + 1
+            recently_station_list.remove(recently_station)
+            break
+    recently_station_list.insert(0, station_hit)
 
-    list_heard_stations.insert(1, '  '+name+': '+url+piped_icon+'\n')
-    if len(list_heard_stations) > MAX_ENTRIES+1:
+    if station_hit.vote > MAX_VOTES:
+        for recently_station in recently_station_list:
+            if recently_station.vote > 0:
+                recently_station.vote = recently_station.vote - 1
+
+    if len(recently_station_list) > MAX_ENTRIES:
         # remove last (oldest) entry
-        list_heard_stations.pop()
+        recently_station_list.pop()
+
+    set_station_dictionary(directory_name(), recently_station_list)
 
-    set_stations_yaml(list_heard_stations)
 
+def set_station_dictionary(cathegory, station_list):
+    global recently_station_dictionary
+    new_cathegory_dictionary = {}
+    station_dictionary = {}
+    for station in station_list:
+        station_dictionary[station.name] = station.to_params_txt()
+    new_cathegory_dictionary[cathegory] = station_dictionary
 
-def set_stations_yaml(heard_stations):
-    global is_yml_file_loadable
-    is_yml_file_loadable = generic.writelns_txt_file(recently_file, heard_stations)
+    recently_station_dictionary = new_cathegory_dictionary
+    generic.write_yaml_file(recently_file, recently_station_dictionary)
 
 
 def get_stations_list():
-    return generic.readlns_txt_file(recently_file)
+    stations_list = []
+    cathegory_dict = get_recently_stations_yaml()
+    if cathegory_dict:
+        for cat_key in cathegory_dict:
+            station_dict = cathegory_dict[cat_key]
+            for station_key in station_dict:
+                stations_list.append(StationVote(station_key, station_dict[station_key]))
+    return stations_list
 
 
 def get_recently_stations_yaml():
-    global is_yml_file_loadable
-    dict_stations = None
-    if is_yml_file_loadable:
-        dict_stations = generic.read_yaml_file(recently_file)
-        if not dict_stations:
-            is_yml_file_loadable = False
-    return dict_stations
+    # cached recently
+    global recently_station_dictionary
+    if not recently_station_dictionary:
+        recently_station_dictionary = generic.read_yaml_file(recently_file)
+        if not recently_station_dictionary:
+            recently_station_dictionary[DIRECTORY_NAME] = None
+    return recently_station_dictionary
 
 
 def directory_name():
-    dir = generic.read_yaml_file(recently_file)
-    if dir:
-        return list(dir.keys())[0]
-    return None
+    return list(get_recently_stations_yaml().keys())[0]

+ 8 - 8
ycast/my_stations.py

@@ -8,8 +8,9 @@ config_file = generic.get_var_path() + '/stations.yml'
 
 
 class Station:
-    def __init__(self, uid, name, url, category, icon):
-        self.id = generic.generate_stationid_with_prefix(uid, ID_PREFIX)
+    def __init__(self, name, url, category, icon):
+        self.id = generic.generate_stationid_with_prefix(
+            generic.get_checksum(name + url), ID_PREFIX)
         self.name = name
         self.url = url
         self.tag = category
@@ -66,11 +67,10 @@ def get_stations_by_category(category):
     if my_stations_yaml and category in my_stations_yaml:
         for station_name in my_stations_yaml[category]:
             station_urls = my_stations_yaml[category][station_name]
-            url_list = station_urls.split('|')
-            station_url = url_list[0]
+            param_list = station_urls.split('|')
+            station_url = param_list[0]
             station_icon = None
-            if len(url_list) > 1:
-                station_icon = url_list[1]
-            station_id = generic.get_checksum(station_name + station_url)
-            stations.append(Station(station_id, station_name, station_url, category, station_icon))
+            if len(param_list) > 1:
+                station_icon = param_list[1]
+            stations.append(Station(station_name, station_url, category, station_icon))
     return stations

+ 1 - 1
ycast/server.py

@@ -156,7 +156,7 @@ def landing(path=''):
 
         stations = my_stations.get_stations_by_category(my_recentlystation.directory_name())
         if stations and len(stations) > 0:
-# emulate Sp
+            # make blank line (display is not shown)
             page.add(vtuner.Directory(' ', url_for('my_stations_landing', _external=True),
                                       len(my_stations.get_category_directories())))
             count = 0