Backend for songs.zachdecook.com
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
<?php

namespace App\Console\Commands;

use App\Song;
use Illuminate\Console\Command;

class AddSongs extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'prosongsa:import {file}';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Import songs from an inputfile.';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
    	define( 'AUTHOR_REGEX', "/^-(([A-Za-z.]+ ?)+)/" );
    	$filename = $this->argument('file');
		$handle = fopen($filename, "r");

		$theSong = [
			'text' => '',
			'verse' => '',
			'number' => FALSE,
		];
		
		if ( !$handle ){
			$this->error("Couldn't read file '$filename'");
			return 1;
		}
		while (($line = fgets($handle)) !== false)
		{
			// If we see a number, then that is what song we are on.
			$matches = array();
			if ( preg_match("(^(X?C?B?\d+)\. )", $line, $matches) )
			{
				if ( $theSong['text'] && $theSong['number'] && $theSong['title']
				&& ( $theSong['number'] != $matches[1] ) ) {
					Song::create( $theSong );
					$this->line( "Created $theSong[title]" );
					$theSong = [
						'text' => '',
						'verse' => '',
						'key' => NULL,
						'author' => NULL,
					];
				}
				$theSong['number'] = $matches[1];
				$theSong['title'] = trim($line);
				$this->line( "Creating $theSong[title]..." );
			}

			$theSong['text'] .= $line;

			if ( preg_match( "/\{p?\d*\((.+m?)\)\}/", $line, $matches)
				|| preg_match("/^{Key: ?([^ ]*).*}/i", $line, $matches)
			) {
				$theSong['key'] = $matches[1];
			}
			if ( preg_match( AUTHOR_REGEX, $line, $matches ) ) {
				$theSong['author'] = $matches[1];
			}
		}
		fclose($handle);
		Song::create( $theSong );
    }
}