in_our_time 0.3.0 → 0.3.1

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.
Files changed (5) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +19 -5
  3. data/VERSION +1 -1
  4. data/lib/iot/iot.rb +141 -45
  5. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a4d33efed1ec31350eb4993c5be89f4506d0200b
4
- data.tar.gz: dcada7f6e8bdafe08258d7529785af1fdbbac2ac
3
+ metadata.gz: ed0b5b221412272a4878b2d8d4292a55785cc1c1
4
+ data.tar.gz: 3381834d2955875c617f2d5ad97fe5ec89cabba5
5
5
  SHA512:
6
- metadata.gz: ec29eeae228da573d068ef13d71ee7c05632fda8b99a331045afbc2cbf4950c23bd30112a0d4da05205645bec85c515f9177fd4bbbb347b44eacc0e6f194007c
7
- data.tar.gz: ee0742b483f3ea7859ebbc36e72b48dd60743b6c87acc692628326021575642f2286728aa1563571ebcc022d15e96ba6e51e1b346700339cb04072a60c7f7321
6
+ metadata.gz: 718ce0b3cc69e71799797625f28d101d2e030aa2818a5b85e2dd07521703a4619597ae9527c3ea0bfbbc22f1ad76be8b460f613c007f2dd81fd9f3a9e2f6584e
7
+ data.tar.gz: 94eccc73c95354135426ab82920b27c03fc9240ca4ea2eb9a2acd6aa6d4d61c8895ceb139fba4caf81f3b2859020d2eb35879993507ef0deb6501e50c8609b22
data/README.md CHANGED
@@ -1,10 +1,12 @@
1
1
  ## In Our Time
2
2
 
