| 
				
			 | 
			
			
				@@ -1,7 +1,6 @@ 
			 | 
		
	
		
			
			| 
				1
			 | 
			
				1
			 | 
			
			
				 package main 
			 | 
		
	
		
			
			| 
				2
			 | 
			
				2
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				3
			 | 
			
				3
			 | 
			
			
				 import ( 
			 | 
		
	
		
			
			| 
				4
			 | 
			
				
			 | 
			
			
				-	"container/heap" 
			 | 
		
	
		
			
			| 
				5
			 | 
			
				4
			 | 
			
			
				 	"encoding/json" 
			 | 
		
	
		
			
			| 
				6
			 | 
			
				5
			 | 
			
			
				 	"errors" 
			 | 
		
	
		
			
			| 
				7
			 | 
			
				6
			 | 
			
			
				 	"fmt" 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -47,97 +46,99 @@ func appendSong(wikiText string, author string, newSong string) string { 
			 | 
		
	
		
			
			| 
				47
			 | 
			
				46
			 | 
			
			
				 	return strings.Join(changedLines, "\n") 
			 | 
		
	
		
			
			| 
				48
			 | 
			
				47
			 | 
			
			
				 } 
			 | 
		
	
		
			
			| 
				49
			 | 
			
				48
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				50
			 | 
			
				
			 | 
			
			
				-func addSong(title string, week int, author string, song string) (bool, error) { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				49
			 | 
			
			
				+func addSong(updateTitle, updateSection, author, song string) (bool, error) { 
			 | 
		
	
		
			
			| 
				51
			 | 
			
				50
			 | 
			
			
				 	wiki := CreateWikiClient(credentials.APIURL, credentials.UserName, credentials.Password) 
			 | 
		
	
		
			
			| 
				52
			 | 
			
				51
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				53
			 | 
			
				
			 | 
			
			
				-	sections, err := wiki.GetWikiPageSections(title) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				52
			 | 
			
			
				+	sections, err := wiki.GetWikiPageSections(updateTitle) 
			 | 
		
	
		
			
			| 
				54
			 | 
			
				53
			 | 
			
			
				 	if err != nil { 
			 | 
		
	
		
			
			| 
				55
			 | 
			
				54
			 | 
			
			
				 		return false, err 
			 | 
		
	
		
			
			| 
				56
			 | 
			
				55
			 | 
			
			
				 	} 
			 | 
		
	
		
			
			| 
				57
			 | 
			
				56
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				58
			 | 
			
				
			 | 
			
			
				-	numberReg, _ := regexp.Compile("\\d+") 
			 | 
		
	
		
			
			| 
				59
			 | 
			
				57
			 | 
			
			
				 	for _, section := range sections { 
			 | 
		
	
		
			
			| 
				60
			 | 
			
				
			 | 
			
			
				-		weekStr := numberReg.FindString(section.title) 
			 | 
		
	
		
			
			| 
				61
			 | 
			
				
			 | 
			
			
				-		if weekStr != "" { 
			 | 
		
	
		
			
			| 
				62
			 | 
			
				
			 | 
			
			
				-			weekNumber, _ := strconv.Atoi(weekStr) 
			 | 
		
	
		
			
			| 
				63
			 | 
			
				
			 | 
			
			
				-			if weekNumber == week { 
			 | 
		
	
		
			
			| 
				64
			 | 
			
				
			 | 
			
			
				-				wikiText, err := wiki.GetWikiPageSectionText(title, section.index) 
			 | 
		
	
		
			
			| 
				65
			 | 
			
				
			 | 
			
			
				-				if err != nil { 
			 | 
		
	
		
			
			| 
				66
			 | 
			
				
			 | 
			
			
				-					return false, err 
			 | 
		
	
		
			
			| 
				67
			 | 
			
				
			 | 
			
			
				-				} 
			 | 
		
	
		
			
			| 
				68
			 | 
			
				
			 | 
			
			
				-				changedWikiText := appendSong(wikiText, author, song) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				58
			 | 
			
			
				+		if updateSection == section.title { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				59
			 | 
			
			
				+			wikiText, err := wiki.GetWikiPageSectionText(updateTitle, section.index) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				60
			 | 
			
			
				+			if err != nil { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				61
			 | 
			
			
				+				return false, err 
			 | 
		
	
		
			
			| 
				
			 | 
			
				62
			 | 
			
			
				+			} 
			 | 
		
	
		
			
			| 
				
			 | 
			
				63
			 | 
			
			
				+			changedWikiText := appendSong(wikiText, author, song) 
			 | 
		
	
		
			
			| 
				69
			 | 
			
				64
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				70
			 | 
			
				
			 | 
			
			
				-				return wiki.EditWikiPageSection(title, section.index, changedWikiText, 
			 | 
		
	
		
			
			| 
				71
			 | 
			
				
			 | 
			
			
				-					fmt.Sprintf("Added week %d song for %s", week, author)) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				65
			 | 
			
			
				+			if false { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				66
			 | 
			
			
				+				// Stub 
			 | 
		
	
		
			
			| 
				
			 | 
			
				67
			 | 
			
			
				+				fmt.Println("Pretend to update wiki text to ", updateTitle, section.index, changedWikiText, 
			 | 
		
	
		
			
			| 
				
			 | 
			
				68
			 | 
			
			
				+					fmt.Sprintf("Added %s song for %s", updateSection, author)) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				69
			 | 
			
			
				+				return true, nil 
			 | 
		
	
		
			
			| 
				72
			 | 
			
				70
			 | 
			
			
				 			} 
			 | 
		
	
		
			
			| 
				
			 | 
			
				71
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				72
			 | 
			
			
				+			return wiki.EditWikiPageSection(updateTitle, section.index, changedWikiText, 
			 | 
		
	
		
			
			| 
				
			 | 
			
				73
			 | 
			
			
				+				fmt.Sprintf("Added %s song for %s", updateSection, author)) 
			 | 
		
	
		
			
			| 
				73
			 | 
			
				74
			 | 
			
			
				 		} 
			 | 
		
	
		
			
			| 
				74
			 | 
			
				75
			 | 
			
			
				 	} 
			 | 
		
	
		
			
			| 
				75
			 | 
			
				76
			 | 
			
			
				 	return false, errors.New("Could not find matching section") 
			 | 
		
	
		
			
			| 
				76
			 | 
			
				77
			 | 
			
			
				 } 
			 | 
		
	
		
			
			| 
				77
			 | 
			
				78
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				78
			 | 
			
				
			 | 
			
			
				-func songSynced(syncedWeek int) error { 
			 | 
		
	
		
			
			| 
				79
			 | 
			
				
			 | 
			
			
				-	v, err := loadDb() 
			 | 
		
	
		
			
			| 
				
			 | 
			
				79
			 | 
			
			
				+func songSynced(userId, roundId int) error { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				80
			 | 
			
			
				+	query := `UPDATE public.entry SET synced = true WHERE user_id = $1 AND round_id = $2` 
			 | 
		
	
		
			
			| 
				
			 | 
			
				81
			 | 
			
			
				+	res, err := getDb().Exec(query, userId, roundId) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				82
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				80
			 | 
			
				83
			 | 
			
			
				 	if err != nil { 
			 | 
		
	
		
			
			| 
				81
			 | 
			
				84
			 | 
			
			
				 		return err 
			 | 
		
	
		
			
			| 
				82
			 | 
			
				85
			 | 
			
			
				 	} 
			 | 
		
	
		
			
			| 
				83
			 | 
			
				86
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				84
			 | 
			
				
			 | 
			
			
				-	synced := false 
			 | 
		
	
		
			
			| 
				85
			 | 
			
				
			 | 
			
			
				-	for _, song := range v.Songs { 
			 | 
		
	
		
			
			| 
				86
			 | 
			
				
			 | 
			
			
				-		if song.Week == syncedWeek { 
			 | 
		
	
		
			
			| 
				87
			 | 
			
				
			 | 
			
			
				-			song.Sync = true 
			 | 
		
	
		
			
			| 
				88
			 | 
			
				
			 | 
			
			
				-			synced = true 
			 | 
		
	
		
			
			| 
				89
			 | 
			
				
			 | 
			
			
				-			err := saveDb(v) 
			 | 
		
	
		
			
			| 
				90
			 | 
			
				
			 | 
			
			
				-			if err != nil { 
			 | 
		
	
		
			
			| 
				91
			 | 
			
				
			 | 
			
			
				-				return err 
			 | 
		
	
		
			
			| 
				92
			 | 
			
				
			 | 
			
			
				-			} 
			 | 
		
	
		
			
			| 
				93
			 | 
			
				
			 | 
			
			
				-		} 
			 | 
		
	
		
			
			| 
				
			 | 
			
				87
			 | 
			
			
				+	affected, err := res.RowsAffected() 
			 | 
		
	
		
			
			| 
				
			 | 
			
				88
			 | 
			
			
				+	if err != nil { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				89
			 | 
			
			
				+		return err 
			 | 
		
	
		
			
			| 
				94
			 | 
			
				90
			 | 
			
			
				 	} 
			 | 
		
	
		
			
			| 
				95
			 | 
			
				
			 | 
			
			
				-	if !synced { 
			 | 
		
	
		
			
			| 
				96
			 | 
			
				
			 | 
			
			
				-		return errors.New("No week matched from JSON for synced song") 
			 | 
		
	
		
			
			| 
				
			 | 
			
				91
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				92
			 | 
			
			
				+	if affected != 1 { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				93
			 | 
			
			
				+		return errors.New("Unknown entry ID") 
			 | 
		
	
		
			
			| 
				97
			 | 
			
				94
			 | 
			
			
				 	} 
			 | 
		
	
		
			
			| 
				98
			 | 
			
				
			 | 
			
			
				-	return errors.New("Week not found") 
			 | 
		
	
		
			
			| 
				
			 | 
			
				95
			 | 
			
			
				+	return nil 
			 | 
		
	
		
			
			| 
				99
			 | 
			
				96
			 | 
			
			
				 } 
			 | 
		
	
		
			
			| 
				100
			 | 
			
				97
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				101
			 | 
			
				
			 | 
			
			
				-func getSongs() (SongPriorityQueue, error) { 
			 | 
		
	
		
			
			| 
				102
			 | 
			
				
			 | 
			
			
				-	dbSongs, err := loadDb() 
			 | 
		
	
		
			
			| 
				
			 | 
			
				98
			 | 
			
			
				+func submitSong() { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				99
			 | 
			
			
				+	query := ` 
			 | 
		
	
		
			
			| 
				
			 | 
			
				100
			 | 
			
			
				+	SELECT e.user_id, e.round_id, e.artist, e.title, e.spotify_url, p.article, u.username, r.section 
			 | 
		
	
		
			
			| 
				
			 | 
			
				101
			 | 
			
			
				+	FROM public.entry e  
			 | 
		
	
		
			
			| 
				
			 | 
			
				102
			 | 
			
			
				+	JOIN public."user" u ON u.id = e.user_id 
			 | 
		
	
		
			
			| 
				
			 | 
			
				103
			 | 
			
			
				+	JOIN public.round r ON r.id = e.round_id 
			 | 
		
	
		
			
			| 
				
			 | 
			
				104
			 | 
			
			
				+	JOIN public.panel p ON p.id = r.panel_id 
			 | 
		
	
		
			
			| 
				
			 | 
			
				105
			 | 
			
			
				+	WHERE r.start < current_timestamp AND e.synced = false` 
			 | 
		
	
		
			
			| 
				
			 | 
			
				106
			 | 
			
			
				+	rows, err := getDb().Query(query) 
			 | 
		
	
		
			
			| 
				103
			 | 
			
				107
			 | 
			
			
				 	if err != nil { 
			 | 
		
	
		
			
			| 
				104
			 | 
			
				
			 | 
			
			
				-		return nil, err 
			 | 
		
	
		
			
			| 
				
			 | 
			
				108
			 | 
			
			
				+		log.Println("Error while reading songs from database:", err) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				109
			 | 
			
			
				+		return 
			 | 
		
	
		
			
			| 
				105
			 | 
			
				110
			 | 
			
			
				 	} 
			 | 
		
	
		
			
			| 
				106
			 | 
			
				
			 | 
			
			
				- 
			 | 
		
	
		
			
			| 
				107
			 | 
			
				
			 | 
			
			
				-	songs := make(SongPriorityQueue, len(dbSongs.Songs)) 
			 | 
		
	
		
			
			| 
				108
			 | 
			
				
			 | 
			
			
				-	for index, songObj := range dbSongs.Songs { 
			 | 
		
	
		
			
			| 
				109
			 | 
			
				
			 | 
			
			
				-		songs[index] = &Song{ 
			 | 
		
	
		
			
			| 
				110
			 | 
			
				
			 | 
			
			
				-			time:  targetTime(songObj), 
			 | 
		
	
		
			
			| 
				111
			 | 
			
				
			 | 
			
			
				-			song:  songEntryWikiText(songObj), 
			 | 
		
	
		
			
			| 
				112
			 | 
			
				
			 | 
			
			
				-			week:  songObj.Week, 
			 | 
		
	
		
			
			| 
				113
			 | 
			
				
			 | 
			
			
				-			sync:  songObj.Sync, 
			 | 
		
	
		
			
			| 
				114
			 | 
			
				
			 | 
			
			
				-			index: index, 
			 | 
		
	
		
			
			| 
				
			 | 
			
				111
			 | 
			
			
				+	defer rows.Close() 
			 | 
		
	
		
			
			| 
				
			 | 
			
				112
			 | 
			
			
				+	for rows.Next() { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				113
			 | 
			
			
				+		var ( 
			 | 
		
	
		
			
			| 
				
			 | 
			
				114
			 | 
			
			
				+			userId, roundId                                       int 
			 | 
		
	
		
			
			| 
				
			 | 
			
				115
			 | 
			
			
				+			artist, title, spotifyURL, article, username, section string 
			 | 
		
	
		
			
			| 
				
			 | 
			
				116
			 | 
			
			
				+		) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				117
			 | 
			
			
				+		err := rows.Scan(&userId, &roundId, &artist, &title, &spotifyURL, &article, &username, §ion) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				118
			 | 
			
			
				+		if err != nil { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				119
			 | 
			
			
				+			log.Println("Error while scanning row:", err) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				120
			 | 
			
			
				+			continue 
			 | 
		
	
		
			
			| 
				115
			 | 
			
				121
			 | 
			
			
				 		} 
			 | 
		
	
		
			
			| 
				116
			 | 
			
				
			 | 
			
			
				-	} 
			 | 
		
	
		
			
			| 
				117
			 | 
			
				
			 | 
			
			
				-	heap.Init(&songs) 
			 | 
		
	
		
			
			| 
				118
			 | 
			
				
			 | 
			
			
				-	for len(songs) > 0 && songs[0].sync { 
			 | 
		
	
		
			
			| 
				119
			 | 
			
				
			 | 
			
			
				-		heap.Pop(&songs) 
			 | 
		
	
		
			
			| 
				120
			 | 
			
				
			 | 
			
			
				-	} 
			 | 
		
	
		
			
			| 
				121
			 | 
			
				
			 | 
			
			
				-	return songs, nil 
			 | 
		
	
		
			
			| 
				122
			 | 
			
				
			 | 
			
			
				-} 
			 | 
		
	
		
			
			| 
				
			 | 
			
				122
			 | 
			
			
				+		song := songWikiText(spotifyURL, artist, title) 
			 | 
		
	
		
			
			| 
				123
			 | 
			
				123
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				124
			 | 
			
				
			 | 
			
			
				-func submitSong() { 
			 | 
		
	
		
			
			| 
				125
			 | 
			
				
			 | 
			
			
				-	now := time.Now() 
			 | 
		
	
		
			
			| 
				126
			 | 
			
				
			 | 
			
			
				-	if len(songs) > 0 && songs[0].time.Before(now) { 
			 | 
		
	
		
			
			| 
				127
			 | 
			
				
			 | 
			
			
				-		fmt.Println("Time has passed for " + songs[0].song) 
			 | 
		
	
		
			
			| 
				128
			 | 
			
				
			 | 
			
			
				-		success, err := addSong("Levyraati 2018", songs[0].week, "Lamperi", songs[0].song) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				124
			 | 
			
			
				+		fmt.Println("Time has passed for " + song) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				125
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				126
			 | 
			
			
				+		success, err := addSong(article, section, username, song) 
			 | 
		
	
		
			
			| 
				129
			 | 
			
				127
			 | 
			
			
				 		if err != nil { 
			 | 
		
	
		
			
			| 
				130
			 | 
			
				128
			 | 
			
			
				 			log.Println("Error while adding song:", err) 
			 | 
		
	
		
			
			| 
				131
			 | 
			
				129
			 | 
			
			
				 		} 
			 | 
		
	
		
			
			| 
				132
			 | 
			
				130
			 | 
			
			
				 		if success { 
			 | 
		
	
		
			
			| 
				133
			 | 
			
				
			 | 
			
			
				-			err := songSynced(songs[0].week) 
			 | 
		
	
		
			
			| 
				134
			 | 
			
				
			 | 
			
			
				-			if err == nil { 
			 | 
		
	
		
			
			| 
				135
			 | 
			
				
			 | 
			
			
				-				heap.Pop(&songs) 
			 | 
		
	
		
			
			| 
				136
			 | 
			
				
			 | 
			
			
				-			} else { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				131
			 | 
			
			
				+			err = songSynced(userId, roundId) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				132
			 | 
			
			
				+			if err != nil { 
			 | 
		
	
		
			
			| 
				137
			 | 
			
				133
			 | 
			
			
				 				fmt.Println("Error received:", err) 
			 | 
		
	
		
			
			| 
				138
			 | 
			
				134
			 | 
			
			
				 			} 
			 | 
		
	
		
			
			| 
				139
			 | 
			
				135
			 | 
			
			
				 		} 
			 | 
		
	
		
			
			| 
				140
			 | 
			
				136
			 | 
			
			
				 	} 
			 | 
		
	
		
			
			| 
				
			 | 
			
				137
			 | 
			
			
				+	err = rows.Err() 
			 | 
		
	
		
			
			| 
				
			 | 
			
				138
			 | 
			
			
				+	if err != nil { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				139
			 | 
			
			
				+		log.Println("Error after reading cursor:", err) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				140
			 | 
			
			
				+		return 
			 | 
		
	
		
			
			| 
				
			 | 
			
				141
			 | 
			
			
				+	} 
			 | 
		
	
		
			
			| 
				141
			 | 
			
				142
			 | 
			
			
				 } 
			 | 
		
	
		
			
			| 
				142
			 | 
			
				143
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				143
			 | 
			
				144
			 | 
			
			
				 func isCurrentAuthor(line, author string) bool { 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -298,16 +299,6 @@ func initCreds() error { 
			 | 
		
	
		
			
			| 
				298
			 | 
			
				299
			 | 
			
			
				 	return nil 
			 | 
		
	
		
			
			| 
				299
			 | 
			
				300
			 | 
			
			
				 } 
			 | 
		
	
		
			
			| 
				300
			 | 
			
				301
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				301
			 | 
			
				
			 | 
			
			
				-func targetTime(entry *SongEntry) time.Time { 
			 | 
		
	
		
			
			| 
				302
			 | 
			
				
			 | 
			
			
				-	yearStart, _ := time.Parse(time.RFC3339, "2018-01-01T00:00:00+02:00") 
			 | 
		
	
		
			
			| 
				303
			 | 
			
				
			 | 
			
			
				-	target := yearStart.AddDate(0, 0, (entry.Week-1)*7) 
			 | 
		
	
		
			
			| 
				304
			 | 
			
				
			 | 
			
			
				-	return target 
			 | 
		
	
		
			
			| 
				305
			 | 
			
				
			 | 
			
			
				-} 
			 | 
		
	
		
			
			| 
				306
			 | 
			
				
			 | 
			
			
				- 
			 | 
		
	
		
			
			| 
				307
			 | 
			
				
			 | 
			
			
				-func songEntryWikiText(entry *SongEntry) string { 
			 | 
		
	
		
			
			| 
				308
			 | 
			
				
			 | 
			
			
				-	return songWikiText(entry.URL, entry.Artist, entry.Title) 
			 | 
		
	
		
			
			| 
				309
			 | 
			
				
			 | 
			
			
				-} 
			 | 
		
	
		
			
			| 
				310
			 | 
			
				
			 | 
			
			
				- 
			 | 
		
	
		
			
			| 
				311
			 | 
			
				302
			 | 
			
			
				 func songWikiText(url string, artist string, title string) string { 
			 | 
		
	
		
			
			| 
				312
			 | 
			
				303
			 | 
			
			
				 	return "[" + url + " " + artist + " - " + title + "]" 
			 | 
		
	
		
			
			| 
				313
			 | 
			
				304
			 | 
			
			
				 } 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -317,45 +308,10 @@ func main() { 
			 | 
		
	
		
			
			| 
				317
			 | 
			
				308
			 | 
			
			
				 	if err != nil { 
			 | 
		
	
		
			
			| 
				318
			 | 
			
				309
			 | 
			
			
				 		panic(err) 
			 | 
		
	
		
			
			| 
				319
			 | 
			
				310
			 | 
			
			
				 	} 
			 | 
		
	
		
			
			| 
				320
			 | 
			
				
			 | 
			
			
				-	songs, err = getSongs() 
			 | 
		
	
		
			
			| 
				321
			 | 
			
				
			 | 
			
			
				-	if err != nil { 
			 | 
		
	
		
			
			| 
				322
			 | 
			
				
			 | 
			
			
				-		panic(err) 
			 | 
		
	
		
			
			| 
				323
			 | 
			
				
			 | 
			
			
				-	} 
			 | 
		
	
		
			
			| 
				324
			 | 
			
				
			 | 
			
			
				- 
			 | 
		
	
		
			
			| 
				325
			 | 
			
				
			 | 
			
			
				-	modifiedSongChan := make(chan *SongEntry) 
			 | 
		
	
		
			
			| 
				326
			 | 
			
				311
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				327
			 | 
			
				312
			 | 
			
			
				 	spotifyClient := spotify.NewClient(credentials.SpotifyClientID, credentials.SpotifyClientSecret) 
			 | 
		
	
		
			
			| 
				328
			 | 
			
				313
			 | 
			
			
				 	go func() { 
			 | 
		
	
		
			
			| 
				329
			 | 
			
				
			 | 
			
			
				- 
			 | 
		
	
		
			
			| 
				330
			 | 
			
				
			 | 
			
			
				-		webStart(credentials.ListenAddr, modifiedSongChan, spotifyClient) 
			 | 
		
	
		
			
			| 
				331
			 | 
			
				
			 | 
			
			
				-	}() 
			 | 
		
	
		
			
			| 
				332
			 | 
			
				
			 | 
			
			
				- 
			 | 
		
	
		
			
			| 
				333
			 | 
			
				
			 | 
			
			
				-	go func() { 
			 | 
		
	
		
			
			| 
				334
			 | 
			
				
			 | 
			
			
				-		for { 
			 | 
		
	
		
			
			| 
				335
			 | 
			
				
			 | 
			
			
				-			newSong := <-modifiedSongChan 
			 | 
		
	
		
			
			| 
				336
			 | 
			
				
			 | 
			
			
				-			matched := false 
			 | 
		
	
		
			
			| 
				337
			 | 
			
				
			 | 
			
			
				-			for _, song := range songs { 
			 | 
		
	
		
			
			| 
				338
			 | 
			
				
			 | 
			
			
				-				if song.week == newSong.Week { 
			 | 
		
	
		
			
			| 
				339
			 | 
			
				
			 | 
			
			
				-					song.song = songEntryWikiText(newSong) 
			 | 
		
	
		
			
			| 
				340
			 | 
			
				
			 | 
			
			
				-					song.sync = newSong.Sync 
			 | 
		
	
		
			
			| 
				341
			 | 
			
				
			 | 
			
			
				-					matched = true 
			 | 
		
	
		
			
			| 
				342
			 | 
			
				
			 | 
			
			
				-					log.Printf("Updated song for week %d, artist: %s, title: %s, URL: %s, time: %v", 
			 | 
		
	
		
			
			| 
				343
			 | 
			
				
			 | 
			
			
				-						newSong.Week, newSong.Artist, newSong.Title, newSong.URL, song.time) 
			 | 
		
	
		
			
			| 
				344
			 | 
			
				
			 | 
			
			
				-				} 
			 | 
		
	
		
			
			| 
				345
			 | 
			
				
			 | 
			
			
				-			} 
			 | 
		
	
		
			
			| 
				346
			 | 
			
				
			 | 
			
			
				-			if !matched { 
			 | 
		
	
		
			
			| 
				347
			 | 
			
				
			 | 
			
			
				-				song := &Song{ 
			 | 
		
	
		
			
			| 
				348
			 | 
			
				
			 | 
			
			
				-					time:  targetTime(newSong), 
			 | 
		
	
		
			
			| 
				349
			 | 
			
				
			 | 
			
			
				-					song:  songEntryWikiText(newSong), 
			 | 
		
	
		
			
			| 
				350
			 | 
			
				
			 | 
			
			
				-					week:  newSong.Week, 
			 | 
		
	
		
			
			| 
				351
			 | 
			
				
			 | 
			
			
				-					sync:  newSong.Sync, 
			 | 
		
	
		
			
			| 
				352
			 | 
			
				
			 | 
			
			
				-					index: len(songs), 
			 | 
		
	
		
			
			| 
				353
			 | 
			
				
			 | 
			
			
				-				} 
			 | 
		
	
		
			
			| 
				354
			 | 
			
				
			 | 
			
			
				-				heap.Push(&songs, song) 
			 | 
		
	
		
			
			| 
				355
			 | 
			
				
			 | 
			
			
				-				log.Printf("Added song for week %d, artist: %s, title: %s, URL: %s, time: %v", 
			 | 
		
	
		
			
			| 
				356
			 | 
			
				
			 | 
			
			
				-					newSong.Week, newSong.Artist, newSong.Title, newSong.URL, song.time) 
			 | 
		
	
		
			
			| 
				357
			 | 
			
				
			 | 
			
			
				-			} 
			 | 
		
	
		
			
			| 
				358
			 | 
			
				
			 | 
			
			
				-		} 
			 | 
		
	
		
			
			| 
				
			 | 
			
				314
			 | 
			
			
				+		webStart(credentials.ListenAddr, spotifyClient) 
			 | 
		
	
		
			
			| 
				359
			 | 
			
				315
			 | 
			
			
				 	}() 
			 | 
		
	
		
			
			| 
				360
			 | 
			
				316
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				361
			 | 
			
				317
			 | 
			
			
				 	gocron.Every(1).Hour().Do(fixAveragesTask) 
			 |