groove-dl 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,171 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- module GrooveDl
3
- # Widgets components
4
- module Widgets
5
- # Download section
6
- module Download
7
- # List page
8
- module List
9
- # Queue tree
10
- class Queue < Gtk::Box
11
- attr_reader :store, :data
12
- attr_writer :downloader, :client
13
- attr_accessor :failed, :success, :queue
14
-
15
- COLUMN_PATH,
16
- COLUMN_PGBAR_VALUE,
17
- COLUMN_PGBAR_TEXT = *(0..2).to_a
18
-
19
- ##
20
- # Initialize widgets
21
- #
22
- # @param [Grooveshark::Client] client Grooveshark client
23
- # @param [Gtk::Window] window Gtk app
24
- #
25
- def load(client, window)
26
- @success = 0
27
- @failed = 0
28
- @queue = 0
29
- @client = client
30
- @window = window
31
- @data = {}
32
- @downloader = GrooveDl::Downloader.new(@client)
33
- @downloader.type = 'gui'
34
-
35
- sw = Gtk::ScrolledWindow.new
36
- sw.shadow_type = Gtk::ShadowType::ETCHED_IN
37
- sw.set_policy(Gtk::PolicyType::AUTOMATIC,
38
- Gtk::PolicyType::AUTOMATIC)
39
- pack_start(sw, expand: true, fill: true, padding: 0)
40
-
41
- @store = Gtk::ListStore.new(String, Integer, String)
42
- create_model
43
- treeview = Gtk::TreeView.new(@store)
44
- treeview.rules_hint = true
45
-
46
- sw.add(treeview)
47
-
48
- add_columns(treeview)
49
- end
50
-
51
- def create_model(data = {})
52
- data.each do |id, element|
53
- if element.is_a?(Grooveshark::Song)
54
- iter = @store.append
55
- iter[COLUMN_PATH] =
56
- @downloader.build_path(@window
57
- .find_by_name('directory_chooser')
58
- .filename,
59
- element)
60
- iter[COLUMN_PGBAR_VALUE] = 0
61
- iter[COLUMN_PGBAR_TEXT] = nil
62
- @data[element.id] = { iter: iter, song: element }
63
- else
64
- playlist = Grooveshark::Playlist.new(@client,
65
- 'playlist_id' => id)
66
- result = {}
67
- playlist.load_songs.each do |song|
68
- result[song.id] = song
69
- end
70
-
71
- create_model(result)
72
- end
73
- end
74
-
75
- return if @data.empty?
76
- @queue = @data.count
77
- @window.find_by_name('download_book').set_label('QUEUE', @queue)
78
- end
79
-
80
- ##
81
- # Add columns on the treeview element
82
- #
83
- # @param [Gtk::Treeview] treeview Treeview
84
- #
85
- def add_columns(treeview)
86
- renderer = Gtk::CellRendererText.new
87
- column = Gtk::TreeViewColumn.new('Path',
88
- renderer,
89
- 'text' => COLUMN_PATH)
90
- column.fixed_width = 650
91
- treeview.append_column(column)
92
-
93
- renderer = Gtk::CellRendererProgress.new
94
- column = Gtk::TreeViewColumn.new('Progress',
95
- renderer,
96
- value: COLUMN_PGBAR_VALUE,
97
- text: COLUMN_PGBAR_TEXT)
98
- column.fixed_width = 100
99
- treeview.append_column(column)
100
- end
101
-
102
- ##
103
- # Download files in queue
104
- #
105
- def download
106
- concurrency = @window.find_by_name('concurrency_entry').text.to_i
107
- concurrency = 5 if concurrency == 0
108
- Thread.abort_on_exception = true
109
- Thread.new do
110
- nb = 0
111
- @data.each do |_id, s|
112
- nb += 1
113
- Thread.new do
114
- download_file(s)
115
- nb -= 1
116
- end
117
- sleep(0.5) until nb < concurrency
118
- end
119
- end
120
- end
121
-
122
- ##
123
- # Download song
124
- #
125
- # @param [Grooveshark::Song] song Song to download
126
- #
127
- def download_file(song)
128
- begin
129
- @downloader.download(song[:song], song[:iter])
130
- notify_success(song)
131
- rescue Errors::AlreadyDownloaded => e
132
- GrooveDl.configuration.logger.info(e.message)
133
- notify_success(song)
134
- rescue Grooveshark::GeneralError => e
135
- GrooveDl.configuration.logger.error(e)
136
- notify_error(song, e)
137
- end
138
-
139
- @window.find_by_name('download_book')
140
- .set_label('QUEUE', @queue -= 1)
141
- @store.remove(song[:iter])
142
- end
143
-
144
- ##
145
- # Notify success
146
- #
147
- # @param [Grooveshark::Song] song Song displayed in success page
148
- #
149
- def notify_success(song)
150
- @window.find_by_name('download_success_list')
151
- .create_model(song[:iter])
152
- @window.find_by_name('download_book')
153
- .set_label('SUCCESS', @success += 1)
154
- end
155
-
156
- ##
157
- # Notify erro
158
- #
159
- # @param [Grooveshark::Song] song Song displayed in failed page
160
- #
161
- def notify_error(song, e)
162
- @window.find_by_name('download_failed_list')
163
- .create_model(song[:iter], e.message)
164
- @window.find_by_name('download_book')
165
- .set_label('FAILED', @failed += 1)
166
- end
167
- end
168
- end
169
- end
170
- end
171
- end
@@ -1,83 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- module GrooveDl
3
- # Widgets components
4
- module Widgets
5
- # Download section
6
- module Download
7
- # List page
8
- module List
9
- # Success tree
10
- class Success < Gtk::Box
11
- attr_reader :store, :data, :treeview
12
-
13
- COLUMN_PATH,
14
- COLUMN_SIZE = *(0..1).to_a
15
- RIGHT_CLICK = 3
16
-
17
- ##
18
- # Initialize widgets
19
- #
20
- # @param [Grooveshark::Client] client Grooveshark client
21
- # @param [Gtk::Window] window Gtk app
22
- #
23
- def load(_client, _window, menu)
24
- @data = {}
25
- sw = Gtk::ScrolledWindow.new
26
- sw.shadow_type = Gtk::ShadowType::ETCHED_IN
27
- sw.set_policy(Gtk::PolicyType::AUTOMATIC,
28
- Gtk::PolicyType::AUTOMATIC)
29
- pack_start(sw, expand: true, fill: true, padding: 0)
30
-
31
- @store = Gtk::ListStore.new(String, String)
32
- @treeview = Gtk::TreeView.new(@store)
33
- @treeview.rules_hint = true
34
-
35
- @treeview.signal_connect('button_press_event') do |widget, event|
36
- if event.is_a?(Gdk::EventButton) && event.button == RIGHT_CLICK
37
- path, _model = widget.get_path_at_pos(event.x, event.y)
38
- widget.selection.select_path(path)
39
- menu.popup(nil, nil, event.button, event.time)
40
- end
41
- end
42
-
43
- sw.add(@treeview)
44
-
45
- add_columns
46
- end
47
-
48
- ##
49
- # Append row in the list store
50
- #
51
- # @param [Gtk::TreeIter] i Iterable element
52
- #
53
- def create_model(i)
54
- iter = @store.append
55
- path = i[COLUMN_PATH]
56
- iter[COLUMN_PATH] = path
57
- size = (File.size?(path).to_f / (1024 * 1024)).round(2)
58
- iter[COLUMN_SIZE] = "#{size} MB"
59
- end
60
-
61
- ##
62
- # Add columns on the treeview element
63
- #
64
- def add_columns
65
- renderer = Gtk::CellRendererText.new
66
- column = Gtk::TreeViewColumn.new('Path',
67
- renderer,
68
- 'text' => COLUMN_PATH)
69
- column.fixed_width = 650
70
- @treeview.append_column(column)
71
-
72
- renderer = Gtk::CellRendererText.new
73
- column = Gtk::TreeViewColumn.new('Size',
74
- renderer,
75
- 'text' => COLUMN_SIZE)
76
- column.fixed_width = 100
77
- @treeview.append_column(column)
78
- end
79
- end
80
- end
81
- end
82
- end
83
- end
@@ -1,32 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- module GrooveDl
3
- # Widgets components
4
- module Widgets
5
- # Download section
6
- module Menu
7
- # Success menu
8
- class Success < Gtk::Menu
9
- ##
10
- # Initialize widgets
11
- #
12
- # @param [Grooveshark::Client] client Grooveshark client
13
- # @param [Gtk::Window] window Gtk app
14
- #
15
- def load(_client, window)
16
- item = Gtk::ImageMenuItem.new(stock_id: Gtk::Stock::OPEN)
17
- item.signal_connect('activate') do
18
- treeview = window.find_by_name('download_success_list').treeview
19
- iter = treeview.selection.selected
20
- Thread.new do
21
- path = iter[Download::List::Queue::COLUMN_PATH]
22
- system("gnome-open #{Shellwords.escape(path)}")
23
- end
24
- end
25
-
26
- append(item)
27
- show_all
28
- end
29
- end
30
- end
31
- end
32
- end
@@ -1,74 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- module GrooveDl
3
- # Widgets components
4
- module Widgets
5
- # Search section
6
- module Search
7
- # Search bar
8
- class Bar < Gtk::Box
9
- attr_reader :type, :query
10
-
11
- ##
12
- # Initialize widgets
13
- #
14
- # @param [Grooveshark::Client] client Grooveshark client
15
- # @param [Gtk::Window] window Gtk app
16
- #
17
- def load(client, window)
18
- search_box = Gtk::Box.new(:horizontal, 6)
19
-
20
- search_bar = Gtk::Entry.new
21
- search_bar.set_name('search_bar')
22
- search_bar.set_placeholder_text('Search...')
23
-
24
- search_box.pack_start(search_bar,
25
- expand: true,
26
- fill: true,
27
- padding: 10)
28
-
29
- search_type = Gtk::ComboBoxText.new
30
- search_type.set_name('search_type')
31
- search_type.append_text 'Playlists'
32
- search_type.append_text 'Songs'
33
- search_type.active = 0
34
-
35
- search_box.pack_start(search_type,
36
- expand: false,
37
- fill: true,
38
- padding: 5)
39
-
40
- button = Gtk::Button.new(stock_id: Gtk::Stock::FIND)
41
- button.set_name('search_button')
42
- search_box.pack_start(button,
43
- expand: false,
44
- fill: false,
45
- padding: 10)
46
-
47
- pack_start(search_box,
48
- expand: false,
49
- padding: 10)
50
-
51
- # Signals
52
- button.signal_connect('released') do
53
- @type = search_type.active_text
54
- @query = search_bar.text
55
- next if @type.empty? || @query.empty?
56
- search = client.request('getResultsFromSearch',
57
- type: @type,
58
- query: @query)
59
- results = search['result'].map do |data|
60
- next Grooveshark::Song.new data if type == 'Songs'
61
- data
62
- end if search.key?('result')
63
-
64
- window.find_by_name('search_list').create_model(results)
65
- end
66
-
67
- search_bar.signal_connect('activate') do
68
- button.signal_emit('released')
69
- end
70
- end
71
- end
72
- end
73
- end
74
- end
@@ -1,151 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- module GrooveDl
3
- # Widgets components
4
- module Widgets
5
- # Search section
6
- module Search
7
- # Search list tree
8
- class List < Gtk::Box
9
- attr_reader :data
10
- attr_reader :store
11
-
12
- COLUMN_CHECKBOX,
13
- COLUMN_ID,
14
- COLUMN_NAME,
15
- COLUMN_AUTHOR,
16
- COLUMN_SONG = *(0..4).to_a
17
-
18
- ##
19
- # Initialize widgets
20
- #
21
- # @param [Grooveshark::Client] client Grooveshark client
22
- # @param [Gtk::Window] window Gtk app
23
- #
24
- def load(_client, _window)
25
- set_name('search_list')
26
-
27
- sw = Gtk::ScrolledWindow.new
28
- sw.shadow_type = Gtk::ShadowType::ETCHED_IN
29
- sw.set_policy(Gtk::PolicyType::AUTOMATIC, Gtk::PolicyType::AUTOMATIC)
30
- pack_start(sw, expand: true, fill: true, padding: 0)
31
-
32
- @store = Gtk::ListStore.new(TrueClass,
33
- Integer,
34
- String,
35
- String,
36
- String)
37
- create_model
38
- treeview = Gtk::TreeView.new(@store)
39
- treeview.rules_hint = true
40
- treeview.search_column = COLUMN_SONG
41
-
42
- sw.add(treeview)
43
-
44
- add_columns(treeview)
45
- end
46
-
47
- ##
48
- # Create line in the list store
49
- #
50
- # @param [Array] data Data stored
51
- #
52
- def create_model(data = [])
53
- @store.clear
54
- @data = {}
55
- data.each do |element|
56
- iter = @store.append
57
- iter[COLUMN_CHECKBOX] = false
58
- if element.is_a?(Grooveshark::Song)
59
- @data[element.id.to_i] = element
60
- iter[COLUMN_ID] = element.id.to_i
61
- iter[COLUMN_NAME] = element.name
62
- iter[COLUMN_AUTHOR] = element.artist
63
- iter[COLUMN_SONG] = element.album
64
- else
65
- @data[element['playlist_id'].to_i] = element
66
- iter[COLUMN_ID] = element['playlist_id'].to_i
67
- iter[COLUMN_NAME] = element['name']
68
- iter[COLUMN_AUTHOR] = element['f_name']
69
- iter[COLUMN_SONG] = element['num_songs']
70
- end
71
- end
72
- end
73
-
74
- ##
75
- # Add columns on the treeview element
76
- #
77
- # @param [Gtk::Treeview] treeview Treeview
78
- #
79
- def add_columns(treeview)
80
- renderer = Gtk::CellRendererToggle.new
81
- renderer.signal_connect('toggled') do |_cell, path|
82
- fixed_toggled(treeview.model, path)
83
- end
84
-
85
- column = Gtk::TreeViewColumn.new('X',
86
- renderer,
87
- 'active' => COLUMN_CHECKBOX)
88
- column.sizing = Gtk::TreeViewColumn::Sizing::FIXED
89
- column.fixed_width = 30
90
- column.set_clickable(true)
91
- column.signal_connect('clicked') do
92
- @store.each do |_model, _path, iter|
93
- fixed = iter[COLUMN_CHECKBOX]
94
- fixed ^= 1
95
- iter[COLUMN_CHECKBOX] = fixed
96
- end
97
- end
98
-
99
- treeview.append_column(column)
100
-
101
- renderer = Gtk::CellRendererText.new
102
- column = Gtk::TreeViewColumn.new('Id',
103
- renderer,
104
- 'text' => COLUMN_ID)
105
- column.set_sort_column_id(COLUMN_ID)
106
- column.sizing = Gtk::TreeViewColumn::Sizing::FIXED
107
- column.fixed_width = 70
108
- treeview.append_column(column)
109
-
110
- renderer = Gtk::CellRendererText.new
111
- column = Gtk::TreeViewColumn.new('Name',
112
- renderer,
113
- 'text' => COLUMN_NAME)
114
- column.set_sort_column_id(COLUMN_NAME)
115
- column.fixed_width = 400
116
- treeview.append_column(column)
117
-
118
- renderer = Gtk::CellRendererText.new
119
- column = Gtk::TreeViewColumn.new('Author',
120
- renderer,
121
- 'text' => COLUMN_AUTHOR)
122
- column.set_sort_column_id(COLUMN_AUTHOR)
123
- column.fixed_width = 200
124
- treeview.append_column(column)
125
-
126
- renderer = Gtk::CellRendererText.new
127
- column = Gtk::TreeViewColumn.new('Other data',
128
- renderer,
129
- 'text' => COLUMN_SONG)
130
- column.set_sort_column_id(COLUMN_SONG)
131
- column.fixed_width = 100
132
- treeview.append_column(column)
133
- end
134
-
135
- ##
136
- # Fixed toggle button
137
- #
138
- # @param [Gtk::ListStore] model List store
139
- # @param [String] path_str Path to row
140
- #
141
- def fixed_toggled(model, path_str)
142
- path = Gtk::TreePath.new(path_str)
143
- iter = model.get_iter(path)
144
- fixed = iter[COLUMN_CHECKBOX]
145
- fixed ^= 1
146
- iter[COLUMN_CHECKBOX] = fixed
147
- end
148
- end
149
- end
150
- end
151
- end