3
- Select, auto-download, and play **BBC In Our Time** podcasts easily, from the command line [link](http://www.bbc.co.uk/programmes/b006qykl).
3
+ Select, automatically download, and play **BBC In Our Time** podcasts easily, from the command line.
4
4
 
5
- When played, podcast is archived locally for offline access in the future.
5
+ - [BBC In Our Time](http://www.bbc.co.uk/programmes/b006qykl).
6
6
 
7
- Checks regularly for new podcasts and adds to the list.
7
+ Podcast is archived locally for offline access in the future.
8
+
9
+ Regularly checks for new podcasts.
8
10
 
9
11
  ![compile image](https://raw.githubusercontent.com/mjago/In_Our_Time/master/light_theme.png)
10
12
 
@@ -16,12 +18,24 @@ Checks regularly for new podcasts and adds to the list.
16
18
  gem install in_our_time
17
19
  iot
18
20
  ```
19
-
20
21
  ## Config:
21
22
 
22
23
  Config can be found at '~/.in_our_time/config.yml'
23
24
 
24
25
  ## mp3 player:
25
26
 
26
- By default uses **afplay** on **OSX** but can also be configured to use **mpg123**. Use **aplay** on **Linux**.
27
+ By default uses **afplay** as the media player but gains **Forward skip**, **Reverse Skip**, **Pause** and **Resume** controls when used with - [mpg123](https://www.mpg123.de/). Install **mpg123** and modify the config.yml file to use **mpg123**:
28
+
29
+ ```sh
30
+ :mpg_player: :mpg123
31
+ ```
27
32
 
33
+ ## Command line options:
34
+ Version:
35
+ ```sh
36
+ iot --version
37
+ ```
38
+ Help:
39
+ ```sh
40
+ iot --help
41
+ ```
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.0
1
+ 0.3.1
data/lib/iot/iot.rb CHANGED
@@ -6,6 +6,7 @@ require 'yaml'
6
6
  require 'fileutils'
7
7
  require 'colorize'
8
8
  require 'oga'
9
+ require 'pty'
9
10
 
10
11
  class InOurTime
11
12
 
@@ -14,6 +15,7 @@ class InOurTime
14
15
  CONFIG_DIR = '.in_our_time'
15
16
  CONFIG_NAME = 'config.yml'
16
17
  IN_OUR_TIME = File.join ROOT, CONFIG_DIR
18
+ VERSION = File.join HERE, '..','..','VERSION'
17
19
  DEFAULT_CONFIG = File.join HERE, '..','..',CONFIG_NAME
18
20
  CONFIG = File.join IN_OUR_TIME,CONFIG_NAME
19
21
  UPDATE_INTERVAL = 604800
@@ -64,9 +66,11 @@ class InOurTime
64
66
  when "q",'Q', "\u0003", "\u0004"
65
67
  :quit
66
68
  when 'p', 'P'
67
- :previous
68
- when 'n', 'N'
69
- :next
69
+ :pause
70
+ when 'f', 'F'
71
+ :forward
72
+ when 'r', 'R'
73
+ :rewind
70
74
  when 's', 'S'
71
75
  :stop
72
76
  when 'x', 'X', "\r"
@@ -85,12 +89,20 @@ class InOurTime
85
89
  @programs, @selected = [], 0
86
90
  setup
87
91
  load_config
92
+ load_version
93
+ load_help_maybe
94
+ display_version
88
95
  check_remote
89
96
  parse_rss
90
97
  sort_titles
98
+ version_display_wait
91
99
  run
92
100
  end
93
101
 
102
+ def version_display_wait
103
+ sleep 0.01 while Time.now - @start_time < 1
104
+ end
105
+
94
106
  def iot_print x, col = @text_colour
95
107
  print x.colorize col if @config[:colour]
96
108
  print x unless @config[:colour]
@@ -106,6 +118,7 @@ class InOurTime
106
118
  end
107
119
 
108
120
  def setup
121
+ @start_time = Time.now
109
122
  iot = IN_OUR_TIME
110
123
  audio = File.join iot, AUDIO_DIRECTORY
111
124
  pages = File.join iot, RSS_DIRECTORY
@@ -117,6 +130,17 @@ class InOurTime
117
130
  end
118
131
  end
119
132
 
133
+ def display_version
134
+ clear
135
+ iot_print("Loading ", @system_colour) unless ARGV[0] == '-v' || ARGV[0] == '--version'
136
+ iot_puts "In Our Time Player (#{@version})", @system_colour
137
+ exit 0 if ARGV[0] == '-v' || ARGV[0] == '--version'
138
+ end
139
+
140
+ def load_version
141
+ File.open(VERSION) {|f| @version = f.readline.strip}
142
+ end
143
+
120
144
  def update_remote?
121
145
  now - @config[:update_interval] > @config[:last_update]
122
146
  end
@@ -276,28 +300,23 @@ class InOurTime
276
300
  def pre_delay
277
301
  x = DateTime.strptime("Mon, 20 Jun 2016", '%a, %d %b %Y')
278
302
  y = DateTime.strptime(date, '%a, %d %b %Y')
279
- y < x ? '410' : '435'
303
+ if y < x
304
+ return '410' unless @playing == 'Abelard and Heloise'
305
+ '0' if @playing == 'Abelard and Heloise'
306
+ else
307
+ '435'
308
+ end
280
309
  end
281
310
 
282
311
  def player_cmd
283
312
  case @config[:mpg_player]
284
313
  when :mpg123
285
- "mpg123 -qk#{pre_delay}"
314
+ "mpg123 --remote-err -Cqk#{pre_delay}"
286
315
  else
287
316
  "afplay"
288
317
  end
289
318
  end
290
319
 
291
- def kill_cmd
292
- "killall " +
293
- case @config[:mpg_player]
294
- when :mpg123
295
- "mpg123"
296
- else
297
- "afplay"
298
- end
299
- end
300
-
301
320
  def clear
302
321
  system 'clear' or system 'cls'
303
322
  end
@@ -340,19 +359,62 @@ class InOurTime
340
359
  end
341
360
  end
342
361
  unless @no_play
343
- @play = Thread.new do
344
- @playing = prg[:title]
345
- system player_cmd + ' ' +
346
- filename_from_title(@playing)
347
- @playing, @no_play = nil, nil
348
- end
362
+ @playing = prg[:title]
363
+ window_title prg[:title]
364
+ @cmd = player_cmd + ' ' + filename_from_title(@playing)
365
+ @messages = []
366
+ @p_out, @p_in, @pid = PTY.spawn(@cmd)
349
367
  end
350
368
  @no_play = nil
351
369
  end
352
370
 
371
+ def window_title title = ''
372
+ puts "\"\033]0;#{title}\007"
373
+ end
374
+
375
+ def reset
376
+ @pid, @playing, @paused = nil, nil, nil
377
+ window_title
378
+ display_list :same_page
379
+ end
380
+
381
+ def write_player str
382
+ begin
383
+ @p_in.puts str
384
+ rescue Errno::EIO
385
+ reset
386
+ end
387
+ end
388
+
389
+ def pause
390
+ if control_play?
391
+ @paused = @paused ? false : true
392
+ write_player " "
393
+ display_list :same_page
394
+ end
395
+ end
396
+
397
+ def control_play?
398
+ if @config[:mpg_player] == :mpg123
399
+ if @playing
400
+ true
401
+ end
402
+ end
403
+ end
404
+
405
+ def forward
406
+ write_player ":" if control_play?
407
+ end
408
+
409
+ def rewind
410
+ write_player ";" if control_play?
411
+ end
412
+
353
413
  def print_playing_maybe
354
414
  if @playing
355
- iot_puts "\nPlaying '#{@playing}'", @selection_colour
415
+ iot_print("\nPlaying: ", @count_colour) unless @paused
416
+ iot_print("\nPaused: ", @count_colour) if @paused
417
+ iot_puts @playing, @selection_colour
356
418
  elsif @started.nil?
357
419
  @started = true
358
420
  iot_puts "\n? or h for instructions", @text_colour
@@ -361,11 +423,18 @@ class InOurTime
361
423
  end
362
424
  end
363
425
 
426
+ def kill_cmd
427
+ "killall " +
428
+ @config[:mpg_player].to_s
429
+ end
430
+
364
431
  def kill_audio
365
432
  if @playing
366
- system kill_cmd if @play
367
- @play.kill if @play
368
- @playing = nil
433
+ if @pid.is_a? Fixnum
434
+ Process.kill('QUIT', @pid)
435
+ sleep 0.2
436
+ reset
437
+ end
369
438
  end
370
439
  end
371
440
 
@@ -407,7 +476,7 @@ class InOurTime
407
476
  def display_list action
408
477
  clear
409
478
  case action
410
- when :draw_page
479
+ when :next_page
411
480
  draw_page
412
481
  when :previous_page
413
482
  if @line_count > 0
@@ -423,25 +492,32 @@ class InOurTime
423
492
  end
424
493
  end
425
494
 
495
+ def load_help_maybe
496
+ if ARGV[0] == '-h' || ARGV[0] == '--help' || ARGV[0] == '-?'
497
+ help
498
+ exit 0
499
+ end
500
+ end
501
+
426
502
  def help
427
503
  unless @help
428
504
  clear
429
- iot_puts " In Our Time Player (Help) "
430
- iot_puts " "
431
- iot_puts " Next - N (down arrow) "
432
- iot_puts " Previous - P (up arrow) "
433
- iot_puts " Next Page - (SPACE) "
434
- iot_puts " Play - X (return) "
435
- iot_puts " Stop - S "
436
- iot_puts " List - L "
437
- iot_puts " Info - I "
438
- iot_puts " Help - H "
439
- iot_puts " Quit - Q "
440
- iot_puts " TL;DR "
441
- iot_puts "Select: up/down arrows "
442
- iot_puts "Play: enter "
443
- iot_puts "Config: #{CONFIG} "
444
- 18.upto(@config[:page_height] - 1) {iot_puts ''}
505
+ iot_puts " In Our Time Player (#{@version})"
506
+ iot_puts " Next - N or Down Key ", @system_colour
507
+ iot_puts " Previous - P or Up Key ", @system_colour
508
+ iot_puts " Next Page - SPACE ", @system_colour
509
+ iot_puts " Play - X or Enter ", @system_colour
510
+ iot_puts " Stop - S ", @system_colour
511
+ iot_puts " List Page 1 - L ", @system_colour
512
+ iot_puts " Info - I ", @system_colour
513
+ iot_puts " Help - H ", @system_colour
514
+ iot_puts " Quit - Q ", @system_colour
515
+ iot_puts " mpg123 Controls: ", @system_colour
516
+ iot_puts " Pause/Resume - P ", @system_colour
517
+ iot_puts " Forward Skip - F ", @system_colour
518
+ iot_puts " Reverse Skip - R ", @system_colour
519
+ iot_puts " ", @system_colour
520
+ iot_puts "Config: #{CONFIG}" , @system_colour
445
521
  print_playing_maybe
446
522
  @help = true
447
523
  else
@@ -566,18 +642,38 @@ class InOurTime
566
642
  end
567
643
 
568
644
  ip = key.input
645
+
646
+ if @pid.is_a? Fixnum
647
+ begin
648
+ write_player( "\e")
649
+ if @pid.is_a? Fixnum
650
+ Process.kill 0, @pid
651
+ end
652
+ rescue Errno::ESRCH
653
+ reset
654
+ end
655
+ else
656
+ @pid = nil
657
+ end
658
+
569
659
  @info = nil unless ip == :info
570
660
  @help = nil unless ip == :help
571
661
 
572
662
  action =
573
663
  case ip
664
+ when :pause
665
+ pause
666
+ when :forward
667
+ forward
668
+ when :rewind
669
+ rewind
574
670
  when :list
575
671
  @line_count = 0
576
672
  @selected = 0
577
- display_list :draw_page
673
+ display_list :next_page
578
674
  when :page_forward
579
675
  @selected = @line_count
580
- display_list :draw_page
676
+ display_list :next_page
581
677
  when :previous
582
678
  @selected -= 1 if @selected > 0
583
679
  if @selected >= @line_count -
@@ -591,7 +687,7 @@ class InOurTime
591
687
  if @selected <= @line_count - 1
592
688
  display_list :same_page
593
689
  else
594
- display_list :draw_page
690
+ display_list :next_page
595
691
  end
596
692
  when :play
597
693
  kill_audio
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: in_our_time
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Martyn Jago
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-10-01 00:00:00.000000000 Z
11
+ date: 2016-10-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: oga